UNPKG

@vendasta/store

Version:

Components and data for Store

181 lines 21.6 kB
/** * @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=