stream-chat-angular 4.29.1 → 4.31.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/bundles/stream-chat-angular.umd.js +164 -78
- package/bundles/stream-chat-angular.umd.js.map +1 -1
- package/esm2015/assets/version.js +2 -2
- package/esm2015/lib/avatar-placeholder/avatar-placeholder.component.js +14 -4
- package/esm2015/lib/channel-list/channel-list.component.js +2 -7
- package/esm2015/lib/custom-templates.service.js +5 -1
- package/esm2015/lib/date-parser.service.js +40 -0
- package/esm2015/lib/icon-placeholder/icon-placeholder.component.js +5 -4
- package/esm2015/lib/message/message.component.js +17 -16
- package/esm2015/lib/message-input/message-input.component.js +3 -1
- package/esm2015/lib/message-list/message-list.component.js +42 -20
- package/esm2015/lib/parse-date.js +19 -0
- package/esm2015/lib/types.js +1 -1
- package/esm2015/public-api.js +3 -2
- package/fesm2015/stream-chat-angular.js +142 -60
- package/fesm2015/stream-chat-angular.js.map +1 -1
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +4 -2
- package/lib/channel-list/channel-list.component.d.ts +0 -1
- package/lib/custom-templates.service.d.ts +5 -1
- package/lib/date-parser.service.d.ts +29 -0
- package/lib/icon-placeholder/icon-placeholder.component.d.ts +4 -2
- package/lib/message/message.component.d.ts +3 -1
- package/lib/message-list/message-list.component.d.ts +16 -4
- package/lib/parse-date.d.ts +1 -0
- package/lib/types.d.ts +4 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -1
- package/src/assets/styles/css/index.css +1 -1
- package/src/assets/styles/css/index.css.map +1 -1
- package/src/assets/styles/scss/Card.scss +27 -2
- package/src/assets/styles/v2/css/index.css +1 -1
- package/src/assets/styles/v2/css/index.css.map +1 -1
- package/src/assets/styles/v2/css/index.layout.css +1 -1
- package/src/assets/styles/v2/css/index.layout.css.map +1 -1
- package/src/assets/styles/v2/scss/Channel/Channel-layout.scss +4 -0
- package/src/assets/styles/v2/scss/Message/Message-layout.scss +4 -2
- package/src/assets/styles/v2/scss/MessageList/MessageList-layout.scss +4 -0
- package/src/assets/styles/v2/scss/Thread/Thread-layout.scss +5 -0
- package/src/assets/styles/v2/scss/TypingIndicator/TypingIndicator-layout.scss +4 -0
- package/src/assets/styles/v2/scss/_emoji-replacement.scss +40 -0
- package/src/assets/styles/v2/scss/index.layout.scss +1 -0
- package/src/assets/version.ts +1 -1
- package/esm2015/lib/message/parse-date.js +0 -8
- package/lib/message/parse-date.d.ts +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Component, Input, ViewChild, } from '@angular/core';
|
|
2
|
-
import { parseDate } from './parse-date';
|
|
3
2
|
import emojiRegex from 'emoji-regex';
|
|
4
3
|
import { listUsers } from '../list-users';
|
|
5
4
|
import { NgxPopperjsTriggers, NgxPopperjsPlacements } from 'ngx-popperjs';
|
|
@@ -8,24 +7,26 @@ import * as i1 from "../chat-client.service";
|
|
|
8
7
|
import * as i2 from "../channel.service";
|
|
9
8
|
import * as i3 from "../custom-templates.service";
|
|
10
9
|
import * as i4 from "../theme.service";
|
|
11
|
-
import * as i5 from "../
|
|
12
|
-
import * as i6 from "
|
|
13
|
-
import * as i7 from "
|
|
14
|
-
import * as i8 from "../
|
|
15
|
-
import * as i9 from "../
|
|
16
|
-
import * as i10 from "../
|
|
17
|
-
import * as i11 from "../
|
|
18
|
-
import * as i12 from "
|
|
19
|
-
import * as i13 from "@
|
|
10
|
+
import * as i5 from "../date-parser.service";
|
|
11
|
+
import * as i6 from "../avatar-placeholder/avatar-placeholder.component";
|
|
12
|
+
import * as i7 from "ngx-popperjs";
|
|
13
|
+
import * as i8 from "../message-actions-box/message-actions-box.component";
|
|
14
|
+
import * as i9 from "../icon-placeholder/icon-placeholder.component";
|
|
15
|
+
import * as i10 from "../message-reactions/message-reactions.component";
|
|
16
|
+
import * as i11 from "../attachment-list/attachment-list.component";
|
|
17
|
+
import * as i12 from "../loading-indicator-placeholder/loading-indicator-placeholder.component";
|
|
18
|
+
import * as i13 from "@angular/common";
|
|
19
|
+
import * as i14 from "@ngx-translate/core";
|
|
20
20
|
/**
|
|
21
21
|
* The `Message` component displays a message with additional information such as sender and date, and enables [interaction with the message (i.e. edit or react)](../concepts/message-interactions.mdx).
|
|
22
22
|
*/
|
|
23
23
|
export class MessageComponent {
|
|
24
|
-
constructor(chatClientService, channelService, customTemplatesService, cdRef, themeService) {
|
|
24
|
+
constructor(chatClientService, channelService, customTemplatesService, cdRef, themeService, dateParser) {
|
|
25
25
|
this.chatClientService = chatClientService;
|
|
26
26
|
this.channelService = channelService;
|
|
27
27
|
this.customTemplatesService = customTemplatesService;
|
|
28
28
|
this.cdRef = cdRef;
|
|
29
|
+
this.dateParser = dateParser;
|
|
29
30
|
/**
|
|
30
31
|
* The list of [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript) that are enabled for the current user, the list of [supported interactions](../concepts/message-interactions.mdx) can be found in our message interaction guide. Unathorized actions won't be displayed on the UI. The [`MessageList`](./MessageListComponent.mdx) component automatically sets this based on [channel capabilities](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript).
|
|
31
32
|
*/
|
|
@@ -124,7 +125,7 @@ export class MessageComponent {
|
|
|
124
125
|
if (!this.message || !((_a = this.message) === null || _a === void 0 ? void 0 : _a.created_at)) {
|
|
125
126
|
return;
|
|
126
127
|
}
|
|
127
|
-
return
|
|
128
|
+
return this.dateParser.parseDateTime(this.message.created_at);
|
|
128
129
|
}
|
|
129
130
|
get areOptionsVisible() {
|
|
130
131
|
if (!this.message) {
|
|
@@ -341,8 +342,8 @@ export class MessageComponent {
|
|
|
341
342
|
return content;
|
|
342
343
|
}
|
|
343
344
|
}
|
|
344
|
-
MessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageComponent, deps: [{ token: i1.ChatClientService }, { token: i2.ChannelService }, { token: i3.CustomTemplatesService }, { token: i0.ChangeDetectorRef }, { token: i4.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
345
|
-
MessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageComponent, selector: "stream-message", inputs: { message: "message", enabledMessageActions: "enabledMessageActions", isLastSentMessage: "isLastSentMessage", mode: "mode", isHighlighted: "isHighlighted", customActions: "customActions" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #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 }}\"\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 \"\n data-testid=\"message-container\"\n (mouseleave)=\"isActionBoxOpen = false\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <ng-container *ngIf=\"themeVersion === '1'\">\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n </ng-container>\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n type=\"user\"\n location=\"message-sender\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-edit-in-progress]=\"isEditing\"\n *ngIf=\"areOptionsVisible\"\n >\n <div\n data-testid=\"message-actions-container\"\n #messageActionsToggle\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 [class.str-chat-angular__message-simple__actions__action--options--editing]=\"\n isEditing\n \"\n [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerClick\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"true\"\n [popperHideOnClickOutside]=\"true\"\n [popperHideOnMouseLeave]=\"false\"\n >\n <popper-content #popperContent>\n <ng-template\n #defaultMessageActionsBox\n let-isOpen=\"isOpen\"\n let-isMine=\"isMine\"\n let-enabledActions=\"enabledActions\"\n let-messageInput=\"message\"\n let-displayedActionsCountChangeHandler=\"displayedActionsCountChangeHandler\"\n let-isEditingChangeHandler=\"isEditingChangeHandler\"\n let-customActions=\"customActions\"\n >\n <stream-message-actions-box\n [isOpen]=\"isOpen\"\n [isMine]=\"isMine\"\n [enabledActions]=\"enabledActions\"\n [message]=\"messageInput\"\n [customActions]=\"customActions\"\n (displayedActionsCount)=\"\n displayedActionsCountChangeHandler($event)\n \"\n (isEditing)=\"isEditingChangeHandler($event)\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageActionsBoxTemplate || defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </popper-content>\n <div\n class=\"str-chat__message-actions-box-button\"\n *ngIf=\"visibleMessageActionsCount > 0\"\n data-testid=\"action-icon\"\n (click)=\"isActionBoxOpen = !isActionBoxOpen\"\n (keyup.enter)=\"isActionBoxOpen = !isActionBoxOpen\"\n >\n <stream-icon-placeholder\n icon=\"action-icon\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <div\n *ngIf=\"\n enabledMessageActions.indexOf('send-reply') !== -1 &&\n mode === 'main'\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--thread\n str-chat__message-reply-in-thread-button\n \"\n data-testid=\"reply-in-thread\"\n (click)=\"setAsActiveParentMessage()\"\n (keyup.enter)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-action-icon\"\n icon=\"reply-in-thread\"\n ></stream-icon-placeholder>\n </div>\n <div\n *ngIf=\"canReactToMessage\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--reactions\n str-chat__message-reactions-button\n \"\n data-testid=\"reaction-icon\"\n (click)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n (keyup.enter)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-action-icon\"\n icon=\"reaction-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <div class=\"str-chat__message-reactions-host\">\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-isSelectorOpen=\"isSelectorOpen\"\n let-isSelectorOpenChangeHandler=\"isSelectorOpenChangeHandler\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [isSelectorOpen]=\"isSelectorOpen\"\n (isSelectorOpenChange)=\"isSelectorOpenChangeHandler($event)\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageReactionsTemplate || defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <!-- transform: translate3d(0, 0, 0) fixes scrolling issues on iOS, see: https://stackoverflow.com/questions/50105780/elements-disappear-when-scrolling-in-safari-webkit-transform-fix-only-works-t/50144295#50144295 -->\n <!-- transform: none is required when image carousel is open in order for the modal to be correctly positioned, see how the transform property changes the behavior of fixed positioned elements https://developer.mozilla.org/en-US/docs/Web/CSS/position -->\n <div\n class=\"str-chat__message-bubble\"\n style=\"transform: {{\n imageAttachmentModalState === 'opened'\n ? 'none'\n : 'translate3d(0, 0, 0)'\n }}\"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n *ngIf=\"message?.text || (message?.quoted_message && hasAttachment)\"\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 (click)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n (keyup.enter)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\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 data-testid=\"client-error-message\"\n *ngIf=\"message?.type === 'error'\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n {{ \"streamChat.Error \u00B7 Unsent\" | translate }}\n </div>\n <div\n data-testid=\"error-message\"\n *ngIf=\"message?.status === 'failed'\"\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 data-testid=\"text\">\n <p>\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 mentionTemplate || defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '2'\"\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n replyCountButton;\n context: { position: 'inside-message-bubble' }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n messageDateAndSender;\n context: { position: 'inside-message-bubble' }\n \"\n ></ng-container>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n replyCountButton;\n context: { position: 'outside-message-bubble', message: message }\n \"\n ></ng-container>\n\n <ng-container\n *ngTemplateOutlet=\"\n messageDateAndSender;\n context: { position: 'outside-message-bubble' }\n \"\n ></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 systemMessageTemplate || 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 [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [size]=\"20\"\n type=\"user\"\n location=\"quoted-message-sender\"\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 attachmentListTemplate || 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<!-- We need these markups in slightly different positions in theme-v1 and theme-v2, this soultion makes that possible without duplicating the code -->\n<ng-template #messageDateAndSender let-position=\"position\">\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <ng-container\n *ngIf=\"\n (position === 'inside-message-bubble' && themeVersion === '1') ||\n (position === 'outside-message-bubble' && themeVersion === '2')\n \"\n >\n <div\n class=\"str-chat__translation-notice\"\n *ngIf=\"shouldDisplayTranslationNotice\"\n data-testid=\"translation-notice\"\n >\n <button\n data-testid=\"see-original\"\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n translate\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n data-testid=\"see-translation\"\n *ngIf=\"displayedMessageTextContent === 'original'\"\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n translate\n >\n streamChat.See translation\n </button>\n </div>\n <div\n class=\"\n str-chat__message-data\n str-chat__message-simple-data\n str-chat__message-metadata\n \"\n >\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <ng-container *ngIf=\"themeVersion === '2'\">\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n </ng-container>\n <span\n data-testid=\"sender\"\n *ngIf=\"!isSentByCurrentUser\"\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 data-testid=\"date\" class=\"str-chat__message-simple-timestamp\">\n {{ parsedDate }}\n </span>\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 customDeliveredStatusTemplate || 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 [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </popper-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered-icon\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n customSendingStatusTemplate || 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 [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </popper-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 customReadStatusTemplate || defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus>\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 [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </popper-content>\n <stream-avatar-placeholder\n class=\"str-chat-angular__avatar-host\"\n data-test-id=\"last-read-user-avatar\"\n [size]=\"15\"\n [imageUrl]=\"lastReadUser?.image\"\n [name]=\"lastReadUser?.name || lastReadUser?.id\"\n type=\"user\"\n location=\"message-reader\"\n [user]=\"lastReadUser\"\n ></stream-avatar-placeholder>\n <span\n data-test-id=\"read-by-length\"\n *ngIf=\"isReadByMultipleUsers\"\n class=\"str-chat__message-simple-status-number\"\n >\n {{ (message?.readBy)!.length }}\n </span>\n </span>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #replyCountButton let-position=\"position\">\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <div\n *ngIf=\"\n (position === 'inside-message-bubble' && themeVersion === '1') ||\n (position === 'outside-message-bubble' && themeVersion === '2')\n \"\n class=\"\n str-chat__message-simple-reply-button\n str-chat__message-replies-count-button-wrapper\n \"\n >\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <button\n *ngIf=\"shouldDisplayThreadLink\"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '1'\"\n stream-icon-placeholder\n icon=\"reply\"\n ></stream-icon-placeholder>\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 attachmentListTemplate || defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n</ng-template>\n", components: [{ type: i5.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size", "location", "channel", "user", "type", "initialsType"] }, { type: i6.NgxPopperjsContentComponent, selector: "popper-content" }, { type: i7.MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: ["isOpen", "isMine", "message", "enabledActions", "customActions"], outputs: ["displayedActionsCount", "isEditing"] }, { type: i8.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: i9.MessageReactionsComponent, selector: "stream-message-reactions", inputs: ["messageId", "messageReactionCounts", "isSelectorOpen", "latestReactions", "ownReactions"], outputs: ["isSelectorOpenChange"] }, { type: i10.AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "parentMessageId", "attachments"], outputs: ["imageModalStateChange"] }, { type: i11.LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: ["size", "color"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgxPopperjsDirective, selector: "[popper]", inputs: ["popperTimeout", "popperTimeoutAfterShow", "popperApplyClass", "popper", "popperDisabled", "popperPlacement", "popperApplyArrowClass", "popperPreventOverflow", "popperHideOnClickOutside", "popperTrigger", "popperStyles", "popperAriaDescribeBy", "popperAriaRole", "popperBoundaries", "popperCloseOnClickOutside", "popperDisableAnimation", "popperDisableStyle", "popperHideOnMouseLeave", "popperHideOnScroll", "popperAppendTo", "popperModifiers", "popperPositionFixed", "popperDelay", "popperShowOnStart", "popperTarget"], outputs: ["popperOnHidden", "popperOnShown", "popperOnUpdate"], exportAs: ["popper"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i13.TranslatePipe } });
|
|
345
|
+
MessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageComponent, deps: [{ token: i1.ChatClientService }, { token: i2.ChannelService }, { token: i3.CustomTemplatesService }, { token: i0.ChangeDetectorRef }, { token: i4.ThemeService }, { token: i5.DateParserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
346
|
+
MessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageComponent, selector: "stream-message", inputs: { message: "message", enabledMessageActions: "enabledMessageActions", isLastSentMessage: "isLastSentMessage", mode: "mode", isHighlighted: "isHighlighted", customActions: "customActions" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #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 }}\"\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 \"\n data-testid=\"message-container\"\n (mouseleave)=\"isActionBoxOpen = false\"\n>\n <ng-container *ngIf=\"!message?.deleted_at; else deletedMessage\">\n <ng-container *ngIf=\"message?.type !== 'system'; else systemMessage\">\n <ng-container *ngIf=\"themeVersion === '1'\">\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n </ng-container>\n <stream-avatar-placeholder\n data-testid=\"avatar\"\n class=\"str-chat-angular__avatar-host str-chat__message-sender-avatar\"\n [imageUrl]=\"message?.user?.image\"\n [name]=\"message?.user?.name || message?.user?.id\"\n type=\"user\"\n location=\"message-sender\"\n [user]=\"message?.user || undefined\"\n ></stream-avatar-placeholder>\n <div class=\"str-chat__message-inner\">\n <div\n class=\"str-chat__message-simple__actions str-chat__message-options\"\n data-testid=\"message-options\"\n [class.str-chat__message-edit-in-progress]=\"isEditing\"\n *ngIf=\"areOptionsVisible\"\n >\n <div\n data-testid=\"message-actions-container\"\n #messageActionsToggle\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 [class.str-chat-angular__message-simple__actions__action--options--editing]=\"\n isEditing\n \"\n [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerClick\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"true\"\n [popperHideOnClickOutside]=\"true\"\n [popperHideOnMouseLeave]=\"false\"\n >\n <popper-content #popperContent>\n <ng-template\n #defaultMessageActionsBox\n let-isOpen=\"isOpen\"\n let-isMine=\"isMine\"\n let-enabledActions=\"enabledActions\"\n let-messageInput=\"message\"\n let-displayedActionsCountChangeHandler=\"displayedActionsCountChangeHandler\"\n let-isEditingChangeHandler=\"isEditingChangeHandler\"\n let-customActions=\"customActions\"\n >\n <stream-message-actions-box\n [isOpen]=\"isOpen\"\n [isMine]=\"isMine\"\n [enabledActions]=\"enabledActions\"\n [message]=\"messageInput\"\n [customActions]=\"customActions\"\n (displayedActionsCount)=\"\n displayedActionsCountChangeHandler($event)\n \"\n (isEditing)=\"isEditingChangeHandler($event)\"\n ></stream-message-actions-box>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageActionsBoxTemplate || defaultMessageActionsBox;\n context: getMessageActionsBoxContext()\n \"\n >\n </ng-container>\n </popper-content>\n <div\n class=\"str-chat__message-actions-box-button\"\n *ngIf=\"visibleMessageActionsCount > 0\"\n data-testid=\"action-icon\"\n (click)=\"isActionBoxOpen = !isActionBoxOpen\"\n (keyup.enter)=\"isActionBoxOpen = !isActionBoxOpen\"\n >\n <stream-icon-placeholder\n icon=\"action-icon\"\n class=\"str-chat__message-action-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <div\n *ngIf=\"\n enabledMessageActions.indexOf('send-reply') !== -1 &&\n mode === 'main'\n \"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--thread\n str-chat__message-reply-in-thread-button\n \"\n data-testid=\"reply-in-thread\"\n (click)=\"setAsActiveParentMessage()\"\n (keyup.enter)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-action-icon\"\n icon=\"reply-in-thread\"\n ></stream-icon-placeholder>\n </div>\n <div\n *ngIf=\"canReactToMessage\"\n class=\"\n str-chat__message-simple__actions__action\n str-chat__message-simple__actions__action--reactions\n str-chat__message-reactions-button\n \"\n data-testid=\"reaction-icon\"\n (click)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n (keyup.enter)=\"isReactionSelectorOpen = !isReactionSelectorOpen\"\n >\n <stream-icon-placeholder\n class=\"str-chat__message-action-icon\"\n icon=\"reaction-icon\"\n ></stream-icon-placeholder>\n </div>\n </div>\n <div class=\"str-chat__message-reactions-host\">\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <ng-template\n #defaultMessageReactions\n let-messageReactionCounts=\"messageReactionCounts\"\n let-latestReactions=\"latestReactions\"\n let-isSelectorOpen=\"isSelectorOpen\"\n let-isSelectorOpenChangeHandler=\"isSelectorOpenChangeHandler\"\n let-messageId=\"messageId\"\n let-ownReactions=\"ownReactions\"\n >\n <stream-message-reactions\n [messageReactionCounts]=\"messageReactionCounts\"\n [latestReactions]=\"latestReactions\"\n [isSelectorOpen]=\"isSelectorOpen\"\n (isSelectorOpenChange)=\"isSelectorOpenChangeHandler($event)\"\n [messageId]=\"messageId\"\n [ownReactions]=\"ownReactions\"\n ></stream-message-reactions>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageReactionsTemplate || defaultMessageReactions;\n context: getMessageReactionsContext()\n \"\n ></ng-container>\n </div>\n <!-- transform: translate3d(0, 0, 0) fixes scrolling issues on iOS, see: https://stackoverflow.com/questions/50105780/elements-disappear-when-scrolling-in-safari-webkit-transform-fix-only-works-t/50144295#50144295 -->\n <!-- transform: none is required when image carousel is open in order for the modal to be correctly positioned, see how the transform property changes the behavior of fixed positioned elements https://developer.mozilla.org/en-US/docs/Web/CSS/position -->\n <div\n class=\"str-chat__message-bubble\"\n style=\"transform: {{\n imageAttachmentModalState === 'opened'\n ? 'none'\n : 'translate3d(0, 0, 0)'\n }}\"\n >\n <ng-container *ngIf=\"hasAttachment && !message?.quoted_message\">\n <ng-container\n *ngTemplateOutlet=\"attachmentsTemplate\"\n ></ng-container>\n </ng-container>\n <div\n class=\"str-chat__message-text\"\n tabindex=\"0\"\n *ngIf=\"message?.text || (message?.quoted_message && hasAttachment)\"\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 (click)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\n \"\n (keyup.enter)=\"\n message?.status === 'failed' && message?.errorStatusCode !== 403\n ? resendMessage()\n : undefined\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 data-testid=\"client-error-message\"\n *ngIf=\"message?.type === 'error'\"\n class=\"\n str-chat__simple-message--error-message\n str-chat__message--error-message\n \"\n >\n {{ \"streamChat.Error \u00B7 Unsent\" | translate }}\n </div>\n <div\n data-testid=\"error-message\"\n *ngIf=\"message?.status === 'failed'\"\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 data-testid=\"text\">\n <p>\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 mentionTemplate || defaultMention;\n context: getMentionContext(part)\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '2'\"\n class=\"str-chat__message-error-icon\"\n icon=\"error\"\n ></stream-icon-placeholder>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n replyCountButton;\n context: { position: 'inside-message-bubble' }\n \"\n ></ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n messageDateAndSender;\n context: { position: 'inside-message-bubble' }\n \"\n ></ng-container>\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n replyCountButton;\n context: { position: 'outside-message-bubble', message: message }\n \"\n ></ng-container>\n\n <ng-container\n *ngTemplateOutlet=\"\n messageDateAndSender;\n context: { position: 'outside-message-bubble' }\n \"\n ></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 systemMessageTemplate || 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 [imageUrl]=\"message?.quoted_message?.user?.image\"\n [name]=\"\n message?.quoted_message?.user?.name || message?.quoted_message?.user?.id\n \"\n [size]=\"20\"\n type=\"user\"\n location=\"quoted-message-sender\"\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 attachmentListTemplate || 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<!-- We need these markups in slightly different positions in theme-v1 and theme-v2, this soultion makes that possible without duplicating the code -->\n<ng-template #messageDateAndSender let-position=\"position\">\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <ng-container\n *ngIf=\"\n (position === 'inside-message-bubble' && themeVersion === '1') ||\n (position === 'outside-message-bubble' && themeVersion === '2')\n \"\n >\n <div\n class=\"str-chat__translation-notice\"\n *ngIf=\"shouldDisplayTranslationNotice\"\n data-testid=\"translation-notice\"\n >\n <button\n data-testid=\"see-original\"\n *ngIf=\"displayedMessageTextContent === 'translation'\"\n (click)=\"displayOriginalMessage()\"\n (keyup.enter)=\"displayOriginalMessage()\"\n translate\n >\n streamChat.See original (automatically translated)\n </button>\n <button\n data-testid=\"see-translation\"\n *ngIf=\"displayedMessageTextContent === 'original'\"\n (click)=\"displayTranslatedMessage()\"\n (keyup.enter)=\"displayTranslatedMessage()\"\n translate\n >\n streamChat.See translation\n </button>\n </div>\n <div\n class=\"\n str-chat__message-data\n str-chat__message-simple-data\n str-chat__message-metadata\n \"\n >\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <ng-container *ngIf=\"themeVersion === '2'\">\n <ng-container *ngTemplateOutlet=\"messageStatus\"></ng-container>\n </ng-container>\n <span\n data-testid=\"sender\"\n *ngIf=\"!isSentByCurrentUser\"\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 data-testid=\"date\" class=\"str-chat__message-simple-timestamp\">\n {{ parsedDate }}\n </span>\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 customDeliveredStatusTemplate || 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 [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Delivered\" | translate }}\n </div>\n </popper-content>\n <stream-icon-placeholder\n data-testid=\"delivered-icon\"\n icon=\"delivered-icon\"\n ></stream-icon-placeholder>\n </span>\n </ng-template>\n <ng-template #sendingStatus>\n <ng-container\n *ngTemplateOutlet=\"\n customSendingStatusTemplate || 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 [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div class=\"str-chat__tooltip str-chat__tooltip-angular\">\n {{ \"streamChat.Sending...\" | translate }}\n </div>\n </popper-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 customReadStatusTemplate || defaultReadStatus;\n context: getReadStatusContext()\n \"\n ></ng-container>\n </ng-template>\n <ng-template #defaultReadStatus>\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 [popper]=\"popperContent\"\n [popperTrigger]=\"popperTriggerHover\"\n [popperPlacement]=\"popperPlacementAuto\"\n [popperHideOnScroll]=\"false\"\n [popperHideOnClickOutside]=\"false\"\n (hover)=\"$event.stopPropagation()\"\n >\n <popper-content #popperContent>\n <div\n class=\"str-chat__tooltip str-chat__tooltip-angular\"\n data-testid=\"read-by-tooltip\"\n >\n {{ readByText }}\n </div>\n </popper-content>\n <stream-avatar-placeholder\n class=\"str-chat-angular__avatar-host\"\n data-test-id=\"last-read-user-avatar\"\n [size]=\"15\"\n [imageUrl]=\"lastReadUser?.image\"\n [name]=\"lastReadUser?.name || lastReadUser?.id\"\n type=\"user\"\n location=\"message-reader\"\n [user]=\"lastReadUser\"\n ></stream-avatar-placeholder>\n <span\n data-test-id=\"read-by-length\"\n *ngIf=\"isReadByMultipleUsers\"\n class=\"str-chat__message-simple-status-number\"\n >\n {{ (message?.readBy)!.length }}\n </span>\n </span>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #replyCountButton let-position=\"position\">\n <!-- eslint-disable @angular-eslint/template/conditional-complexity -->\n <div\n *ngIf=\"\n (position === 'inside-message-bubble' && themeVersion === '1') ||\n (position === 'outside-message-bubble' && themeVersion === '2')\n \"\n class=\"\n str-chat__message-simple-reply-button\n str-chat__message-replies-count-button-wrapper\n \"\n >\n <!-- eslint-enable @angular-eslint/template/conditional-complexity -->\n <button\n *ngIf=\"shouldDisplayThreadLink\"\n class=\"str-chat__message-replies-count-button\"\n data-testid=\"reply-count-button\"\n (click)=\"setAsActiveParentMessage()\"\n >\n <stream-icon-placeholder\n *ngIf=\"themeVersion === '1'\"\n stream-icon-placeholder\n icon=\"reply\"\n ></stream-icon-placeholder>\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 attachmentListTemplate || defaultAttachments;\n context: getAttachmentListContext()\n \"\n ></ng-container>\n</ng-template>\n", components: [{ type: i6.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "size", "location", "channel", "user", "type", "initialsType"] }, { type: i7.NgxPopperjsContentComponent, selector: "popper-content" }, { type: i8.MessageActionsBoxComponent, selector: "stream-message-actions-box", inputs: ["isOpen", "isMine", "message", "enabledActions", "customActions"], outputs: ["displayedActionsCount", "isEditing"] }, { type: i9.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon", "size"] }, { type: i10.MessageReactionsComponent, selector: "stream-message-reactions", inputs: ["messageId", "messageReactionCounts", "isSelectorOpen", "latestReactions", "ownReactions"], outputs: ["isSelectorOpenChange"] }, { type: i11.AttachmentListComponent, selector: "stream-attachment-list", inputs: ["messageId", "parentMessageId", "attachments"], outputs: ["imageModalStateChange"] }, { type: i12.LoadingIndicatorPlaceholderComponent, selector: "stream-loading-indicator-placeholder", inputs: ["size", "color"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.NgxPopperjsDirective, selector: "[popper]", inputs: ["popperTimeout", "popperTimeoutAfterShow", "popperApplyClass", "popper", "popperDisabled", "popperPlacement", "popperApplyArrowClass", "popperPreventOverflow", "popperHideOnClickOutside", "popperTrigger", "popperStyles", "popperAriaDescribeBy", "popperAriaRole", "popperBoundaries", "popperCloseOnClickOutside", "popperDisableAnimation", "popperDisableStyle", "popperHideOnMouseLeave", "popperHideOnScroll", "popperAppendTo", "popperModifiers", "popperPositionFixed", "popperDelay", "popperShowOnStart", "popperTarget"], outputs: ["popperOnHidden", "popperOnShown", "popperOnUpdate"], exportAs: ["popper"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i14.TranslatePipe } });
|
|
346
347
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageComponent, decorators: [{
|
|
347
348
|
type: Component,
|
|
348
349
|
args: [{
|
|
@@ -350,7 +351,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
350
351
|
templateUrl: './message.component.html',
|
|
351
352
|
styles: [],
|
|
352
353
|
}]
|
|
353
|
-
}], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i2.ChannelService }, { type: i3.CustomTemplatesService }, { type: i0.ChangeDetectorRef }, { type: i4.ThemeService }]; }, propDecorators: { message: [{
|
|
354
|
+
}], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i2.ChannelService }, { type: i3.CustomTemplatesService }, { type: i0.ChangeDetectorRef }, { type: i4.ThemeService }, { type: i5.DateParserService }]; }, propDecorators: { message: [{
|
|
354
355
|
type: Input
|
|
355
356
|
}], enabledMessageActions: [{
|
|
356
357
|
type: Input
|
|
@@ -366,4 +367,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
366
367
|
type: ViewChild,
|
|
367
368
|
args: ['container']
|
|
368
369
|
}] } });
|
|
369
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlL21lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBSUwsU0FBUyxHQUlWLE1BQU0sZUFBZSxDQUFDO0FBaUJ2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUdyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBUTFFOztHQUVHO0FBTUgsTUFBTSxPQUFPLGdCQUFnQjtJQXdEM0IsWUFDVSxpQkFBb0MsRUFDcEMsY0FBOEIsRUFDOUIsc0JBQThDLEVBQzlDLEtBQXdCLEVBQ2hDLFlBQTBCO1FBSmxCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUF2RGxDOztXQUVHO1FBQ00sMEJBQXFCLEdBQWEsRUFBRSxDQUFDO1FBSzlDOztXQUVHO1FBQ00sU0FBSSxHQUFzQixNQUFNLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUMvQjs7V0FFRztRQUNNLGtCQUFhLEdBQThCLEVBQUUsQ0FBQztRQUt2RCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QiwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDL0IsK0JBQTBCLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLHFCQUFnQixHQUFrQixFQUFFLENBQUM7UUFXckMsdUJBQWtCLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBQy9DLHVCQUFrQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQztRQUMvQyx3QkFBbUIsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7UUFDakQsbUNBQThCLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLGdDQUEyQixHQUErQixVQUFVLENBQUM7UUFDckUsOEJBQXlCLEdBQXdCLFFBQVEsQ0FBQztRQUdsRCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFZekMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO0lBQ2hELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUNwRCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxDQUNoRCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FDM0QsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxDQUN2RCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FDOUQsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFFBQVEsQ0FBQyxDQUMxRCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FDN0QsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxDQUN6RCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FDNUQsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLFFBQVEsQ0FBQyxDQUM5RCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDMUQsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLFFBQVEsQ0FBQyxDQUM1RCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FDdkQsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxDQUN6RCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FDMUQsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFFB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QUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixTQUNFLFFBQVEsQ0FBQyxDQUFDLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDLEVBQ3JELElBQUksS0FBSyxTQUFTLENBQ3JCLENBQUM7UUFFRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sc0JBQXNCLENBQUMsT0FBZTtRQUM1QyxNQUFNLFNBQVMsR0FDYixnS0FBZ0ssQ0FBQztRQUNuSyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FDdkIsU0FBUyxFQUNULENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEtBQUssb0JBQW9CLEtBQUssTUFBTSxDQUM1RCxDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7NkdBN2FVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLHlYQ2xEN0IsaXB3QkE4b0JBOzJGRDVsQmEsZ0JBQWdCO2tCQUw1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFdBQVcsRUFBRSwwQkFBMEI7b0JBQ3ZDLE1BQU0sRUFBRSxFQUFFO2lCQUNYO3FPQUtVLE9BQU87c0JBQWYsS0FBSztnQkFJRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBSUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxhQUFhO3NCQUFyQixLQUFLO2dCQUlHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBNEIwQixTQUFTO3NCQUF4QyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50LCBVc2VyUmVzcG9uc2UgfSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSB9IGZyb20gJy4uL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudExpc3RDb250ZXh0LFxuICBNZW50aW9uVGVtcGxhdGVDb250ZXh0LFxuICBNZXNzYWdlQWN0aW9uc0JveENvbnRleHQsXG4gIE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0LFxuICBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzLFxuICBTdHJlYW1NZXNzYWdlLFxuICBEZWxpdmVyZWRTdGF0dXNDb250ZXh0LFxuICBTZW5kaW5nU3RhdHVzQ29udGV4dCxcbiAgUmVhZFN0YXR1c0NvbnRleHQsXG4gIEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtLFxuICBTeXN0ZW1NZXNzYWdlQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSAnLi9wYXJzZS1kYXRlJztcbmltcG9ydCBlbW9qaVJlZ2V4IGZyb20gJ2Vtb2ppLXJlZ2V4JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uL3RoZW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd4UG9wcGVyanNUcmlnZ2VycywgTmd4UG9wcGVyanNQbGFjZW1lbnRzIH0gZnJvbSAnbmd4LXBvcHBlcmpzJztcblxudHlwZSBNZXNzYWdlUGFydCA9IHtcbiAgY29udGVudDogc3RyaW5nO1xuICB0eXBlOiAndGV4dCcgfCAnbWVudGlvbic7XG4gIHVzZXI/OiBVc2VyUmVzcG9uc2U7XG59O1xuXG4vKipcbiAqIFRoZSBgTWVzc2FnZWAgY29tcG9uZW50IGRpc3BsYXlzIGEgbWVzc2FnZSB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBzZW5kZXIgYW5kIGRhdGUsIGFuZCBlbmFibGVzIFtpbnRlcmFjdGlvbiB3aXRoIHRoZSBtZXNzYWdlIChpLmUuIGVkaXQgb3IgcmVhY3QpXSguLi9jb25jZXB0cy9tZXNzYWdlLWludGVyYWN0aW9ucy5tZHgpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tbWVzc2FnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgW2NoYW5uZWwgY2FwYWJpbGl0aWVzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9jaGFubmVsX2NhcGFiaWxpdGllcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkgdGhhdCBhcmUgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgdXNlciwgdGhlIGxpc3Qgb2YgW3N1cHBvcnRlZCBpbnRlcmFjdGlvbnNdKC4uL2NvbmNlcHRzL21lc3NhZ2UtaW50ZXJhY3Rpb25zLm1keCkgY2FuIGJlIGZvdW5kIGluIG91ciBtZXNzYWdlIGludGVyYWN0aW9uIGd1aWRlLiBVbmF0aG9yaXplZCBhY3Rpb25zIHdvbid0IGJlIGRpc3BsYXllZCBvbiB0aGUgVUkuIFRoZSBbYE1lc3NhZ2VMaXN0YF0oLi9NZXNzYWdlTGlzdENvbXBvbmVudC5tZHgpIGNvbXBvbmVudCBhdXRvbWF0aWNhbGx5IHNldHMgdGhpcyBiYXNlZCBvbiBbY2hhbm5lbCBjYXBhYmlsaXRpZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2NoYW5uZWxfY2FwYWJpbGl0aWVzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIG1lc3NhZ2Ugc3RhdHVzIChzZW5kaW5nLCBzZW50LCB3aG8gcmVhZCB0aGUgbWVzc2FnZSkgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgaXNMYXN0U2VudE1lc3NhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBtZXNzYWdlIGlzIGJlaW5nIGRpc3BhbHllZCBpbiBhIGNoYW5uZWwgb3IgaW4gYSBbdGhyZWFkXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU6ICd0aHJlYWQnIHwgJ21haW4nID0gJ21haW4nO1xuICAvKipcbiAgICogSGlnaGxpZ2h0aW5nIGlzIHVzZWQgdG8gYWRkIHZpc3VhbCBlbXBoYXNpemUgdG8gYSBtZXNzYWdlIHdoZW4ganVtcGluZyB0byB0aGUgbWVzc2FnZVxuICAgKi9cbiAgQElucHV0KCkgaXNIaWdobGlnaHRlZCA9IGZhbHNlO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGN1c3RvbSBtZXNzYWdlIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBhY3Rpb24gYm94XG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21BY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbVtdID0gW107XG4gIHJlYWRvbmx5IHRoZW1lVmVyc2lvbjogJzEnIHwgJzInO1xuICBjYW5SZWNlaXZlUmVhZEV2ZW50czogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgY2FuUmVhY3RUb01lc3NhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGlzRWRpdGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgaXNBY3Rpb25Cb3hPcGVuID0gZmFsc2U7XG4gIGlzUmVhY3Rpb25TZWxlY3Rvck9wZW4gPSBmYWxzZTtcbiAgdmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSAwO1xuICBtZXNzYWdlVGV4dFBhcnRzOiBNZXNzYWdlUGFydFtdID0gW107XG4gIG1lbnRpb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8TWVudGlvblRlbXBsYXRlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURlbGl2ZXJlZFN0YXR1c1RlbXBsYXRlOlxuICAgIHwgVGVtcGxhdGVSZWY8RGVsaXZlcmVkU3RhdHVzQ29udGV4dD5cbiAgICB8IHVuZGVmaW5lZDtcbiAgY3VzdG9tU2VuZGluZ1N0YXR1c1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxTZW5kaW5nU3RhdHVzQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbVJlYWRTdGF0dXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8UmVhZFN0YXR1c0NvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBhdHRhY2htZW50TGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxBdHRhY2htZW50TGlzdENvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBtZXNzYWdlQWN0aW9uc0JveFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlQWN0aW9uc0JveENvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBtZXNzYWdlUmVhY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgc3lzdGVtTWVzc2FnZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxTeXN0ZW1NZXNzYWdlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIHBvcHBlclRyaWdnZXJDbGljayA9IE5neFBvcHBlcmpzVHJpZ2dlcnMuY2xpY2s7XG4gIHBvcHBlclRyaWdnZXJIb3ZlciA9IE5neFBvcHBlcmpzVHJpZ2dlcnMuaG92ZXI7XG4gIHBvcHBlclBsYWNlbWVudEF1dG8gPSBOZ3hQb3BwZXJqc1BsYWNlbWVudHMuQVVUTztcbiAgc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gZmFsc2U7XG4gIGRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudDogJ29yaWdpbmFsJyB8ICd0cmFuc2xhdGlvbicgPSAnb3JpZ2luYWwnO1xuICBpbWFnZUF0dGFjaG1lbnRNb2RhbFN0YXRlOiAnb3BlbmVkJyB8ICdjbG9zZWQnID0gJ2Nsb3NlZCc7XG4gIHByaXZhdGUgcXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlcjogVXNlclJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIHByaXZhdGUgY29udGFpbmVyOlxuICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy50aGVtZVZlcnNpb24gPSB0aGVtZVNlcnZpY2UudGhlbWVWZXJzaW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLnVzZXIkLnN1YnNjcmliZSgodSkgPT4ge1xuICAgICAgICB0aGlzLnVzZXIgPSB1O1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lbnRpb25UZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLm1lbnRpb25UZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuYXR0YWNobWVudExpc3RUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmF0dGFjaG1lbnRMaXN0VGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VBY3Rpb25zQm94VGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5tZXNzYWdlQWN0aW9uc0JveFRlbXBsYXRlID0gdGVtcGxhdGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlUmVhY3Rpb25zVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5tZXNzYWdlUmVhY3Rpb25zVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRlbGl2ZXJlZFN0YXR1c1RlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tRGVsaXZlcmVkU3RhdHVzVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnNlbmRpbmdTdGF0dXNUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbVNlbmRpbmdTdGF0dXNUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UucmVhZFN0YXR1c1RlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tUmVhZFN0YXR1c1RlbXBsYXRlID0gdGVtcGxhdGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5zeXN0ZW1NZXNzYWdlVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5zeXN0ZW1NZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gZmFsc2U7XG4gICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICdvcmlnaW5hbCc7XG4gICAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cygpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxBdHRhY2htZW50cyA9IHRoaXMubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmF0dGFjaG1lbnRzO1xuICAgICAgdGhpcy5xdW90ZWRNZXNzYWdlQXR0YWNobWVudHMgPVxuICAgICAgICBvcmlnaW5hbEF0dGFjaG1lbnRzICYmIG9yaWdpbmFsQXR0YWNobWVudHMubGVuZ3RoXG4gICAgICAgICAgPyBbb3JpZ2luYWxBdHRhY2htZW50c1swXV1cbiAgICAgICAgICA6IFtdO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgIHRoaXMuY2FuUmVhY3RUb01lc3NhZ2UgPVxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdzZW5kLXJlYWN0aW9uJykgIT09IC0xO1xuICAgICAgdGhpcy5jYW5SZWNlaXZlUmVhZEV2ZW50cyA9XG4gICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgZ2V0IHNob3VsZERpc3BsYXlUaHJlYWRMaW5rKCkge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMubWVzc2FnZT8ucmVwbHlfY291bnQgJiZcbiAgICAgIHRoaXMubW9kZSAhPT0gJ3RocmVhZCcgJiZcbiAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3NlbmQtcmVwbHknKSAhPT0gLTFcbiAgICApO1xuICB9XG5cbiAgZ2V0IGlzU2VudEJ5Q3VycmVudFVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZT8udXNlcj8uaWQgPT09IHRoaXMudXNlcj8uaWQ7XG4gIH1cblxuICBnZXQgcmVhZEJ5VGV4dCgpIHtcbiAgICByZXR1cm4gbGlzdFVzZXJzKHRoaXMubWVzc2FnZSEucmVhZEJ5KTtcbiAgfVxuXG4gIGdldCBsYXN0UmVhZFVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZT8ucmVhZEJ5LmZpbHRlcigodSkgPT4gdS5pZCAhPT0gdGhpcy51c2VyPy5pZClbMF07XG4gIH1cblxuICBnZXQgaXNPbmx5UmVhZEJ5TWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZSAmJiB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBpc1JlYWRCeU11bHRpcGxlVXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZSAmJiB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDE7XG4gIH1cblxuICBnZXQgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5ICYmXG4gICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAncmVjZWl2ZWQnICYmXG4gICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgZ2V0IHBhcnNlZERhdGUoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2UgfHwgIXRoaXMubWVzc2FnZT8uY3JlYXRlZF9hdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VEYXRlKHRoaXMubWVzc2FnZS5jcmVhdGVkX2F0KTtcbiAgfVxuXG4gIGdldCBhcmVPcHRpb25zVmlzaWJsZSgpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIShcbiAgICAgICF0aGlzLm1lc3NhZ2UudHlwZSB8fFxuICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdlcnJvcicgfHxcbiAgICAgIHRoaXMubWVzc2FnZS50eXBlID09PSAnc3lzdGVtJyB8fFxuICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdlcGhlbWVyYWwnIHx8XG4gICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAnZmFpbGVkJyB8fFxuICAgICAgdGhpcy5tZXNzYWdlLnN0YXR1cyA9PT0gJ3NlbmRpbmcnIHx8XG4gICAgICAodGhpcy5tb2RlID09PSAndGhyZWFkJyAmJiAhdGhpcy5tZXNzYWdlLnBhcmVudF9pZClcbiAgICApO1xuICB9XG5cbiAgZ2V0IGhhc0F0dGFjaG1lbnQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5tZXNzYWdlPy5hdHRhY2htZW50cyAmJiAhIXRoaXMubWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGg7XG4gIH1cblxuICBnZXQgaGFzUmVhY3Rpb25zKCkge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLm1lc3NhZ2UucmVhY3Rpb25fY291bnRzKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIGdldCByZXBseUNvdW50UGFyYW0oKSB7XG4gICAgcmV0dXJuIHsgcmVwbHlDb3VudDogdGhpcy5tZXNzYWdlPy5yZXBseV9jb3VudCB9O1xuICB9XG5cbiAgZ2V0IGNhbkRpc3BsYXlSZWFkU3RhdHVzKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNhblJlY2VpdmVSZWFkRXZlbnRzICE9PSBmYWxzZSAmJlxuICAgICAgdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTFcbiAgICApO1xuICB9XG5cbiAgZ2V0QXR0YWNobWVudExpc3RDb250ZXh0KCk6IEF0dGFjaG1lbnRMaXN0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5pZCB8fCAnJyxcbiAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLm1lc3NhZ2U/LmF0dGFjaG1lbnRzIHx8IFtdLFxuICAgICAgcGFyZW50TWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LnBhcmVudF9pZCxcbiAgICAgIGltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXI6IChzdGF0ZSkgPT5cbiAgICAgICAgKHRoaXMuaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZSA9IHN0YXRlKSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZUNvbnRleHQoKTogU3lzdGVtTWVzc2FnZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgaXNIaWdobGlnaHRlZDogdGhpcy5pc0hpZ2hsaWdodGVkLFxuICAgICAgaXNMYXN0U2VudE1lc3NhZ2U6IHRoaXMuaXNMYXN0U2VudE1lc3NhZ2UsXG4gICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICBjdXN0b21BY3Rpb25zOiB0aGlzLmN1c3RvbUFjdGlvbnMsXG4gICAgICBwYXJzZWREYXRlOiB0aGlzLnBhcnNlZERhdGUsXG4gICAgfTtcbiAgfVxuXG4gIGdldFF1b3RlZE1lc3NhZ2VBdHRhY2htZW50TGlzdENvbnRleHQoKTogQXR0YWNobWVudExpc3RDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5pZCB8fCAnJyxcbiAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLnF1b3RlZE1lc3NhZ2VBdHRhY2htZW50cyEsXG4gICAgICBwYXJlbnRNZXNzYWdlSWQ6IHRoaXM/Lm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5wYXJlbnRfaWQsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0KCk6IE1lc3NhZ2VSZWFjdGlvbnNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZVJlYWN0aW9uQ291bnRzOiB0aGlzLm1lc3NhZ2U/LnJlYWN0aW9uX2NvdW50cyB8fCB7fSxcbiAgICAgIGxhdGVzdFJlYWN0aW9uczogdGhpcy5tZXNzYWdlPy5sYXRlc3RfcmVhY3Rpb25zIHx8IFtdLFxuICAgICAgaXNTZWxlY3Rvck9wZW46IHRoaXMuaXNSZWFjdGlvblNlbGVjdG9yT3BlbixcbiAgICAgIGlzU2VsZWN0b3JPcGVuQ2hhbmdlSGFuZGxlcjogKGlzT3BlbikgPT5cbiAgICAgICAgKHRoaXMuaXNSZWFjdGlvblNlbGVjdG9yT3BlbiA9IGlzT3BlbiksXG4gICAgICBtZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8uaWQsXG4gICAgICBvd25SZWFjdGlvbnM6IHRoaXMubWVzc2FnZT8ub3duX3JlYWN0aW9ucyB8fCBbXSxcbiAgICB9O1xuICB9XG5cbiAgcmVzZW5kTWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UucmVzZW5kTWVzc2FnZSh0aGlzLm1lc3NhZ2UhKTtcbiAgfVxuXG4gIHNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2Uuc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKHRoaXMubWVzc2FnZSk7XG4gIH1cblxuICBnZXRNZW50aW9uQ29udGV4dChtZXNzYWdlUGFydDogTWVzc2FnZVBhcnQpOiBNZW50aW9uVGVtcGxhdGVDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogbWVzc2FnZVBhcnQuY29udGVudCxcbiAgICAgIHVzZXI6IG1lc3NhZ2VQYXJ0LnVzZXIhLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlQWN0aW9uc0JveENvbnRleHQoKTogTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNPcGVuOiB0aGlzLmlzQWN0aW9uQm94T3BlbixcbiAgICAgIGlzTWluZTogdGhpcy5pc1NlbnRCeUN1cnJlbnRVc2VyLFxuICAgICAgZW5hYmxlZEFjdGlvbnM6IHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgZGlzcGxheWVkQWN0aW9uc0NvdW50Q2hhbmVIYW5sZXI6IChjb3VudCkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gY291bnQ7XG4gICAgICAgIC8vIG1lc3NhZ2UgYWN0aW9uIGJveCBjaGFuZ2VzIFVJIGJpbmRpbmdzIGluIHBhcmVudCwgc28gd2UnbGwgaGF2ZSB0byByZXJ1biBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGRpc3BsYXllZEFjdGlvbnNDb3VudENoYW5nZUhhbmRsZXI6IChjb3VudCkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gY291bnQ7XG4gICAgICAgIC8vIG1lc3NhZ2UgYWN0aW9uIGJveCBjaGFuZ2VzIFVJIGJpbmRpbmdzIGluIHBhcmVudCwgc28gd2UnbGwgaGF2ZSB0byByZXJ1biBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGlzRWRpdGluZ0NoYW5nZUhhbmRsZXI6IChpc0VkaXRpbmcpID0+IHtcbiAgICAgICAgdGhpcy5pc0VkaXRpbmcgPSBpc0VkaXRpbmc7XG4gICAgICAgIHRoaXMuaXNBY3Rpb25Cb3hPcGVuID0gIXRoaXMuaXNFZGl0aW5nO1xuICAgICAgfSxcbiAgICAgIGN1c3RvbUFjdGlvbnM6IHRoaXMuY3VzdG9tQWN0aW9ucyB8fCBbXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVsaXZlcmVkU3RhdHVzQ29udGV4dCgpOiBEZWxpdmVyZWRTdGF0dXNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICB9O1xuICB9XG5cbiAgZ2V0U2VuZGluZ1N0YXR1c0NvbnRleHQoKTogU2VuZGluZ1N0YXR1c0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBnZXRSZWFkU3RhdHVzQ29udGV4dCgpOiBSZWFkU3RhdHVzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgICByZWFkQnlUZXh0OiB0aGlzLnJlYWRCeVRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGp1bXBUb01lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcsIHBhcmVudE1lc3NhZ2VJZD86IHN0cmluZykge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKG1lc3NhZ2VJZCwgcGFyZW50TWVzc2FnZUlkKTtcbiAgfVxuXG4gIGRpc3BsYXlUcmFuc2xhdGVkTWVzc2FnZSgpIHtcbiAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cyh0cnVlKTtcbiAgfVxuXG4gIGRpc3BsYXlPcmlnaW5hbE1lc3NhZ2UoKSB7XG4gICAgdGhpcy5jcmVhdGVNZXNzYWdlUGFydHMoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNZXNzYWdlUGFydHMoc2hvdWxkVHJhbnNsYXRlID0gdHJ1ZSkge1xuICAgIGxldCBjb250ZW50ID0gdGhpcy5nZXRNZXNzYWdlQ29udGVudChzaG91bGRUcmFuc2xhdGUpO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpc0hUTUwgPSBmYWxzZTtcbiAgICAgIC8vIEJhY2tlbmQgd2lsbCB3cmFwIEhUTUwgY29udGVudCB3aXRoIDxwPjwvcD5cXG5cbiAgICAgIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoJzxwPicpKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoJzxwPicsICcnKTtcbiAgICAgICAgaXNIVE1MID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZW50LmVuZHNXaXRoKCc8L3A+XFxuJykpIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgnPC9wPlxcbicsICcnKTtcbiAgICAgICAgaXNIVE1MID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzIHx8XG4gICAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmZpeEVtb2ppRGlzcGxheShjb250ZW50KTtcbiAgICAgICAgaWYgKCFpc0hUTUwpIHtcbiAgICAgICAgICBjb250ZW50ID0gdGhpcy53cmFwTGluc2tXaXRoQW5jaG9yVGFnKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IFt7IGNvbnRlbnQsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cyA9IFtdO1xuICAgICAgICBsZXQgdGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMubWVzc2FnZSEubWVudGlvbmVkX3VzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBtZW50aW9uID0gYEAke3VzZXIubmFtZSB8fCB1c2VyLmlkfWA7XG4gICAgICAgICAgbGV0IHByZWNlZGluZ1RleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0LmluZGV4T2YobWVudGlvbikpO1xuICAgICAgICAgIHByZWNlZGluZ1RleHQgPSB0aGlzLmZpeEVtb2ppRGlzcGxheShwcmVjZWRpbmdUZXh0KTtcbiAgICAgICAgICBpZiAoIWlzSFRNTCkge1xuICAgICAgICAgICAgcHJlY2VkaW5nVGV4dCA9IHRoaXMud3JhcExpbnNrV2l0aEFuY2hvclRhZyhwcmVjZWRpbmdUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzLnB1c2goe1xuICAgICAgICAgICAgY29udGVudDogcHJlY2VkaW5nVGV4dCxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMucHVzaCh7XG4gICAgICAgICAgICBjb250ZW50OiBtZW50aW9uLFxuICAgICAgICAgICAgdHlwZTogJ21lbnRpb24nLFxuICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHByZWNlZGluZ1RleHQgKyBtZW50aW9uLCAnJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgIHRleHQgPSB0aGlzLmZpeEVtb2ppRGlzcGxheSh0ZXh0KTtcbiAgICAgICAgICBpZiAoIWlzSFRNTCkge1xuICAgICAgICAgICAgdGV4dCA9IHRoaXMud3JhcExpbnNrV2l0aEFuY2hvclRhZyh0ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzLnB1c2goeyBjb250ZW50OiB0ZXh0LCB0eXBlOiAndGV4dCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1lc3NhZ2VDb250ZW50KHNob3VsZFRyYW5zbGF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IHRoaXMubWVzc2FnZT8uaHRtbCB8fCB0aGlzLm1lc3NhZ2U/LnRleHQ7XG4gICAgaWYgKHNob3VsZFRyYW5zbGF0ZSkge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLm1lc3NhZ2U/LnRyYW5zbGF0aW9uO1xuICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPSAndHJhbnNsYXRpb24nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uIHx8IG9yaWdpbmFsQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPSAnb3JpZ2luYWwnO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsQ29udGVudDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpeEVtb2ppRGlzcGxheShjb250ZW50OiBzdHJpbmcpIHtcbiAgICAvLyBXcmFwIGVtb2ppcyBpbiBzcGFuIHRvIGRpc3BsYXkgZW1vamlzIGNvcnJlY3RseSBpbiBDaHJvbWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTk2MjIzXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGVtb2ppUmVnZXgoKSwgJ2cnKTtcbiAgICAvLyBCYXNlZCBvbiB0aGlzOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NTY1MTEyL2phdmFzY3JpcHQtaG93LXRvLWZpbmQtb3V0LWlmLXRoZS11c2VyLWJyb3dzZXItaXMtY2hyb21lXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgY29uc3QgaXNDaHJvbWUgPVxuICAgICAgISEod2luZG93IGFzIGFueSkuY2hyb21lICYmIHR5cGVvZiAod2luZG93IGFzIGFueSkub3ByID09PSAndW5kZWZpbmVkJztcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICByZWdleCxcbiAgICAgIChtYXRjaCkgPT5cbiAgICAgICAgYDxzcGFuICR7XG4gICAgICAgICAgaXNDaHJvbWUgPyAnY2xhc3M9XCJzdHItY2hhdF9fZW1vamktZGlzcGxheS1maXhcIicgOiAnJ1xuICAgICAgICB9PiR7bWF0Y2h9PC9zcGFuPmBcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIHdyYXBMaW5za1dpdGhBbmNob3JUYWcoY29udGVudDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXJsUmVnZXhwID1cbiAgICAgIC8oPzooPzpodHRwcz98ZnRwfGZpbGUpOlxcL1xcL3x3d3dcXC58ZnRwXFwuKSg/OlxcKFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0qXFwpfFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0pKig/OlxcKFstQS1aMC05KyZAIy8lPX5ffCQ/ITosLl0qXFwpfFtBLVowLTkrJkAjLyU9fl98JF0pL2dpbTtcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgdXJsUmVnZXhwLFxuICAgICAgKG1hdGNoKSA9PiBgPGEgaHJlZj1cIiR7bWF0Y2h9XCIgcmVsPVwibm9mb2xsb3dcIj4ke21hdGNofTwvYT5gXG4gICAgKTtcblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJcbiAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUgc3RyLWNoYXRfX21lc3NhZ2Ugc3RyLWNoYXRfX21lc3NhZ2UtLXt7XG4gICAgbWVzc2FnZT8udHlwZVxuICB9fSBzdHItY2hhdF9fbWVzc2FnZS0te3sgbWVzc2FnZT8uc3RhdHVzIH19IHt7XG4gICAgbWVzc2FnZT8udGV4dCA/ICdzdHItY2hhdF9fbWVzc2FnZS0taGFzLXRleHQnIDogJ2hhcy1uby10ZXh0J1xuICB9fVwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0tbWVdPVwiaXNTZW50QnlDdXJyZW50VXNlclwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0tb3RoZXJdPVwiIWlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLS1tZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1oYXMtYXR0YWNobWVudF09XCJoYXNBdHRhY2htZW50XCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS13aXRoLXJlYWN0aW9uc109XCJoYXNSZWFjdGlvbnNcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLWhpZ2hsaWdodGVkXT1cImlzSGlnaGxpZ2h0ZWRcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utd2l0aC10aHJlYWQtbGlua109XCJzaG91bGREaXNwbGF5VGhyZWFkTGlua1wiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1zZW5kLWNhbi1iZS1yZXRyaWVkXT1cIlxuICAgIG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgbWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDNcbiAgXCJcbiAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWNvbnRhaW5lclwiXG4gIChtb3VzZWxlYXZlKT1cImlzQWN0aW9uQm94T3BlbiA9IGZhbHNlXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXNzYWdlPy5kZWxldGVkX2F0OyBlbHNlIGRlbGV0ZWRNZXNzYWdlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2U/LnR5cGUgIT09ICdzeXN0ZW0nOyBlbHNlIHN5c3RlbU1lc3NhZ2VcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcxJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVzc2FnZVN0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICBkYXRhLXRlc3RpZD1cImF2YXRhclwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICAgIFtpbWFnZVVybF09XCJtZXNzYWdlPy51c2VyPy5pbWFnZVwiXG4gICAgICAgIFtuYW1lXT1cIm1lc3NhZ2U/LnVzZXI/Lm5hbWUgfHwgbWVzc2FnZT8udXNlcj8uaWRcIlxuICAgICAgICB0eXBlPVwidXNlclwiXG4gICAgICAgIGxvY2F0aW9uPVwibWVzc2FnZS1zZW5kZXJcIlxuICAgICAgICBbdXNlcl09XCJtZXNzYWdlPy51c2VyIHx8IHVuZGVmaW5lZFwiXG4gICAgICA+PC9zdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWlubmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9ucyBzdHItY2hhdF9fbWVzc2FnZS1vcHRpb25zXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2Utb3B0aW9uc1wiXG4gICAgICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLWVkaXQtaW4tcHJvZ3Jlc3NdPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAqbmdJZj1cImFyZU9wdGlvbnNWaXNpYmxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1hY3Rpb25zLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAjbWVzc2FnZUFjdGlvbnNUb2dnbGVcbiAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtY29udGFpbmVyXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZV9fYWN0aW9uc19fYWN0aW9uLS1vcHRpb25zXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2NsYXNzLnN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb24tLW9wdGlvbnMtLWVkaXRpbmddPVwiXG4gICAgICAgICAgICAgIGlzRWRpdGluZ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtwb3BwZXJdPVwicG9wcGVyQ29udGVudFwiXG4gICAgICAgICAgICBbcG9wcGVyVHJpZ2dlcl09XCJwb3BwZXJUcmlnZ2VyQ2xpY2tcIlxuICAgICAgICAgICAgW3BvcHBlclBsYWNlbWVudF09XCJwb3BwZXJQbGFjZW1lbnRBdXRvXCJcbiAgICAgICAgICAgIFtwb3BwZXJIaWRlT25TY3JvbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcG9wcGVySGlkZU9uQ2xpY2tPdXRzaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgW3BvcHBlckhpZGVPbk1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwb3BwZXItY29udGVudCAjcG9wcGVyQ29udGVudD5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgI2RlZmF1bHRNZXNzYWdlQWN0aW9uc0JveFxuICAgICAgICAgICAgICAgIGxldC1pc09wZW49XCJpc09wZW5cIlxuICAgICAgICAgICAgICAgIGxldC1pc01pbmU9XCJpc01pbmVcIlxuICAgICAgICAgICAgICAgIGxldC1lbmFibGVkQWN0aW9ucz1cImVuYWJsZWRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgICBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgbGV0LWRpc3BsYXllZEFjdGlvbnNDb3VudENoYW5nZUhhbmRsZXI9XCJkaXNwbGF5ZWRBY3Rpb25zQ291bnRDaGFuZ2VIYW5kbGVyXCJcbiAgICAgICAgICAgICAgICBsZXQtaXNFZGl0aW5nQ2hhbmdlSGFuZGxlcj1cImlzRWRpdGluZ0NoYW5nZUhhbmRsZXJcIlxuICAgICAgICAgICAgICAgIGxldC1jdXN0b21BY3Rpb25zPVwiY3VzdG9tQWN0aW9uc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3RyZWFtLW1lc3NhZ2UtYWN0aW9ucy1ib3hcbiAgICAgICAgICAgICAgICAgIFtpc09wZW5dPVwiaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAgIFtpc01pbmVdPVwiaXNNaW5lXCJcbiAgICAgICAgICAgICAgICAgIFtlbmFibGVkQWN0aW9uc109XCJlbmFibGVkQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlSW5wdXRcIlxuICAgICAgICAgICAgICAgICAgW2N1c3RvbUFjdGlvbnNdPVwiY3VzdG9tQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAoZGlzcGxheWVkQWN0aW9uc0NvdW50KT1cIlxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRBY3Rpb25zQ291bnRDaGFuZ2VIYW5kbGVyKCRldmVudClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAoaXNFZGl0aW5nKT1cImlzRWRpdGluZ0NoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtYWN0aW9ucy1ib3g+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUFjdGlvbnNCb3hUZW1wbGF0ZSB8fCBkZWZhdWx0TWVzc2FnZUFjdGlvbnNCb3g7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiBnZXRNZXNzYWdlQWN0aW9uc0JveENvbnRleHQoKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3BvcHBlci1jb250ZW50PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWFjdGlvbnMtYm94LWJ1dHRvblwiXG4gICAgICAgICAgICAgICpuZ0lmPVwidmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPiAwXCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhY3Rpb24taWNvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJpc0FjdGlvbkJveE9wZW4gPSAhaXNBY3Rpb25Cb3hPcGVuXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImlzQWN0aW9uQm94T3BlbiA9ICFpc0FjdGlvbkJveE9wZW5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBpY29uPVwiYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2NvbmRpdGlvbmFsLWNvbXBsZXhpdHkgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3NlbmQtcmVwbHknKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgbW9kZSA9PT0gJ21haW4nXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb25cbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb24tLXRocmVhZFxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1yZXBseS1pbi10aHJlYWQtYnV0dG9uXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJyZXBseS1pbi10aHJlYWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICBpY29uPVwicmVwbHktaW4tdGhyZWFkXCJcbiAgICAgICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuUmVhY3RUb01lc3NhZ2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb25cbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb24tLXJlYWN0aW9uc1xuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtYnV0dG9uXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJyZWFjdGlvbi1pY29uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpc1JlYWN0aW9uU2VsZWN0b3JPcGVuID0gIWlzUmVhY3Rpb25TZWxlY3Rvck9wZW5cIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImlzUmVhY3Rpb25TZWxlY3Rvck9wZW4gPSAhaXNSZWFjdGlvblNlbGVjdG9yT3BlblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgICBpY29uPVwicmVhY3Rpb24taWNvblwiXG4gICAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZWFjdGlvbnMtaG9zdFwiPlxuICAgICAgICAgIDwhLS0gZXNsaW50LWVuYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY29uZGl0aW9uYWwtY29tcGxleGl0eSAtLT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNkZWZhdWx0TWVzc2FnZVJlYWN0aW9uc1xuICAgICAgICAgICAgbGV0LW1lc3NhZ2VSZWFjdGlvbkNvdW50cz1cIm1lc3NhZ2VSZWFjdGlvbkNvdW50c1wiXG4gICAgICAgICAgICBsZXQtbGF0ZXN0UmVhY3Rpb25zPVwibGF0ZXN0UmVhY3Rpb25zXCJcbiAgICAgICAgICAgIGxldC1pc1NlbGVjdG9yT3Blbj1cImlzU2VsZWN0b3JPcGVuXCJcbiAgICAgICAgICAgIGxldC1pc1NlbGVjdG9yT3BlbkNoYW5nZUhhbmRsZXI9XCJpc1NlbGVjdG9yT3BlbkNoYW5nZUhhbmRsZXJcIlxuICAgICAgICAgICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICBsZXQtb3duUmVhY3Rpb25zPVwib3duUmVhY3Rpb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLW1lc3NhZ2UtcmVhY3Rpb25zXG4gICAgICAgICAgICAgIFttZXNzYWdlUmVhY3Rpb25Db3VudHNdPVwibWVzc2FnZVJlYWN0aW9uQ291bnRzXCJcbiAgICAgICAgICAgICAgW2xhdGVzdFJlYWN0aW9uc109XCJsYXRlc3RSZWFjdGlvbnNcIlxuICAgICAgICAgICAgICBbaXNTZWxlY3Rvck9wZW5dPVwiaXNTZWxlY3Rvck9wZW5cIlxuICAgICAgICAgICAgICAoaXNTZWxlY3Rvck9wZW5DaGFuZ2UpPVwiaXNTZWxlY3Rvck9wZW5DaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICBbbWVzc2FnZUlkXT1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICAgIFtvd25SZWFjdGlvbnNdPVwib3duUmVhY3Rpb25zXCJcbiAgICAgICAgICAgID48L3N0cmVhbS1tZXNzYWdlLXJlYWN0aW9ucz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIG1lc3NhZ2VSZWFjdGlvbnNUZW1wbGF0ZSB8fCBkZWZhdWx0TWVzc2FnZVJlYWN0aW9ucztcbiAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZVJlYWN0aW9uc0NvbnRleHQoKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCkgZml4ZXMgc2Nyb2xsaW5nIGlzc3VlcyBvbiBpT1MsIHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTAxMDU3ODAvZWxlbWVudHMtZGlzYXBwZWFyLXdoZW4tc2Nyb2xsaW5nLWluLXNhZmFyaS13ZWJraXQtdHJhbnNmb3JtLWZpeC1vbmx5LXdvcmtzLXQvNTAxNDQyOTUjNTAxNDQyOTUgLS0+XG4gICAgICAgIDwhLS0gdHJhbnNmb3JtOiBub25lIGlzIHJlcXVpcmVkIHdoZW4gaW1hZ2UgY2Fyb3VzZWwgaXMgb3BlbiBpbiBvcmRlciBmb3IgdGhlIG1vZGFsIHRvIGJlIGNvcnJlY3RseSBwb3NpdGlvbmVkLCBzZWUgaG93IHRoZSB0cmFuc2Zvcm0gcHJvcGVydHkgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgZml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcG9zaXRpb24gIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB7e1xuICAgICAgICAgICAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZSA9PT0gJ29wZW5lZCdcbiAgICAgICAgICAgICAgPyAnbm9uZSdcbiAgICAgICAgICAgICAgOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgICAgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0F0dGFjaG1lbnQgJiYgIW1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudHNUZW1wbGF0ZVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2U/LnRleHQgfHwgKG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlICYmIGhhc0F0dGFjaG1lbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaW5uZXItbWVzc2FnZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtdGV4dC1pbm5lciBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtdGV4dC1pbm5lclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtbGlnaHQtdGV4dC1pbm5lci0taGFzLWF0dGFjaG1lbnRdPVwiXG4gICAgICAgICAgICAgICAgaGFzQXR0YWNobWVudFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgbWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJyAmJiBtZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgIT09IDQwM1xuICAgICAgICAgICAgICAgICAgPyByZXNlbmRNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJcbiAgICAgICAgICAgICAgICBtZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnICYmIG1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSAhPT0gNDAzXG4gICAgICAgICAgICAgICAgICA/IHJlc2VuZE1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInF1b3RlZE1lc3NhZ2VcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0F0dGFjaG1lbnQgJiYgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImF0dGFjaG1lbnRzVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImNsaWVudC1lcnJvci1tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2U/LnR5cGUgPT09ICdlcnJvcidcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgICAgICBzdHItY2hhdF9fc2ltcGxlLW1lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLS1lcnJvci1tZXNzYWdlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5FcnJvciDCtyBVbnNlbnRcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZXJyb3ItbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgICAgICAgc3RyLWNoYXRfX3NpbXBsZS1tZXNzYWdlLS1lcnJvci1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS0tZXJyb3ItbWVzc2FnZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgKG1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSA9PT0gNDAzXG4gICAgICAgICAgICAgICAgICAgID8gXCJzdHJlYW1DaGF0Lk1lc3NhZ2UgRmFpbGVkIMK3IFVuYXV0aG9yaXplZFwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJzdHJlYW1DaGF0Lk1lc3NhZ2UgRmFpbGVkIMK3IENsaWNrIHRvIHRyeSBhZ2FpblwiXG4gICAgICAgICAgICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJ0ZXh0XCI+XG4gICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICA8IS0tIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvdXNlLXRyYWNrLWJ5LWZ1bmN0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGFydCBvZiBtZXNzYWdlVGV4dFBhcnRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwYXJ0LnR5cGUgPT09ICd0ZXh0JzsgZWxzZSBtZW50aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInBhcnQuY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWVudGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRNZW50aW9uIGxldC1jb250ZW50PVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1tZW50aW9uXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtZW50aW9uVGVtcGxhdGUgfHwgZGVmYXVsdE1lbnRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lbnRpb25Db250ZXh0KHBhcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICpuZ0lmPVwidGhlbWVWZXJzaW9uID09PSAnMidcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1lcnJvci1pY29uXCJcbiAgICAgICAgICAgIGljb249XCJlcnJvclwiXG4gICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIHJlcGx5Q291bnRCdXR0b247XG4gICAgICAgICAgICBjb250ZXh0OiB7IHBvc2l0aW9uOiAnaW5zaWRlLW1lc3NhZ2UtYnViYmxlJyB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIG1lc3NhZ2VEYXRlQW5kU2VuZGVyO1xuICAgICAgICAgICAgY29udGV4dDogeyBwb3NpdGlvbjogJ2luc2lkZS1tZXNzYWdlLWJ1YmJsZScgfVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIHJlcGx5Q291bnRCdXR0b247XG4gICAgICAgICAgY29udGV4dDogeyBwb3NpdGlvbjogJ291dHNpZGUtbWVzc2FnZS1idWJibGUnLCBtZXNzYWdlOiBtZXNzYWdlIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIG1lc3NhZ2VEYXRlQW5kU2VuZGVyO1xuICAgICAgICAgIGNvbnRleHQ6IHsgcG9zaXRpb246ICdvdXRzaWRlLW1lc3NhZ2UtYnViYmxlJyB9XG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVsZXRlZE1lc3NhZ2U+XG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWRlbGV0ZWQtY29tcG9uZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1kZWxldGVkLWlubmVyXCIgdHJhbnNsYXRlPlxuICAgICAgc3RyZWFtQ2hhdC5UaGlzIG1lc3NhZ2Ugd2FzIGRlbGV0ZWQuLi5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N5c3RlbU1lc3NhZ2U+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgc3lzdGVtTWVzc2FnZVRlbXBsYXRlIHx8IGRlZmF1bHRTeXN0ZW1NZXNzYWdlO1xuICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUNvbnRleHQoKVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U3lzdGVtTWVzc2FnZSBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiPlxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJzeXN0ZW0tbWVzc2FnZVwiIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX3RleHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLS1zeXN0ZW1fX2xpbmVcIj48L2Rpdj5cbiAgICAgICAgPHA+e3sgbWVzc2FnZUlucHV0Py50ZXh0IH19PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fbGluZVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fZGF0ZVwiPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcXVvdGVkTWVzc2FnZT5cbiAgPGRpdlxuICAgICpuZ0lmPVwibWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIlxuICAgIGNsYXNzPVwicXVvdGVkLW1lc3NhZ2Ugc3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLXByZXZpZXdcIlxuICAgIGRhdGEtdGVzdGlkPVwicXVvdGVkLW1lc3NhZ2UtY29udGFpbmVyXCJcbiAgICBbY2xhc3MubWluZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgICAoY2xpY2spPVwiXG4gICAgICBqdW1wVG9NZXNzYWdlKFxuICAgICAgICAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UpIS5pZCxcbiAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnBhcmVudF9pZFxuICAgICAgKVxuICAgIFwiXG4gICAgKGtleXVwLmVudGVyKT1cIlxuICAgICAganVtcFRvTWVzc2FnZShcbiAgICAgICAgKG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlKSEuaWQsXG4gICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5wYXJlbnRfaWRcbiAgICAgIClcbiAgICBcIlxuICA+XG4gICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgIGRhdGEtdGVzdGlkPVwicW91dGVkLW1lc3NhZ2UtYXZhdGFyXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3Qgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLWF2YXRhclwiXG4gICAgICBbaW1hZ2VVcmxdPVwibWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnVzZXI/LmltYWdlXCJcbiAgICAgIFtuYW1lXT1cIlxuICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8ubmFtZSB8fCBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8uaWRcbiAgICAgIFwiXG4gICAgICBbc2l6ZV09XCIyMFwiXG4gICAgICB0eXBlPVwidXNlclwiXG4gICAgICBsb2NhdGlvbj1cInF1b3RlZC1tZXNzYWdlLXNlbmRlclwiXG4gICAgICBbdXNlcl09XCJtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlciB8fCB1bmRlZmluZWRcIlxuICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gICAgPGRpdiBjbGFzcz1cInF1b3RlZC1tZXNzYWdlLWlubmVyIHN0ci1jaGF0X19xdW90ZWQtbWVzc2FnZS1idWJibGVcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uYXR0YWNobWVudHMgJiZcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uYXR0YWNobWVudHM/Lmxlbmd0aFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAjZGVmYXVsdEF0dGFjaG1lbnRzXG4gICAgICAgICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgbGV0LWF0dGFjaG1lbnRzPVwiYXR0YWNobWVudHNcIlxuICAgICAgICAgIGxldC1wYXJlbnRNZXNzYWdlSWQ9XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgICAgICAgIGxldC1pbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3RyZWFtLWF0dGFjaG1lbnQtbGlzdFxuICAgICAgICAgICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlSWRcIlxuICAgICAgICAgICAgW2F0dGFjaG1lbnRzXT1cImF0dGFjaG1lbnRzXCJcbiAgICAgICAgICAgIFtwYXJlbnRNZXNzYWdlSWRdPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICAgICAgICAgIChpbWFnZU1vZGFsU3RhdGVDaGFuZ2UpPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zdHJlYW0tYXR0YWNobWVudC1saXN0PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRMaXN0VGVtcGxhdGUgfHwgZGVmYXVsdEF0dGFjaG1lbnRzO1xuICAgICAgICAgICAgY29udGV4dDogZ2V0UXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRMaXN0Q29udGV4dCgpXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2XG4gICAgICAgIGRhdGEtdGVzdGlkPVwicXVvdGVkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnRyYW5zbGF0aW9uIHx8XG4gICAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/Lmh0bWwgfHxcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udGV4dFxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gV2UgbmVlZCB0aGVzZSBtYXJrdXBzIGluIHNsaWdodGx5IGRpZmZlcmVudCBwb3NpdGlvbnMgaW4gdGhlbWUtdjEgYW5kIHRoZW1lLXYyLCB0aGlzIHNvdWx0aW9uIG1ha2VzIHRoYXQgcG9zc2libGUgd2l0aG91dCBkdXBsaWNhdGluZyB0aGUgY29kZSAtLT5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZURhdGVBbmRTZW5kZXIgbGV0LXBvc2l0aW9uPVwicG9zaXRpb25cIj5cbiAgPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY29uZGl0aW9uYWwtY29tcGxleGl0eSAtLT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICAocG9zaXRpb24gPT09ICdpbnNpZGUtbWVzc2FnZS1idWJibGUnICYmIHRoZW1lVmVyc2lvbiA9PT0gJzEnKSB8fFxuICAgICAgKHBvc2l0aW9uID09PSAnb3V0c2lkZS1tZXNzYWdlLWJ1YmJsZScgJiYgdGhlbWVWZXJzaW9uID09PSAnMicpXG4gICAgXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3RyYW5zbGF0aW9uLW5vdGljZVwiXG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZVwiXG4gICAgICBkYXRhLXRlc3RpZD1cInRyYW5zbGF0aW9uLW5vdGljZVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlZS1vcmlnaW5hbFwiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID09PSAndHJhbnNsYXRpb24nXCJcbiAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlPcmlnaW5hbE1lc3NhZ2UoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJkaXNwbGF5T3JpZ2luYWxNZXNzYWdlKClcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgc3RyZWFtQ2hhdC5TZWUgb3JpZ2luYWwgKGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZClcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlZS10cmFuc2xhdGlvblwiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheWVkTWVzc2FnZVRleHRDb250ZW50ID09PSAnb3JpZ2luYWwnXCJcbiAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlUcmFuc2xhdGVkTWVzc2FnZSgpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cImRpc3BsYXlUcmFuc2xhdGVkTWVzc2FnZSgpXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICA+XG4gICAgICAgIHN0cmVhbUNoYXQuU2VlIHRyYW5zbGF0aW9uXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIlxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1kYXRhXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1kYXRhXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW1ldGFkYXRhXG4gICAgICBcIlxuICAgID5cbiAgICAgIDwhLS0gZXNsaW50LWVuYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY29uZGl0aW9uYWwtY29tcGxleGl0eSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcyJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVzc2FnZVN0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3BhblxuICAgICAgICBkYXRhLXRlc3RpZD1cInNlbmRlclwiXG4gICAgICAgICpuZ0lmPVwiIWlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1uYW1lIHN0ci1jaGF0X19tZXNzYWdlLXNlbmRlci1uYW1lXCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzc2FnZT8udXNlcj8ubmFtZSA/IG1lc3NhZ2U/LnVzZXI/Lm5hbWUgOiBtZXNzYWdlPy51c2VyPy5pZCB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJkYXRlXCIgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtdGltZXN0YW1wXCI+XG4gICAgICAgIHt7IHBhcnNlZERhdGUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21lc3NhZ2VTdGF0dXM+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdJZj1cIlxuICAgICAgaXNTZW50QnlDdXJyZW50VXNlciAmJlxuICAgICAgKChpc0xhc3RTZW50TWVzc2FnZSAmJiBtZXNzYWdlPy5zdGF0dXMgPT09ICdyZWNlaXZlZCcpIHx8XG4gICAgICAgIG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ3NlbmRpbmcnKVxuICAgIFwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZT8uc3RhdHVzID09PSAnc2VuZGluZyc7IGVsc2Ugc2VudFN0YXR1c1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbmRpbmdTdGF0dXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3NlbnRTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgbW9kZSA9PT0gJ21haW4nICYmIGlzTWVzc2FnZURlbGl2ZXJlZEFuZFJlYWQgJiYgY2FuRGlzcGxheVJlYWRTdGF0dXM7XG4gICAgICAgICAgZWxzZSBkZWxpdmVyZWRTdGF0dXNcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlYWRTdGF0dXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWxpdmVyZWRTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgY3VzdG9tRGVsaXZlcmVkU3RhdHVzVGVtcGxhdGUgfHwgZGVmYXVsdERlbGl2ZXJlZFN0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXREZWxpdmVyZWRTdGF0dXNDb250ZXh0KClcbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERlbGl2ZXJlZFN0YXR1cz5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ21haW4nXCJcbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZGVsaXZlcmVkLWluZGljYXRvclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtwb3BwZXJdPVwicG9wcGVyQ29udGVudFwiXG4gICAgICAgIFtwb3BwZXJUcmlnZ2VyXT1cInBvcHBlclRyaWdnZXJIb3ZlclwiXG4gICAgICAgIFtwb3BwZXJQbGFjZW1lbnRdPVwicG9wcGVyUGxhY2VtZW50QXV0b1wiXG4gICAgICAgIFtwb3BwZXJIaWRlT25TY3JvbGxdPVwiZmFsc2VcIlxuICAgICAgICBbcG9wcGVySGlkZU9uQ2xpY2tPdXRzaWRlXT1cImZhbHNlXCJcbiAgICAgICAgKGhvdmVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICA+XG4gICAgICAgIDxwb3BwZXItY29udGVudCAjcG9wcGVyQ29udGVudD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3Rvb2x0aXAgc3RyLWNoYXRfX3Rvb2x0aXAtYW5ndWxhclwiPlxuICAgICAgICAgICAge3sgXCJzdHJlYW1DaGF0LkRlbGl2ZXJlZFwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcG9wcGVyLWNvbnRlbnQ+XG4gICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGVsaXZlcmVkLWljb25cIlxuICAgICAgICAgIGljb249XCJkZWxpdmVyZWQtaWNvblwiXG4gICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNzZW5kaW5nU3RhdHVzPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIGN1c3RvbVNlbmRpbmdTdGF0dXNUZW1wbGF0ZSB8fCBkZWZhdWx0U2VuZGluZ1N0YXR1cztcbiAgICAgICAgICBjb250ZXh0OiBnZXRTZW5kaW5nU3RhdHVzQ29udGV4dCgpXG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZW5kaW5nU3RhdHVzPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1cy1hbmd1bGFyXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc3RhdHVzXG4gICAgICAgIFwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VuZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbcG9wcGVyXT1cInBvcHBlckNvbnRlbnRcIlxuICAgICAgICBbcG9wcGVyVHJpZ2dlcl09XCJwb3BwZXJUcmlnZ2VySG92ZXJcIlxuICAgICAgICBbcG9wcGVyUGxhY2VtZW50XT1cInBvcHBlclBsYWNlbWVudEF1dG9cIlxuICAgICAgICBbcG9wcGVySGlkZU9uU2Nyb2xsXT1cImZhbHNlXCJcbiAgICAgICAgW3BvcHBlckhpZGVPbkNsaWNrT3V0c2lkZV09XCJmYWxzZVwiXG4gICAgICAgIChob3Zlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgPlxuICAgICAgICA8cG9wcGVyLWNvbnRlbnQgI3BvcHBlckNvbnRlbnQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIj5cbiAgICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5TZW5kaW5nLi4uXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wb3BwZXItY29udGVudD5cbiAgICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlclxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3ItcGxhY2Vob2xkZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI3JlYWRTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgY3VzdG9tUmVhZFN0YXR1c1RlbXBsYXRlIHx8IGRlZmF1bHRSZWFkU3RhdHVzO1xuICAgICAgICAgIGNvbnRleHQ6IGdldFJlYWRTdGF0dXNDb250ZXh0KClcbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJlYWRTdGF0dXM+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXNcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzLWFuZ3VsYXJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zdGF0dXNcbiAgICAgICAgXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJyZWFkLWluZGljYXRvclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtwb3BwZXJdPVwicG9wcGVyQ29udGVudFwiXG4gICAgICAgIFtwb3BwZXJUcmlnZ2VyXT1cInBvcHBlclRyaWdnZXJIb3ZlclwiXG4gICAgICAgIFtwb3BwZXJQbGFjZW1lbnRdPVwicG9wcGVyUGxhY2VtZW50QXV0b1wiXG4gICAgICAgIFtwb3BwZXJIaWRlT25TY3JvbGxdPVwiZmFsc2VcIlxuICAgICAgICBbcG9wcGVySGlkZU9uQ2xpY2tPdXRzaWRlXT1cImZhbHNlXCJcbiAgICAgICAgKGhvdmVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICA+XG4gICAgICAgIDxwb3BwZXItY29udGVudCAjcG9wcGVyQ29udGVudD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190b29sdGlwIHN0ci1jaGF0X190b29sdGlwLWFuZ3VsYXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJyZWFkLWJ5LXRvb2x0aXBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHJlYWRCeVRleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wb3BwZXItY29udGVudD5cbiAgICAgICAgPHN0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0LWFuZ3VsYXJfX2F2YXRhci1ob3N0XCJcbiAgICAgICAgICBkYXRhLXRlc3QtaWQ9XCJsYXN0LXJlYWQtdXNlci1hdmF0YXJcIlxuICAgICAgICAgIFtzaXplXT1cIjE1XCJcbiAgICAgICAgICBbaW1hZ2VVcmxdPVwibGFzdFJlYWRVc2VyPy5pbWFnZVwiXG4gICAgICAgICAgW25hbWVdPVwibGFzdFJlYWRVc2VyPy5uYW1lIHx8IGxhc3RSZWFkVXNlcj8uaWRcIlxuICAgICAgICAgIHR5cGU9XCJ1c2VyXCJcbiAgICAgICAgICBsb2NhdGlvbj1cIm1lc3NhZ2UtcmVhZGVyXCJcbiAgICAgICAgICBbdXNlcl09XCJsYXN0UmVhZFVzZXJcIlxuICAgICAgICA+PC9zdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGRhdGEtdGVzdC1pZD1cInJlYWQtYnktbGVuZ3RoXCJcbiAgICAgICAgICAqbmdJZj1cImlzUmVhZEJ5TXVsdGlwbGVVc2Vyc1wiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzLW51bWJlclwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAobWVzc2FnZT8ucmVhZEJ5KSEubGVuZ3RoIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVwbHlDb3VudEJ1dHRvbiBsZXQtcG9zaXRpb249XCJwb3NpdGlvblwiPlxuICA8IS0tIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9jb25kaXRpb25hbC1jb21wbGV4aXR5IC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIChwb3NpdGlvbiA9PT0gJ2luc2lkZS1tZXNzYWdlLWJ1YmJsZScgJiYgdGhlbWVWZXJzaW9uID09PSAnMScpIHx8XG4gICAgICAocG9zaXRpb24gPT09ICdvdXRzaWRlLW1lc3NhZ2UtYnViYmxlJyAmJiB0aGVtZVZlcnNpb24gPT09ICcyJylcbiAgICBcIlxuICAgIGNsYXNzPVwiXG4gICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtcmVwbHktYnV0dG9uXG4gICAgICBzdHItY2hhdF9fbWVzc2FnZS1yZXBsaWVzLWNvdW50LWJ1dHRvbi13cmFwcGVyXG4gICAgXCJcbiAgPlxuICAgIDwhLS0gZXNsaW50LWVuYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY29uZGl0aW9uYWwtY29tcGxleGl0eSAtLT5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlUaHJlYWRMaW5rXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtcmVwbGllcy1jb3VudC1idXR0b25cIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJyZXBseS1jb3VudC1idXR0b25cIlxuICAgICAgKGNsaWNrKT1cInNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpXCJcbiAgICA+XG4gICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcxJ1wiXG4gICAgICAgIHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgIGljb249XCJyZXBseVwiXG4gICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgIHt7bWVzc2FnZT8ucmVwbHlfY291bnQgPT09IDEgPyAoJ3N0cmVhbUNoYXQuMSByZXBseScgfCB0cmFuc2xhdGUpIDogKCdzdHJlYW1DaGF0Lnt7IHJlcGx5Q291bnQgfX1cbiAgICAgIHJlcGxpZXMnIHwgdHJhbnNsYXRlOnJlcGx5Q291bnRQYXJhbSl9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXR0YWNobWVudHNUZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHRBdHRhY2htZW50c1xuICAgIGxldC1tZXNzYWdlSWQ9XCJtZXNzYWdlSWRcIlxuICAgIGxldC1hdHRhY2htZW50cz1cImF0dGFjaG1lbnRzXCJcbiAgICBsZXQtcGFyZW50TWVzc2FnZUlkPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICBsZXQtaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcj1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXJcIlxuICA+XG4gICAgPHN0cmVhbS1hdHRhY2htZW50LWxpc3RcbiAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgIFthdHRhY2htZW50c109XCJhdHRhY2htZW50c1wiXG4gICAgICBbcGFyZW50TWVzc2FnZUlkXT1cInBhcmVudE1lc3NhZ2VJZFwiXG4gICAgICAoaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlKT1cImltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgPjwvc3RyZWFtLWF0dGFjaG1lbnQtbGlzdD5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBhdHRhY2htZW50TGlzdFRlbXBsYXRlIHx8IGRlZmF1bHRBdHRhY2htZW50cztcbiAgICAgIGNvbnRleHQ6IGdldEF0dGFjaG1lbnRMaXN0Q29udGV4dCgpXG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvbWVzc2FnZS9tZXNzYWdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlL21lc3NhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBSUwsU0FBUyxHQUlWLE1BQU0sZUFBZSxDQUFDO0FBaUJ2QixPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFHckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTMUU7O0dBRUc7QUFNSCxNQUFNLE9BQU8sZ0JBQWdCO0lBd0QzQixZQUNVLGlCQUFvQyxFQUNwQyxjQUE4QixFQUM5QixzQkFBOEMsRUFDOUMsS0FBd0IsRUFDaEMsWUFBMEIsRUFDbEIsVUFBNkI7UUFMN0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUV4QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQXpEdkM7O1dBRUc7UUFDTSwwQkFBcUIsR0FBYSxFQUFFLENBQUM7UUFLOUM7O1dBRUc7UUFDTSxTQUFJLEdBQXNCLE1BQU0sQ0FBQztRQUMxQzs7V0FFRztRQUNNLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQy9COztXQUVHO1FBQ00sa0JBQWEsR0FBOEIsRUFBRSxDQUFDO1FBS3ZELG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUMvQiwrQkFBMEIsR0FBRyxDQUFDLENBQUM7UUFDL0IscUJBQWdCLEdBQWtCLEVBQUUsQ0FBQztRQVdyQyx1QkFBa0IsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7UUFDL0MsdUJBQWtCLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBQy9DLHdCQUFtQixHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQztRQUNqRCxtQ0FBOEIsR0FBRyxLQUFLLENBQUM7UUFDdkMsZ0NBQTJCLEdBQStCLFVBQVUsQ0FBQztRQUNyRSw4QkFBeUIsR0FBd0IsUUFBUSxDQUFDO1FBR2xELGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQWF6QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7SUFDaEQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQ3BELENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQ2hELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUMzRCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDLENBQ3ZELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUM5RCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxDQUFDLENBQzFELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUM3RCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLENBQ3pELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUM1RCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsUUFBUSxDQUFDLENBQzlELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUMxRCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsUUFBUSxDQUFDLENBQzVELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUN2RCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLENBQ3pELENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUMxRCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsUUFB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LENBQ3ZCLEtBQUssRUFDTCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ1IsU0FDRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxFQUNyRCxJQUFJLEtBQUssU0FBUyxDQUNyQixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQWU7UUFDNUMsTUFBTSxTQUFTLEdBQ2IsZ0tBQWdLLENBQUM7UUFDbkssT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQ3ZCLFNBQVMsRUFDVCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsWUFBWSxLQUFLLG9CQUFvQixLQUFLLE1BQU0sQ0FDNUQsQ0FBQztRQUVGLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OzZHQTlhVSxnQkFBZ0I7aUdBQWhCLGdCQUFnQix5WENsRDdCLGlwd0JBOG9CQTsyRkQ1bEJhLGdCQUFnQjtrQkFMNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixXQUFXLEVBQUUsMEJBQTBCO29CQUN2QyxNQUFNLEVBQUUsRUFBRTtpQkFDWDtxUUFLVSxPQUFPO3NCQUFmLEtBQUs7Z0JBSUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFJRyxhQUFhO3NCQUFyQixLQUFLO2dCQTRCMEIsU0FBUztzQkFBeEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXR0YWNobWVudCwgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRMaXN0Q29udGV4dCxcbiAgTWVudGlvblRlbXBsYXRlQ29udGV4dCxcbiAgTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0LFxuICBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgU3RyZWFtTWVzc2FnZSxcbiAgRGVsaXZlcmVkU3RhdHVzQ29udGV4dCxcbiAgU2VuZGluZ1N0YXR1c0NvbnRleHQsXG4gIFJlYWRTdGF0dXNDb250ZXh0LFxuICBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbSxcbiAgU3lzdGVtTWVzc2FnZUNvbnRleHQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBlbW9qaVJlZ2V4IGZyb20gJ2Vtb2ppLXJlZ2V4JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uL3RoZW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd4UG9wcGVyanNUcmlnZ2VycywgTmd4UG9wcGVyanNQbGFjZW1lbnRzIH0gZnJvbSAnbmd4LXBvcHBlcmpzJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5cbnR5cGUgTWVzc2FnZVBhcnQgPSB7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgdHlwZTogJ3RleHQnIHwgJ21lbnRpb24nO1xuICB1c2VyPzogVXNlclJlc3BvbnNlO1xufTtcblxuLyoqXG4gKiBUaGUgYE1lc3NhZ2VgIGNvbXBvbmVudCBkaXNwbGF5cyBhIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgc2VuZGVyIGFuZCBkYXRlLCBhbmQgZW5hYmxlcyBbaW50ZXJhY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSAoaS5lLiBlZGl0IG9yIHJlYWN0KV0oLi4vY29uY2VwdHMvbWVzc2FnZS1pbnRlcmFjdGlvbnMubWR4KS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1lc3NhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW10sXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZFxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIFtjaGFubmVsIGNhcGFiaWxpdGllc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvY2hhbm5lbF9jYXBhYmlsaXRpZXMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIHRoYXQgYXJlIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IHVzZXIsIHRoZSBsaXN0IG9mIFtzdXBwb3J0ZWQgaW50ZXJhY3Rpb25zXSguLi9jb25jZXB0cy9tZXNzYWdlLWludGVyYWN0aW9ucy5tZHgpIGNhbiBiZSBmb3VuZCBpbiBvdXIgbWVzc2FnZSBpbnRlcmFjdGlvbiBndWlkZS4gVW5hdGhvcml6ZWQgYWN0aW9ucyB3b24ndCBiZSBkaXNwbGF5ZWQgb24gdGhlIFVJLiBUaGUgW2BNZXNzYWdlTGlzdGBdKC4vTWVzc2FnZUxpc3RDb21wb25lbnQubWR4KSBjb21wb25lbnQgYXV0b21hdGljYWxseSBzZXRzIHRoaXMgYmFzZWQgb24gW2NoYW5uZWwgY2FwYWJpbGl0aWVzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9jaGFubmVsX2NhcGFiaWxpdGllcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBtZXNzYWdlIHN0YXR1cyAoc2VuZGluZywgc2VudCwgd2hvIHJlYWQgdGhlIG1lc3NhZ2UpIGlzIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpIGlzTGFzdFNlbnRNZXNzYWdlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgbWVzc2FnZSBpcyBiZWluZyBkaXNwYWx5ZWQgaW4gYSBjaGFubmVsIG9yIGluIGEgW3RocmVhZF0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvdGhyZWFkcy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCkuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlOiAndGhyZWFkJyB8ICdtYWluJyA9ICdtYWluJztcbiAgLyoqXG4gICAqIEhpZ2hsaWdodGluZyBpcyB1c2VkIHRvIGFkZCB2aXN1YWwgZW1waGFzaXplIHRvIGEgbWVzc2FnZSB3aGVuIGp1bXBpbmcgdG8gdGhlIG1lc3NhZ2VcbiAgICovXG4gIEBJbnB1dCgpIGlzSGlnaGxpZ2h0ZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjdXN0b20gbWVzc2FnZSBhY3Rpb25zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgYWN0aW9uIGJveFxuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tQWN0aW9uczogQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW1bXSA9IFtdO1xuICByZWFkb25seSB0aGVtZVZlcnNpb246ICcxJyB8ICcyJztcbiAgY2FuUmVjZWl2ZVJlYWRFdmVudHM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGNhblJlYWN0VG9NZXNzYWdlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBpc0VkaXRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGlzQWN0aW9uQm94T3BlbiA9IGZhbHNlO1xuICBpc1JlYWN0aW9uU2VsZWN0b3JPcGVuID0gZmFsc2U7XG4gIHZpc2libGVNZXNzYWdlQWN0aW9uc0NvdW50ID0gMDtcbiAgbWVzc2FnZVRleHRQYXJ0czogTWVzc2FnZVBhcnRbXSA9IFtdO1xuICBtZW50aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPE1lbnRpb25UZW1wbGF0ZUNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21EZWxpdmVyZWRTdGF0dXNUZW1wbGF0ZTpcbiAgICB8IFRlbXBsYXRlUmVmPERlbGl2ZXJlZFN0YXR1c0NvbnRleHQ+XG4gICAgfCB1bmRlZmluZWQ7XG4gIGN1c3RvbVNlbmRpbmdTdGF0dXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8U2VuZGluZ1N0YXR1c0NvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21SZWFkU3RhdHVzVGVtcGxhdGU6IFRlbXBsYXRlUmVmPFJlYWRTdGF0dXNDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgYXR0YWNobWVudExpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8QXR0YWNobWVudExpc3RDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZUFjdGlvbnNCb3hUZW1wbGF0ZTogVGVtcGxhdGVSZWY8TWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZVJlYWN0aW9uc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlUmVhY3Rpb25zQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIHN5c3RlbU1lc3NhZ2VUZW1wbGF0ZTogVGVtcGxhdGVSZWY8U3lzdGVtTWVzc2FnZUNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBwb3BwZXJUcmlnZ2VyQ2xpY2sgPSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmNsaWNrO1xuICBwb3BwZXJUcmlnZ2VySG92ZXIgPSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmhvdmVyO1xuICBwb3BwZXJQbGFjZW1lbnRBdXRvID0gTmd4UG9wcGVyanNQbGFjZW1lbnRzLkFVVE87XG4gIHNob3VsZERpc3BsYXlUcmFuc2xhdGlvbk5vdGljZSA9IGZhbHNlO1xuICBkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQ6ICdvcmlnaW5hbCcgfCAndHJhbnNsYXRpb24nID0gJ29yaWdpbmFsJztcbiAgaW1hZ2VBdHRhY2htZW50TW9kYWxTdGF0ZTogJ29wZW5lZCcgfCAnY2xvc2VkJyA9ICdjbG9zZWQnO1xuICBwcml2YXRlIHF1b3RlZE1lc3NhZ2VBdHRhY2htZW50czogQXR0YWNobWVudFtdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVzZXI6IFVzZXJSZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBwcml2YXRlIGNvbnRhaW5lcjpcbiAgICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICAgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGF0Q2xpZW50U2VydmljZTogQ2hhdENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZVBhcnNlcjogRGF0ZVBhcnNlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy50aGVtZVZlcnNpb24gPSB0aGVtZVNlcnZpY2UudGhlbWVWZXJzaW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLnVzZXIkLnN1YnNjcmliZSgodSkgPT4ge1xuICAgICAgICB0aGlzLnVzZXIgPSB1O1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lbnRpb25UZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLm1lbnRpb25UZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuYXR0YWNobWVudExpc3RUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmF0dGFjaG1lbnRMaXN0VGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VBY3Rpb25zQm94VGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5tZXNzYWdlQWN0aW9uc0JveFRlbXBsYXRlID0gdGVtcGxhdGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlUmVhY3Rpb25zVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5tZXNzYWdlUmVhY3Rpb25zVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRlbGl2ZXJlZFN0YXR1c1RlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tRGVsaXZlcmVkU3RhdHVzVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnNlbmRpbmdTdGF0dXNUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbVNlbmRpbmdTdGF0dXNUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UucmVhZFN0YXR1c1RlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tUmVhZFN0YXR1c1RlbXBsYXRlID0gdGVtcGxhdGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5zeXN0ZW1NZXNzYWdlVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5zeXN0ZW1NZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuc2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlID0gZmFsc2U7XG4gICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICdvcmlnaW5hbCc7XG4gICAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cygpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxBdHRhY2htZW50cyA9IHRoaXMubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmF0dGFjaG1lbnRzO1xuICAgICAgdGhpcy5xdW90ZWRNZXNzYWdlQXR0YWNobWVudHMgPVxuICAgICAgICBvcmlnaW5hbEF0dGFjaG1lbnRzICYmIG9yaWdpbmFsQXR0YWNobWVudHMubGVuZ3RoXG4gICAgICAgICAgPyBbb3JpZ2luYWxBdHRhY2htZW50c1swXV1cbiAgICAgICAgICA6IFtdO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMpIHtcbiAgICAgIHRoaXMuY2FuUmVhY3RUb01lc3NhZ2UgPVxuICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdzZW5kLXJlYWN0aW9uJykgIT09IC0xO1xuICAgICAgdGhpcy5jYW5SZWNlaXZlUmVhZEV2ZW50cyA9XG4gICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgZ2V0IHNob3VsZERpc3BsYXlUaHJlYWRMaW5rKCkge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMubWVzc2FnZT8ucmVwbHlfY291bnQgJiZcbiAgICAgIHRoaXMubW9kZSAhPT0gJ3RocmVhZCcgJiZcbiAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zLmluZGV4T2YoJ3NlbmQtcmVwbHknKSAhPT0gLTFcbiAgICApO1xuICB9XG5cbiAgZ2V0IGlzU2VudEJ5Q3VycmVudFVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZT8udXNlcj8uaWQgPT09IHRoaXMudXNlcj8uaWQ7XG4gIH1cblxuICBnZXQgcmVhZEJ5VGV4dCgpIHtcbiAgICByZXR1cm4gbGlzdFVzZXJzKHRoaXMubWVzc2FnZSEucmVhZEJ5KTtcbiAgfVxuXG4gIGdldCBsYXN0UmVhZFVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZT8ucmVhZEJ5LmZpbHRlcigodSkgPT4gdS5pZCAhPT0gdGhpcy51c2VyPy5pZClbMF07XG4gIH1cblxuICBnZXQgaXNPbmx5UmVhZEJ5TWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZSAmJiB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBpc1JlYWRCeU11bHRpcGxlVXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZSAmJiB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDE7XG4gIH1cblxuICBnZXQgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5tZXNzYWdlICYmXG4gICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5ICYmXG4gICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAncmVjZWl2ZWQnICYmXG4gICAgICB0aGlzLm1lc3NhZ2UucmVhZEJ5Lmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgZ2V0IHBhcnNlZERhdGUoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2UgfHwgIXRoaXMubWVzc2FnZT8uY3JlYXRlZF9hdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZVRpbWUodGhpcy5tZXNzYWdlLmNyZWF0ZWRfYXQpO1xuICB9XG5cbiAgZ2V0IGFyZU9wdGlvbnNWaXNpYmxlKCkge1xuICAgIGlmICghdGhpcy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhKFxuICAgICAgIXRoaXMubWVzc2FnZS50eXBlIHx8XG4gICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgdGhpcy5tZXNzYWdlLnR5cGUgPT09ICdzeXN0ZW0nIHx8XG4gICAgICB0aGlzLm1lc3NhZ2UudHlwZSA9PT0gJ2VwaGVtZXJhbCcgfHxcbiAgICAgIHRoaXMubWVzc2FnZS5zdGF0dXMgPT09ICdmYWlsZWQnIHx8XG4gICAgICB0aGlzLm1lc3NhZ2Uuc3RhdHVzID09PSAnc2VuZGluZycgfHxcbiAgICAgICh0aGlzLm1vZGUgPT09ICd0aHJlYWQnICYmICF0aGlzLm1lc3NhZ2UucGFyZW50X2lkKVxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzQXR0YWNobWVudCgpIHtcbiAgICByZXR1cm4gISF0aGlzLm1lc3NhZ2U/LmF0dGFjaG1lbnRzICYmICEhdGhpcy5tZXNzYWdlLmF0dGFjaG1lbnRzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBoYXNSZWFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5tZXNzYWdlPy5yZWFjdGlvbl9jb3VudHMgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMubWVzc2FnZS5yZWFjdGlvbl9jb3VudHMpLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgZ2V0IHJlcGx5Q291bnRQYXJhbSgpIHtcbiAgICByZXR1cm4geyByZXBseUNvdW50OiB0aGlzLm1lc3NhZ2U/LnJlcGx5X2NvdW50IH07XG4gIH1cblxuICBnZXQgY2FuRGlzcGxheVJlYWRTdGF0dXMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2FuUmVjZWl2ZVJlYWRFdmVudHMgIT09IGZhbHNlICYmXG4gICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucy5pbmRleE9mKCdyZWFkLWV2ZW50cycpICE9PSAtMVxuICAgICk7XG4gIH1cblxuICBnZXRBdHRhY2htZW50TGlzdENvbnRleHQoKTogQXR0YWNobWVudExpc3RDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZUlkOiB0aGlzLm1lc3NhZ2U/LmlkIHx8ICcnLFxuICAgICAgYXR0YWNobWVudHM6IHRoaXMubWVzc2FnZT8uYXR0YWNobWVudHMgfHwgW10sXG4gICAgICBwYXJlbnRNZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8ucGFyZW50X2lkLFxuICAgICAgaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcjogKHN0YXRlKSA9PlxuICAgICAgICAodGhpcy5pbWFnZUF0dGFjaG1lbnRNb2RhbFN0YXRlID0gc3RhdGUpLFxuICAgIH07XG4gIH1cblxuICBnZXRNZXNzYWdlQ29udGV4dCgpOiBTeXN0ZW1NZXNzYWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICBpc0hpZ2hsaWdodGVkOiB0aGlzLmlzSGlnaGxpZ2h0ZWQsXG4gICAgICBpc0xhc3RTZW50TWVzc2FnZTogdGhpcy5pc0xhc3RTZW50TWVzc2FnZSxcbiAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgIGN1c3RvbUFjdGlvbnM6IHRoaXMuY3VzdG9tQWN0aW9ucyxcbiAgICAgIHBhcnNlZERhdGU6IHRoaXMucGFyc2VkRGF0ZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0UXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRMaXN0Q29udGV4dCgpOiBBdHRhY2htZW50TGlzdENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlSWQ6IHRoaXMubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LmlkIHx8ICcnLFxuICAgICAgYXR0YWNobWVudHM6IHRoaXMucXVvdGVkTWVzc2FnZUF0dGFjaG1lbnRzISxcbiAgICAgIHBhcmVudE1lc3NhZ2VJZDogdGhpcz8ubWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnBhcmVudF9pZCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWVzc2FnZVJlYWN0aW9uc0NvbnRleHQoKTogTWVzc2FnZVJlYWN0aW9uc0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlUmVhY3Rpb25Db3VudHM6IHRoaXMubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzIHx8IHt9LFxuICAgICAgbGF0ZXN0UmVhY3Rpb25zOiB0aGlzLm1lc3NhZ2U/LmxhdGVzdF9yZWFjdGlvbnMgfHwgW10sXG4gICAgICBpc1NlbGVjdG9yT3BlbjogdGhpcy5pc1JlYWN0aW9uU2VsZWN0b3JPcGVuLFxuICAgICAgaXNTZWxlY3Rvck9wZW5DaGFuZ2VIYW5kbGVyOiAoaXNPcGVuKSA9PlxuICAgICAgICAodGhpcy5pc1JlYWN0aW9uU2VsZWN0b3JPcGVuID0gaXNPcGVuKSxcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5tZXNzYWdlPy5pZCxcbiAgICAgIG93blJlYWN0aW9uczogdGhpcy5tZXNzYWdlPy5vd25fcmVhY3Rpb25zIHx8IFtdLFxuICAgIH07XG4gIH1cblxuICByZXNlbmRNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5yZXNlbmRNZXNzYWdlKHRoaXMubWVzc2FnZSEpO1xuICB9XG5cbiAgc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UodGhpcy5tZXNzYWdlKTtcbiAgfVxuXG4gIGdldE1lbnRpb25Db250ZXh0KG1lc3NhZ2VQYXJ0OiBNZXNzYWdlUGFydCk6IE1lbnRpb25UZW1wbGF0ZUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBtZXNzYWdlUGFydC5jb250ZW50LFxuICAgICAgdXNlcjogbWVzc2FnZVBhcnQudXNlciEsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCgpOiBNZXNzYWdlQWN0aW9uc0JveENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBpc09wZW46IHRoaXMuaXNBY3Rpb25Cb3hPcGVuLFxuICAgICAgaXNNaW5lOiB0aGlzLmlzU2VudEJ5Q3VycmVudFVzZXIsXG4gICAgICBlbmFibGVkQWN0aW9uczogdGhpcy5lbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBkaXNwbGF5ZWRBY3Rpb25zQ291bnRDaGFuZUhhbmxlcjogKGNvdW50KSA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSBjb3VudDtcbiAgICAgICAgLy8gbWVzc2FnZSBhY3Rpb24gYm94IGNoYW5nZXMgVUkgYmluZGluZ3MgaW4gcGFyZW50LCBzbyB3ZSdsbCBoYXZlIHRvIHJlcnVuIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZGlzcGxheWVkQWN0aW9uc0NvdW50Q2hhbmdlSGFuZGxlcjogKGNvdW50KSA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VBY3Rpb25zQ291bnQgPSBjb3VudDtcbiAgICAgICAgLy8gbWVzc2FnZSBhY3Rpb24gYm94IGNoYW5nZXMgVUkgYmluZGluZ3MgaW4gcGFyZW50LCBzbyB3ZSdsbCBoYXZlIHRvIHJlcnVuIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgaXNFZGl0aW5nQ2hhbmdlSGFuZGxlcjogKGlzRWRpdGluZykgPT4ge1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IGlzRWRpdGluZztcbiAgICAgICAgdGhpcy5pc0FjdGlvbkJveE9wZW4gPSAhdGhpcy5pc0VkaXRpbmc7XG4gICAgICB9LFxuICAgICAgY3VzdG9tQWN0aW9uczogdGhpcy5jdXN0b21BY3Rpb25zIHx8IFtdLFxuICAgIH07XG4gIH1cblxuICBnZXREZWxpdmVyZWRTdGF0dXNDb250ZXh0KCk6IERlbGl2ZXJlZFN0YXR1c0NvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UhLFxuICAgIH07XG4gIH1cblxuICBnZXRTZW5kaW5nU3RhdHVzQ29udGV4dCgpOiBTZW5kaW5nU3RhdHVzQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSEsXG4gICAgfTtcbiAgfVxuXG4gIGdldFJlYWRTdGF0dXNDb250ZXh0KCk6IFJlYWRTdGF0dXNDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlISxcbiAgICAgIHJlYWRCeVRleHQ6IHRoaXMucmVhZEJ5VGV4dCxcbiAgICB9O1xuICB9XG5cbiAganVtcFRvTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZywgcGFyZW50TWVzc2FnZUlkPzogc3RyaW5nKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UobWVzc2FnZUlkLCBwYXJlbnRNZXNzYWdlSWQpO1xuICB9XG5cbiAgZGlzcGxheVRyYW5zbGF0ZWRNZXNzYWdlKCkge1xuICAgIHRoaXMuY3JlYXRlTWVzc2FnZVBhcnRzKHRydWUpO1xuICB9XG5cbiAgZGlzcGxheU9yaWdpbmFsTWVzc2FnZSgpIHtcbiAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VQYXJ0cyhmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lc3NhZ2VQYXJ0cyhzaG91bGRUcmFuc2xhdGUgPSB0cnVlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSB0aGlzLmdldE1lc3NhZ2VDb250ZW50KHNob3VsZFRyYW5zbGF0ZSk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGlzSFRNTCA9IGZhbHNlO1xuICAgICAgLy8gQmFja2VuZCB3aWxsIHdyYXAgSFRNTCBjb250ZW50IHdpdGggPHA+PC9wPlxcblxuICAgICAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgnPHA+JykpIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgnPHA+JywgJycpO1xuICAgICAgICBpc0hUTUwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRlbnQuZW5kc1dpdGgoJzwvcD5cXG4nKSkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKCc8L3A+XFxuJywgJycpO1xuICAgICAgICBpc0hUTUwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMgfHxcbiAgICAgICAgdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgY29udGVudCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KGNvbnRlbnQpO1xuICAgICAgICBpZiAoIWlzSFRNTCkge1xuICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLndyYXBMaW5za1dpdGhBbmNob3JUYWcoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gW3sgY29udGVudCwgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlVGV4dFBhcnRzID0gW107XG4gICAgICAgIGxldCB0ZXh0ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5tZXNzYWdlIS5tZW50aW9uZWRfdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1lbnRpb24gPSBgQCR7dXNlci5uYW1lIHx8IHVzZXIuaWR9YDtcbiAgICAgICAgICBsZXQgcHJlY2VkaW5nVGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQuaW5kZXhPZihtZW50aW9uKSk7XG4gICAgICAgICAgcHJlY2VkaW5nVGV4dCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KHByZWNlZGluZ1RleHQpO1xuICAgICAgICAgIGlmICghaXNIVE1MKSB7XG4gICAgICAgICAgICBwcmVjZWRpbmdUZXh0ID0gdGhpcy53cmFwTGluc2tXaXRoQW5jaG9yVGFnKHByZWNlZGluZ1RleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMucHVzaCh7XG4gICAgICAgICAgICBjb250ZW50OiBwcmVjZWRpbmdUZXh0LFxuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVRleHRQYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IG1lbnRpb24sXG4gICAgICAgICAgICB0eXBlOiAnbWVudGlvbicsXG4gICAgICAgICAgICB1c2VyLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UocHJlY2VkaW5nVGV4dCArIG1lbnRpb24sICcnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgdGV4dCA9IHRoaXMuZml4RW1vamlEaXNwbGF5KHRleHQpO1xuICAgICAgICAgIGlmICghaXNIVE1MKSB7XG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy53cmFwTGluc2tXaXRoQW5jaG9yVGFnKHRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1lc3NhZ2VUZXh0UGFydHMucHVzaCh7IGNvbnRlbnQ6IHRleHQsIHR5cGU6ICd0ZXh0JyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWVzc2FnZUNvbnRlbnQoc2hvdWxkVHJhbnNsYXRlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gdGhpcy5tZXNzYWdlPy5odG1sIHx8IHRoaXMubWVzc2FnZT8udGV4dDtcbiAgICBpZiAoc2hvdWxkVHJhbnNsYXRlKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMubWVzc2FnZT8udHJhbnNsYXRpb247XG4gICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaG91bGREaXNwbGF5VHJhbnNsYXRpb25Ob3RpY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICd0cmFuc2xhdGlvbic7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJhbnNsYXRpb24gfHwgb3JpZ2luYWxDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXllZE1lc3NhZ2VUZXh0Q29udGVudCA9ICdvcmlnaW5hbCc7XG4gICAgICByZXR1cm4gb3JpZ2luYWxDb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZml4RW1vamlEaXNwbGF5KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIC8vIFdyYXAgZW1vamlzIGluIHNwYW4gdG8gZGlzcGxheSBlbW9qaXMgY29ycmVjdGx5IGluIENocm9tZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01OTYyMjNcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZW1vamlSZWdleCgpLCAnZycpO1xuICAgIC8vIEJhc2VkIG9uIHRoaXM6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ1NjUxMTIvamF2YXNjcmlwdC1ob3ctdG8tZmluZC1vdXQtaWYtdGhlLXVzZXItYnJvd3Nlci1pcy1jaHJvbWVcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICBjb25zdCBpc0Nocm9tZSA9XG4gICAgICAhISh3aW5kb3cgYXMgYW55KS5jaHJvbWUgJiYgdHlwZW9mICh3aW5kb3cgYXMgYW55KS5vcHIgPT09ICd1bmRlZmluZWQnO1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgIHJlZ2V4LFxuICAgICAgKG1hdGNoKSA9PlxuICAgICAgICBgPHNwYW4gJHtcbiAgICAgICAgICBpc0Nocm9tZSA/ICdjbGFzcz1cInN0ci1jaGF0X19lbW9qaS1kaXNwbGF5LWZpeFwiJyA6ICcnXG4gICAgICAgIH0+JHttYXRjaH08L3NwYW4+YFxuICAgICk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcExpbnNrV2l0aEFuY2hvclRhZyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCB1cmxSZWdleHAgPVxuICAgICAgLyg/Oig/Omh0dHBzP3xmdHB8ZmlsZSk6XFwvXFwvfHd3d1xcLnxmdHBcXC4pKD86XFwoWy1BLVowLTkrJkAjLyU9fl98JD8hOiwuXSpcXCl8Wy1BLVowLTkrJkAjLyU9fl98JD8hOiwuXSkqKD86XFwoWy1BLVowLTkrJkAjLyU9fl98JD8hOiwuXSpcXCl8W0EtWjAtOSsmQCMvJT1+X3wkXSkvZ2ltO1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICB1cmxSZWdleHAsXG4gICAgICAobWF0Y2gpID0+IGA8YSBocmVmPVwiJHttYXRjaH1cIiByZWw9XCJub2ZvbGxvd1wiPiR7bWF0Y2h9PC9hPmBcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI2NvbnRhaW5lclxuICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZSBzdHItY2hhdF9fbWVzc2FnZSBzdHItY2hhdF9fbWVzc2FnZS0te3tcbiAgICBtZXNzYWdlPy50eXBlXG4gIH19IHN0ci1jaGF0X19tZXNzYWdlLS17eyBtZXNzYWdlPy5zdGF0dXMgfX0ge3tcbiAgICBtZXNzYWdlPy50ZXh0ID8gJ3N0ci1jaGF0X19tZXNzYWdlLS1oYXMtdGV4dCcgOiAnaGFzLW5vLXRleHQnXG4gIH19XCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1tZV09XCJpc1NlbnRCeUN1cnJlbnRVc2VyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLS1vdGhlcl09XCIhaXNTZW50QnlDdXJyZW50VXNlclwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtLW1lXT1cImlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLWhhcy1hdHRhY2htZW50XT1cImhhc0F0dGFjaG1lbnRcIlxuICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtLXdpdGgtcmVhY3Rpb25zXT1cImhhc1JlYWN0aW9uc1wiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS0taGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS13aXRoLXRocmVhZC1saW5rXT1cInNob3VsZERpc3BsYXlUaHJlYWRMaW5rXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLXNlbmQtY2FuLWJlLXJldHJpZWRdPVwiXG4gICAgbWVzc2FnZT8uc3RhdHVzID09PSAnZmFpbGVkJyAmJiBtZXNzYWdlPy5lcnJvclN0YXR1c0NvZGUgIT09IDQwM1xuICBcIlxuICBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtY29udGFpbmVyXCJcbiAgKG1vdXNlbGVhdmUpPVwiaXNBY3Rpb25Cb3hPcGVuID0gZmFsc2VcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1lc3NhZ2U/LmRlbGV0ZWRfYXQ7IGVsc2UgZGVsZXRlZE1lc3NhZ2VcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZT8udHlwZSAhPT0gJ3N5c3RlbSc7IGVsc2Ugc3lzdGVtTWVzc2FnZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoZW1lVmVyc2lvbiA9PT0gJzEnXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlU3RhdHVzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYXZhdGFyXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdC1hbmd1bGFyX19hdmF0YXItaG9zdCBzdHItY2hhdF9fbWVzc2FnZS1zZW5kZXItYXZhdGFyXCJcbiAgICAgICAgW2ltYWdlVXJsXT1cIm1lc3NhZ2U/LnVzZXI/LmltYWdlXCJcbiAgICAgICAgW25hbWVdPVwibWVzc2FnZT8udXNlcj8ubmFtZSB8fCBtZXNzYWdlPy51c2VyPy5pZFwiXG4gICAgICAgIHR5cGU9XCJ1c2VyXCJcbiAgICAgICAgbG9jYXRpb249XCJtZXNzYWdlLXNlbmRlclwiXG4gICAgICAgIFt1c2VyXT1cIm1lc3NhZ2U/LnVzZXIgfHwgdW5kZWZpbmVkXCJcbiAgICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtaW5uZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zIHN0ci1jaGF0X19tZXNzYWdlLW9wdGlvbnNcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWVzc2FnZS1vcHRpb25zXCJcbiAgICAgICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2UtZWRpdC1pbi1wcm9ncmVzc109XCJpc0VkaXRpbmdcIlxuICAgICAgICAgICpuZ0lmPVwiYXJlT3B0aW9uc1Zpc2libGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJtZXNzYWdlLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgICAgICAgICAgICNtZXNzYWdlQWN0aW9uc1RvZ2dsZVxuICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1jb250YWluZXJcbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb25cbiAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlX19hY3Rpb25zX19hY3Rpb24tLW9wdGlvbnNcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbY2xhc3Muc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnNfX2FjdGlvbi0tb3B0aW9ucy0tZWRpdGluZ109XCJcbiAgICAgICAgICAgICAgaXNFZGl0aW5nXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW3BvcHBlcl09XCJwb3BwZXJDb250ZW50XCJcbiAgICAgICAgICAgIFtwb3BwZXJUcmlnZ2VyXT1cInBvcHBlclRyaWdnZXJDbGlja1wiXG4gICAgICAgICAgICBbcG9wcGVyUGxhY2VtZW50XT1cInBvcHBlclBsYWNlbWVudEF1dG9cIlxuICAgICAgICAgICAgW3BvcHBlckhpZGVPblNjcm9sbF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtwb3BwZXJIaWRlT25DbGlja091dHNpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcG9wcGVySGlkZU9uTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBvcHBlci1jb250ZW50ICNwb3BwZXJDb250ZW50PlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAjZGVmYXVsdE1lc3NhZ2VBY3Rpb25zQm94XG4gICAgICAgICAgICAgICAgbGV0LWlzT3Blbj1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgbGV0LWlzTWluZT1cImlzTWluZVwiXG4gICAgICAgICAgICAgICAgbGV0LWVuYWJsZWRBY3Rpb25zPVwiZW5hYmxlZEFjdGlvbnNcIlxuICAgICAgICAgICAgICAgIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBsZXQtZGlzcGxheWVkQWN0aW9uc0NvdW50Q2hhbmdlSGFuZGxlcj1cImRpc3BsYXllZEFjdGlvbnNDb3VudENoYW5nZUhhbmRsZXJcIlxuICAgICAgICAgICAgICAgIGxldC1pc0VkaXRpbmdDaGFuZ2VIYW5kbGVyPVwiaXNFZGl0aW5nQ2hhbmdlSGFuZGxlclwiXG4gICAgICAgICAgICAgICAgbGV0LWN1c3RvbUFjdGlvbnM9XCJjdXN0b21BY3Rpb25zXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzdHJlYW0tbWVzc2FnZS1hY3Rpb25zLWJveFxuICAgICAgICAgICAgICAgICAgW2lzT3Blbl09XCJpc09wZW5cIlxuICAgICAgICAgICAgICAgICAgW2lzTWluZV09XCJpc01pbmVcIlxuICAgICAgICAgICAgICAgICAgW2VuYWJsZWRBY3Rpb25zXT1cImVuYWJsZWRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VJbnB1dFwiXG4gICAgICAgICAgICAgICAgICBbY3VzdG9tQWN0aW9uc109XCJjdXN0b21BY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgIChkaXNwbGF5ZWRBY3Rpb25zQ291bnQpPVwiXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZEFjdGlvbnNDb3VudENoYW5nZUhhbmRsZXIoJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIChpc0VkaXRpbmcpPVwiaXNFZGl0aW5nQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9zdHJlYW0tbWVzc2FnZS1hY3Rpb25zLWJveD5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlQWN0aW9uc0JveFRlbXBsYXRlIHx8IGRlZmF1bHRNZXNzYWdlQWN0aW9uc0JveDtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdldE1lc3NhZ2VBY3Rpb25zQm94Q29udGV4dCgpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvcG9wcGVyLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtYWN0aW9ucy1ib3gtYnV0dG9uXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ2aXNpYmxlTWVzc2FnZUFjdGlvbnNDb3VudCA+IDBcIlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFjdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlzQWN0aW9uQm94T3BlbiA9ICFpc0FjdGlvbkJveE9wZW5cIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaXNBY3Rpb25Cb3hPcGVuID0gIWlzQWN0aW9uQm94T3BlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIGljb249XCJhY3Rpb24taWNvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb24taWNvblwiXG4gICAgICAgICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY29uZGl0aW9uYWwtY29tcGxleGl0eSAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBlbmFibGVkTWVzc2FnZUFjdGlvbnMuaW5kZXhPZignc2VuZC1yZXBseScpICE9PSAtMSAmJlxuICAgICAgICAgICAgICBtb2RlID09PSAnbWFpbidcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnNfX2FjdGlvblxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnNfX2FjdGlvbi0tdGhyZWFkXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXJlcGx5LWluLXRocmVhZC1idXR0b25cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInJlcGx5LWluLXRocmVhZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKClcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb24taWNvblwiXG4gICAgICAgICAgICAgIGljb249XCJyZXBseS1pbi10aHJlYWRcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJjYW5SZWFjdFRvTWVzc2FnZVwiXG4gICAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnNfX2FjdGlvblxuICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGVfX2FjdGlvbnNfX2FjdGlvbi0tcmVhY3Rpb25zXG4gICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1idXR0b25cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWN0aW9uLWljb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImlzUmVhY3Rpb25TZWxlY3Rvck9wZW4gPSAhaXNSZWFjdGlvblNlbGVjdG9yT3BlblwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaXNSZWFjdGlvblNlbGVjdG9yT3BlbiA9ICFpc1JlYWN0aW9uU2VsZWN0b3JPcGVuXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1hY3Rpb24taWNvblwiXG4gICAgICAgICAgICAgIGljb249XCJyZWFjdGlvbi1pY29uXCJcbiAgICAgICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXJlYWN0aW9ucy1ob3N0XCI+XG4gICAgICAgICAgPCEtLSBlc2xpbnQtZW5hYmxlIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9jb25kaXRpb25hbC1jb21wbGV4aXR5IC0tPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2RlZmF1bHRNZXNzYWdlUmVhY3Rpb25zXG4gICAgICAgICAgICBsZXQtbWVzc2FnZVJlYWN0aW9uQ291bnRzPVwibWVzc2FnZVJlYWN0aW9uQ291bnRzXCJcbiAgICAgICAgICAgIGxldC1sYXRlc3RSZWFjdGlvbnM9XCJsYXRlc3RSZWFjdGlvbnNcIlxuICAgICAgICAgICAgbGV0LWlzU2VsZWN0b3JPcGVuPVwiaXNTZWxlY3Rvck9wZW5cIlxuICAgICAgICAgICAgbGV0LWlzU2VsZWN0b3JPcGVuQ2hhbmdlSGFuZGxlcj1cImlzU2VsZWN0b3JPcGVuQ2hhbmdlSGFuZGxlclwiXG4gICAgICAgICAgICBsZXQtbWVzc2FnZUlkPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgIGxldC1vd25SZWFjdGlvbnM9XCJvd25SZWFjdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdHJlYW0tbWVzc2FnZS1yZWFjdGlvbnNcbiAgICAgICAgICAgICAgW21lc3NhZ2VSZWFjdGlvbkNvdW50c109XCJtZXNzYWdlUmVhY3Rpb25Db3VudHNcIlxuICAgICAgICAgICAgICBbbGF0ZXN0UmVhY3Rpb25zXT1cImxhdGVzdFJlYWN0aW9uc1wiXG4gICAgICAgICAgICAgIFtpc1NlbGVjdG9yT3Blbl09XCJpc1NlbGVjdG9yT3BlblwiXG4gICAgICAgICAgICAgIChpc1NlbGVjdG9yT3BlbkNoYW5nZSk9XCJpc1NlbGVjdG9yT3BlbkNoYW5nZUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFttZXNzYWdlSWRdPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgW293blJlYWN0aW9uc109XCJvd25SZWFjdGlvbnNcIlxuICAgICAgICAgICAgPjwvc3RyZWFtLW1lc3NhZ2UtcmVhY3Rpb25zPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgbWVzc2FnZVJlYWN0aW9uc1RlbXBsYXRlIHx8IGRlZmF1bHRNZXNzYWdlUmVhY3Rpb25zO1xuICAgICAgICAgICAgICBjb250ZXh0OiBnZXRNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKSBmaXhlcyBzY3JvbGxpbmcgaXNzdWVzIG9uIGlPUywgc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81MDEwNTc4MC9lbGVtZW50cy1kaXNhcHBlYXItd2hlbi1zY3JvbGxpbmctaW4tc2FmYXJpLXdlYmtpdC10cmFuc2Zvcm0tZml4LW9ubHktd29ya3MtdC81MDE0NDI5NSM1MDE0NDI5NSAtLT5cbiAgICAgICAgPCEtLSB0cmFuc2Zvcm06IG5vbmUgaXMgcmVxdWlyZWQgd2hlbiBpbWFnZSBjYXJvdXNlbCBpcyBvcGVuIGluIG9yZGVyIGZvciB0aGUgbW9kYWwgdG8gYmUgY29ycmVjdGx5IHBvc2l0aW9uZWQsIHNlZSBob3cgdGhlIHRyYW5zZm9ybSBwcm9wZXJ0eSBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiBmaXhlZCBwb3NpdGlvbmVkIGVsZW1lbnRzIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9wb3NpdGlvbiAgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgc3R5bGU9XCJ0cmFuc2Zvcm06IHt7XG4gICAgICAgICAgICBpbWFnZUF0dGFjaG1lbnRNb2RhbFN0YXRlID09PSAnb3BlbmVkJ1xuICAgICAgICAgICAgICA/ICdub25lJ1xuICAgICAgICAgICAgICA6ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSdcbiAgICAgICAgICB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXR0YWNobWVudCAmJiAhbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2VcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhdHRhY2htZW50c1RlbXBsYXRlXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXRleHRcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8udGV4dCB8fCAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UgJiYgaGFzQXR0YWNobWVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpbm5lci1tZXNzYWdlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS10ZXh0LWlubmVyIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS10ZXh0LWlubmVyXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1saWdodC10ZXh0LWlubmVyLS1oYXMtYXR0YWNobWVudF09XCJcbiAgICAgICAgICAgICAgICBoYXNBdHRhY2htZW50XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICBtZXNzYWdlPy5zdGF0dXMgPT09ICdmYWlsZWQnICYmIG1lc3NhZ2U/LmVycm9yU3RhdHVzQ29kZSAhPT0gNDAzXG4gICAgICAgICAgICAgICAgICA/IHJlc2VuZE1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcgJiYgbWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlICE9PSA0MDNcbiAgICAgICAgICAgICAgICAgID8gcmVzZW5kTWVzc2FnZSgpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicXVvdGVkTWVzc2FnZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXR0YWNobWVudCAmJiBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudHNUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiY2xpZW50LWVycm9yLW1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZT8udHlwZSA9PT0gJ2Vycm9yJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICAgIHN0ci1jaGF0X19zaW1wbGUtbWVzc2FnZS0tZXJyb3ItbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgXCJzdHJlYW1DaGF0LkVycm9yIMK3IFVuc2VudFwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJlcnJvci1tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm1lc3NhZ2U/LnN0YXR1cyA9PT0gJ2ZhaWxlZCdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICAgICAgICBzdHItY2hhdF9fc2ltcGxlLW1lc3NhZ2UtLWVycm9yLW1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLS1lcnJvci1tZXNzYWdlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAobWVzc2FnZT8uZXJyb3JTdGF0dXNDb2RlID09PSA0MDNcbiAgICAgICAgICAgICAgICAgICAgPyBcInN0cmVhbUNoYXQuTWVzc2FnZSBGYWlsZWQgwrcgVW5hdXRob3JpemVkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInN0cmVhbUNoYXQuTWVzc2FnZSBGYWlsZWQgwrcgQ2xpY2sgdG8gdHJ5IGFnYWluXCJcbiAgICAgICAgICAgICAgICAgICkgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cInRleHRcIj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS91c2UtdHJhY2stYnktZnVuY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYXJ0IG9mIG1lc3NhZ2VUZXh0UGFydHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInBhcnQudHlwZSA9PT0gJ3RleHQnOyBlbHNlIG1lbnRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicGFydC5jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtZW50aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1lbnRpb24gbGV0LWNvbnRlbnQ9XCJjb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLW1lbnRpb25cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnRpb25UZW1wbGF0ZSB8fCBkZWZhdWx0TWVudGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogZ2V0TWVudGlvbkNvbnRleHQocGFydClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgKm5nSWY9XCJ0aGVtZVZlcnNpb24gPT09ICcyJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLWVycm9yLWljb25cIlxuICAgICAgICAgICAgaWNvbj1cImVycm9yXCJcbiAgICAgICAgICA+PC9zdHJlYW0taWNvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgcmVwbHlDb3VudEJ1dHRvbjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgcG9zaXRpb246ICdpbnNpZGUtbWVzc2FnZS1idWJibGUnIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgbWVzc2FnZURhdGVBbmRTZW5kZXI7XG4gICAgICAgICAgICBjb250ZXh0OiB7IHBvc2l0aW9uOiAnaW5zaWRlLW1lc3NhZ2UtYnViYmxlJyB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgcmVwbHlDb3VudEJ1dHRvbjtcbiAgICAgICAgICBjb250ZXh0OiB7IHBvc2l0aW9uOiAnb3V0c2lkZS1tZXNzYWdlLWJ1YmJsZScsIG1lc3NhZ2U6IG1lc3NhZ2UgfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgbWVzc2FnZURhdGVBbmRTZW5kZXI7XG4gICAgICAgICAgY29udGV4dDogeyBwb3NpdGlvbjogJ291dHNpZGUtbWVzc2FnZS1idWJibGUnIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWxldGVkTWVzc2FnZT5cbiAgPGRpdiBkYXRhLXRlc3RpZD1cIm1lc3NhZ2UtZGVsZXRlZC1jb21wb25lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLWRlbGV0ZWQtaW5uZXJcIiB0cmFuc2xhdGU+XG4gICAgICBzdHJlYW1DaGF0LlRoaXMgbWVzc2FnZSB3YXMgZGVsZXRlZC4uLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3lzdGVtTWVzc2FnZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBzeXN0ZW1NZXNzYWdlVGVtcGxhdGUgfHwgZGVmYXVsdFN5c3RlbU1lc3NhZ2U7XG4gICAgICBjb250ZXh0OiBnZXRNZXNzYWdlQ29udGV4dCgpXG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTeXN0ZW1NZXNzYWdlIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCI+XG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cInN5c3RlbS1tZXNzYWdlXCIgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fdGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2UtLXN5c3RlbV9fbGluZVwiPjwvZGl2PlxuICAgICAgICA8cD57eyBtZXNzYWdlSW5wdXQ/LnRleHQgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtX19saW5lXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS0tc3lzdGVtX19kYXRlXCI+XG4gICAgICAgIHt7IHBhcnNlZERhdGUgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNxdW90ZWRNZXNzYWdlPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZVwiXG4gICAgY2xhc3M9XCJxdW90ZWQtbWVzc2FnZSBzdHItY2hhdF9fcXVvdGVkLW1lc3NhZ2UtcHJldmlld1wiXG4gICAgZGF0YS10ZXN0aWQ9XCJxdW90ZWQtbWVzc2FnZS1jb250YWluZXJcIlxuICAgIFtjbGFzcy5taW5lXT1cImlzU2VudEJ5Q3VycmVudFVzZXJcIlxuICAgIChjbGljayk9XCJcbiAgICAgIGp1bXBUb01lc3NhZ2UoXG4gICAgICAgIChtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZSkhLmlkLFxuICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8ucGFyZW50X2lkXG4gICAgICApXG4gICAgXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwiXG4gICAgICBqdW1wVG9NZXNzYWdlKFxuICAgICAgICAobWVzc2FnZT8ucXVvdGVkX21lc3NhZ2UpIS5pZCxcbiAgICAgICAgbWVzc2FnZT8ucXVvdGVkX21lc3NhZ2U/LnBhcmVudF9pZFxuICAgICAgKVxuICAgIFwiXG4gID5cbiAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgZGF0YS10ZXN0aWQ9XCJxb3V0ZWQtbWVzc2FnZS1hdmF0YXJcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdC1hbmd1bGFyX19hdmF0YXItaG9zdCBzdHItY2hhdF9fbWVzc2FnZS1zZW5kZXItYXZhdGFyXCJcbiAgICAgIFtpbWFnZVVybF09XCJtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udXNlcj8uaW1hZ2VcIlxuICAgICAgW25hbWVdPVwiXG4gICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy51c2VyPy5uYW1lIHx8IG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy51c2VyPy5pZFxuICAgICAgXCJcbiAgICAgIFtzaXplXT1cIjIwXCJcbiAgICAgIHR5cGU9XCJ1c2VyXCJcbiAgICAgIGxvY2F0aW9uPVwicXVvdGVkLW1lc3NhZ2Utc2VuZGVyXCJcbiAgICAgIFt1c2VyXT1cIm1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy51c2VyIHx8IHVuZGVmaW5lZFwiXG4gICAgPjwvc3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlcj5cbiAgICA8ZGl2IGNsYXNzPVwicXVvdGVkLW1lc3NhZ2UtaW5uZXIgc3RyLWNoYXRfX3F1b3RlZC1tZXNzYWdlLWJ1YmJsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5hdHRhY2htZW50cyAmJlxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy5hdHRhY2htZW50cz8ubGVuZ3RoXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICNkZWZhdWx0QXR0YWNobWVudHNcbiAgICAgICAgICBsZXQtbWVzc2FnZUlkPVwibWVzc2FnZUlkXCJcbiAgICAgICAgICBsZXQtYXR0YWNobWVudHM9XCJhdHRhY2htZW50c1wiXG4gICAgICAgICAgbGV0LXBhcmVudE1lc3NhZ2VJZD1cInBhcmVudE1lc3NhZ2VJZFwiXG4gICAgICAgICAgbGV0LWltYWdlTW9kYWxTdGF0ZUNoYW5nZUhhbmRsZXI9XCJpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdHJlYW0tYXR0YWNobWVudC1saXN0XG4gICAgICAgICAgICBbbWVzc2FnZUlkXT1cIm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICBbYXR0YWNobWVudHNdPVwiYXR0YWNobWVudHNcIlxuICAgICAgICAgICAgW3BhcmVudE1lc3NhZ2VJZF09XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgICAgICAgICAgKGltYWdlTW9kYWxTdGF0ZUNoYW5nZSk9XCJpbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgID48L3N0cmVhbS1hdHRhY2htZW50LWxpc3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgYXR0YWNobWVudExpc3RUZW1wbGF0ZSB8fCBkZWZhdWx0QXR0YWNobWVudHM7XG4gICAgICAgICAgICBjb250ZXh0OiBnZXRRdW90ZWRNZXNzYWdlQXR0YWNobWVudExpc3RDb250ZXh0KClcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXZcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJxdW90ZWQtbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8udHJhbnNsYXRpb24gfHxcbiAgICAgICAgICBtZXNzYWdlPy5xdW90ZWRfbWVzc2FnZT8uaHRtbCB8fFxuICAgICAgICAgIG1lc3NhZ2U/LnF1b3RlZF9tZXNzYWdlPy50ZXh0XG4gICAgICAgIFwiXG4gICAgICA+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBXZSBuZWVkIHRoZXNlIG1hcmt1cHMgaW4gc2xpZ2h0bHkgZGlmZmVyZW50IHBvc2l0aW9ucyBpbiB0aGVtZS12MSBhbmQgdGhlbWUtdjIsIHRoaXMgc291bHRpb24gbWFrZXMgdGhhdCBwb3NzaWJsZSB3aXRob3V0IGR1cGxpY2F0aW5nIHRoZSBjb2RlIC0tPlxuPG5nLXRlbXBsYXRlICNtZXNzYWdlRGF0ZUFuZFNlbmRlciBsZXQtcG9zaXRpb249XCJwb3NpdGlvblwiPlxuICA8IS0tIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9jb25kaXRpb25hbC1jb21wbGV4aXR5IC0tPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJcbiAgICAgIChwb3NpdGlvbiA9PT0gJ2luc2lkZS1tZXNzYWdlLWJ1YmJsZScgJiYgdGhlbWVWZXJzaW9uID09PSAnMScpIHx8XG4gICAgICAocG9zaXRpb24gPT09ICdvdXRzaWRlLW1lc3NhZ2UtYnViYmxlJyAmJiB0aGVtZVZlcnNpb24gPT09ICcyJylcbiAgICBcIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHJhbnNsYXRpb24tbm90aWNlXCJcbiAgICAgICpuZ0lmPVwic2hvdWxkRGlzcGxheVRyYW5zbGF0aW9uTm90aWNlXCJcbiAgICAgIGRhdGEtdGVzdGlkPVwidHJhbnNsYXRpb24tbm90aWNlXCJcbiAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VlLW9yaWdpbmFsXCJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPT09ICd0cmFuc2xhdGlvbidcIlxuICAgICAgICAoY2xpY2spPVwiZGlzcGxheU9yaWdpbmFsTWVzc2FnZSgpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cImRpc3BsYXlPcmlnaW5hbE1lc3NhZ2UoKVwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBzdHJlYW1DaGF0LlNlZSBvcmlnaW5hbCAoYXV0b21hdGljYWxseSB0cmFuc2xhdGVkKVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VlLXRyYW5zbGF0aW9uXCJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5ZWRNZXNzYWdlVGV4dENvbnRlbnQgPT09ICdvcmlnaW5hbCdcIlxuICAgICAgICAoY2xpY2spPVwiZGlzcGxheVRyYW5zbGF0ZWRNZXNzYWdlKClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZGlzcGxheVRyYW5zbGF0ZWRNZXNzYWdlKClcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgc3RyZWFtQ2hhdC5TZWUgdHJhbnNsYXRpb25cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLWRhdGFcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLWRhdGFcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtbWV0YWRhdGFcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPCEtLSBlc2xpbnQtZW5hYmxlIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9jb25kaXRpb25hbC1jb21wbGV4aXR5IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoZW1lVmVyc2lvbiA9PT0gJzInXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlU3RhdHVzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGRhdGEtdGVzdGlkPVwic2VuZGVyXCJcbiAgICAgICAgKm5nSWY9XCIhaXNTZW50QnlDdXJyZW50VXNlclwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLW5hbWUgc3RyLWNoYXRfX21lc3NhZ2Utc2VuZGVyLW5hbWVcIlxuICAgICAgPlxuICAgICAgICB7eyBtZXNzYWdlPy51c2VyPy5uYW1lID8gbWVzc2FnZT8udXNlcj8ubmFtZSA6IG1lc3NhZ2U/LnVzZXI/LmlkIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImRhdGVcIiBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS10aW1lc3RhbXBcIj5cbiAgICAgICAge3sgcGFyc2VkRGF0ZSB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVN0YXR1cz5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICBpc1NlbnRCeUN1cnJlbnRVc2VyICYmXG4gICAgICAoKGlzTGFzdFNlbnRNZXNzYWdlICYmIG1lc3NhZ2U/LnN0YXR1cyA9PT0gJ3JlY2VpdmVkJykgfHxcbiAgICAgICAgbWVzc2FnZT8uc3RhdHVzID09PSAnc2VuZGluZycpXG4gICAgXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5zdGF0dXMgPT09ICdzZW5kaW5nJzsgZWxzZSBzZW50U3RhdHVzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VuZGluZ1N0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2VudFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBtb2RlID09PSAnbWFpbicgJiYgaXNNZXNzYWdlRGVsaXZlcmVkQW5kUmVhZCAmJiBjYW5EaXNwbGF5UmVhZFN0YXR1cztcbiAgICAgICAgICBlbHNlIGRlbGl2ZXJlZFN0YXR1c1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVhZFN0YXR1c1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2RlbGl2ZXJlZFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICBjdXN0b21EZWxpdmVyZWRTdGF0dXNUZW1wbGF0ZSB8fCBkZWZhdWx0RGVsaXZlcmVkU3RhdHVzO1xuICAgICAgICAgIGNvbnRleHQ6IGdldERlbGl2ZXJlZFN0YXR1c0NvbnRleHQoKVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGVsaXZlcmVkU3RhdHVzPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAnbWFpbidcIlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXNcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzLWFuZ3VsYXJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zdGF0dXNcbiAgICAgICAgXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJkZWxpdmVyZWQtaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW3BvcHBlcl09XCJwb3BwZXJDb250ZW50XCJcbiAgICAgICAgW3BvcHBlclRyaWdnZXJdPVwicG9wcGVyVHJpZ2dlckhvdmVyXCJcbiAgICAgICAgW3BvcHBlclBsYWNlbWVudF09XCJwb3BwZXJQbGFjZW1lbnRBdXRvXCJcbiAgICAgICAgW3BvcHBlckhpZGVPblNjcm9sbF09XCJmYWxzZVwiXG4gICAgICAgIFtwb3BwZXJIaWRlT25DbGlja091dHNpZGVdPVwiZmFsc2VcIlxuICAgICAgICAoaG92ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgID5cbiAgICAgICAgPHBvcHBlci1jb250ZW50ICNwb3BwZXJDb250ZW50PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fdG9vbHRpcCBzdHItY2hhdF9fdG9vbHRpcC1hbmd1bGFyXCI+XG4gICAgICAgICAgICB7eyBcInN0cmVhbUNoYXQuRGVsaXZlcmVkXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wb3BwZXItY29udGVudD5cbiAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJkZWxpdmVyZWQtaWNvblwiXG4gICAgICAgICAgaWNvbj1cImRlbGl2ZXJlZC1pY29uXCJcbiAgICAgICAgPjwvc3RyZWFtLWljb24tcGxhY2Vob2xkZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI3NlbmRpbmdTdGF0dXM+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgY3VzdG9tU2VuZGluZ1N0YXR1c1RlbXBsYXRlIHx8IGRlZmF1bHRTZW5kaW5nU3RhdHVzO1xuICAgICAgICAgIGNvbnRleHQ6IGdldFNlbmRpbmdTdGF0dXNDb250ZXh0KClcbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbmRpbmdTdGF0dXM+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXNcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zaW1wbGUtc3RhdHVzLWFuZ3VsYXJcbiAgICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1zdGF0dXNcbiAgICAgICAgXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJzZW5kaW5nLWluZGljYXRvclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtwb3BwZXJdPVwicG9wcGVyQ29udGVudFwiXG4gICAgICAgIFtwb3BwZXJUcmlnZ2VyXT1cInBvcHBlclRyaWdnZXJIb3ZlclwiXG4gICAgICAgIFtwb3BwZXJQbGFjZW1lbnRdPVwicG9wcGVyUGxhY2VtZW50QXV0b1wiXG4gICAgICAgIFtwb3BwZXJIaWRlT25TY3JvbGxdPVwiZmFsc2VcIlxuICAgICAgICBbcG9wcGVySGlkZU9uQ2xpY2tPdXRzaWRlXT1cImZhbHNlXCJcbiAgICAgICAgKGhvdmVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICA+XG4gICAgICAgIDxwb3BwZXItY29udGVudCAjcG9wcGVyQ29udGVudD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3Rvb2x0aXAgc3RyLWNoYXRfX3Rvb2x0aXAtYW5ndWxhclwiPlxuICAgICAgICAgICAge3sgXCJzdHJlYW1DaGF0LlNlbmRpbmcuLi5cIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3BvcHBlci1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yLXBsYWNlaG9sZGVyXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgID48L3N0cmVhbS1sb2FkaW5nLWluZGljYXRvci1wbGFjZWhvbGRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjcmVhZFN0YXR1cz5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICBjdXN0b21SZWFkU3RhdHVzVGVtcGxhdGUgfHwgZGVmYXVsdFJlYWRTdGF0dXM7XG4gICAgICAgICAgY29udGV4dDogZ2V0UmVhZFN0YXR1c0NvbnRleHQoKVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UmVhZFN0YXR1cz5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utc2ltcGxlLXN0YXR1c1xuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtYW5ndWxhclxuICAgICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXN0YXR1c1xuICAgICAgICBcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWQtaW5kaWNhdG9yXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW3BvcHBlcl09XCJwb3BwZXJDb250ZW50XCJcbiAgICAgICAgW3BvcHBlclRyaWdnZXJdPVwicG9wcGVyVHJpZ2dlckhvdmVyXCJcbiAgICAgICAgW3BvcHBlclBsYWNlbWVudF09XCJwb3BwZXJQbGFjZW1lbnRBdXRvXCJcbiAgICAgICAgW3BvcHBlckhpZGVPblNjcm9sbF09XCJmYWxzZVwiXG4gICAgICAgIFtwb3BwZXJIaWRlT25DbGlja091dHNpZGVdPVwiZmFsc2VcIlxuICAgICAgICAoaG92ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgID5cbiAgICAgICAgPHBvcHBlci1jb250ZW50ICNwb3BwZXJDb250ZW50PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3Rvb2x0aXAgc3RyLWNoYXRfX3Rvb2x0aXAtYW5ndWxhclwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInJlYWQtYnktdG9vbHRpcFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgcmVhZEJ5VGV4dCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3BvcHBlci1jb250ZW50PlxuICAgICAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXQtYW5ndWxhcl9fYXZhdGFyLWhvc3RcIlxuICAgICAgICAgIGRhdGEtdGVzdC1pZD1cImxhc3QtcmVhZC11c2VyLWF2YXRhclwiXG4gICAgICAgICAgW3NpemVdPVwiMTVcIlxuICAgICAgICAgIFtpbWFnZVVybF09XCJsYXN0UmVhZFVzZXI/LmltYWdlXCJcbiAgICAgICAgICBbbmFtZV09XCJsYXN0UmVhZFVzZXI/Lm5hbWUgfHwgbGFzdFJlYWRVc2VyPy5pZFwiXG4gICAgICAgICAgdHlwZT1cInVzZXJcIlxuICAgICAgICAgIGxvY2F0aW9uPVwibWVzc2FnZS1yZWFkZXJcIlxuICAgICAgICAgIFt1c2VyXT1cImxhc3RSZWFkVXNlclwiXG4gICAgICAgID48L3N0cmVhbS1hdmF0YXItcGxhY2Vob2xkZXI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgZGF0YS10ZXN0LWlkPVwicmVhZC1ieS1sZW5ndGhcIlxuICAgICAgICAgICpuZ0lmPVwiaXNSZWFkQnlNdWx0aXBsZVVzZXJzXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1zdGF0dXMtbnVtYmVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IChtZXNzYWdlPy5yZWFkQnkpIS5sZW5ndGggfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyZXBseUNvdW50QnV0dG9uIGxldC1wb3NpdGlvbj1cInBvc2l0aW9uXCI+XG4gIDwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2NvbmRpdGlvbmFsLWNvbXBsZXhpdHkgLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cIlxuICAgICAgKHBvc2l0aW9uID09PSAnaW5zaWRlLW1lc3NhZ2UtYnViYmxlJyAmJiB0aGVtZVZlcnNpb24gPT09ICcxJykgfHxcbiAgICAgIChwb3NpdGlvbiA9PT0gJ291dHNpZGUtbWVzc2FnZS1idWJibGUnICYmIHRoZW1lVmVyc2lvbiA9PT0gJzInKVxuICAgIFwiXG4gICAgY2xhc3M9XCJcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXNpbXBsZS1yZXBseS1idXR0b25cbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLXJlcGxpZXMtY291bnQtYnV0dG9uLXdyYXBwZXJcbiAgICBcIlxuICA+XG4gICAgPCEtLSBlc2xpbnQtZW5hYmxlIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9jb25kaXRpb25hbC1jb21wbGV4aXR5IC0tPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwic2hvdWxkRGlzcGxheVRocmVhZExpbmtcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbWVzc2FnZS1yZXBsaWVzLWNvdW50LWJ1dHRvblwiXG4gICAgICBkYXRhLXRlc3RpZD1cInJlcGx5LWNvdW50LWJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKClcIlxuICAgID5cbiAgICAgIDxzdHJlYW0taWNvbi1wbGFjZWhvbGRlclxuICAgICAgICAqbmdJZj1cInRoZW1lVmVyc2lvbiA9PT0gJzEnXCJcbiAgICAgICAgc3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgaWNvbj1cInJlcGx5XCJcbiAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAge3ttZXNzYWdlPy5yZXBseV9jb3VudCA9PT0gMSA/ICgnc3RyZWFtQ2hhdC4xIHJlcGx5JyB8IHRyYW5zbGF0ZSkgOiAoJ3N0cmVhbUNoYXQue3sgcmVwbHlDb3VudCB9fVxuICAgICAgcmVwbGllcycgfCB0cmFuc2xhdGU6cmVwbHlDb3VudFBhcmFtKX19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhdHRhY2htZW50c1RlbXBsYXRlPlxuICA8bmctdGVtcGxhdGVcbiAgICAjZGVmYXVsdEF0dGFjaG1lbnRzXG4gICAgbGV0LW1lc3NhZ2VJZD1cIm1lc3NhZ2VJZFwiXG4gICAgbGV0LWF0dGFjaG1lbnRzPVwiYXR0YWNobWVudHNcIlxuICAgIGxldC1wYXJlbnRNZXNzYWdlSWQ9XCJwYXJlbnRNZXNzYWdlSWRcIlxuICAgIGxldC1pbWFnZU1vZGFsU3RhdGVDaGFuZ2VIYW5kbGVyPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlclwiXG4gID5cbiAgICA8c3RyZWFtLWF0dGFjaG1lbnQtbGlzdFxuICAgICAgW21lc3NhZ2VJZF09XCJtZXNzYWdlSWRcIlxuICAgICAgW2F0dGFjaG1lbnRzXT1cImF0dGFjaG1lbnRzXCJcbiAgICAgIFtwYXJlbnRNZXNzYWdlSWRdPVwicGFyZW50TWVzc2FnZUlkXCJcbiAgICAgIChpbWFnZU1vZGFsU3RhdGVDaGFuZ2UpPVwiaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcigkZXZlbnQpXCJcbiAgICA+PC9zdHJlYW0tYXR0YWNobWVudC1saXN0PlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgIGF0dGFjaG1lbnRMaXN0VGVtcGxhdGUgfHwgZGVmYXVsdEF0dGFjaG1lbnRzO1xuICAgICAgY29udGV4dDogZ2V0QXR0YWNobWVudExpc3RDb250ZXh0KClcbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|