UNPKG

@vendasta/store

Version:

Components and data for Store

85 lines 29.4 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Addon } from '@vendasta/core/shared'; import { ProductCost } from '@vendasta/marketplace-apps/v1'; import { FeatureFlagService } from '@vendasta/partner'; import { of } from 'rxjs'; import { map } from 'rxjs/operators'; import { Product } from '../../shared/product'; import { MarketingType } from '../product-details-v2.interface'; import * as i0 from "@angular/core"; import * as i1 from "@vendasta/partner"; import * as i2 from "@angular/material/card"; import * as i3 from "../../selling-info/selling-info.component"; import * as i4 from "../../faqs/faqs.component"; import * as i5 from "../billing-price/billing-price-card/billing-price-card.component"; import * as i6 from "../marketplace-cost/marketplace-cost-card/marketplace-cost-card.component"; import * as i7 from "@angular/material/icon"; import * as i8 from "@vendasta/galaxy/popover"; import * as i9 from "./product-requirements/product-requirements.component"; import * as i10 from "../../restrictions/country-v2/supported-countries-v2.component"; import * as i11 from "../need-help/need-help.component"; import * as i12 from "../videos/videos.component"; import * as i13 from "../addon-list/addon-list.component"; import * as i14 from "@angular/common"; import * as i15 from "@ngx-translate/core"; export class ProductInfoComponent { constructor(featureFlagService) { this.featureFlagService = featureFlagService; this.showPricing = false; this.hasVerifiedContract = false; this.canAccessContractPricing = false; this.marketingType = MarketingType.Partner; this.addonSelected = new EventEmitter(); this.showProductRequirementsPopover = false; } ngOnInit() { this.productDependenciesEnabled$ = this.productDependenciesFeatureFlag ? this.featureFlagService .batchGetStatus(this.partnerId, null, [this.productDependenciesFeatureFlag]) .pipe(map((resp) => resp && resp[this.productDependenciesFeatureFlag])) : of(false); this.showProductDependenciesList = this.product.restrictions?.appRequirement?.rules?.length > 0 && this.product.restrictions?.appRequirement?.rules[0].appIds?.length > 0; } onAddonSelected(addonId) { this.addonSelected.emit(addonId); } getAddons() { if (!this.addons) { this.addons = this.product.addons.map((addon) => Addon.fromApi(addon)); } return this.addons; } } ProductInfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ProductInfoComponent, deps: [{ token: i1.FeatureFlagService }], target: i0.ɵɵFactoryTarget.Component }); ProductInfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: ProductInfoComponent, selector: "app-product-info", inputs: { product: "product", partnerId: "partnerId", billingPrice: "billingPrice", marketplaceCost: "marketplaceCost", showPricing: "showPricing", hasVerifiedContract: "hasVerifiedContract", canAccessContractPricing: "canAccessContractPricing", businessCountryCode: "businessCountryCode", isOO: "isOO", marketingType: "marketingType", productDependenciesFeatureFlag: "productDependenciesFeatureFlag" }, outputs: { addonSelected: "addonSelected" }, ngImport: i0, template: "<div class=\"product-content\">\n <div class=\"left-column\">\n <section *ngIf=\"product.description || product.keySellingPoints\">\n <mat-card>\n <app-selling-info\n [description]=\"product.description\"\n [keySellingPoints]=\"product.keySellingPoints\"\n ></app-selling-info>\n </mat-card>\n </section>\n <section *ngIf=\"product.faqs?.length > 0\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.FAQS' | translate }}\n </h2>\n <app-faqs [faqs]=\"product.faqs\"></app-faqs>\n </mat-card>\n </section>\n </div>\n <div class=\"right-column\">\n <section *ngIf=\"!!billingPrice || !!marketplaceCost\">\n <ng-container *ngIf=\"billingPrice; else costTemplate\">\n <app-billing-price-card\n [marketingType]=\"marketingType\"\n [contactSales]=\"product?.shouldContactSales\"\n [startingAt]=\"product?.usesCustomPricing\"\n [billingPrice]=\"billingPrice\"\n [isOO]=\"isOO\"\n ></app-billing-price-card>\n </ng-container>\n <ng-template #costTemplate>\n <app-marketplace-cost-card\n [contactSales]=\"product?.shouldContactSales\"\n [marketplaceCost]=\"marketplaceCost\"\n [isOO]=\"isOO\"\n ></app-marketplace-cost-card>\n </ng-template>\n </section>\n <section>\n <mat-card>\n <ng-container *ngIf=\"productDependenciesEnabled$ | async\">\n <h2 class=\"va-component-title requirements-title\">\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.TITLE'\n | translate\n }}\n </h2>\n <ng-container *ngIf=\"showProductDependenciesList\">\n <div class=\"requirements-header\">\n <h2 class=\"va-component-subtitle\">\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.LABEL'\n | translate\n }}\n </h2>\n <mat-icon\n [glxyPopover]=\"productRequirementsPopover\"\n (mouseenter)=\"showProductRequirementsPopover = true\"\n (mouseleave)=\"showProductRequirementsPopover = false\"\n inline\n >\n info_outline\n </mat-icon>\n <glxy-popover\n #productRequirementsPopover\n [isOpen]=\"showProductRequirementsPopover\"\n >\n <glxy-popover-title>\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.TOOLTIP.TITLE'\n | translate\n }}\n </glxy-popover-title>\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.TOOLTIP.DESCRIPTION'\n | translate\n }}\n </glxy-popover>\n </div>\n <div class=\"product-requirements\">\n <product-requirements [product]=\"product\"></product-requirements>\n </div>\n </ng-container>\n </ng-container>\n <h2 class=\"va-component-subtitle\">\n {{ 'FRONTEND.STORE.AVAILABLE_IN' | translate }}\n </h2>\n <app-supported-countries-v2\n [businessCountryCode]=\"businessCountryCode\"\n [countryCodes]=\"product.restrictions.country.whitelist\"\n ></app-supported-countries-v2>\n </mat-card>\n </section>\n <section *ngIf=\"product.needHelp\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.NEED_HELP' | translate }}?\n </h2>\n <app-need-help [needHelp]=\"product.needHelp\"></app-need-help>\n </mat-card>\n </section>\n <section *ngIf=\"product.videos && product.videos.length > 0\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.VIDEOS' | translate }}\n </h2>\n <app-videos [videos]=\"product.videos\"></app-videos>\n </mat-card>\n </section>\n <section *ngIf=\"product.addons?.length\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.PRODUCTS_AND_ADDONS' | translate }}\n </h2>\n <app-addon-list\n [addons]=\"getAddons()\"\n (addonSelected)=\"onAddonSelected($event)\"\n ></app-addon-list>\n </mat-card>\n </section>\n </div>\n</div>\n", styles: [":host{display:block;font-size:14px;line-height:1.4}:host *{box-sizing:border-box}section{padding:12px}@media screen and (max-width: 600px){section{padding:8px 0 0}}.left-column{width:66%}@media screen and (max-width: 600px){.left-column{width:100%}}.right-column{width:34%}@media screen and (max-width: 600px){.right-column{width:100%}}.product-content{display:flex}@media screen and (max-width: 600px){.product-content{flex-direction:column}}:host ::ng-deep .product-content img{width:100%;-o-object-fit:contain;object-fit:contain}.va-component-title{font-size:16px;font-weight:400;margin-top:0}.requirements-title{margin-bottom:16px}.va-component-subtitle{font-size:12px;font-weight:400;margin-top:0;color:#616161}.requirements-header{display:flex;font-size:16px;font-weight:400;align-items:center}.requirements-header .va-component-subtitle{margin:0 4px 0 0}.product-requirements{margin-bottom:16px}\n"], components: [{ type: i2.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i3.VaSellingInfoComponent, selector: "app-selling-info", inputs: ["description", "keySellingPoints"] }, { type: i4.VaFaqsComponent, selector: "app-faqs", inputs: ["faqs"] }, { type: i5.BillingPriceCardComponent, selector: "app-billing-price-card", inputs: ["billingPrice", "contactSales", "startingAt", "isOO", "marketingType"] }, { type: i6.MarketplaceCostCardComponent, selector: "app-marketplace-cost-card", inputs: ["marketplaceCost", "contactSales", "isOO"] }, { type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8.PopoverComponent, selector: "glxy-popover", inputs: ["origin", "keepOnScreen", "maxWidth", "maxHeight", "isOpen", "hasBackdrop", "showBackdrop", "hasArrow", "padding", "highContrast", "positions"], outputs: ["backdropClick"] }, { type: i9.ProductRequirementsComponent, selector: "product-requirements", inputs: ["product"] }, { type: i10.SupportedCountriesV2Component, selector: "app-supported-countries-v2", inputs: ["businessCountryCode", "countryCodes"] }, { type: i11.NeedHelpComponent, selector: "app-need-help", inputs: ["needHelp"] }, { type: i12.VideosComponent, selector: "app-videos", inputs: ["videos"] }, { type: i13.AddonListComponent, selector: "app-addon-list", inputs: ["addons"], outputs: ["addonSelected"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.GalaxyPopoverDirective, selector: "[glxyPopover]", inputs: ["glxyPopover"], exportAs: ["glxyPopover"] }, { type: i8.PopoverTitleDirective, selector: "glxy-popover-title, [glxyPopoverTitle]" }], pipes: { "translate": i15.TranslatePipe, "async": i14.AsyncPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ProductInfoComponent, decorators: [{ type: Component, args: [{ selector: 'app-product-info', template: "<div class=\"product-content\">\n <div class=\"left-column\">\n <section *ngIf=\"product.description || product.keySellingPoints\">\n <mat-card>\n <app-selling-info\n [description]=\"product.description\"\n [keySellingPoints]=\"product.keySellingPoints\"\n ></app-selling-info>\n </mat-card>\n </section>\n <section *ngIf=\"product.faqs?.length > 0\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.FAQS' | translate }}\n </h2>\n <app-faqs [faqs]=\"product.faqs\"></app-faqs>\n </mat-card>\n </section>\n </div>\n <div class=\"right-column\">\n <section *ngIf=\"!!billingPrice || !!marketplaceCost\">\n <ng-container *ngIf=\"billingPrice; else costTemplate\">\n <app-billing-price-card\n [marketingType]=\"marketingType\"\n [contactSales]=\"product?.shouldContactSales\"\n [startingAt]=\"product?.usesCustomPricing\"\n [billingPrice]=\"billingPrice\"\n [isOO]=\"isOO\"\n ></app-billing-price-card>\n </ng-container>\n <ng-template #costTemplate>\n <app-marketplace-cost-card\n [contactSales]=\"product?.shouldContactSales\"\n [marketplaceCost]=\"marketplaceCost\"\n [isOO]=\"isOO\"\n ></app-marketplace-cost-card>\n </ng-template>\n </section>\n <section>\n <mat-card>\n <ng-container *ngIf=\"productDependenciesEnabled$ | async\">\n <h2 class=\"va-component-title requirements-title\">\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.TITLE'\n | translate\n }}\n </h2>\n <ng-container *ngIf=\"showProductDependenciesList\">\n <div class=\"requirements-header\">\n <h2 class=\"va-component-subtitle\">\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.LABEL'\n | translate\n }}\n </h2>\n <mat-icon\n [glxyPopover]=\"productRequirementsPopover\"\n (mouseenter)=\"showProductRequirementsPopover = true\"\n (mouseleave)=\"showProductRequirementsPopover = false\"\n inline\n >\n info_outline\n </mat-icon>\n <glxy-popover\n #productRequirementsPopover\n [isOpen]=\"showProductRequirementsPopover\"\n >\n <glxy-popover-title>\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.TOOLTIP.TITLE'\n | translate\n }}\n </glxy-popover-title>\n {{\n 'FRONTEND.STORE.PRODUCT_DETAILS.PRODUCT_REQUIREMENTS.TOOLTIP.DESCRIPTION'\n | translate\n }}\n </glxy-popover>\n </div>\n <div class=\"product-requirements\">\n <product-requirements [product]=\"product\"></product-requirements>\n </div>\n </ng-container>\n </ng-container>\n <h2 class=\"va-component-subtitle\">\n {{ 'FRONTEND.STORE.AVAILABLE_IN' | translate }}\n </h2>\n <app-supported-countries-v2\n [businessCountryCode]=\"businessCountryCode\"\n [countryCodes]=\"product.restrictions.country.whitelist\"\n ></app-supported-countries-v2>\n </mat-card>\n </section>\n <section *ngIf=\"product.needHelp\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.NEED_HELP' | translate }}?\n </h2>\n <app-need-help [needHelp]=\"product.needHelp\"></app-need-help>\n </mat-card>\n </section>\n <section *ngIf=\"product.videos && product.videos.length > 0\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.VIDEOS' | translate }}\n </h2>\n <app-videos [videos]=\"product.videos\"></app-videos>\n </mat-card>\n </section>\n <section *ngIf=\"product.addons?.length\">\n <mat-card>\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.PRODUCTS_AND_ADDONS' | translate }}\n </h2>\n <app-addon-list\n [addons]=\"getAddons()\"\n (addonSelected)=\"onAddonSelected($event)\"\n ></app-addon-list>\n </mat-card>\n </section>\n </div>\n</div>\n", styles: [":host{display:block;font-size:14px;line-height:1.4}:host *{box-sizing:border-box}section{padding:12px}@media screen and (max-width: 600px){section{padding:8px 0 0}}.left-column{width:66%}@media screen and (max-width: 600px){.left-column{width:100%}}.right-column{width:34%}@media screen and (max-width: 600px){.right-column{width:100%}}.product-content{display:flex}@media screen and (max-width: 600px){.product-content{flex-direction:column}}:host ::ng-deep .product-content img{width:100%;-o-object-fit:contain;object-fit:contain}.va-component-title{font-size:16px;font-weight:400;margin-top:0}.requirements-title{margin-bottom:16px}.va-component-subtitle{font-size:12px;font-weight:400;margin-top:0;color:#616161}.requirements-header{display:flex;font-size:16px;font-weight:400;align-items:center}.requirements-header .va-component-subtitle{margin:0 4px 0 0}.product-requirements{margin-bottom:16px}\n"] }] }], ctorParameters: function () { return [{ type: i1.FeatureFlagService }]; }, propDecorators: { product: [{ type: Input }], partnerId: [{ type: Input }], billingPrice: [{ type: Input }], marketplaceCost: [{ type: Input }], showPricing: [{ type: Input }], hasVerifiedContract: [{ type: Input }], canAccessContractPricing: [{ type: Input }], businessCountryCode: [{ type: Input }], isOO: [{ type: Input }], marketingType: [{ type: Input }], productDependenciesFeatureFlag: [{ type: Input }], addonSelected: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1pbmZvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wcm9kdWN0LWRldGFpbHMtdjIvcHJvZHVjdC1pbmZvL3Byb2R1Y3QtaW5mby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvcHJvZHVjdC1kZXRhaWxzLXYyL3Byb2R1Y3QtaW5mby9wcm9kdWN0LWluZm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT2hFLE1BQU0sT0FBTyxvQkFBb0I7SUFzQi9CLFlBQTZCLGtCQUFzQztRQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBakIxRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsNkJBQXdCLEdBQUcsS0FBSyxDQUFDO1FBR2pDLGtCQUFhLEdBQWtCLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFLcEQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBS3JELG1DQUE4QixHQUFHLEtBQUssQ0FBQztJQUUrQixDQUFDO0lBRXZFLFFBQVE7UUFDTixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLDhCQUE4QjtZQUNwRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtpQkFDcEIsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7aUJBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLDJCQUEyQjtZQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBZTtRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDeEU7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQzs7aUhBNUNVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLHlmQ2ZqQyw0NklBMEhBOzJGRDNHYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCO3lHQUtuQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFByb2R1Y3RQcmljaW5nIH0gZnJvbSAnQHZlbmRhc3RhL2JpbGxpbmcnO1xuaW1wb3J0IHsgQWRkb24gfSBmcm9tICdAdmVuZGFzdGEvY29yZS9zaGFyZWQnO1xuaW1wb3J0IHsgUHJvZHVjdENvc3QgfSBmcm9tICdAdmVuZGFzdGEvbWFya2V0cGxhY2UtYXBwcy92MSc7XG5pbXBvcnQgeyBGZWF0dXJlRmxhZ1NlcnZpY2UgfSBmcm9tICdAdmVuZGFzdGEvcGFydG5lcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9wcm9kdWN0JztcbmltcG9ydCB7IE1hcmtldGluZ1R5cGUgfSBmcm9tICcuLi9wcm9kdWN0LWRldGFpbHMtdjIuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb2R1Y3QtaW5mbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWluZm8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcm9kdWN0LWluZm8uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdEluZm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwcm9kdWN0OiBQcm9kdWN0O1xuICBASW5wdXQoKSBwYXJ0bmVySWQ6IHN0cmluZztcbiAgQElucHV0KCkgYmlsbGluZ1ByaWNlOiBQcm9kdWN0UHJpY2luZztcbiAgQElucHV0KCkgbWFya2V0cGxhY2VDb3N0OiBQcm9kdWN0Q29zdDtcbiAgQElucHV0KCkgc2hvd1ByaWNpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgaGFzVmVyaWZpZWRDb250cmFjdCA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5BY2Nlc3NDb250cmFjdFByaWNpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgYnVzaW5lc3NDb3VudHJ5Q29kZTogc3RyaW5nO1xuICBASW5wdXQoKSBpc09POiBib29sZWFuO1xuICBASW5wdXQoKSBtYXJrZXRpbmdUeXBlOiBNYXJrZXRpbmdUeXBlID0gTWFya2V0aW5nVHlwZS5QYXJ0bmVyO1xuICAvLyBUaGUgcHJvZHVjdCBkZXBlbmRlbmNpZXMgZmVhdHVyZSBpcyBiZWluZyByZWxlYXNlZCBpbiBkaWZmZXJlbnQgc3RhZ2VzLCBzb1xuICAvLyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc2hvdyB0aGUgZmVhdHVyZSBpbiBzb21lIGFwcHMsIGJ1dCBub3QgaW4gb3RoZXJzLlxuICBASW5wdXQoKSBwcm9kdWN0RGVwZW5kZW5jaWVzRmVhdHVyZUZsYWc6IHN0cmluZztcblxuICBAT3V0cHV0KCkgYWRkb25TZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgYWRkb25zOiBBZGRvbltdO1xuICBwcm9kdWN0RGVwZW5kZW5jaWVzRW5hYmxlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHNob3dQcm9kdWN0RGVwZW5kZW5jaWVzTGlzdDogYm9vbGVhbjtcbiAgc2hvd1Byb2R1Y3RSZXF1aXJlbWVudHNQb3BvdmVyID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmZWF0dXJlRmxhZ1NlcnZpY2U6IEZlYXR1cmVGbGFnU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb2R1Y3REZXBlbmRlbmNpZXNFbmFibGVkJCA9IHRoaXMucHJvZHVjdERlcGVuZGVuY2llc0ZlYXR1cmVGbGFnXG4gICAgICA/IHRoaXMuZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICAgICAgLmJhdGNoR2V0U3RhdHVzKHRoaXMucGFydG5lcklkLCBudWxsLCBbdGhpcy5wcm9kdWN0RGVwZW5kZW5jaWVzRmVhdHVyZUZsYWddKVxuICAgICAgICAgIC5waXBlKG1hcCgocmVzcCkgPT4gcmVzcCAmJiByZXNwW3RoaXMucHJvZHVjdERlcGVuZGVuY2llc0ZlYXR1cmVGbGFnXSkpXG4gICAgICA6IG9mKGZhbHNlKTtcbiAgICB0aGlzLnNob3dQcm9kdWN0RGVwZW5kZW5jaWVzTGlzdCA9XG4gICAgICB0aGlzLnByb2R1Y3QucmVzdHJpY3Rpb25zPy5hcHBSZXF1aXJlbWVudD8ucnVsZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMucHJvZHVjdC5yZXN0cmljdGlvbnM/LmFwcFJlcXVpcmVtZW50Py5ydWxlc1swXS5hcHBJZHM/Lmxlbmd0aCA+IDA7XG4gIH1cblxuICBvbkFkZG9uU2VsZWN0ZWQoYWRkb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hZGRvblNlbGVjdGVkLmVtaXQoYWRkb25JZCk7XG4gIH1cblxuICBnZXRBZGRvbnMoKTogQWRkb25bXSB7XG4gICAgaWYgKCF0aGlzLmFkZG9ucykge1xuICAgICAgdGhpcy5hZGRvbnMgPSB0aGlzLnByb2R1Y3QuYWRkb25zLm1hcCgoYWRkb24pID0+IEFkZG9uLmZyb21BcGkoYWRkb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRkb25zO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHJvZHVjdC1jb250ZW50XCI+XG4gIDxkaXYgY2xhc3M9XCJsZWZ0LWNvbHVtblwiPlxuICAgIDxzZWN0aW9uICpuZ0lmPVwicHJvZHVjdC5kZXNjcmlwdGlvbiB8fCBwcm9kdWN0LmtleVNlbGxpbmdQb2ludHNcIj5cbiAgICAgIDxtYXQtY2FyZD5cbiAgICAgICAgPGFwcC1zZWxsaW5nLWluZm9cbiAgICAgICAgICBbZGVzY3JpcHRpb25dPVwicHJvZHVjdC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgW2tleVNlbGxpbmdQb2ludHNdPVwicHJvZHVjdC5rZXlTZWxsaW5nUG9pbnRzXCJcbiAgICAgICAgPjwvYXBwLXNlbGxpbmctaW5mbz5cbiAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxzZWN0aW9uICpuZ0lmPVwicHJvZHVjdC5mYXFzPy5sZW5ndGggPiAwXCI+XG4gICAgICA8bWF0LWNhcmQ+XG4gICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC10aXRsZVwiPlxuICAgICAgICAgIHt7ICdGUk9OVEVORC5TVE9SRS5GQVFTJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2gyPlxuICAgICAgICA8YXBwLWZhcXMgW2ZhcXNdPVwicHJvZHVjdC5mYXFzXCI+PC9hcHAtZmFxcz5cbiAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9zZWN0aW9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbHVtblwiPlxuICAgIDxzZWN0aW9uICpuZ0lmPVwiISFiaWxsaW5nUHJpY2UgfHwgISFtYXJrZXRwbGFjZUNvc3RcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiaWxsaW5nUHJpY2U7IGVsc2UgY29zdFRlbXBsYXRlXCI+XG4gICAgICAgIDxhcHAtYmlsbGluZy1wcmljZS1jYXJkXG4gICAgICAgICAgW21hcmtldGluZ1R5cGVdPVwibWFya2V0aW5nVHlwZVwiXG4gICAgICAgICAgW2NvbnRhY3RTYWxlc109XCJwcm9kdWN0Py5zaG91bGRDb250YWN0U2FsZXNcIlxuICAgICAgICAgIFtzdGFydGluZ0F0XT1cInByb2R1Y3Q/LnVzZXNDdXN0b21QcmljaW5nXCJcbiAgICAgICAgICBbYmlsbGluZ1ByaWNlXT1cImJpbGxpbmdQcmljZVwiXG4gICAgICAgICAgW2lzT09dPVwiaXNPT1wiXG4gICAgICAgID48L2FwcC1iaWxsaW5nLXByaWNlLWNhcmQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY29zdFRlbXBsYXRlPlxuICAgICAgICA8YXBwLW1hcmtldHBsYWNlLWNvc3QtY2FyZFxuICAgICAgICAgIFtjb250YWN0U2FsZXNdPVwicHJvZHVjdD8uc2hvdWxkQ29udGFjdFNhbGVzXCJcbiAgICAgICAgICBbbWFya2V0cGxhY2VDb3N0XT1cIm1hcmtldHBsYWNlQ29zdFwiXG4gICAgICAgICAgW2lzT09dPVwiaXNPT1wiXG4gICAgICAgID48L2FwcC1tYXJrZXRwbGFjZS1jb3N0LWNhcmQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvc2VjdGlvbj5cbiAgICA8c2VjdGlvbj5cbiAgICAgIDxtYXQtY2FyZD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb2R1Y3REZXBlbmRlbmNpZXNFbmFibGVkJCB8IGFzeW5jXCI+XG4gICAgICAgICAgPGgyIGNsYXNzPVwidmEtY29tcG9uZW50LXRpdGxlIHJlcXVpcmVtZW50cy10aXRsZVwiPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgJ0ZST05URU5ELlNUT1JFLlBST0RVQ1RfREVUQUlMUy5QUk9EVUNUX1JFUVVJUkVNRU5UUy5USVRMRSdcbiAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UHJvZHVjdERlcGVuZGVuY2llc0xpc3RcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1aXJlbWVudHMtaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC1zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAnRlJPTlRFTkQuU1RPUkUuUFJPRFVDVF9ERVRBSUxTLlBST0RVQ1RfUkVRVUlSRU1FTlRTLkxBQkVMJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgIFtnbHh5UG9wb3Zlcl09XCJwcm9kdWN0UmVxdWlyZW1lbnRzUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd1Byb2R1Y3RSZXF1aXJlbWVudHNQb3BvdmVyID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwic2hvd1Byb2R1Y3RSZXF1aXJlbWVudHNQb3BvdmVyID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgIGlubGluZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgaW5mb19vdXRsaW5lXG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxnbHh5LXBvcG92ZXJcbiAgICAgICAgICAgICAgICAjcHJvZHVjdFJlcXVpcmVtZW50c1BvcG92ZXJcbiAgICAgICAgICAgICAgICBbaXNPcGVuXT1cInNob3dQcm9kdWN0UmVxdWlyZW1lbnRzUG9wb3ZlclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Z2x4eS1wb3BvdmVyLXRpdGxlPlxuICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgJ0ZST05URU5ELlNUT1JFLlBST0RVQ1RfREVUQUlMUy5QUk9EVUNUX1JFUVVJUkVNRU5UUy5UT09MVElQLlRJVExFJ1xuICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvZ2x4eS1wb3BvdmVyLXRpdGxlPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAnRlJPTlRFTkQuU1RPUkUuUFJPRFVDVF9ERVRBSUxTLlBST0RVQ1RfUkVRVUlSRU1FTlRTLlRPT0xUSVAuREVTQ1JJUFRJT04nXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9nbHh5LXBvcG92ZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXJlcXVpcmVtZW50c1wiPlxuICAgICAgICAgICAgICA8cHJvZHVjdC1yZXF1aXJlbWVudHMgW3Byb2R1Y3RdPVwicHJvZHVjdFwiPjwvcHJvZHVjdC1yZXF1aXJlbWVudHM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC1zdWJ0aXRsZVwiPlxuICAgICAgICAgIHt7ICdGUk9OVEVORC5TVE9SRS5BVkFJTEFCTEVfSU4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvaDI+XG4gICAgICAgIDxhcHAtc3VwcG9ydGVkLWNvdW50cmllcy12MlxuICAgICAgICAgIFtidXNpbmVzc0NvdW50cnlDb2RlXT1cImJ1c2luZXNzQ291bnRyeUNvZGVcIlxuICAgICAgICAgIFtjb3VudHJ5Q29kZXNdPVwicHJvZHVjdC5yZXN0cmljdGlvbnMuY291bnRyeS53aGl0ZWxpc3RcIlxuICAgICAgICA+PC9hcHAtc3VwcG9ydGVkLWNvdW50cmllcy12Mj5cbiAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxzZWN0aW9uICpuZ0lmPVwicHJvZHVjdC5uZWVkSGVscFwiPlxuICAgICAgPG1hdC1jYXJkPlxuICAgICAgICA8aDIgY2xhc3M9XCJ2YS1jb21wb25lbnQtdGl0bGVcIj5cbiAgICAgICAgICB7eyAnRlJPTlRFTkQuU1RPUkUuTkVFRF9IRUxQJyB8IHRyYW5zbGF0ZSB9fT9cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPGFwcC1uZWVkLWhlbHAgW25lZWRIZWxwXT1cInByb2R1Y3QubmVlZEhlbHBcIj48L2FwcC1uZWVkLWhlbHA+XG4gICAgICA8L21hdC1jYXJkPlxuICAgIDwvc2VjdGlvbj5cbiAgICA8c2VjdGlvbiAqbmdJZj1cInByb2R1Y3QudmlkZW9zICYmIHByb2R1Y3QudmlkZW9zLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxtYXQtY2FyZD5cbiAgICAgICAgPGgyIGNsYXNzPVwidmEtY29tcG9uZW50LXRpdGxlXCI+XG4gICAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLlZJREVPUycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPGFwcC12aWRlb3MgW3ZpZGVvc109XCJwcm9kdWN0LnZpZGVvc1wiPjwvYXBwLXZpZGVvcz5cbiAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxzZWN0aW9uICpuZ0lmPVwicHJvZHVjdC5hZGRvbnM/Lmxlbmd0aFwiPlxuICAgICAgPG1hdC1jYXJkPlxuICAgICAgICA8aDIgY2xhc3M9XCJ2YS1jb21wb25lbnQtdGl0bGVcIj5cbiAgICAgICAgICB7eyAnRlJPTlRFTkQuU1RPUkUuUFJPRFVDVFNfQU5EX0FERE9OUycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPGFwcC1hZGRvbi1saXN0XG4gICAgICAgICAgW2FkZG9uc109XCJnZXRBZGRvbnMoKVwiXG4gICAgICAgICAgKGFkZG9uU2VsZWN0ZWQpPVwib25BZGRvblNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICA+PC9hcHAtYWRkb24tbGlzdD5cbiAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9zZWN0aW9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19