UNPKG

@cometchat/chat-uikit-angular

Version:

Ready-to-use Chat UI Components for Angular (JavaScript/Web)

373 lines 80 kB
import { Component, Input, ChangeDetectionStrategy, } from "@angular/core";
import "@cometchat/uikit-elements";
import { AvatarStyle, DateStyle, ListItemStyle, } from "@cometchat/uikit-elements";
import { CallButtonsConfiguration, CallLogDetailsStyle, CallLogParticipantsConfiguration, CallLogHistoryConfiguration, CallLogRecordingsConfiguration, } from "@cometchat/uikit-shared";
import { fontHelper, localize, DatePatterns, } from "@cometchat/uikit-resources";
import { CometChat } from "@cometchat/chat-sdk-javascript";
import { CallDetailUtils } from "../../../Shared/Utils/CallDetailUtils";
import { CallLogUtils } from "../../../Shared/Utils/CallLogUtils";
import * as i0 from "@angular/core";
import * as i1 from "../../../CometChatTheme.service";
import * as i2 from "../../CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component";
import * as i3 from "../../CometChatCallLogParticipants/cometchat-call-log-participants/cometchat-call-log-participants.component";
import * as i4 from "../../CometChatCallLogRecordings/cometchat-call-log-recordings/cometchat-call-log-recordings.component";
import * as i5 from "../../CometChatCallLogHistory/cometchat-call-log-history/cometchat-call-log-history.component";
import * as i6 from "@angular/common";
export class CometChatCallLogDetailsComponent {
    constructor(ref, themeService) {
        this.ref = ref;
        this.themeService = themeService;
        this.title = localize("CALL_DETAILS");
        this.hideProfile = false;
        this.backIconUrl = "assets/backbutton.svg";
        this.greaterThanIconURL = "assets/greaterThanIcon.svg";
        this.callButtonsConfiguration = new CallButtonsConfiguration({});
        this.callLogParticipantsConfiguration = new CallLogParticipantsConfiguration({});
        this.callLogHistoryConfiguration = new CallLogHistoryConfiguration({});
        this.callLogRecordingsConfiguration = new CallLogRecordingsConfiguration({});
        this.onError = (error) => {
            console.log(error);
        };
        this.datePattern = DatePatterns.time;
        this.datePattern2 = DatePatterns.DayDate;
        this.data = [];
        this.avatarStyle = {
            borderRadius: "16px",
            width: "28px",
            height: "28px",
            border: "none",
        };
        this.labelStyle = {
            textFont: '600 22px sans-serif, Inter',
            textColor: 'rgb(20, 20, 20)'
        };
        this.callDetailsStyle = {
            width: "100%",
            height: "100%",
        };
        this.listItemStyle = {};
        this.dateStyle = {};
        this.callButtonsStyle = {
            width: "100%",
            height: "100%",
            border: "none",
            borderRadius: "0",
            background: "transparent",
        };
        this.iconStyle = {
            height: "16px",
            width: "16px",
            iconTint: "RGBA(20, 20, 20, 0.68)",
        };
        this.defaultTemplate = [];
        this.authToken = "";
        this.loggedInUser = null;
        this.showCallLogDetailOptionList = true;
        this.showCometChatMessages = true;
        this.showParticipantsList = false;
        this.showCallRecordingList = false;
        this.showCallHistory = false;
        this.userListenerId = "userlist_" + new Date().getTime();
        this.limit = 5;
        this.onItemClick = (call) => {
            this.call = call;
            this.showCallLogDetailOptionList = true;
            this.showCallHistory = false;
            this.ref.detectChanges();
        };
        this.types = [];
        this.categories = [];
        this.getTemplateOptions = (template) => {
            if (template.options) {
                return template.options(this.user, this.group, template.id);
            }
            else
                return [];
        };
        this.onOptionClick = (option) => {
            if (option?.onClick) {
                option.onClick(this.call);
            }
            else {
                switch (option.id) {
                    case "participants":
                        this.showCallLogDetailOptionList = false;
                        this.showParticipantsList = true;
                        this.ref.detectChanges();
                        break;
                    case "recordings":
                        this.showCallLogDetailOptionList = false;
                        this.showCallRecordingList = true;
                        this.ref.detectChanges();
                        break;
                    case "callHistory":
                        this.showCallLogDetailOptionList = false;
                        this.showCallHistory = true;
                        this.ref.detectChanges();
                        break;
                    default:
                        break;
                }
            }
        };
        this.handlePageOnBackClick = () => {
            this.showCallHistory = false;
            this.showCallRecordingList = false;
            this.showParticipantsList = false;
            this.showCometChatMessages = false;
            this.showCallLogDetailOptionList = true;
            this.ref.detectChanges();
        };
        this.wrapperStyle = () => {
            return {
                width: this.callDetailsStyle.width,
                height: this.callDetailsStyle.height,
                border: this.callDetailsStyle.border,
                borderRadius: this.callDetailsStyle.borderRadius,
                background: this.callDetailsStyle.background,
                padding: '16px',
            };
        };
        this.profileContainerStyle = () => {
            return {
                height: "auto",
                width: "100%",
                minHeight: "150px",
                padding: "16px",
                display: "flex",
                flexDirection: "column",
                justifyContent: "center",
                alignItems: "center",
                boxSizing: "border-box",
                gap: "8px",
            };
        };
        this.getTailViewStyle = () => {
            return {
                font: fontHelper(this.themeService?.theme.typography.text3),
                color: this.themeService.theme.palette.getAccent600()
            };
        };
        this.backButtonStyle = () => {
            return {
                height: "24px",
                width: "24px",
                border: "none",
                borderRadius: "0",
                background: "transparent",
                buttonIconTint: this.themeService.theme.palette.getPrimary(),
            };
        };
    }
    getTitleStyle() {
        return {
            textFont: this.callDetailsStyle.titleFont ||
                fontHelper(this.themeService.theme.typography.title1),
            textColor: this.callDetailsStyle.titleColor ||
                this.themeService.theme.palette.getAccent(),
        };
    }
    ngOnChanges(changes) {
        if (changes["user"] || changes["group"]) {
            this.showCallLogDetailOptionList = true;
            this.showParticipantsList = false;
            this.showCallRecordingList = false;
            this.showCallHistory = false;
            this.showCometChatMessages = false;
        }
    }
    removeListener() {
        CometChat.removeUserListener(this.userListenerId);
    }
    ngOnInit() {
        CometChat.getLoggedinUser()
            .then((user) => {
            this.loggedInUser = user;
            this.authToken = this.loggedInUser.getAuthToken();
            this.getTemplate();
        })
            .catch((error) => {
            if (this.onError) {
                this.onError(error);
            }
        });
        this.setThemeStyle();
    }
    trackByFnOption(index, option) {
        return option.id;
    }
    getTemplate() {
        if (this.data && this.data?.length > 0) {
            this.defaultTemplate = this.data;
            this.ref.detectChanges();
        }
        else {
            this.defaultTemplate = CallDetailUtils.getDefaultCallTemplate(this.call, this.loggedInUser, this.themeService.theme);
            this.ref.detectChanges();
        }
    }
    getCustomOptionView(option) {
        return option?.customView;
    }
    getSectionHeaderStyle(template) {
        return {
            textFont: template.titleFont,
            textColor: template.titleColor,
        };
    }
    getButtonStyle(option) {
        return {
            height: "100%",
            width: "100%",
            border: "none",
            borderRadius: "0",
            buttonTextFont: option?.titleFont,
            buttonTextColor: option?.titleColor,
            background: option?.backgroundColor || "transparent",
        };
    }
    subtitleStyle(template) {
        return {
            textFont: template.titleFont,
            textColor: template.titleColor,
        };
    }
    showDataSectionStyle(template) {
        return {
            textFont: template.titleFont,
            textColor: template.titleColor,
        };
    }
    setThemeStyle() {
        this.setDetailsStyle();
        this.setAvatarStyle();
        this.setListItemStyle();
        this.setDateStyle();
    }
    setListItemStyle() {
        let defaultStyle = new ListItemStyle({
            height: "45px",
            width: "100%",
            background: this.themeService.theme.palette.getAccent50() ||
                this.themeService.theme.palette.getBackground(),
            activeBackground: "transparent",
            borderRadius: "5px",
            titleFont: fontHelper(this.themeService.theme.typography.title2),
            titleColor: this.themeService.theme.palette.getAccent(),
            border: "none",
            separatorColor: this.themeService.theme.palette.getAccent200(),
            hoverBackground: this.themeService.theme.palette.getAccent100(),
        });
        this.listItemStyle = { ...defaultStyle, ...this.listItemStyle };
    }
    setAvatarStyle() {
        let defaultStyle = new AvatarStyle({
            borderRadius: "24px",
            width: "46px",
            height: "46px",
            border: "none",
            backgroundColor: this.themeService.theme.palette.getAccent700(),
            nameTextColor: this.themeService.theme.palette.getAccent900(),
            backgroundSize: "cover",
            nameTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
            outerViewBorderSpacing: "",
        });
        this.avatarStyle = { ...defaultStyle, ...this.avatarStyle };
    }
    setDetailsStyle() {
        let defaultStyle = new CallLogDetailsStyle({
            background: this.themeService.theme.palette.getBackground(),
            titleFont: fontHelper(this.themeService.theme.typography.title1),
            titleColor: this.themeService.theme.palette.getAccent(),
            backIconTint: this.themeService.theme.palette.getPrimary(),
            width: "100%",
            height: "100%",
            borderRadius: "",
            nameTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
        });
        this.callDetailsStyle = { ...defaultStyle, ...this.callDetailsStyle };
    }
    setDateStyle() {
        let defaultStyle = new DateStyle({
            textFont: fontHelper(this.themeService.theme.typography.caption2),
            textColor: this.themeService.theme.palette.getAccent600(),
            background: "transparent",
        });
        this.dateStyle = { ...defaultStyle, ...this.dateStyle };
    }
    getTailView(totalSeconds) {
        return CallLogUtils.convertMinutesToHoursMinutesSeconds(totalSeconds);
    }
    getSubtitle(call) {
        return CallLogUtils.getCallStatusWithType(call, this.loggedInUser);
    }
    getListItemStyle(option) {
        return {
            height: "auto",
            width: "100%",
            background: option?.backgroundColor ||
                this.themeService.theme.palette.getBackground(),
            borderRadius: "8px",
            titleFont: option?.titleFont ||
                fontHelper(this.themeService.theme.typography.title2),
            border: "none",
            separatorColor: this.themeService.theme.palette.getAccent200(),
            hoverBackground: this.themeService.theme.palette.getAccent100(),
        };
    }
}
CometChatCallLogDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatCallLogDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.CometChatThemeService }], target: i0.ɵɵFactoryTarget.Component });
CometChatCallLogDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometChatCallLogDetailsComponent, selector: "cometchat-call-log-details", inputs: { call: "call", group: "group", user: "user", title: "title", onBackClick: "onBackClick", hideProfile: "hideProfile", subtitleView: "subtitleView", customProfileView: "customProfileView", backIconUrl: "backIconUrl", greaterThanIconURL: "greaterThanIconURL", callButtonsConfiguration: "callButtonsConfiguration", callLogParticipantsConfiguration: "callLogParticipantsConfiguration", callLogHistoryConfiguration: "callLogHistoryConfiguration", callLogRecordingsConfiguration: "callLogRecordingsConfiguration", onError: "onError", datePattern: "datePattern", datePattern2: "datePattern2", data: "data", avatarStyle: "avatarStyle", labelStyle: "labelStyle", callDetailsStyle: "callDetailsStyle", listItemStyle: "listItemStyle", dateStyle: "dateStyle", callButtonsStyle: "callButtonsStyle" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-call-log-details__wrapper\" *ngIf=\"user || group\" [ngStyle]=\"wrapperStyle()\">\n\n  <div class=\"cc-call-log-details__header\"\n    *ngIf=\"onBackClick && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n    <cometchat-button [iconURL]=\"backIconUrl\" class=\"cc-call-log-details__close-button\" [buttonStyle]=\"backButtonStyle()\"\n      (cc-button-clicked)=\"onBackClick()\"></cometchat-button>\n    <cometchat-label [text]=\"title\" [labelStyle]=\"getTitleStyle()\"></cometchat-label>\n  </div>\n\n  <div class=\"cc-call-log-details\">\n    <div class=\"cc-call-log-details__profile\"\n      *ngIf=\"!hideProfile && showCallLogDetailOptionList && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n\n\n      <div class=\" cc-call-log-details__default-profile\" *ngIf=\"!customProfileView;else listitem\" [ngStyle]=\"profileContainerStyle()\">\n        <cometchat-avatar [name]=\"user?.getName() ?? group?.getName()\" [avatarStyle]=\"avatarStyle\"\n          [image]=\"user?.getAvatar() ?? group?.getIcon()\">\n        </cometchat-avatar>\n\n        <cometchat-label [text]=\"user?.getName() ?? this.group?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n      </div>\n    </div>\n    <div class=\"cc-call-log-details__section-list\"\n      *ngIf=\"showCallLogDetailOptionList && defaultTemplate && defaultTemplate.length > 0\">\n      <div class=\"cc-call-log-details__section\" *ngFor=\"let item of defaultTemplate\">\n        <div class=\"cc-call-log-details__section-separator\" *ngIf=\"item.title\">\n          <cometchat-label [text]=\"item.title\"></cometchat-label>\n        </div>\n        <div class=\"cc-call-log-details__options-wrapper\" *ngIf=\"getTemplateOptions(item)\">\n          <div class=\"cc-call-log-details__options\" *ngFor=\"let option of getTemplateOptions(item);  trackBy: trackByFnOption \">\n            <div class=\"cc-call-log-details__option\" *ngIf=\"!getCustomOptionView(option);else customView\">\n              <div class=\"cc-call-log-details__option-element\">\n\n                <div class=\"cc-call-log-details__calling-default-option\" *ngIf=\"option.id=='calls'\">\n\n                  <cometchat-call-buttons [user]=\"user\" [group]=\"group\"\n                    [callButtonsStyle]=\"callButtonsConfiguration.callButtonsStyle\"\n                    [onVideoCallClick]=\"callButtonsConfiguration.onVideoCallClick\"\n                    [onVoiceCallClick]=\"callButtonsConfiguration.onVoiceCallClick\"\n                    [videoCallIconURL]=\"callButtonsConfiguration.videoCallIconURL\"\n                    [voiceCallIconURL]=\"callButtonsConfiguration.voiceCallIconURL\"></cometchat-call-buttons>\n                </div>\n                <cometchat-list-item *ngIf=\"option.id==='callStatus'\" [listItemStyle]=\"getListItemStyle(option)\"\n                  [hideSeparator]=\"true\">\n                  <div class=\"cc-call-log-details__call-Status\" slot=\"subtitleView\" >\n                    <div *ngIf=\"!subtitleView; else subtitle\" style=\"width: 100%;\">\n                      <div> <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n                          [pattern]=\"datePattern2\">\n                        </cometchat-date></div>\n\n                      <div\n                      class=\"cc-call-log-details__call-Status__subTitle\">\n                        <div>\n\n                          <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n                            [pattern]=\"datePattern\">\n                          </cometchat-date>\n                          <cometchat-label [text]=\"getSubtitle(call)\" [labelStyle]=\"subtitleStyle(option)\">\n                          </cometchat-label>\n                        </div>\n                        <div class=\"cc-call-log-details__call-Status__tailview\" [style]=\"getTailViewStyle()\"> {{ getTailView(call?.getTotalDurationInMinutes()!) }}\n                        </div>\n\n                      </div>\n\n\n                    </div>\n\n                    <ng-template #subtitle>\n                      <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: user ?? group }\">\n                      </ng-container>\n                    </ng-template>\n                  </div>\n\n\n                </cometchat-list-item>\n                <cometchat-list-item *ngIf=\"option.id!=='calls' && option.id!=='callStatus' \"\n                  (cc-listitem-clicked)=\"onOptionClick(option)\" [listItemStyle]=\"getListItemStyle(option)\"\n                  [title]=\"option.title\" [hideSeparator]=\"true\">\n               \n                      <div slot=\"tailView\" class=\"cc-call-log-details__secondary-view__tail-view\" [style]=\"getTailViewStyle()\"\n                       >\n                        {{option.tail}}\n                        <cometchat-icon [iconStyle]=\"iconStyle\" [URL]=\"greaterThanIconURL\"></cometchat-icon>\n                      </div>\n\n               \n\n                </cometchat-list-item>\n\n              </div>\n            </div>\n            <ng-template #customView>\n              <ng-container *ngTemplateOutlet=\"getCustomOptionView(option)\">\n              </ng-container>\n            </ng-template>\n          </div>\n        </div>\n      </div>\n    </div>\n\n\n\n    <div *ngIf=\"showParticipantsList || showCallRecordingList || showCallHistory\" style=\" height: 100%;\">\n\n      <div *ngIf=\"showParticipantsList\" style=\"height: 100%;\">\n        <cometchat-call-log-participants [call]=\"call\"\n          [onBackClick]=\"callLogParticipantsConfiguration.onBackClick || handlePageOnBackClick\"\n          [backIconUrl]=\"callLogParticipantsConfiguration.backIconUrl || backIconUrl\"\n          [avatarStyle]=\"callLogParticipantsConfiguration.avatarStyle\"\n          [onItemClick]=\"callLogParticipantsConfiguration.onItemClick!\"\n          [datePattern]=\"callLogParticipantsConfiguration.datePattern\"\n          [subtitleView]=\"callLogParticipantsConfiguration.subtitleView\"\n          [listItemView]=\"callLogParticipantsConfiguration.listItemView\"\n\n          [listItemStyle]=\"callLogParticipantsConfiguration.listItemStyle\" [callLogParticipantsStyle]=\"\n        callLogParticipantsConfiguration.callLogParticipantsStyle\"\n       \n          [tailView]=\"callLogParticipantsConfiguration.tailView\"></cometchat-call-log-participants>\n      </div>\n      <div *ngIf=\"showCallRecordingList\" style=\"height:100%;\">\n        <cometchat-call-log-recordings [call]=\"call\"\n          [backIconUrl]=\"callLogRecordingsConfiguration.backIconUrl || backIconUrl\" [onBackClick]=\"\n        callLogRecordingsConfiguration.onBackClick || handlePageOnBackClick\n      \" [onItemClick]=\"callLogRecordingsConfiguration.onItemClick!\"\n          [datePattern]=\"callLogRecordingsConfiguration.datePattern!\"\n          [listItemStyle]=\"callLogRecordingsConfiguration.listItemStyle\" callLogRecordingsStyle=\"\n        callLogRecordingsConfiguration.callLogRecordingsStyle\n        callLogRecordingsConfiguration.hideDownloadButton || false\n      \" [onDownloadClick]=\"callLogRecordingsConfiguration.onDownloadClick!\"\n          [listItemView]=\"callLogRecordingsConfiguration.listItemView\"\n          [subtitleView]=\"callLogRecordingsConfiguration.subtitleView\"\n          [tailView]=\"callLogRecordingsConfiguration.tailView\"></cometchat-call-log-recordings>\n      </div>\n      <div *ngIf=\"showCallHistory\" style=\"height: 100%; \">\n        <cometchat-call-log-history [call]=\"call\" [user]=\"user\" [group]=\"group\" [onBackClick]=\"handlePageOnBackClick\"\n          [backIconUrl]=\"callLogHistoryConfiguration.backIconUrl || backIconUrl\"\n          [emptyStateView]=\"callLogHistoryConfiguration.emptyStateView\"\n          [errorStateView]=\"callLogHistoryConfiguration.errorStateView\"\n          [loadingIconURL]=\"callLogHistoryConfiguration.loadingIconURL\"\n          [loadingStateView]=\"callLogHistoryConfiguration.loadingStateView\"\n          [tailView]=\"callLogHistoryConfiguration.tailView\" [callLogRequestBuilder]=\"\n            callLogHistoryConfiguration.callLogRequestBuilder\n          \" [onItemClick]=\"callLogHistoryConfiguration.onItemClick || onItemClick\" [onBackClick]=\"\n            callLogHistoryConfiguration.onBackClick || handlePageOnBackClick\n          \" [listItemStyle]=\"callLogHistoryConfiguration.listItemStyle\"\n          [datePattern]=\"callLogHistoryConfiguration.datePattern\" [dateSeparatorPattern]=\"\n            callLogHistoryConfiguration.dateSeparatorPattern\n          \" [callLogHistoryStyle]=\"\n            callLogHistoryConfiguration.callLogHistoryStyle\n          \" [onError]=\"callLogHistoryConfiguration.onError!\"></cometchat-call-log-history>\n      </div>\n\n    </div>\n  </div>\n</div>\n\n\n<ng-template #listitem>\n  <ng-container *ngTemplateOutlet=\"customProfileView\">\n  </ng-container>\n</ng-template>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.cc-call-log-details__header{display:flex;gap:10px;align-items:center;height:3%}.cc-call-log-details{height:98%}.cc-call-log-details__profile{display:flex;align-items:center;justify-content:center}.cc-call-log-details__default-profile{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.cc-call-log-details__section{margin:10px 3px 3px}.cc-call-log-details__option{margin-top:5px}.cc-call-log-details__calling-default-option{display:flex;align-items:center;justify-content:center;margin:10px}.cc-call-log-details__call-Status{display:flex;justify-content:space-between}.cc-call-log-details__call-Status__subTitle{display:flex;justify-content:space-between;margin:10px 0;padding-right:8px;width:100%}.cc-call-log-details__call-Status__tailview{color:gray}.cc-call-log-details__secondary-view__tail-view{display:flex;align-items:center;justify-content:center;gap:5px;color:RGBA(20,20,20,.68)}\n"], components: [{ type: i2.CometChatCallButtonsComponent, selector: "cometchat-call-buttons", inputs: ["user", "group", "voiceCallIconURL", "voiceCallIconText", "voiceCallIconHoverText", "videoCallIconURL", "videoCallIconText", "videoCallIconHoverText", "onVoiceCallClick", "onVideoCallClick", "onError", "callButtonsStyle", "outgoingCallConfiguration", "ongoingCallConfiguration"] }, { type: i3.CometChatCallLogParticipantsComponent, selector: "cometchat-call-log-participants", inputs: ["title", "call", "backIconUrl", "onBackClick", "datePattern", "subtitleView", "listItemView", "onError", "hideSeparator", "avatarStyle", "dateStyle", "CallLogParticipantsStyle", "listItemStyle"] }, { type: i4.CometChatCallLogRecordingsComponent, selector: "cometchat-call-log-recordings", inputs: ["title", "call", "onBackClick", "backIconURL", "datePattern", "subtitleView", "listItemView", "downloadIconURL", "onDownloadClick", "hideDownloadButton", "onError", "avatarStyle", "dateStyle", "CallLogRecordingsStyle", "listItemStyle", "options"] }, { type: i5.CometChatCallLogHistoryComponent, selector: "cometchat-call-log-history", inputs: ["user", "group", "title", "emptyStateView", "errorStateView", "loadingStateView", "subtitleView", "listItemView", "menu", "emptyStateText", "errorStateText", "loadingIconURL", "backIconUrl", "onItemClick", "onBackClick", "callLogRequestBuilder", "DateSeparatorPattern", "hideSeparator", "dateSeparatorStyle", "hideError", "onError", "showSectionHeader", "sectionHeaderField", "datePattern", "avatarStyle", "dateStyle", "CallLogHistoryStyle", "listItemStyle"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatCallLogDetailsComponent, decorators: [{
            type: Component,
            args: [{ selector: "cometchat-call-log-details", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-call-log-details__wrapper\" *ngIf=\"user || group\" [ngStyle]=\"wrapperStyle()\">\n\n  <div class=\"cc-call-log-details__header\"\n    *ngIf=\"onBackClick && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n    <cometchat-button [iconURL]=\"backIconUrl\" class=\"cc-call-log-details__close-button\" [buttonStyle]=\"backButtonStyle()\"\n      (cc-button-clicked)=\"onBackClick()\"></cometchat-button>\n    <cometchat-label [text]=\"title\" [labelStyle]=\"getTitleStyle()\"></cometchat-label>\n  </div>\n\n  <div class=\"cc-call-log-details\">\n    <div class=\"cc-call-log-details__profile\"\n      *ngIf=\"!hideProfile && showCallLogDetailOptionList && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n\n\n      <div class=\" cc-call-log-details__default-profile\" *ngIf=\"!customProfileView;else listitem\" [ngStyle]=\"profileContainerStyle()\">\n        <cometchat-avatar [name]=\"user?.getName() ?? group?.getName()\" [avatarStyle]=\"avatarStyle\"\n          [image]=\"user?.getAvatar() ?? group?.getIcon()\">\n        </cometchat-avatar>\n\n        <cometchat-label [text]=\"user?.getName() ?? this.group?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n      </div>\n    </div>\n    <div class=\"cc-call-log-details__section-list\"\n      *ngIf=\"showCallLogDetailOptionList && defaultTemplate && defaultTemplate.length > 0\">\n      <div class=\"cc-call-log-details__section\" *ngFor=\"let item of defaultTemplate\">\n        <div class=\"cc-call-log-details__section-separator\" *ngIf=\"item.title\">\n          <cometchat-label [text]=\"item.title\"></cometchat-label>\n        </div>\n        <div class=\"cc-call-log-details__options-wrapper\" *ngIf=\"getTemplateOptions(item)\">\n          <div class=\"cc-call-log-details__options\" *ngFor=\"let option of getTemplateOptions(item);  trackBy: trackByFnOption \">\n            <div class=\"cc-call-log-details__option\" *ngIf=\"!getCustomOptionView(option);else customView\">\n              <div class=\"cc-call-log-details__option-element\">\n\n                <div class=\"cc-call-log-details__calling-default-option\" *ngIf=\"option.id=='calls'\">\n\n                  <cometchat-call-buttons [user]=\"user\" [group]=\"group\"\n                    [callButtonsStyle]=\"callButtonsConfiguration.callButtonsStyle\"\n                    [onVideoCallClick]=\"callButtonsConfiguration.onVideoCallClick\"\n                    [onVoiceCallClick]=\"callButtonsConfiguration.onVoiceCallClick\"\n                    [videoCallIconURL]=\"callButtonsConfiguration.videoCallIconURL\"\n                    [voiceCallIconURL]=\"callButtonsConfiguration.voiceCallIconURL\"></cometchat-call-buttons>\n                </div>\n                <cometchat-list-item *ngIf=\"option.id==='callStatus'\" [listItemStyle]=\"getListItemStyle(option)\"\n                  [hideSeparator]=\"true\">\n                  <div class=\"cc-call-log-details__call-Status\" slot=\"subtitleView\" >\n                    <div *ngIf=\"!subtitleView; else subtitle\" style=\"width: 100%;\">\n                      <div> <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n                          [pattern]=\"datePattern2\">\n                        </cometchat-date></div>\n\n                      <div\n                      class=\"cc-call-log-details__call-Status__subTitle\">\n                        <div>\n\n                          <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n                            [pattern]=\"datePattern\">\n                          </cometchat-date>\n                          <cometchat-label [text]=\"getSubtitle(call)\" [labelStyle]=\"subtitleStyle(option)\">\n                          </cometchat-label>\n                        </div>\n                        <div class=\"cc-call-log-details__call-Status__tailview\" [style]=\"getTailViewStyle()\"> {{ getTailView(call?.getTotalDurationInMinutes()!) }}\n                        </div>\n\n                      </div>\n\n\n                    </div>\n\n                    <ng-template #subtitle>\n                      <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: user ?? group }\">\n                      </ng-container>\n                    </ng-template>\n                  </div>\n\n\n                </cometchat-list-item>\n                <cometchat-list-item *ngIf=\"option.id!=='calls' && option.id!=='callStatus' \"\n                  (cc-listitem-clicked)=\"onOptionClick(option)\" [listItemStyle]=\"getListItemStyle(option)\"\n                  [title]=\"option.title\" [hideSeparator]=\"true\">\n               \n                      <div slot=\"tailView\" class=\"cc-call-log-details__secondary-view__tail-view\" [style]=\"getTailViewStyle()\"\n                       >\n                        {{option.tail}}\n                        <cometchat-icon [iconStyle]=\"iconStyle\" [URL]=\"greaterThanIconURL\"></cometchat-icon>\n                      </div>\n\n               \n\n                </cometchat-list-item>\n\n              </div>\n            </div>\n            <ng-template #customView>\n              <ng-container *ngTemplateOutlet=\"getCustomOptionView(option)\">\n              </ng-container>\n            </ng-template>\n          </div>\n        </div>\n      </div>\n    </div>\n\n\n\n    <div *ngIf=\"showParticipantsList || showCallRecordingList || showCallHistory\" style=\" height: 100%;\">\n\n      <div *ngIf=\"showParticipantsList\" style=\"height: 100%;\">\n        <cometchat-call-log-participants [call]=\"call\"\n          [onBackClick]=\"callLogParticipantsConfiguration.onBackClick || handlePageOnBackClick\"\n          [backIconUrl]=\"callLogParticipantsConfiguration.backIconUrl || backIconUrl\"\n          [avatarStyle]=\"callLogParticipantsConfiguration.avatarStyle\"\n          [onItemClick]=\"callLogParticipantsConfiguration.onItemClick!\"\n          [datePattern]=\"callLogParticipantsConfiguration.datePattern\"\n          [subtitleView]=\"callLogParticipantsConfiguration.subtitleView\"\n          [listItemView]=\"callLogParticipantsConfiguration.listItemView\"\n\n          [listItemStyle]=\"callLogParticipantsConfiguration.listItemStyle\" [callLogParticipantsStyle]=\"\n        callLogParticipantsConfiguration.callLogParticipantsStyle\"\n       \n          [tailView]=\"callLogParticipantsConfiguration.tailView\"></cometchat-call-log-participants>\n      </div>\n      <div *ngIf=\"showCallRecordingList\" style=\"height:100%;\">\n        <cometchat-call-log-recordings [call]=\"call\"\n          [backIconUrl]=\"callLogRecordingsConfiguration.backIconUrl || backIconUrl\" [onBackClick]=\"\n        callLogRecordingsConfiguration.onBackClick || handlePageOnBackClick\n      \" [onItemClick]=\"callLogRecordingsConfiguration.onItemClick!\"\n          [datePattern]=\"callLogRecordingsConfiguration.datePattern!\"\n          [listItemStyle]=\"callLogRecordingsConfiguration.listItemStyle\" callLogRecordingsStyle=\"\n        callLogRecordingsConfiguration.callLogRecordingsStyle\n        callLogRecordingsConfiguration.hideDownloadButton || false\n      \" [onDownloadClick]=\"callLogRecordingsConfiguration.onDownloadClick!\"\n          [listItemView]=\"callLogRecordingsConfiguration.listItemView\"\n          [subtitleView]=\"callLogRecordingsConfiguration.subtitleView\"\n          [tailView]=\"callLogRecordingsConfiguration.tailView\"></cometchat-call-log-recordings>\n      </div>\n      <div *ngIf=\"showCallHistory\" style=\"height: 100%; \">\n        <cometchat-call-log-history [call]=\"call\" [user]=\"user\" [group]=\"group\" [onBackClick]=\"handlePageOnBackClick\"\n          [backIconUrl]=\"callLogHistoryConfiguration.backIconUrl || backIconUrl\"\n          [emptyStateView]=\"callLogHistoryConfiguration.emptyStateView\"\n          [errorStateView]=\"callLogHistoryConfiguration.errorStateView\"\n          [loadingIconURL]=\"callLogHistoryConfiguration.loadingIconURL\"\n          [loadingStateView]=\"callLogHistoryConfiguration.loadingStateView\"\n          [tailView]=\"callLogHistoryConfiguration.tailView\" [callLogRequestBuilder]=\"\n            callLogHistoryConfiguration.callLogRequestBuilder\n          \" [onItemClick]=\"callLogHistoryConfiguration.onItemClick || onItemClick\" [onBackClick]=\"\n            callLogHistoryConfiguration.onBackClick || handlePageOnBackClick\n          \" [listItemStyle]=\"callLogHistoryConfiguration.listItemStyle\"\n          [datePattern]=\"callLogHistoryConfiguration.datePattern\" [dateSeparatorPattern]=\"\n            callLogHistoryConfiguration.dateSeparatorPattern\n          \" [callLogHistoryStyle]=\"\n            callLogHistoryConfiguration.callLogHistoryStyle\n          \" [onError]=\"callLogHistoryConfiguration.onError!\"></cometchat-call-log-history>\n      </div>\n\n    </div>\n  </div>\n</div>\n\n\n<ng-template #listitem>\n  <ng-container *ngTemplateOutlet=\"customProfileView\">\n  </ng-container>\n</ng-template>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.cc-call-log-details__header{display:flex;gap:10px;align-items:center;height:3%}.cc-call-log-details{height:98%}.cc-call-log-details__profile{display:flex;align-items:center;justify-content:center}.cc-call-log-details__default-profile{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.cc-call-log-details__section{margin:10px 3px 3px}.cc-call-log-details__option{margin-top:5px}.cc-call-log-details__calling-default-option{display:flex;align-items:center;justify-content:center;margin:10px}.cc-call-log-details__call-Status{display:flex;justify-content:space-between}.cc-call-log-details__call-Status__subTitle{display:flex;justify-content:space-between;margin:10px 0;padding-right:8px;width:100%}.cc-call-log-details__call-Status__tailview{color:gray}.cc-call-log-details__secondary-view__tail-view{display:flex;align-items:center;justify-content:center;gap:5px;color:RGBA(20,20,20,.68)}\n"] }]
        }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.CometChatThemeService }]; }, propDecorators: { call: [{
                type: Input
            }], group: [{
                type: Input
            }], user: [{
                type: Input
            }], title: [{
                type: Input
            }], onBackClick: [{
                type: Input
            }], hideProfile: [{
                type: Input
            }], subtitleView: [{
                type: Input
            }], customProfileView: [{
                type: Input
            }], backIconUrl: [{
                type: Input
            }], greaterThanIconURL: [{
                type: Input
            }], callButtonsConfiguration: [{
                type: Input
            }], callLogParticipantsConfiguration: [{
                type: Input
            }], callLogHistoryConfiguration: [{
                type: Input
            }], callLogRecordingsConfiguration: [{
                type: Input
            }], onError: [{
                type: Input
            }], datePattern: [{
                type: Input
            }], datePattern2: [{
                type: Input
            }], data: [{
                type: Input
            }], avatarStyle: [{
                type: Input
            }], labelStyle: [{
                type: Input
            }], callDetailsStyle: [{
                type: Input
            }], listItemStyle: [{
                type: Input
            }], dateStyle: [{
                type: Input
            }], callButtonsStyle: [{
                type: Input
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWNhbGwtbG9nLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9DYWxscy9Db21ldENoYXRDYWxsTG9nRGV0YWlscy9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NhbGxzL0NvbWV0Q2hhdENhbGxMb2dEZXRhaWxzL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUdULGFBQWEsR0FDZCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLGdDQUFnQyxFQUNoQywyQkFBMkIsRUFDM0IsOEJBQThCLEdBQy9CLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBSVIsWUFBWSxHQUViLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7O0FBUWxFLE1BQU0sT0FBTyxnQ0FBZ0M7SUFvRzNDLFlBQ1UsR0FBc0Is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aUI7c0JBQXpCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUdHLGdDQUFnQztzQkFBeEMsS0FBSztnQkFHRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBR0csOEJBQThCO3NCQUF0QyxLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IFwiQGNvbWV0Y2hhdC91aWtpdC1lbGVtZW50c1wiO1xuaW1wb3J0IHtcbiAgQXZhdGFyU3R5bGUsXG4gIERhdGVTdHlsZSxcbiAgSWNvblN0eWxlLFxuICBMYWJlbFN0eWxlLFxuICBMaXN0SXRlbVN0eWxlLFxufSBmcm9tIFwiQGNvbWV0Y2hhdC91aWtpdC1lbGVtZW50c1wiO1xuaW1wb3J0IHtcbiAgQ2FsbEJ1dHRvbnNTdHlsZSxcbiAgQ2FsbEJ1dHRvbnNDb25maWd1cmF0aW9uLFxuICBDYWxsTG9nRGV0YWlsc1N0eWxlLFxuICBDYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbixcbiAgQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLFxuICBDYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24sXG59IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXNoYXJlZFwiO1xuaW1wb3J0IHtcbiAgZm9udEhlbHBlcixcbiAgbG9jYWxpemUsXG4gIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLFxuICBDb21ldENoYXREZXRhaWxzT3B0aW9uLFxuICBDb21ldENoYXREZXRhaWxzVGVtcGxhdGUsXG4gIERhdGVQYXR0ZXJucyxcbiAgQ29tZXRDaGF0Q2FsbERldGFpbHNPcHRpb24sXG59IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQ29tZXRDaGF0IH0gZnJvbSBcIkBjb21ldGNoYXQvY2hhdC1zZGstamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgQ29tZXRDaGF0VGhlbWVTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL0NvbWV0Q2hhdFRoZW1lLnNlcnZpY2VcIjtcbmltcG9ydCB7IENhbGxEZXRhaWxVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9TaGFyZWQvVXRpbHMvQ2FsbERldGFpbFV0aWxzXCJcbmltcG9ydCB7IENhbGxMb2dVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9TaGFyZWQvVXRpbHMvQ2FsbExvZ1V0aWxzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlsc1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvbWV0Q2hhdENhbGxMb2dEZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjYWxsITogYW55O1xuICBASW5wdXQoKSBncm91cCE6IENvbWV0Q2hhdC5Hcm91cDtcbiAgQElucHV0KCkgdXNlciE6IENvbWV0Q2hhdC5Vc2VyO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gbG9jYWxpemUoXCJDQUxMX0RFVEFJTFNcIik7XG4gIEBJbnB1dCgpIG9uQmFja0NsaWNrPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaGlkZVByb2ZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc3VidGl0bGVWaWV3ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgY3VzdG9tUHJvZmlsZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpIGJhY2tJY29uVXJsOiBzdHJpbmcgPSBcImFzc2V0cy9iYWNrYnV0dG9uLnN2Z1wiO1xuICBASW5wdXQoKSBncmVhdGVyVGhhbkljb25VUkw6IHN0cmluZyA9IFwiYXNzZXRzL2dyZWF0ZXJUaGFuSWNvbi5zdmdcIjtcblxuICBASW5wdXQoKSBjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb246IENhbGxCdXR0b25zQ29uZmlndXJhdGlvbiA9XG4gICAgbmV3IENhbGxCdXR0b25zQ29uZmlndXJhdGlvbih7fSk7XG5cbiAgQElucHV0KCkgY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb246IENhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uID1cbiAgICBuZXcgQ2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24oe30pO1xuXG4gIEBJbnB1dCgpIGNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbjogQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uID1cbiAgICBuZXcgQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uKHt9KTtcblxuICBASW5wdXQoKSBjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb246IENhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbiA9XG4gICAgbmV3IENhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbih7fSk7XG5cbiAgQElucHV0KCkgb25FcnJvcjogKChlcnJvcjogQ29tZXRDaGF0LkNvbWV0Q2hhdEV4Y2VwdGlvbikgPT4gdm9pZCkgfCBudWxsID0gKFxuICAgIGVycm9yOiBDb21ldENoYXQuQ29tZXRDaGF0RXhjZXB0aW9uXG4gICkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgfTtcbiAgQElucHV0KCkgZGF0ZVBhdHRlcm46IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy50aW1lO1xuICBASW5wdXQoKSBkYXRlUGF0dGVybjI6IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy5EYXlEYXRlO1xuXG4gIEBJbnB1dCgpIGRhdGE6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZVtdID0gW107XG5cbiAgQElucHV0KCkgYXZhdGFyU3R5bGU6IEF2YXRhclN0eWxlID0ge1xuICAgIGJvcmRlclJhZGl1czogXCIxNnB4XCIsXG4gICAgd2lkdGg6IFwiMjhweFwiLFxuICAgIGhlaWdodDogXCIyOHB4XCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgfTtcbiAgQElucHV0KCkgbGFiZWxTdHlsZTogTGFiZWxTdHlsZSA9IHtcbiAgICB0ZXh0Rm9udDogJzYwMCAyMnB4IHNhbnMtc2VyaWYsIEludGVyJyxcbiAgICB0ZXh0Q29sb3I6ICdyZ2IoMjAsIDIwLCAyMCknXG4gIH07XG4gIEBJbnB1dCgpIGNhbGxEZXRhaWxzU3R5bGU6IENhbGxMb2dEZXRhaWxzU3R5bGUgPSB7XG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gIH07XG5cbiAgQElucHV0KCkgbGlzdEl0ZW1TdHlsZTogTGlzdEl0ZW1TdHlsZSA9IHt9O1xuXG4gIEBJbnB1dCgpIGRhdGVTdHlsZTogRGF0ZVN0eWxlID0ge307XG4gIEBJbnB1dCgpIGNhbGxCdXR0b25zU3R5bGU6IENhbGxCdXR0b25zU3R5bGUgPSB7XG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiMFwiLFxuICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgfTtcblxuICBpY29uU3R5bGU6IEljb25TdHlsZSA9IHtcbiAgICBoZWlnaHQ6IFwiMTZweFwiLFxuICAgIHdpZHRoOiBcIjE2cHhcIixcbiAgICBpY29uVGludDogXCJSR0JBKDIwLCAyMCwgMjAsIDAuNjgpXCIsXG4gIH07XG5cbiAgZGVmYXVsdFRlbXBsYXRlOiBDb21ldENoYXREZXRhaWxzVGVtcGxhdGVbXSA9IFtdO1xuXG4gIHB1YmxpYyBhdXRoVG9rZW46IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBsb2dnZWRJblVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBzaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3Q6IEJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgc2hvd0NvbWV0Q2hhdE1lc3NhZ2VzOiBCb29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHNob3dQYXJ0aWNpcGFudHNMaXN0OiBCb29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93Q2FsbFJlY29yZGluZ0xpc3Q6IEJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dDYWxsSGlzdG9yeTogQm9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgZ2V0VGl0bGVTdHlsZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEZvbnQ6XG4gICAgICAgIHRoaXMuY2FsbERldGFpbHNTdHlsZS50aXRsZUZvbnQgfHxcbiAgICAgICAgZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICB0ZXh0Q29sb3I6XG4gICAgICAgIHRoaXMuY2FsbERldGFpbHNTdHlsZS50aXRsZUNvbG9yIHx8XG4gICAgICAgIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgdXNlckxpc3RlbmVySWQgPSBcInVzZXJsaXN0X1wiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHB1YmxpYyByZXF1ZXN0QnVpbGRlcjogYW55O1xuICBwdWJsaWMgbGltaXQ6IG51bWJlciA9IDU7XG5cbiAgcHVibGljIG9uSXRlbUNsaWNrOiAoY2FsbDogYW55KSA9PiB2b2lkID0gKGNhbGw6IGFueSkgPT4ge1xuICAgIHRoaXMuY2FsbCA9IGNhbGw7XG4gICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSB0cnVlO1xuICAgIHRoaXMuc2hvd0NhbGxIaXN0b3J5ID0gZmFsc2U7XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9O1xuICB0eXBlczogc3RyaW5nW10gPSBbXTtcbiAgY2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBDb21ldENoYXRUaGVtZVNlcnZpY2VcbiAgKSB7fVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbXCJ1c2VyXCJdIHx8IGNoYW5nZXNbXCJncm91cFwiXSkge1xuICAgICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93UGFydGljaXBhbnRzTGlzdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93Q2FsbFJlY29yZGluZ0xpc3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0NhbGxIaXN0b3J5ID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dDb21ldENoYXRNZXNzYWdlcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUxpc3RlbmVyKCkge1xuICAgIENvbWV0Q2hhdC5yZW1vdmVVc2VyTGlzdGVuZXIodGhpcy51c2VyTGlzdGVuZXJJZCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBDb21ldENoYXQuZ2V0TG9nZ2VkaW5Vc2VyKClcbiAgICAgIC50aGVuKCh1c2VyOiBDb21ldENoYXQuVXNlciB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSB1c2VyO1xuICAgICAgICB0aGlzLmF1dGhUb2tlbiA9IHRoaXMubG9nZ2VkSW5Vc2VyIS5nZXRBdXRoVG9rZW4oKTtcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IENvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHRoaXMub25FcnJvcikge1xuICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zZXRUaGVtZVN0eWxlKCk7XG4gIH1cblxuICB0cmFja0J5Rm5PcHRpb24oaW5kZXg6IG51bWJlciwgb3B0aW9uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb24uaWQ7XG4gIH1cbiAgZ2V0VGVtcGxhdGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGVmYXVsdFRlbXBsYXRlID0gdGhpcy5kYXRhO1xuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlZmF1bHRUZW1wbGF0ZSA9IENhbGxEZXRhaWxVdGlscy5nZXREZWZhdWx0Q2FsbFRlbXBsYXRlKFxuICAgICAgICB0aGlzLmNhbGwsXG4gICAgICAgIHRoaXMubG9nZ2VkSW5Vc2VyISxcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRUZW1wbGF0ZU9wdGlvbnMgPSAodGVtcGxhdGU6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZSkgPT4ge1xuICAgIGlmICh0ZW1wbGF0ZS5vcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGUub3B0aW9ucyh0aGlzLnVzZXIsIHRoaXMuZ3JvdXAsIHRlbXBsYXRlLmlkIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIHJldHVybiBbXTtcbiAgfTtcblxuICBnZXRDdXN0b21PcHRpb25WaWV3KG9wdGlvbjogQ29tZXRDaGF0RGV0YWlsc09wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24/LmN1c3RvbVZpZXc7XG4gIH1cblxuICBnZXRTZWN0aW9uSGVhZGVyU3R5bGUodGVtcGxhdGU6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0Rm9udDogdGVtcGxhdGUudGl0bGVGb250LFxuICAgICAgdGV4dENvbG9yOiB0ZW1wbGF0ZS50aXRsZUNvbG9yLFxuICAgIH07XG4gIH1cblxuICBvbk9wdGlvbkNsaWNrID0gKG9wdGlvbjogQ29tZXRDaGF0Q2FsbERldGFpbHNPcHRpb24pID0+IHtcbiAgICBpZiAob3B0aW9uPy5vbkNsaWNrKSB7XG4gICAgICBvcHRpb24ub25DbGljayh0aGlzLmNhbGwhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChvcHRpb24uaWQpIHtcbiAgICAgICAgY2FzZSBcInBhcnRpY2lwYW50c1wiOlxuICAgICAgICAgIHRoaXMuc2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zaG93UGFydGljaXBhbnRzTGlzdCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyZWNvcmRpbmdzXCI6XG4gICAgICAgICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSBmYWxzZTtcblxuICAgICAgICAgIHRoaXMuc2hvd0NhbGxSZWNvcmRpbmdMaXN0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiY2FsbEhpc3RvcnlcIjpcbiAgICAgICAgICB0aGlzLnNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5zaG93Q2FsbEhpc3RvcnkgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGdldEJ1dHRvblN0eWxlKG9wdGlvbjogQ29tZXRDaGF0RGV0YWlsc09wdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICBidXR0b25UZXh0Rm9udDogb3B0aW9uPy50aXRsZUZvbnQsXG4gICAgICBidXR0b25UZXh0Q29sb3I6IG9wdGlvbj8udGl0bGVDb2xvcixcbiAgICAgIGJhY2tncm91bmQ6IG9wdGlvbj8uYmFja2dyb3VuZENvbG9yIHx8IFwidHJhbnNwYXJlbnRcIixcbiAgICB9O1xuICB9XG5cblxuICBoYW5kbGVQYWdlT25CYWNrQ2xpY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5zaG93Q2FsbEhpc3RvcnkgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dDYWxsUmVjb3JkaW5nTGlzdCA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1BhcnRpY2lwYW50c0xpc3QgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dDb21ldENoYXRNZXNzYWdlcyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ID0gdHJ1ZTtcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG5cbiAgc3VidGl0bGVTdHlsZSh0ZW1wbGF0ZTogQ29tZXRDaGF0RGV0YWlsc1RlbXBsYXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0ZW1wbGF0ZS50aXRsZUZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRlbXBsYXRlLnRpdGxlQ29sb3IsXG4gICAgfTtcbiAgfVxuICBzaG93RGF0YVNlY3Rpb25TdHlsZSh0ZW1wbGF0ZTogQ29tZXRDaGF0RGV0YWlsc1RlbXBsYXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0ZW1wbGF0ZS50aXRsZUZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRlbXBsYXRlLnRpdGxlQ29sb3IsXG4gICAgfTtcbiAgfVxuXG4gIHNldFRoZW1lU3R5bGUoKSB7XG4gICAgdGhpcy5zZXREZXRhaWxzU3R5bGUoKTtcbiAgICB0aGlzLnNldEF2YXRhclN0eWxlKCk7XG4gICAgdGhpcy5zZXRMaXN0SXRlbVN0eWxlKCk7XG4gICAgdGhpcy5zZXREYXRlU3R5bGUoKTtcbiAgfVxuICBzZXRMaXN0SXRlbVN0eWxlKCkge1xuICAgIGxldCBkZWZhdWx0U3R5bGU6IExpc3RJdGVtU3R5bGUgPSBuZXcgTGlzdEl0ZW1TdHlsZSh7XG4gICAgICBoZWlnaHQ6IFwiNDVweFwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ1MCgpIHx8XG4gICAgICAgIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QmFja2dyb3VuZCgpLFxuICAgICAgYWN0aXZlQmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiLFxuICAgICAgdGl0bGVGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGl0bGUyKSxcbiAgICAgIHRpdGxlQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgc2VwYXJhdG9yQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCksXG4gICAgICBob3ZlckJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gICAgfSk7XG4gICAgdGhpcy5saXN0SXRlbVN0eWxlID0geyAuLi5kZWZhdWx0U3R5bGUsIC4uLnRoaXMubGlzdEl0ZW1TdHlsZSB9O1xuICB9XG4gIHNldEF2YXRhclN0eWxlKCkge1xuICAgIGxldCBkZWZhdWx0U3R5bGU6IEF2YXRhclN0eWxlID0gbmV3IEF2YXRhclN0eWxlKHtcbiAgICAgIGJvcmRlclJhZGl1czogXCIyNHB4XCIsXG4gICAgICB3aWR0aDogXCI0NnB4XCIsXG4gICAgICBoZWlnaHQ6IFwiNDZweFwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgIG5hbWVUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50OTAwKCksXG4gICAgICBiYWNrZ3JvdW5kU2l6ZTogXCJjb3ZlclwiLFxuICAgICAgbmFtZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUxKSxcblxuICAgICAgb3V0ZXJWaWV3Qm9yZGVyU3BhY2luZzogXCJcIixcbiAgICB9KTtcbiAgICB0aGlzLmF2YXRhclN0eWxlID0geyAuLi5kZWZhdWx0U3R5bGUsIC4uLnRoaXMuYXZhdGFyU3R5bGUgfTtcbiAgfVxuXG4gIHNldERldGFpbHNTdHlsZSgpIHtcbiAgICBsZXQgZGVmYXVsdFN0eWxlOiBDYWxsTG9nRGV0YWlsc1N0eWxlID0gbmV3IENhbGxMb2dEZXRhaWxzU3R5bGUoe1xuICAgICAgYmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRCYWNrZ3JvdW5kKCksXG4gICAgICB0aXRsZUZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50aXRsZTEpLFxuICAgICAgdGl0bGVDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIGJhY2tJY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIlwiLFxuICAgICAgbmFtZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICB9KTtcbiAgICB0aGlzLmNhbGxEZXRhaWxzU3R5bGUgPSB7IC4uLmRlZmF1bHRTdHlsZSwgLi4udGhpcy5jYWxsRGV0YWlsc1N0eWxlIH07XG4gIH1cblxuICBzZXREYXRlU3R5bGUoKSB7XG4gICAgbGV0IGRlZmF1bHRTdHlsZTogRGF0ZVN0eWxlID0gbmV3IERhdGVTdHlsZSh7XG4gICAgICB0ZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LmNhcHRpb24yKSxcbiAgICAgIHRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICB9KTtcbiAgICB0aGlzLmRhdGVTdHlsZSA9IHsgLi4uZGVmYXVsdFN0eWxlLCAuLi50aGlzLmRhdGVTdHlsZSB9O1xuICB9XG4gIHdyYXBwZXJTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMuY2FsbERldGFpbHNTdHlsZS53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLmhlaWdodCxcbiAgICAgIGJvcmRlcjogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLmJvcmRlcixcbiAgICAgIGJvcmRlclJhZGl1czogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLmJvcmRlclJhZGl1cyxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuY2FsbERldGFpbHNTdHlsZS5iYWNrZ3JvdW5kLFxuICAgICAgcGFkZGluZzogJzE2cHgnLFxuICAgIH07XG4gIH07XG5cbiAgcHJvZmlsZUNvbnRhaW5lclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgbWluSGVpZ2h0OiBcIjE1MHB4XCIsXG4gICAgICBwYWRkaW5nOiBcIjE2cHhcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICBnYXA6IFwiOHB4XCIsXG4gICAgfVxuICB9XG5cbiAgZ2V0VGFpbFZpZXdTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm57XG4gICAgICBmb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlPy50aGVtZS50eXBvZ3JhcGh5LnRleHQzKSxcbiAgICAgIGNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpXG4gICAgfVxuICB9XG5cbiAgZ2V0VGFpbFZpZXcodG90YWxTZWNvbmRzOiBudW1iZXIpIHtcbiAgICByZXR1cm4gQ2FsbExvZ1V0aWxzLmNvbnZlcnRNaW51dGVzVG9Ib3Vyc01pbnV0ZXNTZWNvbmRzKHRvdGFsU2Vjb25kcyk7XG4gIH1cblxuICBnZXRTdWJ0aXRsZShjYWxsOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBDYWxsTG9nVXRpbHMuZ2V0Q2FsbFN0YXR1c1dpdGhUeXBlKGNhbGwsIHRoaXMubG9nZ2VkSW5Vc2VyISk7XG4gIH1cblxuICBiYWNrQnV0dG9uU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogXCIyNHB4XCIsXG4gICAgICB3aWR0aDogXCIyNHB4XCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjBcIixcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIGJ1dHRvbkljb25UaW50OiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICB9O1xuICB9O1xuICBnZXRMaXN0SXRlbVN0eWxlKG9wdGlvbjogQ29tZXRDaGF0RGV0YWlsc09wdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgb3B0aW9uPy5iYWNrZ3JvdW5kQ29sb3IgfHxcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRCYWNrZ3JvdW5kKCksXG4gICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgICB0aXRsZUZvbnQ6XG4gICAgICAgIG9wdGlvbj8udGl0bGVGb250IHx8XG4gICAgICAgIGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50aXRsZTIpLFxuXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgc2VwYXJhdG9yQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCksXG4gICAgICBob3ZlckJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3dyYXBwZXJcIiAqbmdJZj1cInVzZXIgfHwgZ3JvdXBcIiBbbmdTdHlsZV09XCJ3cmFwcGVyU3R5bGUoKVwiPlxuXG4gIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19oZWFkZXJcIlxuICAgICpuZ0lmPVwib25CYWNrQ2xpY2sgJiYgIShzaG93UGFydGljaXBhbnRzTGlzdCB8fCBzaG93Q2FsbFJlY29yZGluZ0xpc3QgfHwgc2hvd0NhbGxIaXN0b3J5KVwiPlxuICAgIDxjb21ldGNoYXQtYnV0dG9uIFtpY29uVVJMXT1cImJhY2tJY29uVXJsXCIgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jbG9zZS1idXR0b25cIiBbYnV0dG9uU3R5bGVdPVwiYmFja0J1dHRvblN0eWxlKClcIlxuICAgICAgKGNjLWJ1dHRvbi1jbGlja2VkKT1cIm9uQmFja0NsaWNrKClcIj48L2NvbWV0Y2hhdC1idXR0b24+XG4gICAgPGNvbWV0Y2hhdC1sYWJlbCBbdGV4dF09XCJ0aXRsZVwiIFtsYWJlbFN0eWxlXT1cImdldFRpdGxlU3R5bGUoKVwiPjwvY29tZXRjaGF0LWxhYmVsPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19wcm9maWxlXCJcbiAgICAgICpuZ0lmPVwiIWhpZGVQcm9maWxlICYmIHNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCAmJiAhKHNob3dQYXJ0aWNpcGFudHNMaXN0IHx8IHNob3dDYWxsUmVjb3JkaW5nTGlzdCB8fCBzaG93Q2FsbEhpc3RvcnkpXCI+XG5cblxuICAgICAgPGRpdiBjbGFzcz1cIiBjYy1jYWxsLWxvZy1kZXRhaWxzX19kZWZhdWx0LXByb2ZpbGVcIiAqbmdJZj1cIiFjdXN0b21Qcm9maWxlVmlldztlbHNlIGxpc3RpdGVtXCIgW25nU3R5bGVdPVwicHJvZmlsZUNvbnRhaW5lclN0eWxlKClcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1hdmF0YXIgW25hbWVdPVwidXNlcj8uZ2V0TmFtZSgpID8/IGdyb3VwPy5nZXROYW1lKClcIiBbYXZhdGFyU3R5bGVdPVwiYXZhdGFyU3R5bGVcIlxuICAgICAgICAgIFtpbWFnZV09XCJ1c2VyPy5nZXRBdmF0YXIoKSA/PyBncm91cD8uZ2V0SWNvbigpXCI+XG4gICAgICAgIDwvY29tZXRjaGF0LWF2YXRhcj5cblxuICAgICAgICA8Y29tZXRjaGF0LWxhYmVsIFt0ZXh0XT1cInVzZXI/LmdldE5hbWUoKSA/PyB0aGlzLmdyb3VwPy5nZXROYW1lKClcIiBbbGFiZWxTdHlsZV09XCJsYWJlbFN0eWxlXCI+PC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fc2VjdGlvbi1saXN0XCJcbiAgICAgICpuZ0lmPVwic2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ICYmIGRlZmF1bHRUZW1wbGF0ZSAmJiBkZWZhdWx0VGVtcGxhdGUubGVuZ3RoID4gMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3NlY3Rpb25cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkZWZhdWx0VGVtcGxhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3NlY3Rpb24tc2VwYXJhdG9yXCIgKm5nSWY9XCJpdGVtLnRpdGxlXCI+XG4gICAgICAgICAgPGNvbWV0Y2hhdC1sYWJlbCBbdGV4dF09XCJpdGVtLnRpdGxlXCI+PC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fb3B0aW9ucy13cmFwcGVyXCIgKm5nSWY9XCJnZXRUZW1wbGF0ZU9wdGlvbnMoaXRlbSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fb3B0aW9uc1wiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0VGVtcGxhdGVPcHRpb25zKGl0ZW0pOyAgdHJhY2tCeTogdHJhY2tCeUZuT3B0aW9uIFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX29wdGlvblwiICpuZ0lmPVwiIWdldEN1c3RvbU9wdGlvblZpZXcob3B0aW9uKTtlbHNlIGN1c3RvbVZpZXdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX29wdGlvbi1lbGVtZW50XCI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fY2FsbGluZy1kZWZhdWx0LW9wdGlvblwiICpuZ0lmPVwib3B0aW9uLmlkPT0nY2FsbHMnXCI+XG5cbiAgICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtY2FsbC1idXR0b25zIFt1c2VyXT1cInVzZXJcIiBbZ3JvdXBdPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBbY2FsbEJ1dHRvbnNTdHlsZV09XCJjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb24uY2FsbEJ1dHRvbnNTdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvblZpZGVvQ2FsbENsaWNrXT1cImNhbGxCdXR0b25zQ29uZmlndXJhdGlvbi5vblZpZGVvQ2FsbENsaWNrXCJcbiAgICAgICAgICAgICAgICAgICAgW29uVm9pY2VDYWxsQ2xpY2tdPVwiY2FsbEJ1dHRvbnNDb25maWd1cmF0aW9uLm9uVm9pY2VDYWxsQ2xpY2tcIlxuICAgICAgICAgICAgICAgICAgICBbdmlkZW9DYWxsSWNvblVSTF09XCJjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb24udmlkZW9DYWxsSWNvblVSTFwiXG4gICAgICAgICAgICAgICAgICAgIFt2b2ljZUNhbGxJY29uVVJMXT1cImNhbGxCdXR0b25zQ29uZmlndXJhdGlvbi52b2ljZUNhbGxJY29uVVJMXCI+PC9jb21ldGNoYXQtY2FsbC1idXR0b25zPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtbGlzdC1pdGVtICpuZ0lmPVwib3B0aW9uLmlkPT09J2NhbGxTdGF0dXMnXCIgW2xpc3RJdGVtU3R5bGVdPVwiZ2V0TGlzdEl0ZW1TdHlsZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFtoaWRlU2VwYXJhdG9yXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jYWxsLVN0YXR1c1wiIHNsb3Q9XCJzdWJ0aXRsZVZpZXdcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc3VidGl0bGVWaWV3OyBlbHNlIHN1YnRpdGxlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiA8Y29tZXRjaGF0LWRhdGUgW2RhdGVTdHlsZV09XCJkYXRlU3R5bGVcIiBbdGltZXN0YW1wXT1cImNhbGw/LmdldEluaXRpYXRlZEF0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJkYXRlUGF0dGVybjJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWRhdGU+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jYWxsLVN0YXR1c19fc3ViVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbWV0Y2hhdC1kYXRlIFtkYXRlU3R5bGVdPVwiZGF0ZVN0eWxlXCIgW3RpbWVzdGFtcF09XCJjYWxsPy5nZXRJbml0aWF0ZWRBdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJkYXRlUGF0dGVyblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tZXRjaGF0LWxhYmVsIFt0ZXh0XT1cImdldFN1YnRpdGxlKGNhbGwpXCIgW2xhYmVsU3R5bGVdPVwic3VidGl0bGVTdHlsZShvcHRpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fY2FsbC1TdGF0dXNfX3RhaWx2aWV3XCIgW3N0eWxlXT1cImdldFRhaWxWaWV3U3R5bGUoKVwiPiB7eyBnZXRUYWlsVmlldyhjYWxsPy5nZXRUb3RhbER1cmF0aW9uSW5NaW51dGVzKCkhKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1YnRpdGxlVmlldztjb250ZXh0OnsgJGltcGxpY2l0OiB1c2VyID8/IGdyb3VwIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8L2NvbWV0Y2hhdC1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgPGNvbWV0Y2hhdC1saXN0LWl0ZW0gKm5nSWY9XCJvcHRpb24uaWQhPT0nY2FsbHMnICYmIG9wdGlvbi5pZCE9PSdjYWxsU3RhdHVzJyBcIlxuICAgICAgICAgICAgICAgICAgKGNjLWxpc3RpdGVtLWNsaWNrZWQpPVwib25PcHRpb25DbGljayhvcHRpb24pXCIgW2xpc3RJdGVtU3R5bGVdPVwiZ2V0TGlzdEl0ZW1TdHlsZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJvcHRpb24udGl0bGVcIiBbaGlkZVNlcGFyYXRvcl09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9XCJ0YWlsVmlld1wiIGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fc2Vjb25kYXJ5LXZpZXdfX3RhaWwtdmlld1wiIFtzdHlsZV09XCJnZXRUYWlsVmlld1N0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi50YWlsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtaWNvbiBbaWNvblN0eWxlXT1cImljb25TdHlsZVwiIFtVUkxdPVwiZ3JlYXRlclRoYW5JY29uVVJMXCI+PC9jb21ldGNoYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICA8L2NvbWV0Y2hhdC1saXN0LWl0ZW0+XG5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tVmlldz5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldEN1c3RvbU9wdGlvblZpZXcob3B0aW9uKVwiPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dQYXJ0aWNpcGFudHNMaXN0IHx8IHNob3dDYWxsUmVjb3JkaW5nTGlzdCB8fCBzaG93Q2FsbEhpc3RvcnlcIiBzdHlsZT1cIiBoZWlnaHQ6IDEwMCU7XCI+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93UGFydGljaXBhbnRzTGlzdFwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxuICAgICAgICA8Y29tZXRjaGF0LWNhbGwtbG9nLXBhcnRpY2lwYW50cyBbY2FsbF09XCJjYWxsXCJcbiAgICAgICAgICBbb25CYWNrQ2xpY2tdPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24ub25CYWNrQ2xpY2sgfHwgaGFuZGxlUGFnZU9uQmFja0NsaWNrXCJcbiAgICAgICAgICBbYmFja0ljb25VcmxdPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24uYmFja0ljb25VcmwgfHwgYmFja0ljb25VcmxcIlxuICAgICAgICAgIFthdmF0YXJTdHlsZV09XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5hdmF0YXJTdHlsZVwiXG4gICAgICAgICAgW29uSXRlbUNsaWNrXT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLm9uSXRlbUNsaWNrIVwiXG4gICAgICAgICAgW2RhdGVQYXR0ZXJuXT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLmRhdGVQYXR0ZXJuXCJcbiAgICAgICAgICBbc3VidGl0bGVWaWV3XT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLnN1YnRpdGxlVmlld1wiXG4gICAgICAgICAgW2xpc3RJdGVtVmlld109XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5saXN0SXRlbVZpZXdcIlxuXG4gICAgICAgICAgW2xpc3RJdGVtU3R5bGVdPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24ubGlzdEl0ZW1TdHlsZVwiIFtjYWxsTG9nUGFydGljaXBhbnRzU3R5bGVdPVwiXG4gICAgICAgIGNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLmNhbGxMb2dQYXJ0aWNpcGFudHNTdHlsZVwiXG4gICAgICAgXG4gICAgICAgICAgW3RhaWxWaWV3XT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLnRhaWxWaWV3XCI+PC9jb21ldGNoYXQtY2FsbC1sb2ctcGFydGljaXBhbnRzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NhbGxSZWNvcmRpbmdMaXN0XCIgc3R5bGU9XCJoZWlnaHQ6MTAwJTtcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1jYWxsLWxvZy1yZWNvcmRpbmdzIFtjYWxsXT1cImNhbGxcIlxuICAgICAgICAgIFtiYWNrSWNvblVybF09XCJjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24uYmFja0ljb25VcmwgfHwgYmFja0ljb25VcmxcIiBbb25CYWNrQ2xpY2tdPVwiXG4gICAgICAgIGNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5vbkJhY2tDbGljayB8fCBoYW5kbGVQYWdlT25CYWNrQ2xpY2tcbiAgICAgIFwiIFtvbkl0ZW1DbGlja109XCJjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24ub25JdGVtQ2xpY2shXCJcbiAgICAgICAgICBbZGF0ZVBhdHRlcm5dPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLmRhdGVQYXR0ZXJuIVwiXG4gICAgICAgICAgW2xpc3RJdGVtU3R5bGVdPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLmxpc3RJdGVtU3R5bGVcIiBjYWxsTG9nUmVjb3JkaW5nc1N0eWxlPVwiXG4gICAgICAgIGNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5jYWxsTG9nUmVjb3JkaW5nc1N0eWxlXG4gICAgICAgIGNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5oaWRlRG93bmxvYWRCdXR0b24gfHwgZmFsc2VcbiAgICAgIFwiIFtvbkRvd25sb2FkQ2xpY2tdPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLm9uRG93bmxvYWRDbGljayFcIlxuICAgICAgICAgIFtsaXN0SXRlbVZpZXddPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLmxpc3RJdGVtVmlld1wiXG4gICAgICAgICAgW3N1YnRpdGxlVmlld109XCJjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24uc3VidGl0bGVWaWV3XCJcbiAgICAgICAgICBbdGFpbFZpZXddPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLnRhaWxWaWV3XCI+PC9jb21ldGNoYXQtY2FsbC1sb2ctcmVjb3JkaW5ncz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNob3dDYWxsSGlzdG9yeVwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1jYWxsLWxvZy1oaXN0b3J5IFtjYWxsXT1cImNhbGxcIiBbdXNlcl09XCJ1c2VyXCIgW2dyb3VwXT1cImdyb3VwXCIgW29uQmFja0NsaWNrXT1cImhhbmRsZVBhZ2VPbkJhY2tDbGlja1wiXG4gICAgICAgICAgW2JhY2tJY29uVXJsXT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5iYWNrSWNvblVybCB8fCBiYWNrSWNvblVybFwiXG4gICAgICAgICAgW2VtcHR5U3RhdGVWaWV3XT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5lbXB0eVN0YXRlVmlld1wiXG4gICAgICAgICAgW2Vycm9yU3RhdGVWaWV3XT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5lcnJvclN0YXRlVmlld1wiXG4gICAgICAgICAgW2xvYWRpbmdJY29uVVJMXT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5sb2FkaW5nSWNvblVSTFwiXG4gICAgICAgICAgW2xvYWRpbmdTdGF0ZVZpZXddPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmxvYWRpbmdTdGF0ZVZpZXdcIlxuICAgICAgICAgIFt0YWlsVmlld109XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24udGFpbFZpZXdcIiBbY2FsbExvZ1JlcXVlc3RCdWlsZGVyXT1cIlxuICAgICAgICAgICAgY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmNhbGxMb2dSZXF1ZXN0QnVpbGRlclxuICAgICAgICAgIFwiIFtvbkl0ZW1DbGlja109XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24ub25JdGVtQ2xpY2sgfHwgb25JdGVtQ2xpY2tcIiBbb25CYWNrQ2xpY2tdPVwiXG4gICAgICAgICAgICBjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24ub25CYWNrQ2xpY2sgfHwgaGFuZGxlUGFnZU9uQmFja0NsaWNrXG4gICAgICAgICAgXCIgW2xpc3RJdGVtU3R5bGVdPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmxpc3RJdGVtU3R5bGVcIlxuICAgICAgICAgIFtkYXRlUGF0dGVybl09XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uZGF0ZVBhdHRlcm5cIiBbZGF0ZVNlcGFyYXRvclBhdHRlcm5dPVwiXG4gICAgICAgICAgICBjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uZGF0ZVNlcGFyYXRvclBhdHRlcm5cbiAgICAgICAgICBcIiBbY2FsbExvZ0hpc3RvcnlTdHlsZV09XCJcbiAgICAgICAgICAgIGNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5jYWxsTG9nSGlzdG9yeVN0eWxlXG4gICAgICAgICAgXCIgW29uRXJyb3JdPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLm9uRXJyb3IhXCI+PC9jb21ldGNoYXQtY2FsbC1sb2ctaGlzdG9yeT5cbiAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuPG5nLXRlbXBsYXRlICNsaXN0aXRlbT5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVByb2ZpbGVWaWV3XCI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT4iXX0=