@nova-ui/bits
Version:
SolarWinds Nova Framework
133 lines • 28.6 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { FocusMonitor } from "@angular/cdk/a11y";
import { CdkStepHeader, STEP_STATE } from "@angular/cdk/stepper";
import { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, Optional, ViewEncapsulation, } from "@angular/core";
import assign from "lodash/assign";
import { WIZARD_CONFIG, WIZARD_CONFIG_DEFAULT, } from "../../../constants/wizard.constants";
import { WizardStepV2Component } from "../wizard-step/wizard-step.component";
import { WizardStepLabelDirective } from "../wizard-step-label.directive";
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/a11y";
import * as i2 from "@angular/common";
import * as i3 from "../../icon/icon.component";
import * as i4 from "../../tooltip/tooltip.directive";
/** @ignore */
export class WizardStepHeaderComponent extends CdkStepHeader {
constructor(_focusMonitor, _elementRef, config) {
super(_elementRef);
this._focusMonitor = _focusMonitor;
this.config = config;
/** Label that is rendered below optional steps. */
this.optionalLabel = $localize `Optional`;
this.wizardConfig = { ...WIZARD_CONFIG_DEFAULT };
if (this.config) {
this.updateStepStateConfig(this.config.stepState);
}
this.createStepStateConfigMap();
}
ngOnChanges(changes) {
if (changes?.stepStateConfig?.currentValue) {
this.updateStepStateConfig(changes?.stepStateConfig?.currentValue);
this.createStepStateConfigMap();
}
this.stepState = this.getStepState(this.step);
}
ngAfterViewInit() {
this._focusMonitor.monitor(this._elementRef, true);
}
ngOnDestroy() {
this._focusMonitor.stopMonitoring(this._elementRef);
}
/** Focuses the step header. */
focus() {
this._focusMonitor.focusVia(this._elementRef, "program");
}
/** Returns string label of given step if it is a text label. */
get stringLabel() {
return this.label instanceof WizardStepLabelDirective
? null
: this.label;
}
/** Returns WizardStepLabel if the label of given step is a template label. */
get templateLabel() {
return this.label instanceof WizardStepLabelDirective
? this.label
: null;
}
updateStepStateConfig(stepStateConfig) {
this.wizardConfig.stepState = assign({ ...this.wizardConfig.stepState }, stepStateConfig);
}
createStepStateConfigMap() {
this.stepStateConfigMap = {
[STEP_STATE.NUMBER]: this.wizardConfig.stepState?.initial,
[STEP_STATE.DONE]: this.wizardConfig.stepState?.visited,
[STEP_STATE.EDIT]: this.wizardConfig.stepState?.active,
[STEP_STATE.ERROR]: this.wizardConfig.stepState?.error,
};
}
getStepState(step) {
const isSelected = this.selected;
if (step.hasError && isSelected) {
return STEP_STATE.ERROR;
}
if (isSelected) {
return STEP_STATE.EDIT;
}
if (step.completed) {
return STEP_STATE.DONE;
}
return STEP_STATE.NUMBER;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WizardStepHeaderComponent, deps: [{ token: i1.FocusMonitor }, { token: i0.ElementRef }, { token: WIZARD_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: WizardStepHeaderComponent, selector: "nui-wizard-step-header", inputs: { stepStateConfig: "stepStateConfig", label: "label", optionalLabel: "optionalLabel", errorMessage: "errorMessage", index: "index", selected: "selected", active: "active", step: "step" }, host: { attributes: { "role": "tab" }, properties: { "class.nui-wizard-step-header--selected": "selected", "class.nui-wizard-step-header--optional": "step.optional", "class.nui-wizard-step-header--completed": "stepState === 'done'" }, classAttribute: "nui-wizard-step-header" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"nui-wizard-step-header__label\"\n [nuiTooltip]=\"stringLabel ? stringLabel : ''\"\n [class.nui-wizard-step-header__label--active]=\"step.completed\"\n [class.nui-wizard-step-header__label--selected]=\"selected\"\n [class.nui-wizard-step-header__label--error]=\"stepState === 'error'\"\n>\n <!-- If there is a label template, use it. -->\n <ng-container\n *ngIf=\"templateLabel\"\n [ngTemplateOutlet]=\"templateLabel?.template\"\n ></ng-container>\n\n <!-- If there is no label template, fall back to the text label. -->\n <div class=\"nui-wizard-step-header__text-label\" *ngIf=\"stringLabel\">\n {{ label }}\n </div>\n\n <div\n class=\"nui-wizard-step-header__label--optional\"\n *ngIf=\"step.optional && stepState !== 'error'\"\n >\n {{ optionalLabel }}\n </div>\n <div\n class=\"nui-wizard-step-header__label--error\"\n *ngIf=\"stepState === 'error'\"\n >\n {{ errorMessage }}\n </div>\n</div>\n\n<div\n class=\"nui-wizard-step-header-icon nui-step-header-icon-state--{{\n stepState\n }}\"\n>\n <div class=\"nui-wizard-step-header-icon-container\">\n <span class=\"nui-wizard-step-header-icon-content\">\n <ng-container>\n <nui-icon\n [icon]=\"stepStateConfigMap[stepState].icon\"\n [iconColor]=\"stepStateConfigMap[stepState].iconColor\"\n ></nui-icon>\n </ng-container>\n </span>\n </div>\n</div>\n", styles: [".nui-wizard-step-header{overflow:hidden;outline:none;cursor:pointer;position:relative;color:var(--nui-color-text-default,#111);width:145px}.nui-wizard-step-header--completed{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header:focus{outline:none;box-shadow:inset 0 0 0 2px #00c4d280;border-radius:3px}.nui-wizard-step-header:focus:not(:focus-visible){box-shadow:unset;border-radius:unset}.nui-wizard-step-header-icon{height:16px;width:16px;position:relative}.nui-popover-container__content .nui-wizard-step-header-icon{display:flex;align-self:flex-end}.nui-wizard-step-header-icon-content{font-size:16px;height:16px;width:16px;position:relative;top:4px}.nui-wizard-step-header-icon-container .nui-icon{position:relative;top:50%;left:50%;transform:translate(-50%,-50%)}.nui-wizard-step-header__label{display:inline-block;min-width:50px;max-width:130px;vertical-align:middle;padding-bottom:5px;line-height:14px;font-size:11px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.nui-wizard-step-header__label--active{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header__label--selected{color:var(--nui-color-text-default,#111)}.nui-popover-container__content .nui-wizard-step-header__label{padding:0}.nui-wizard-step-header__text-label{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IconComponent, selector: "nui-icon", inputs: ["iconColor", "brushType", "iconHoverColor", "iconSize", "cssClass", "fillContainer", "status", "childStatus", "icon", "counter"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[nuiTooltip]", inputs: ["tooltipPlacement", "nuiTooltipDisabled", "nuiTooltipEllipsis", "nuiTooltip"], exportAs: ["nuiTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WizardStepHeaderComponent, decorators: [{
type: Component,
args: [{ selector: "nui-wizard-step-header", host: {
class: "nui-wizard-step-header",
"[class.nui-wizard-step-header--selected]": "selected",
"[class.nui-wizard-step-header--optional]": "step.optional",
"[class.nui-wizard-step-header--completed]": "stepState === 'done'",
role: "tab",
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"nui-wizard-step-header__label\"\n [nuiTooltip]=\"stringLabel ? stringLabel : ''\"\n [class.nui-wizard-step-header__label--active]=\"step.completed\"\n [class.nui-wizard-step-header__label--selected]=\"selected\"\n [class.nui-wizard-step-header__label--error]=\"stepState === 'error'\"\n>\n <!-- If there is a label template, use it. -->\n <ng-container\n *ngIf=\"templateLabel\"\n [ngTemplateOutlet]=\"templateLabel?.template\"\n ></ng-container>\n\n <!-- If there is no label template, fall back to the text label. -->\n <div class=\"nui-wizard-step-header__text-label\" *ngIf=\"stringLabel\">\n {{ label }}\n </div>\n\n <div\n class=\"nui-wizard-step-header__label--optional\"\n *ngIf=\"step.optional && stepState !== 'error'\"\n >\n {{ optionalLabel }}\n </div>\n <div\n class=\"nui-wizard-step-header__label--error\"\n *ngIf=\"stepState === 'error'\"\n >\n {{ errorMessage }}\n </div>\n</div>\n\n<div\n class=\"nui-wizard-step-header-icon nui-step-header-icon-state--{{\n stepState\n }}\"\n>\n <div class=\"nui-wizard-step-header-icon-container\">\n <span class=\"nui-wizard-step-header-icon-content\">\n <ng-container>\n <nui-icon\n [icon]=\"stepStateConfigMap[stepState].icon\"\n [iconColor]=\"stepStateConfigMap[stepState].iconColor\"\n ></nui-icon>\n </ng-container>\n </span>\n </div>\n</div>\n", styles: [".nui-wizard-step-header{overflow:hidden;outline:none;cursor:pointer;position:relative;color:var(--nui-color-text-default,#111);width:145px}.nui-wizard-step-header--completed{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header:focus{outline:none;box-shadow:inset 0 0 0 2px #00c4d280;border-radius:3px}.nui-wizard-step-header:focus:not(:focus-visible){box-shadow:unset;border-radius:unset}.nui-wizard-step-header-icon{height:16px;width:16px;position:relative}.nui-popover-container__content .nui-wizard-step-header-icon{display:flex;align-self:flex-end}.nui-wizard-step-header-icon-content{font-size:16px;height:16px;width:16px;position:relative;top:4px}.nui-wizard-step-header-icon-container .nui-icon{position:relative;top:50%;left:50%;transform:translate(-50%,-50%)}.nui-wizard-step-header__label{display:inline-block;min-width:50px;max-width:130px;vertical-align:middle;padding-bottom:5px;line-height:14px;font-size:11px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.nui-wizard-step-header__label--active{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header__label--selected{color:var(--nui-color-text-default,#111)}.nui-popover-container__content .nui-wizard-step-header__label{padding:0}.nui-wizard-step-header__text-label{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}\n"] }]
}], ctorParameters: () => [{ type: i1.FocusMonitor }, { type: i0.ElementRef }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [WIZARD_CONFIG]
}] }], propDecorators: { stepStateConfig: [{
type: Input
}], label: [{
type: Input
}], optionalLabel: [{
type: Input
}], errorMessage: [{
type: Input
}], index: [{
type: Input
}], selected: [{
type: Input
}], active: [{
type: Input
}], step: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN0ZXAtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvd2l6YXJkLXYyL3dpemFyZC1zdGVwLWhlYWRlci93aXphcmQtc3RlcC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi93aXphcmQtdjIvd2l6YXJkLXN0ZXAtaGVhZGVyL3dpemFyZC1zdGVwLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQWEsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUUsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUVSLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUNILGFBQWEsRUFDYixxQkFBcUIsR0FDeEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7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LENBQUMsS0FBSyxDQUFDO1NBQzNCO1FBRUQsSUFBSSxVQUFVLEVBQUU7WUFDWixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDMUI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO1NBQzFCO1FBRUQsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUM7K0dBdEhRLHlCQUF5Qix3RUFzQ3RCLGFBQWE7bUdBdENoQix5QkFBeUIscWtCQzVEdEMscWhEQWdEQTs7NEZEWWEseUJBQXlCO2tCQWRyQyxTQUFTOytCQUNJLHdCQUF3QixRQUc1Qjt3QkFDRixLQUFLLEVBQUUsd0JBQXdCO3dCQUMvQiwwQ0FBMEMsRUFBRSxVQUFVO3dCQUN0RCwwQ0FBMEMsRUFBRSxlQUFlO3dCQUMzRCwyQ0FBMkMsRUFBRSxzQkFBc0I7d0JBQ25FLElBQUksRUFBRSxLQUFLO3FCQUNkLGlCQUNjLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07OzBCQXVDMUMsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxhQUFhO3lDQTlCaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XG5pbXBvcnQgeyBDZGtTdGVwSGVhZGVyLCBTdGVwU3RhdGUsIFNURVBfU1RBVEUgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3N0ZXBwZXJcIjtcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGFzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5pbXBvcnQge1xuICAgIFdJWkFSRF9DT05GSUcsXG4gICAgV0laQVJEX0NPTkZJR19ERUZBVUxULFxufSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzL3dpemFyZC5jb25zdGFudHNcIjtcbmltcG9ydCB7IElXaXphcmRDb25maWcsIFdpemFyZFN0ZXBTdGF0ZUNvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgV2l6YXJkU3RlcFYyQ29tcG9uZW50IH0gZnJvbSBcIi4uL3dpemFyZC1zdGVwL3dpemFyZC1zdGVwLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlIH0gZnJvbSBcIi4uL3dpemFyZC1zdGVwLWxhYmVsLmRpcmVjdGl2ZVwiO1xuXG4vKiogQGlnbm9yZSAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXdpemFyZC1zdGVwLWhlYWRlclwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIndpemFyZC1zdGVwLWhlYWRlci5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wid2l6YXJkLXN0ZXAtaGVhZGVyLmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6IFwibnVpLXdpemFyZC1zdGVwLWhlYWRlclwiLFxuICAgICAgICBcIltjbGFzcy5udWktd2l6YXJkLXN0ZXAtaGVhZGVyLS1zZWxlY3RlZF1cIjogXCJzZWxlY3RlZFwiLFxuICAgICAgICBcIltjbGFzcy5udWktd2l6YXJkLXN0ZXAtaGVhZGVyLS1vcHRpb25hbF1cIjogXCJzdGVwLm9wdGlvbmFsXCIsXG4gICAgICAgIFwiW2NsYXNzLm51aS13aXphcmQtc3RlcC1oZWFkZXItLWNvbXBsZXRlZF1cIjogXCJzdGVwU3RhdGUgPT09ICdkb25lJ1wiLFxuICAgICAgICByb2xlOiBcInRhYlwiLFxuICAgIH0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgV2l6YXJkU3RlcEhlYWRlckNvbXBvbmVudFxuICAgIGV4dGVuZHMgQ2RrU3RlcEhlYWRlclxuICAgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgICAvKiogU3RhdGUgb2YgdGhlIGdpdmVuIHN0ZXAuICovXG4gICAgcHVibGljIHN0ZXBTdGF0ZTogU3RlcFN0YXRlO1xuXG4gICAgLyoqIEN1c3RvbSBpY29uIGNvbmZpZyByZWNlaXZlZCBmcm9tIHRoZSB3aXphcmQgc3RlcC4gQWxsb3dzIHRvIGN1c3RvbWl6ZSBzdGF0ZSBpY29ucyBmb3IgYSBwYXJ0aWN1bGFyIHdpemFyZCBzdGVwICovXG4gICAgQElucHV0KCkgc3RlcFN0YXRlQ29uZmlnOiBQYXJ0aWFsPFdpemFyZFN0ZXBTdGF0ZUNvbmZpZz47XG5cbiAgICAvKiogTGFiZWwgb2YgdGhlIGdpdmVuIHN0ZXAuICovXG4gICAgQElucHV0KCkgbGFiZWw6IFdpemFyZFN0ZXBMYWJlbERpcmVjdGl2ZSB8IHN0cmluZztcblxuICAgIC8qKiBMYWJlbCB0aGF0IGlzIHJlbmRlcmVkIGJlbG93IG9wdGlvbmFsIHN0ZXBzLiAqL1xuICAgIEBJbnB1dCgpIG9wdGlvbmFsTGFiZWw6IHN0cmluZyA9ICRsb2NhbGl6ZWBPcHRpb25hbGA7XG5cbiAgICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdGhlcmUncyBhbiBlcnJvci4gKi9cbiAgICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKiBJbmRleCBvZiB0aGUgZ2l2ZW4gc3RlcC4gKi9cbiAgICBASW5wdXQoKSBpbmRleDogbnVtYmVyO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGdpdmVuIHN0ZXAgaXMgc2VsZWN0ZWQuICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogV2hldGhlciB0aGUgZ2l2ZW4gc3RlcCBsYWJlbCBpcyBhY3RpdmUuICovXG4gICAgQElucHV0KCkgYWN0aXZlOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgc3RlcDogV2l6YXJkU3RlcFYyQ29tcG9uZW50O1xuXG4gICAgcHVibGljIHN0ZXBTdGF0ZUNvbmZpZ01hcDogV2l6YXJkU3RlcFN0YXRlQ29uZmlnO1xuXG4gICAgcHJpdmF0ZSB3aXphcmRDb25maWc6IElXaXphcmRDb25maWcgPSB7IC4uLldJWkFSRF9DT05GSUdfREVGQVVMVCB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2ZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxuICAgICAgICBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBJbmplY3QoV0laQVJEX0NPTkZJRylcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZz86IElXaXphcmRDb25maWdcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2VsZW1lbnRSZWYpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGVwU3RhdGVDb25maWcodGhpcy5jb25maWcuc3RlcFN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlU3RlcFN0YXRlQ29uZmlnTWFwKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXM/LnN0ZXBTdGF0ZUNvbmZpZz8uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0ZXBTdGF0ZUNvbmZpZyhjaGFuZ2VzPy5zdGVwU3RhdGVDb25maWc/LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0ZXBTdGF0ZUNvbmZpZ01hcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGVwU3RhdGUgPSB0aGlzLmdldFN0ZXBTdGF0ZSh0aGlzLnN0ZXApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpO1xuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBzdGVwIGhlYWRlci4gKi9cbiAgICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9lbGVtZW50UmVmLCBcInByb2dyYW1cIik7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgc3RyaW5nIGxhYmVsIG9mIGdpdmVuIHN0ZXAgaWYgaXQgaXMgYSB0ZXh0IGxhYmVsLiAqL1xuICAgIHB1YmxpYyBnZXQgc3RyaW5nTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhYmVsIGluc3RhbmNlb2YgV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogdGhpcy5sYWJlbDtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBXaXphcmRTdGVwTGFiZWwgaWYgdGhlIGxhYmVsIG9mIGdpdmVuIHN0ZXAgaXMgYSB0ZW1wbGF0ZSBsYWJlbC4gKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlTGFiZWwoKTogV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhYmVsIGluc3RhbmNlb2YgV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlXG4gICAgICAgICAgICA/IHRoaXMubGFiZWxcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVN0ZXBTdGF0ZUNvbmZpZyhzdGVwU3RhdGVDb25maWc6IFdpemFyZFN0ZXBTdGF0ZUNvbmZpZykge1xuICAgICAgICB0aGlzLndpemFyZENvbmZpZy5zdGVwU3RhdGUgPSBhc3NpZ24oXG4gICAgICAgICAgICB7IC4uLnRoaXMud2l6YXJkQ29uZmlnLnN0ZXBTdGF0ZSB9LFxuICAgICAgICAgICAgc3RlcFN0YXRlQ29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGVwU3RhdGVDb25maWdNYXAoKSB7XG4gICAgICAgIHRoaXMuc3RlcFN0YXRlQ29uZmlnTWFwID0ge1xuICAgICAgICAgICAgW1NURVBfU1RBVEUuTlVNQkVSXTogdGhpcy53aXphcmRDb25maWcuc3RlcFN0YXRlPy5pbml0aWFsLFxuICAgICAgICAgICAgW1NURVBfU1RBVEUuRE9ORV06IHRoaXMud2l6YXJkQ29uZmlnLnN0ZXBTdGF0ZT8udmlzaXRlZCxcbiAgICAgICAgICAgIFtTVEVQX1NUQVRFLkVESVRdOiB0aGlzLndpemFyZENvbmZpZy5zdGVwU3RhdGU/LmFjdGl2ZSxcbiAgICAgICAgICAgIFtTVEVQX1NUQVRFLkVSUk9SXTogdGhpcy53aXphcmRDb25maWcuc3RlcFN0YXRlPy5lcnJvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0ZXBTdGF0ZShzdGVwOiBXaXphcmRTdGVwVjJDb21wb25lbnQpOiBTdGVwU3RhdGUge1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZDtcblxuICAgICAgICBpZiAoc3RlcC5oYXNFcnJvciAmJiBpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RFUF9TVEFURS5FUlJPUjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RFUF9TVEFURS5FRElUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0ZXAuY29tcGxldGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RFUF9TVEFURS5ET05FO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFNURVBfU1RBVEUuTlVNQkVSO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXJfX2xhYmVsXCJcbiAgICBbbnVpVG9vbHRpcF09XCJzdHJpbmdMYWJlbCA/IHN0cmluZ0xhYmVsIDogJydcIlxuICAgIFtjbGFzcy5udWktd2l6YXJkLXN0ZXAtaGVhZGVyX19sYWJlbC0tYWN0aXZlXT1cInN0ZXAuY29tcGxldGVkXCJcbiAgICBbY2xhc3MubnVpLXdpemFyZC1zdGVwLWhlYWRlcl9fbGFiZWwtLXNlbGVjdGVkXT1cInNlbGVjdGVkXCJcbiAgICBbY2xhc3MubnVpLXdpemFyZC1zdGVwLWhlYWRlcl9fbGFiZWwtLWVycm9yXT1cInN0ZXBTdGF0ZSA9PT0gJ2Vycm9yJ1wiXG4+XG4gICAgPCEtLSBJZiB0aGVyZSBpcyBhIGxhYmVsIHRlbXBsYXRlLCB1c2UgaXQuIC0tPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJ0ZW1wbGF0ZUxhYmVsXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVMYWJlbD8udGVtcGxhdGVcIlxuICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gSWYgdGhlcmUgaXMgbm8gbGFiZWwgdGVtcGxhdGUsIGZhbGwgYmFjayB0byB0aGUgdGV4dCBsYWJlbC4gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXJfX3RleHQtbGFiZWxcIiAqbmdJZj1cInN0cmluZ0xhYmVsXCI+XG4gICAgICAgIHt7IGxhYmVsIH19XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibnVpLXdpemFyZC1zdGVwLWhlYWRlcl9fbGFiZWwtLW9wdGlvbmFsXCJcbiAgICAgICAgKm5nSWY9XCJzdGVwLm9wdGlvbmFsICYmIHN0ZXBTdGF0ZSAhPT0gJ2Vycm9yJ1wiXG4gICAgPlxuICAgICAgICB7eyBvcHRpb25hbExhYmVsIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXJfX2xhYmVsLS1lcnJvclwiXG4gICAgICAgICpuZ0lmPVwic3RlcFN0YXRlID09PSAnZXJyb3InXCJcbiAgICA+XG4gICAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXZcbiAgICBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXItaWNvbiBudWktc3RlcC1oZWFkZXItaWNvbi1zdGF0ZS0te3tcbiAgICAgICAgc3RlcFN0YXRlXG4gICAgfX1cIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJudWktd2l6YXJkLXN0ZXAtaGVhZGVyLWljb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibnVpLXdpemFyZC1zdGVwLWhlYWRlci1pY29uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG51aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInN0ZXBTdGF0ZUNvbmZpZ01hcFtzdGVwU3RhdGVdLmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbkNvbG9yXT1cInN0ZXBTdGF0ZUNvbmZpZ01hcFtzdGVwU3RhdGVdLmljb25Db2xvclwiXG4gICAgICAgICAgICAgICAgPjwvbnVpLWljb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=