UNPKG

@vendasta/store

Version:

Components and data for Store

95 lines 26.6 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { BillingModel } from '@vendasta/billing'; import { of } from 'rxjs'; import { TranslateService } from '@ngx-translate/core'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; import * as i2 from "@vendasta/uikit"; import * as i3 from "@angular/material/chips"; import * as i4 from "@angular/material/button"; import * as i5 from "../pricing/pricing.component"; import * as i6 from "@angular/common"; import * as i7 from "@angular/material/tooltip"; export class VaHeaderContainerComponent { constructor(translateService) { this.translateService = translateService; this.loaded = true; this.showEnableAddon = false; this.prerequisiteSelected = new EventEmitter(); this.actionSelected = new EventEmitter(); this.primaryPricingActionSelected = new EventEmitter(); this.pricingActionSelected = new EventEmitter(); } onActionSelected() { this.actionSelected.emit(); } onPrerequisiteSelected() { this.prerequisiteSelected.emit(); } showPricingModel(billedProduct) { return billedProduct && [BillingModel.Tiered, BillingModel.Stairstep].includes(billedProduct.billingModel); } getPricingModelTooltips(billingModel) { switch (billingModel) { case BillingModel.Stairstep: return this.translateService.stream('FRONTEND.STORE.PRICE_APPLIES_PER_UNIT'); case BillingModel.Tiered: return this.translateService.stream('FRONTEND.STORE.PRICE_APPLIES_TO_ALL_UNITS'); default: return of(''); } } } VaHeaderContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaHeaderContainerComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); VaHeaderContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: VaHeaderContainerComponent, selector: "app-header-container", inputs: { iconUrl: "iconUrl", title: "title", tagline: "tagline", prerequisite: "prerequisite", chipLabels: "chipLabels", pricing: "pricing", billedProduct: "billedProduct", loaded: "loaded", hasVerifiedContract: "hasVerifiedContract", pricingLabel: "pricingLabel", primaryPricingActionLabel: "primaryPricingActionLabel", pricingActionLabel: "pricingActionLabel", pricingActionEnabled: "pricingActionEnabled", actionEnabled: "actionEnabled", actionLabel: "actionLabel", showAction: "showAction", showPricing: "showPricing", showEnableAddon: "showEnableAddon", prerequisiteLabel: "prerequisiteLabel" }, outputs: { prerequisiteSelected: "prerequisiteSelected", actionSelected: "actionSelected", primaryPricingActionSelected: "primaryPricingActionSelected", pricingActionSelected: "pricingActionSelected" }, ngImport: i0, template: "<div class=\"header-container\">\n <div class=\"product-overview\">\n <div class=\"product-id\">\n <va-icon [iconUrl]=\"iconUrl\" [name]=\"title\" [diameter]=\"120\"></va-icon>\n\n <div class=\"product-id-text\">\n <h1\n [ngClass]=\"{\n 'stencil-title stencil-shimmer': !title,\n 'product-title': title\n }\"\n >\n {{ title }}\n </h1>\n\n <span\n [ngClass]=\"{\n 'stencil-tagline stencil-shimmer': !title && !tagline,\n tagline: tagline\n }\"\n >\n {{ tagline }}\n </span>\n\n <div *ngIf=\"prerequisite\" class=\"prerequisite\">\n <span class=\"requires-text\">\n {{ 'FRONTEND.STORE.REQUIRES' | translate }}\n </span>\n <span>{{ prerequisite }}</span>\n </div>\n\n <mat-chip-list>\n <mat-chip *ngFor=\"let chip of chipLabels\">\n {{ chip | translate }}\n </mat-chip>\n </mat-chip-list>\n </div>\n </div>\n\n <div class=\"pricing\">\n <button\n *ngIf=\"showAction && !showEnableAddon\"\n mat-raised-button\n class=\"app-enable-button\"\n [disabled]=\"!actionEnabled\"\n (click)=\"onActionSelected()\"\n >\n {{ actionLabel }}\n </button>\n\n <button\n *ngIf=\"showEnableAddon && !showAction\"\n mat-raised-button\n class=\"app-enable-button\"\n [disabled]=\"!showEnableAddon\"\n (click)=\"onActionSelected()\"\n >\n {{ actionLabel }}\n </button>\n\n <div\n *ngIf=\"prerequisiteLabel && !showEnableAddon\"\n class=\"addon-enable\"\n (click)=\"onPrerequisiteSelected()\"\n >\n {{\n 'FRONTEND.STORE.ENABLED_WITH_PREREQUISITE'\n | translate: { prerequisite: prerequisiteLabel }\n }}\n </div>\n\n <div *ngIf=\"showPricing\" class=\"price-box\">\n <div *ngIf=\"pricing?.prices?.length\" class=\"wholesale-price\">\n {{ pricingLabel }}\n <div\n *ngIf=\"showPricingModel(billedProduct) && hasVerifiedContract\"\n class=\"pricing-model\"\n [matTooltip]=\"\n getPricingModelTooltips(billedProduct.billingModel) | async\n \"\n >\n ({{ billedProduct.billingModel }})\n </div>\n </div>\n <app-pricing\n [pricing]=\"pricing\"\n [billedProduct]=\"billedProduct\"\n [hasVerifiedContract]=\"hasVerifiedContract\"\n [loaded]=\"loaded\"\n ></app-pricing>\n </div>\n\n <p *ngIf=\"pricingActionEnabled\" class=\"pricing-action-container\">\n <a (click)=\"primaryPricingActionSelected.emit()\">\n {{ primaryPricingActionLabel }}\n </a>\n <a (click)=\"pricingActionSelected.emit()\">{{ pricingActionLabel }}</a>\n </p>\n </div>\n </div>\n</div>\n", styles: [":host{font-size:16px}.product-title{font-size:24px}@media screen and (min-width: 600px){.product-title{font-size:32px}}.product-overview{display:flex;flex-wrap:wrap;border-bottom:1px solid #e0e0e0}.product-overview h1{margin:0;font-weight:400;line-height:1.2}.product-overview mat-chip{margin-bottom:3px}.product-id{display:flex;width:100%;padding:24px;flex-grow:1}.product-id va-icon{margin-right:20px}@media screen and (max-width: 600px){.product-id va-icon ::ng-deep .va-icon-container{width:40px!important;height:40px!important}.product-id va-icon ::ng-deep .va-icon-container span{line-height:40px!important;font-size:15px!important}}.product-id .product-id-text{display:flex;flex-direction:column;justify-content:center}.product-id span{overflow:hidden}.product-id .tagline{color:#616161;margin:.5em 0 1em;font-size:16px}@media screen and (min-width: 600px){.product-id .tagline{font-size:20px}}@media screen and (min-width: 600px){.product-id{width:66%;padding-right:20px}}.product-id .prerequisite{margin:.5em 0 1em;font-size:14px}.product-id .requires-text{color:#9e9e9e}.inline-link{display:inline-flex!important;color:#1e88e5;cursor:pointer;padding-top:5px}.pricing{display:flex;flex-direction:column;width:100%;padding:0 24px 24px;color:#616161}@media screen and (min-width: 600px){.pricing{width:34%;padding-top:24px;padding-left:20px}}.pricing span{display:block}.pricing span:nth-child(2){margin:.5em 0 1em}.pricing .price{font-size:24px;font-weight:700;line-height:1;color:#4caf50}.pricing .price-box{padding-top:10px}.pricing .pricing-action-container{display:flex;flex-direction:column;margin:8px 0}.pricing .pricing-action-container mat-icon{vertical-align:middle;margin-right:6px}.pricing .pricing-action-container a{cursor:pointer;margin:5px 0}.pricing .pricing-model{display:inline-block;font-size:.8rem;color:#9e9e9e;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.app-enable-button{height:inherit;color:#fff;background-color:#4caf50;font-size:20px;padding:14px 16px;line-height:1}.addon-enable{height:inherit;background-color:#e0e0e0;font-size:14px;padding:14px 16px;line-height:1;color:#1e88e5;cursor:pointer;text-align:center}.wholesale-price{margin-top:0;padding-bottom:8px;margin-bottom:4px;border-bottom:1px solid #e0e0e0}.stencil-title{height:32px;width:200px;margin-bottom:5px!important}.stencil-tagline{height:32px;width:250px}\n"], components: [{ type: i2.IconComponent, selector: "va-icon", inputs: ["iconUrl", "name", "diameter", "backgroundColor", "borderColor", "fontColor"] }, { type: i3.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.VaPricingComponent, selector: "app-pricing" }], directives: [{ type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "translate": i1.TranslatePipe, "async": i6.AsyncPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaHeaderContainerComponent, decorators: [{ type: Component, args: [{ selector: 'app-header-container', template: "<div class=\"header-container\">\n <div class=\"product-overview\">\n <div class=\"product-id\">\n <va-icon [iconUrl]=\"iconUrl\" [name]=\"title\" [diameter]=\"120\"></va-icon>\n\n <div class=\"product-id-text\">\n <h1\n [ngClass]=\"{\n 'stencil-title stencil-shimmer': !title,\n 'product-title': title\n }\"\n >\n {{ title }}\n </h1>\n\n <span\n [ngClass]=\"{\n 'stencil-tagline stencil-shimmer': !title && !tagline,\n tagline: tagline\n }\"\n >\n {{ tagline }}\n </span>\n\n <div *ngIf=\"prerequisite\" class=\"prerequisite\">\n <span class=\"requires-text\">\n {{ 'FRONTEND.STORE.REQUIRES' | translate }}\n </span>\n <span>{{ prerequisite }}</span>\n </div>\n\n <mat-chip-list>\n <mat-chip *ngFor=\"let chip of chipLabels\">\n {{ chip | translate }}\n </mat-chip>\n </mat-chip-list>\n </div>\n </div>\n\n <div class=\"pricing\">\n <button\n *ngIf=\"showAction && !showEnableAddon\"\n mat-raised-button\n class=\"app-enable-button\"\n [disabled]=\"!actionEnabled\"\n (click)=\"onActionSelected()\"\n >\n {{ actionLabel }}\n </button>\n\n <button\n *ngIf=\"showEnableAddon && !showAction\"\n mat-raised-button\n class=\"app-enable-button\"\n [disabled]=\"!showEnableAddon\"\n (click)=\"onActionSelected()\"\n >\n {{ actionLabel }}\n </button>\n\n <div\n *ngIf=\"prerequisiteLabel && !showEnableAddon\"\n class=\"addon-enable\"\n (click)=\"onPrerequisiteSelected()\"\n >\n {{\n 'FRONTEND.STORE.ENABLED_WITH_PREREQUISITE'\n | translate: { prerequisite: prerequisiteLabel }\n }}\n </div>\n\n <div *ngIf=\"showPricing\" class=\"price-box\">\n <div *ngIf=\"pricing?.prices?.length\" class=\"wholesale-price\">\n {{ pricingLabel }}\n <div\n *ngIf=\"showPricingModel(billedProduct) && hasVerifiedContract\"\n class=\"pricing-model\"\n [matTooltip]=\"\n getPricingModelTooltips(billedProduct.billingModel) | async\n \"\n >\n ({{ billedProduct.billingModel }})\n </div>\n </div>\n <app-pricing\n [pricing]=\"pricing\"\n [billedProduct]=\"billedProduct\"\n [hasVerifiedContract]=\"hasVerifiedContract\"\n [loaded]=\"loaded\"\n ></app-pricing>\n </div>\n\n <p *ngIf=\"pricingActionEnabled\" class=\"pricing-action-container\">\n <a (click)=\"primaryPricingActionSelected.emit()\">\n {{ primaryPricingActionLabel }}\n </a>\n <a (click)=\"pricingActionSelected.emit()\">{{ pricingActionLabel }}</a>\n </p>\n </div>\n </div>\n</div>\n", styles: [":host{font-size:16px}.product-title{font-size:24px}@media screen and (min-width: 600px){.product-title{font-size:32px}}.product-overview{display:flex;flex-wrap:wrap;border-bottom:1px solid #e0e0e0}.product-overview h1{margin:0;font-weight:400;line-height:1.2}.product-overview mat-chip{margin-bottom:3px}.product-id{display:flex;width:100%;padding:24px;flex-grow:1}.product-id va-icon{margin-right:20px}@media screen and (max-width: 600px){.product-id va-icon ::ng-deep .va-icon-container{width:40px!important;height:40px!important}.product-id va-icon ::ng-deep .va-icon-container span{line-height:40px!important;font-size:15px!important}}.product-id .product-id-text{display:flex;flex-direction:column;justify-content:center}.product-id span{overflow:hidden}.product-id .tagline{color:#616161;margin:.5em 0 1em;font-size:16px}@media screen and (min-width: 600px){.product-id .tagline{font-size:20px}}@media screen and (min-width: 600px){.product-id{width:66%;padding-right:20px}}.product-id .prerequisite{margin:.5em 0 1em;font-size:14px}.product-id .requires-text{color:#9e9e9e}.inline-link{display:inline-flex!important;color:#1e88e5;cursor:pointer;padding-top:5px}.pricing{display:flex;flex-direction:column;width:100%;padding:0 24px 24px;color:#616161}@media screen and (min-width: 600px){.pricing{width:34%;padding-top:24px;padding-left:20px}}.pricing span{display:block}.pricing span:nth-child(2){margin:.5em 0 1em}.pricing .price{font-size:24px;font-weight:700;line-height:1;color:#4caf50}.pricing .price-box{padding-top:10px}.pricing .pricing-action-container{display:flex;flex-direction:column;margin:8px 0}.pricing .pricing-action-container mat-icon{vertical-align:middle;margin-right:6px}.pricing .pricing-action-container a{cursor:pointer;margin:5px 0}.pricing .pricing-model{display:inline-block;font-size:.8rem;color:#9e9e9e;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.app-enable-button{height:inherit;color:#fff;background-color:#4caf50;font-size:20px;padding:14px 16px;line-height:1}.addon-enable{height:inherit;background-color:#e0e0e0;font-size:14px;padding:14px 16px;line-height:1;color:#1e88e5;cursor:pointer;text-align:center}.wholesale-price{margin-top:0;padding-bottom:8px;margin-bottom:4px;border-bottom:1px solid #e0e0e0}.stencil-title{height:32px;width:200px;margin-bottom:5px!important}.stencil-tagline{height:32px;width:250px}\n"] }] }], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { iconUrl: [{ type: Input }], title: [{ type: Input }], tagline: [{ type: Input }], prerequisite: [{ type: Input }], chipLabels: [{ type: Input }], pricing: [{ type: Input }], billedProduct: [{ type: Input }], loaded: [{ type: Input }], hasVerifiedContract: [{ type: Input }], pricingLabel: [{ type: Input }], primaryPricingActionLabel: [{ type: Input }], pricingActionLabel: [{ type: Input }], pricingActionEnabled: [{ type: Input }], actionEnabled: [{ type: Input }], actionLabel: [{ type: Input }], showAction: [{ type: Input }], showPricing: [{ type: Input }], showEnableAddon: [{ type: Input }], prerequisiteLabel: [{ type: Input }], prerequisiteSelected: [{ type: Output }], actionSelected: [{ type: Output }], primaryPricingActionSelected: [{ type: Output }], pricingActionSelected: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvaGVhZGVyLWNvbnRhaW5lci9oZWFkZXItY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9oZWFkZXItY29udGFpbmVyL2hlYWRlci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBQWlCLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7OztBQU92RCxNQUFNLE9BQU8sMEJBQTBCO0lBeUJyQyxZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWpCN0MsV0FBTSxHQUFHLElBQUksQ0FBQztRQVVkLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRXZCLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLGlDQUE0QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEQsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVJLENBQUM7SUFFMUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBNEI7UUFDM0MsT0FBTyxhQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxZQUEwQjtRQUNoRCxRQUFRLFlBQVksRUFBRTtZQUNwQixLQUFLLFlBQVksQ0FBQyxTQUFTO2dCQUN6QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUMvRSxLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUNuRjtnQkFDRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNqQjtJQUNILENBQUM7O3VIQWhEVSwwQkFBMEI7MkdBQTFCLDBCQUEwQixpMkJDWHZDLDY2RkFxR0E7MkZEMUZhLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDRSxzQkFBc0I7dUdBS3ZCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFByaWNpbmcgfSBmcm9tICcuLi9wcmljaW5nL3ByaWNpbmcnO1xuaW1wb3J0IHsgQmlsbGVkUHJvZHVjdCwgQmlsbGluZ01vZGVsIH0gZnJvbSAnQHZlbmRhc3RhL2JpbGxpbmcnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWhlYWRlci1jb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaGVhZGVyLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hlYWRlci1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmFIZWFkZXJDb250YWluZXJDb21wb25lbnQge1xuICBASW5wdXQoKSBpY29uVXJsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRhZ2xpbmU6IHN0cmluZztcbiAgQElucHV0KCkgcHJlcmVxdWlzaXRlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNoaXBMYWJlbHM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBwcmljaW5nOiBQcmljaW5nO1xuICBASW5wdXQoKSBiaWxsZWRQcm9kdWN0OiBCaWxsZWRQcm9kdWN0O1xuICBASW5wdXQoKSBsb2FkZWQgPSB0cnVlO1xuICBASW5wdXQoKSBoYXNWZXJpZmllZENvbnRyYWN0OiBib29sZWFuO1xuICBASW5wdXQoKSBwcmljaW5nTGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcHJpbWFyeVByaWNpbmdBY3Rpb25MYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBwcmljaW5nQWN0aW9uTGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcHJpY2luZ0FjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFjdGlvbkxhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dBY3Rpb246IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dQcmljaW5nOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93RW5hYmxlQWRkb24gPSBmYWxzZTtcbiAgQElucHV0KCkgcHJlcmVxdWlzaXRlTGFiZWw6IHN0cmluZztcbiAgQE91dHB1dCgpIHByZXJlcXVpc2l0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgYWN0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwcmltYXJ5UHJpY2luZ0FjdGlvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHJpY2luZ0FjdGlvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge31cblxuICBvbkFjdGlvblNlbGVjdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uU2VsZWN0ZWQuZW1pdCgpO1xuICB9XG5cbiAgb25QcmVyZXF1aXNpdGVTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnByZXJlcXVpc2l0ZVNlbGVjdGVkLmVtaXQoKTtcbiAgfVxuXG4gIHNob3dQcmljaW5nTW9kZWwoYmlsbGVkUHJvZHVjdDogQmlsbGVkUHJvZHVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBiaWxsZWRQcm9kdWN0ICYmIFtCaWxsaW5nTW9kZWwuVGllcmVkLCBCaWxsaW5nTW9kZWwuU3RhaXJzdGVwXS5pbmNsdWRlcyhiaWxsZWRQcm9kdWN0LmJpbGxpbmdNb2RlbCk7XG4gIH1cblxuICBnZXRQcmljaW5nTW9kZWxUb29sdGlwcyhiaWxsaW5nTW9kZWw6IEJpbGxpbmdNb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgc3dpdGNoIChiaWxsaW5nTW9kZWwpIHtcbiAgICAgIGNhc2UgQmlsbGluZ01vZGVsLlN0YWlyc3RlcDpcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ0ZST05URU5ELlNUT1JFLlBSSUNFX0FQUExJRVNfUEVSX1VOSVQnKTtcbiAgICAgIGNhc2UgQmlsbGluZ01vZGVsLlRpZXJlZDpcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ0ZST05URU5ELlNUT1JFLlBSSUNFX0FQUExJRVNfVE9fQUxMX1VOSVRTJyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gb2YoJycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImhlYWRlci1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cInByb2R1Y3Qtb3ZlcnZpZXdcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pZFwiPlxuICAgICAgPHZhLWljb24gW2ljb25VcmxdPVwiaWNvblVybFwiIFtuYW1lXT1cInRpdGxlXCIgW2RpYW1ldGVyXT1cIjEyMFwiPjwvdmEtaWNvbj5cblxuICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaWQtdGV4dFwiPlxuICAgICAgICA8aDFcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc3RlbmNpbC10aXRsZSBzdGVuY2lsLXNoaW1tZXInOiAhdGl0bGUsXG4gICAgICAgICAgICAncHJvZHVjdC10aXRsZSc6IHRpdGxlXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0aXRsZSB9fVxuICAgICAgICA8L2gxPlxuXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3N0ZW5jaWwtdGFnbGluZSBzdGVuY2lsLXNoaW1tZXInOiAhdGl0bGUgJiYgIXRhZ2xpbmUsXG4gICAgICAgICAgICB0YWdsaW5lOiB0YWdsaW5lXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0YWdsaW5lIH19XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwicHJlcmVxdWlzaXRlXCIgY2xhc3M9XCJwcmVyZXF1aXNpdGVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVzLXRleHRcIj5cbiAgICAgICAgICAgIHt7ICdGUk9OVEVORC5TVE9SRS5SRVFVSVJFUycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgcHJlcmVxdWlzaXRlIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IGNoaXAgb2YgY2hpcExhYmVsc1wiPlxuICAgICAgICAgICAge3sgY2hpcCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInByaWNpbmdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93QWN0aW9uICYmICFzaG93RW5hYmxlQWRkb25cIlxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICBjbGFzcz1cImFwcC1lbmFibGUtYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFhY3Rpb25FbmFibGVkXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uU2VsZWN0ZWQoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGFjdGlvbkxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dFbmFibGVBZGRvbiAmJiAhc2hvd0FjdGlvblwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYXBwLWVuYWJsZS1idXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXNob3dFbmFibGVBZGRvblwiXG4gICAgICAgIChjbGljayk9XCJvbkFjdGlvblNlbGVjdGVkKClcIlxuICAgICAgPlxuICAgICAgICB7eyBhY3Rpb25MYWJlbCB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJwcmVyZXF1aXNpdGVMYWJlbCAmJiAhc2hvd0VuYWJsZUFkZG9uXCJcbiAgICAgICAgY2xhc3M9XCJhZGRvbi1lbmFibGVcIlxuICAgICAgICAoY2xpY2spPVwib25QcmVyZXF1aXNpdGVTZWxlY3RlZCgpXCJcbiAgICAgID5cbiAgICAgICAge3tcbiAgICAgICAgICAnRlJPTlRFTkQuU1RPUkUuRU5BQkxFRF9XSVRIX1BSRVJFUVVJU0lURSdcbiAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHByZXJlcXVpc2l0ZTogcHJlcmVxdWlzaXRlTGFiZWwgfVxuICAgICAgICB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93UHJpY2luZ1wiIGNsYXNzPVwicHJpY2UtYm94XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJwcmljaW5nPy5wcmljZXM/Lmxlbmd0aFwiIGNsYXNzPVwid2hvbGVzYWxlLXByaWNlXCI+XG4gICAgICAgICAge3sgcHJpY2luZ0xhYmVsIH19XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJzaG93UHJpY2luZ01vZGVsKGJpbGxlZFByb2R1Y3QpICYmIGhhc1ZlcmlmaWVkQ29udHJhY3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmljaW5nLW1vZGVsXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICAgICAgICBnZXRQcmljaW5nTW9kZWxUb29sdGlwcyhiaWxsZWRQcm9kdWN0LmJpbGxpbmdNb2RlbCkgfCBhc3luY1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAoe3sgYmlsbGVkUHJvZHVjdC5iaWxsaW5nTW9kZWwgfX0pXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YXBwLXByaWNpbmdcbiAgICAgICAgICBbcHJpY2luZ109XCJwcmljaW5nXCJcbiAgICAgICAgICBbYmlsbGVkUHJvZHVjdF09XCJiaWxsZWRQcm9kdWN0XCJcbiAgICAgICAgICBbaGFzVmVyaWZpZWRDb250cmFjdF09XCJoYXNWZXJpZmllZENvbnRyYWN0XCJcbiAgICAgICAgICBbbG9hZGVkXT1cImxvYWRlZFwiXG4gICAgICAgID48L2FwcC1wcmljaW5nPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxwICpuZ0lmPVwicHJpY2luZ0FjdGlvbkVuYWJsZWRcIiBjbGFzcz1cInByaWNpbmctYWN0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICA8YSAoY2xpY2spPVwicHJpbWFyeVByaWNpbmdBY3Rpb25TZWxlY3RlZC5lbWl0KClcIj5cbiAgICAgICAgICB7eyBwcmltYXJ5UHJpY2luZ0FjdGlvbkxhYmVsIH19XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGEgKGNsaWNrKT1cInByaWNpbmdBY3Rpb25TZWxlY3RlZC5lbWl0KClcIj57eyBwcmljaW5nQWN0aW9uTGFiZWwgfX08L2E+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=