@vendasta/store
Version:
Components and data for Store
181 lines • 21.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { BehaviorSubject, ReplaySubject, combineLatest, merge as observableMerge } from 'rxjs';
import { Package } from './package';
import { Addon } from '@vendasta/core/shared';
import { skipWhile, shareReplay, map, take } from 'rxjs/operators';
import { orderProductsAndAddons } from './utils';
export class VaPackageDetailsComponent {
constructor() {
this.showActionButton = true;
this.showPricing = true;
this.actionLabel = 'Get It Now';
this.getItNow = new EventEmitter();
this.standAloneProducts$$ = new BehaviorSubject([]);
this.products$ = new BehaviorSubject([]);
this.addons$ = new BehaviorSubject([]);
this.pkg$ = new ReplaySubject(1);
this.itemSelectedEvent$ = new ReplaySubject(1);
this.combinedItemsList$ = combineLatest(this.products$, this.addons$, (products, addons) => {
return (/** @type {?} */ ([].concat(products || []).concat(addons || [])));
});
this.orderedItemsList$ = combineLatest(this.combinedItemsList$, this.pkg$, (combined, pkg) => {
return orderProductsAndAddons(combined, pkg ? pkg.productOrder || [] : []);
});
/** @type {?} */
const nonEmptyCombinedItemsList = this.combinedItemsList$.pipe(skipWhile(items => !items || items.length === 0), shareReplay(1));
// Need to map to an index because that's how product selection works.
/** @type {?} */
const initialSelectedItem$ = nonEmptyCombinedItemsList.pipe(map((_) => 0), take(1));
/** @type {?} */
const mergedSelection = observableMerge(initialSelectedItem$, this.itemSelectedEvent$);
this.selectedItem$ = combineLatest(mergedSelection, this.orderedItemsList$).pipe(map(([index, items]) => {
return items[index];
}));
this.lmiCategories$ = this.products$.pipe(skipWhile(products => !products || products.length === 0), map(products => {
return VaPackageDetailsComponent.getLmiCategories(products);
}));
this.productNameForSingleAddon$ = nonEmptyCombinedItemsList.pipe(map(items => {
return VaPackageDetailsComponent.getProductNameForSingleAddon(items);
}));
this.displayTagName$ = combineLatest(this.pkg$, this.combinedItemsList$).pipe(map(([pkg, items]) => {
return VaPackageDetailsComponent.getDisplayTagline(pkg, items);
}));
}
/**
* @param {?} standAloneProducts
* @return {?}
*/
set standAloneProducts(standAloneProducts) {
this.standAloneProducts$$.next(standAloneProducts);
}
/**
* @param {?} products
* @return {?}
*/
set products(products) {
this.products$.next(products);
}
/**
* @param {?} addons
* @return {?}
*/
set addons(addons) {
this.addons$.next(addons);
}
/**
* @param {?} pkg
* @return {?}
*/
set pkg(pkg) {
this.pkg$.next(pkg);
}
/**
* @param {?} products
* @return {?}
*/
static getLmiCategories(products) {
/** @type {?} */
let lmiCategories = [];
if (products) {
products.forEach(product => {
lmiCategories = lmiCategories.concat(product.getLmiCategoryNames());
});
}
return new Set(lmiCategories);
}
/**
* @param {?} pkg
* @param {?} items
* @return {?}
*/
static getDisplayTagline(pkg, items) {
if (pkg && pkg.tagline) {
return pkg.tagline;
}
else if (items && items.length === 1) {
// Single product / addon package.
return items[0].tagline || '';
}
return '';
}
/**
* @param {?} items
* @return {?}
*/
static getProductNameForSingleAddon(items) {
if (items && items.length === 1 && items[0] instanceof Addon) {
/** @type {?} */
const addon = (/** @type {?} */ (items[0]));
return addon.productName;
}
}
/**
* @param {?} i
* @return {?}
*/
selectItem(i) {
this.itemSelectedEvent$.next(i);
}
/**
* @return {?}
*/
emitGetItNow() {
this.getItNow.emit();
}
}
VaPackageDetailsComponent.decorators = [
{ type: Component, args: [{
selector: 'va-package-details',
template: "<div *ngIf=\"pkg$ | async as pkg\" class=\"page\">\n <va-header-container [iconUrl]=\"pkg.icon\"\n [title]=\"pkg.name\"\n [tagline]=\"displayTagName$ | async\"\n [prerequisite]=\"productNameForSingleAddon$ | async\"\n [chipLabels]=\"lmiCategories$ | async\"\n [pricing]=\"pkg.pricing\"\n [pricingLabel]=\"'Pricing'\"\n [showAction]=\"showActionButton\"\n [showPricing]=\"showPricing\"\n [actionLabel]=\"actionLabel\"\n [actionEnabled]=true\n (actionSelected)=\"emitGetItNow()\"\n ></va-header-container>\n <ng-container *ngIf=\"pkg?.content\">\n <va-selling-info [description]=\"pkg.content\"></va-selling-info>\n </ng-container>\n\n <va-products-nav [items]=\"orderedItemsList$ | async\"\n [hideItemsNav]=\"pkg?.hide_product_icons_and_names\"\n (itemSelected)=\"selectItem($event)\"></va-products-nav>\n\n <ng-container *ngIf=\"selectedItem$ | async as selectedItem\">\n <div *ngIf=\"!pkg?.hide_product_details\" class=\"package-content\">\n <div class=\"left-column\">\n <section\n *ngIf=\"(selectedItem.endUserMarketing?.description || selectedItem.endUserMarketing?.keySellingPoints) ||\n (selectedItem.description || selectedItem.keySellingPoints)\">\n <va-selling-info [description]=\"selectedItem.endUserMarketing?.description || selectedItem.description\"\n [keySellingPoints]=\"selectedItem.endUserMarketing?.keySellingPoints || selectedItem.keySellingPoints\"></va-selling-info>\n </section>\n\n <section *ngIf=\"(selectedItem.endUserMarketing?.faqs?.length > 0\n && selectedItem.endUserMarketing?.faqs[0].question) || selectedItem.faqs?.length > 0\">\n <h2 class=\"va-component-title\">FAQs</h2>\n <va-faqs [faqs]=\"selectedItem.endUserMarketing?.faqs || selectedItem.faqs\"></va-faqs>\n </section>\n </div>\n\n <div class=\"right-column\">\n <section *ngIf=\"selectedItem.screenshotUrls?.length > 0 || selectedItem.screenshots?.length > 0\">\n <h2 class=\"va-component-title\">Gallery</h2>\n <va-image-gallery [imageUrls]=\"selectedItem.screenshotUrls || selectedItem.screenshots\"></va-image-gallery>\n </section>\n\n <section *ngIf=\"selectedItem.endUserMarketing?.files?.length > 0 || selectedItem.files?.length > 0\">\n <h2 class=\"va-component-title\">Files</h2>\n <va-files [files]=\"selectedItem.endUserMarketingFiles || selectedItem.files\"></va-files>\n </section>\n </div>\n </div>\n </ng-container>\n</div>\n",
styles: [":host{display:block;font-size:14px;line-height:1.4}:host *{box-sizing:border-box}.va-component-title{font-size:24px;font-weight:300;margin-top:0}@media screen and (min-width:600px){.va-component-title{font-size:32px}}img{max-width:100%}va-icon{display:inline-block}.page{position:relative;margin:0 auto 20px;background:#fff;color:#212121;box-shadow:0 3px 10px rgba(33,33,33,.3);overflow:hidden;font-size:16px}.page .item-amount{color:#9e9e9e;font-size:14px;text-align:right;margin:0 24px 8px}section{padding:24px}.left-column{width:66%}@media screen and (max-width:600px){.left-column{width:100%}}.right-column{width:34%}.package-content{display:flex}@media screen and (max-width:600px){.right-column{width:100%}.package-content{flex-direction:column}}"]
}] }
];
/** @nocollapse */
VaPackageDetailsComponent.ctorParameters = () => [];
VaPackageDetailsComponent.propDecorators = {
showActionButton: [{ type: Input }],
showPricing: [{ type: Input }],
actionLabel: [{ type: Input }],
getItNow: [{ type: Output }],
standAloneProducts: [{ type: Input }],
products: [{ type: Input }],
addons: [{ type: Input }],
pkg: [{ type: Input }]
};
if (false) {
/** @type {?} */
VaPackageDetailsComponent.prototype.showActionButton;
/** @type {?} */
VaPackageDetailsComponent.prototype.showPricing;
/** @type {?} */
VaPackageDetailsComponent.prototype.actionLabel;
/** @type {?} */
VaPackageDetailsComponent.prototype.getItNow;
/** @type {?} */
VaPackageDetailsComponent.prototype.standAloneProducts$$;
/** @type {?} */
VaPackageDetailsComponent.prototype.products$;
/** @type {?} */
VaPackageDetailsComponent.prototype.addons$;
/** @type {?} */
VaPackageDetailsComponent.prototype.pkg$;
/** @type {?} */
VaPackageDetailsComponent.prototype.itemSelectedEvent$;
/** @type {?} */
VaPackageDetailsComponent.prototype.selectedItem$;
/** @type {?} */
VaPackageDetailsComponent.prototype.combinedItemsList$;
/** @type {?} */
VaPackageDetailsComponent.prototype.orderedItemsList$;
/** @type {?} */
VaPackageDetailsComponent.prototype.lmiCategories$;
/** @type {?} */
VaPackageDetailsComponent.prototype.productNameForSingleAddon$;
/** @type {?} */
VaPackageDetailsComponent.prototype.displayTagName$;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B2ZW5kYXN0YS9zdG9yZS8iLCJzb3VyY2VzIjpbImxpYi9wYWNrYWdlLWRldGFpbHMvcGFja2FnZS1kZXRhaWxzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxhQUFhLEVBQUUsS0FBSyxJQUFJLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBT2pELE1BQU0sT0FBTyx5QkFBeUI7SUFtRXBDO1FBbEVTLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixnQkFBVyxHQUFHLFlBQVksQ0FBQztRQUUxQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV4Qyx5QkFBb0IsR0FBK0IsSUFBSSxlQUFlLENBQVksRUFBRSxDQUFDLENBQUM7UUFDdEYsY0FBUyxHQUErQixJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQztRQUMzRSxZQUFPLEdBQTZCLElBQUksZUFBZSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLFNBQUksR0FBMkIsSUFBSSxhQUFhLENBQVUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsdUJBQWtCLEdBQTBCLElBQUksYUFBYSxDQUFT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QUssR0FBRyxtQkFBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQVM7WUFDL0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7Ozs7SUFrREQsVUFBVSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDOzs7O0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7O1lBOUhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixneEZBQTZDOzthQUU5Qzs7Ozs7K0JBRUUsS0FBSzswQkFDTCxLQUFLOzBCQUNMLEtBQUs7dUJBRUwsTUFBTTtpQ0FlTixLQUFLO3VCQUtMLEtBQUs7cUJBS0wsS0FBSztrQkFLTCxLQUFLOzs7O0lBbENOLHFEQUFpQzs7SUFDakMsZ0RBQTRCOztJQUM1QixnREFBb0M7O0lBRXBDLDZDQUF3Qzs7SUFFeEMseURBQXNGOztJQUN0Riw4Q0FBMkU7O0lBQzNFLDRDQUFxRTs7SUFDckUseUNBQTZEOztJQUM3RCx1REFBeUU7O0lBRXpFLGtEQUEyQzs7SUFDM0MsdURBQW9EOztJQUNwRCxzREFBbUQ7O0lBQ25ELG1EQUF3Qzs7SUFDeEMsK0RBQStDOztJQUMvQyxvREFBb0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtZXJnZSBhcyBvYnNlcnZhYmxlTWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBhY2thZ2UgfSBmcm9tICcuL3BhY2thZ2UnO1xuaW1wb3J0IHsgQWRkb24gfSBmcm9tICdAdmVuZGFzdGEvY29yZS9zaGFyZWQnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uL3NoYXJlZC9wcm9kdWN0JztcbmltcG9ydCB7IHNraXBXaGlsZSwgc2hhcmVSZXBsYXksIG1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IG9yZGVyUHJvZHVjdHNBbmRBZGRvbnMgfSBmcm9tICcuL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmEtcGFja2FnZS1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICdwYWNrYWdlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWNrYWdlLWRldGFpbHMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWYVBhY2thZ2VEZXRhaWxzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ1dHRvbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dQcmljaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgYWN0aW9uTGFiZWwgPSAnR2V0IEl0IE5vdyc7XG5cbiAgQE91dHB1dCgpIGdldEl0Tm93ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHN0YW5kQWxvbmVQcm9kdWN0cyQkOiBCZWhhdmlvclN1YmplY3Q8UHJvZHVjdFtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJvZHVjdFtdPihbXSk7XG4gIHByb2R1Y3RzJDogQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RbXT4oW10pO1xuICBhZGRvbnMkOiBCZWhhdmlvclN1YmplY3Q8QWRkb25bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFkZG9uW10+KFtdKTtcbiAgcGtnJDogUmVwbGF5U3ViamVjdDxQYWNrYWdlPiA9IG5ldyBSZXBsYXlTdWJqZWN0PFBhY2thZ2U+KDEpO1xuICBpdGVtU2VsZWN0ZWRFdmVudCQ6IFJlcGxheVN1YmplY3Q8bnVtYmVyPiA9IG5ldyBSZXBsYXlTdWJqZWN0PG51bWJlcj4oMSk7XG5cbiAgc2VsZWN0ZWRJdGVtJDogT2JzZXJ2YWJsZTxQcm9kdWN0IHwgQWRkb24+O1xuICBjb21iaW5lZEl0ZW1zTGlzdCQ6IE9ic2VydmFibGU8KFByb2R1Y3QgfCBBZGRvbilbXT47XG4gIG9yZGVyZWRJdGVtc0xpc3QkOiBPYnNlcnZhYmxlPChQcm9kdWN0IHwgQWRkb24pW10+O1xuICBsbWlDYXRlZ29yaWVzJDogT2JzZXJ2YWJsZTxTZXQ8c3RyaW5nPj47XG4gIHByb2R1Y3ROYW1lRm9yU2luZ2xlQWRkb24kOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGRpc3BsYXlUYWdOYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIEBJbnB1dCgpXG4gIHNldCBzdGFuZEFsb25lUHJvZHVjdHMoc3RhbmRBbG9uZVByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICB0aGlzLnN0YW5kQWxvbmVQcm9kdWN0cyQkLm5leHQoc3RhbmRBbG9uZVByb2R1Y3RzKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBwcm9kdWN0cyhwcm9kdWN0czogUHJvZHVjdFtdKSB7XG4gICAgdGhpcy5wcm9kdWN0cyQubmV4dChwcm9kdWN0cyk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYWRkb25zKGFkZG9uczogQWRkb25bXSkge1xuICAgIHRoaXMuYWRkb25zJC5uZXh0KGFkZG9ucyk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcGtnKHBrZzogUGFja2FnZSkge1xuICAgIHRoaXMucGtnJC5uZXh0KHBrZyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0TG1pQ2F0ZWdvcmllcyhwcm9kdWN0czogUHJvZHVjdFtdKTogU2V0PHN0cmluZz4ge1xuICAgIGxldCBsbWlDYXRlZ29yaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChwcm9kdWN0cykge1xuICAgICAgcHJvZHVjdHMuZm9yRWFjaChwcm9kdWN0ID0+IHtcbiAgICAgICAgbG1pQ2F0ZWdvcmllcyA9IGxtaUNhdGVnb3JpZXMuY29uY2F0KHByb2R1Y3QuZ2V0TG1pQ2F0ZWdvcnlOYW1lcygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNldChsbWlDYXRlZ29yaWVzKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXREaXNwbGF5VGFnbGluZShwa2c6IFBhY2thZ2UsIGl0ZW1zOiAoUHJvZHVjdCB8IEFkZG9uKVtdKTogc3RyaW5nIHtcbiAgICBpZiAocGtnICYmIHBrZy50YWdsaW5lKSB7XG4gICAgICByZXR1cm4gcGtnLnRhZ2xpbmU7XG4gICAgfSBlbHNlIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIFNpbmdsZSBwcm9kdWN0IC8gYWRkb24gcGFja2FnZS5cbiAgICAgIHJldHVybiBpdGVtc1swXS50YWdsaW5lIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJvZHVjdE5hbWVGb3JTaW5nbGVBZGRvbihpdGVtczogKFByb2R1Y3QgfCBBZGRvbilbXSk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA9PT0gMSAmJiBpdGVtc1swXSBpbnN0YW5jZW9mIEFkZG9uKSB7XG4gICAgICBjb25zdCBhZGRvbiA9IGl0ZW1zWzBdIGFzIEFkZG9uO1xuICAgICAgcmV0dXJuIGFkZG9uLnByb2R1Y3ROYW1lO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29tYmluZWRJdGVtc0xpc3QkID0gY29tYmluZUxhdGVzdCh0aGlzLnByb2R1Y3RzJCwgdGhpcy5hZGRvbnMkLCAocHJvZHVjdHM6IFByb2R1Y3RbXSwgYWRkb25zOiBBZGRvbltdKSA9PiB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KHByb2R1Y3RzIHx8IFtdKS5jb25jYXQoYWRkb25zIHx8IFtdKSBhcyAoUHJvZHVjdCB8IEFkZG9uKVtdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vcmRlcmVkSXRlbXNMaXN0JCA9IGNvbWJpbmVMYXRlc3QodGhpcy5jb21iaW5lZEl0ZW1zTGlzdCQsIHRoaXMucGtnJCwgKGNvbWJpbmVkOiAoUHJvZHVjdCB8IEFkZG9uKVtdLCBwa2c6IFBhY2thZ2UpID0+IHtcbiAgICAgIHJldHVybiBvcmRlclByb2R1Y3RzQW5kQWRkb25zKGNvbWJpbmVkLCBwa2cgPyBwa2cucHJvZHVjdE9yZGVyIHx8IFtdIDogW10pXG4gICAgfSk7XG5cbiAgICBjb25zdCBub25FbXB0eUNvbWJpbmVkSXRlbXNMaXN0ID0gdGhpcy5jb21iaW5lZEl0ZW1zTGlzdCQucGlwZShcbiAgICAgIHNraXBXaGlsZShpdGVtcyA9PiAhaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcblxuICAgIC8vIE5lZWQgdG8gbWFwIHRvIGFuIGluZGV4IGJlY2F1c2UgdGhhdCdzIGhvdyBwcm9kdWN0IHNlbGVjdGlvbiB3b3Jrcy5cbiAgICBjb25zdCBpbml0aWFsU2VsZWN0ZWRJdGVtJCA9IG5vbkVtcHR5Q29tYmluZWRJdGVtc0xpc3QucGlwZShcbiAgICAgIG1hcCgoXzogYW55KSA9PiAwKSxcbiAgICAgIHRha2UoMSlcbiAgICApO1xuXG4gICAgY29uc3QgbWVyZ2VkU2VsZWN0aW9uID0gb2JzZXJ2YWJsZU1lcmdlKGluaXRpYWxTZWxlY3RlZEl0ZW0kLCB0aGlzLml0ZW1TZWxlY3RlZEV2ZW50JCk7XG5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbSQgPSBjb21iaW5lTGF0ZXN0KG1lcmdlZFNlbGVjdGlvbiwgdGhpcy5vcmRlcmVkSXRlbXNMaXN0JCkucGlwZShcbiAgICAgIG1hcCgoW2luZGV4LCBpdGVtc10pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zW2luZGV4XTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMubG1pQ2F0ZWdvcmllcyQgPSB0aGlzLnByb2R1Y3RzJC5waXBlKFxuICAgICAgc2tpcFdoaWxlKHByb2R1Y3RzID0+ICFwcm9kdWN0cyB8fCBwcm9kdWN0cy5sZW5ndGggPT09IDApLFxuICAgICAgbWFwKHByb2R1Y3RzID0+IHtcbiAgICAgICAgcmV0dXJuIFZhUGFja2FnZURldGFpbHNDb21wb25lbnQuZ2V0TG1pQ2F0ZWdvcmllcyhwcm9kdWN0cyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnByb2R1Y3ROYW1lRm9yU2luZ2xlQWRkb24kID0gbm9uRW1wdHlDb21iaW5lZEl0ZW1zTGlzdC5waXBlKFxuICAgICAgbWFwKGl0ZW1zID0+IHtcbiAgICAgICAgcmV0dXJuIFZhUGFja2FnZURldGFpbHNDb21wb25lbnQuZ2V0UHJvZHVjdE5hbWVGb3JTaW5nbGVBZGRvbihpdGVtcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmRpc3BsYXlUYWdOYW1lJCA9IGNvbWJpbmVMYXRlc3QodGhpcy5wa2ckLCB0aGlzLmNvbWJpbmVkSXRlbXNMaXN0JCkucGlwZShcbiAgICAgIG1hcCgoW3BrZywgaXRlbXNdKSA9PiB7XG4gICAgICAgIHJldHVybiBWYVBhY2thZ2VEZXRhaWxzQ29tcG9uZW50LmdldERpc3BsYXlUYWdsaW5lKHBrZywgaXRlbXMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0SXRlbShpOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TZWxlY3RlZEV2ZW50JC5uZXh0KGkpO1xuICB9XG5cbiAgZW1pdEdldEl0Tm93KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0SXROb3cuZW1pdCgpO1xuICB9XG59XG4iXX0=