UNPKG

@spartacus/storefront

Version:

Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.

57 lines 19.2 kB
import { Component } from '@angular/core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { take } from 'rxjs/operators'; import { ViewModes } from '../product-view/product-view.component'; import * as i0 from "@angular/core"; import * as i1 from "../../../../cms-structure/page/index"; import * as i2 from "./product-list-component.service"; import * as i3 from "../../../../shared/config/view-config"; import * as i4 from "../../../../shared/components/list-navigation/sorting/sorting.component"; import * as i5 from "../../../../shared/components/list-navigation/pagination/pagination.component"; import * as i6 from "../product-view/product-view.component"; import * as i7 from "../product-grid-item/product-grid-item.component"; import * as i8 from "../product-list-item/product-list-item.component"; import * as i9 from "./product-scroll/product-scroll.component"; import * as i10 from "@angular/common"; import * as i11 from "@spartacus/core"; export class ProductListComponent { constructor(pageLayoutService, productListComponentService, scrollConfig) { this.pageLayoutService = pageLayoutService; this.productListComponentService = productListComponentService; this.scrollConfig = scrollConfig; this.subscription = new Subscription(); this.model$ = this.productListComponentService.model$; this.viewMode$ = new BehaviorSubject(ViewModes.Grid); this.ViewModes = ViewModes; } ngOnInit() { var _a, _b; this.isInfiniteScroll = (_b = (_a = this.scrollConfig.view) === null || _a === void 0 ? void 0 : _a.infiniteScroll) === null || _b === void 0 ? void 0 : _b.active; this.subscription.add(this.pageLayoutService.templateName$ .pipe(take(1)) .subscribe((template) => { this.viewMode$.next(template === 'ProductGridPageTemplate' ? ViewModes.Grid : ViewModes.List); })); } sortList(sortCode) { this.productListComponentService.sort(sortCode); } setViewMode(mode) { this.viewMode$.next(mode); } ngOnDestroy() { this.subscription.unsubscribe(); } } ProductListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ProductListComponent, deps: [{ token: i1.PageLayoutService }, { token: i2.ProductListComponentService }, { token: i3.ViewConfig }], target: i0.ɵɵFactoryTarget.Component }); ProductListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: ProductListComponent, selector: "cx-product-list", ngImport: i0, template: "<div class=\"cx-page\" *ngIf=\"model$ | async as model\">\n <section class=\"cx-page-section\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 col-lg-12\" *ngIf=\"viewMode$ | async as viewMode\">\n <div class=\"cx-sorting top\">\n <div class=\"row\">\n <label\n class=\"form-group cx-sort-dropdown col-12 col-lg-4 mr-auto\"\n >\n <span>{{ 'productList.sortBy' | cxTranslate }}</span>\n <cx-sorting\n [sortOptions]=\"model.sorts\"\n (sortListEvent)=\"sortList($event)\"\n [selectedOption]=\"model.pagination.sort\"\n placeholder=\"{{ 'productList.sortBy' | cxTranslate }}\"\n ></cx-sorting>\n </label>\n <div *ngIf=\"!isInfiniteScroll\" class=\"col-auto\">\n <div\n class=\"cx-pagination\"\n [attr.aria-label]=\"\n 'productList.productSearchPagination' | cxTranslate\n \"\n >\n <cx-pagination\n [pagination]=\"model.pagination\"\n queryParam=\"currentPage\"\n [defaultPage]=\"0\"\n ></cx-pagination>\n </div>\n </div>\n <div class=\"col-auto ml-auto ml-lg-0\">\n <cx-product-view\n (modeChange)=\"setViewMode($event)\"\n [mode]=\"viewMode\"\n ></cx-product-view>\n </div>\n </div>\n </div>\n <div class=\"cx-product-container\">\n <!-- Product list when using pagination -->\n <ng-container *ngIf=\"!isInfiniteScroll; else infiniteScroll\">\n <ng-container *ngIf=\"viewMode === ViewModes.Grid\">\n <div class=\"row\">\n <cx-product-grid-item\n *ngFor=\"let product of model?.products\"\n [product]=\"product\"\n class=\"col-12 col-sm-6 col-md-4\"\n ></cx-product-grid-item>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"viewMode === ViewModes.List\">\n <cx-product-list-item\n *ngFor=\"let product of model?.products\"\n [product]=\"product\"\n class=\"cx-product-search-list\"\n ></cx-product-list-item>\n </ng-container>\n </ng-container>\n\n <!-- Product list when using infinite scroll -->\n <ng-template #infiniteScroll>\n <cx-product-scroll\n [scrollConfig]=\"scrollConfig\"\n [model]=\"model\"\n [inputViewMode]=\"viewMode\"\n ></cx-product-scroll>\n </ng-template>\n </div>\n <div class=\"cx-sorting bottom\">\n <div class=\"row\">\n <label\n class=\"form-group cx-sort-dropdown col-12 col-lg-4 mr-auto\"\n >\n <span>{{ 'productList.sortBy' | cxTranslate }}</span>\n <cx-sorting\n [sortOptions]=\"model.sorts\"\n (sortListEvent)=\"sortList($event)\"\n [selectedOption]=\"model.pagination.sort\"\n placeholder=\"{{ 'productList.sortBy' | cxTranslate }}\"\n ></cx-sorting>\n </label>\n <div\n *ngIf=\"!isInfiniteScroll\"\n class=\"col-auto\"\n [attr.aria-label]=\"\n 'productList.productSearchPagination' | cxTranslate\n \"\n >\n <div class=\"cx-pagination\">\n <cx-pagination\n [pagination]=\"model.pagination\"\n queryParam=\"currentPage\"\n [defaultPage]=\"0\"\n ></cx-pagination>\n </div>\n </div>\n <div class=\"col-auto ml-auto ml-lg-0\">\n <cx-product-view\n (modeChange)=\"setViewMode($event)\"\n [mode]=\"viewMode\"\n ></cx-product-view>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n</div>\n", components: [{ type: i4.SortingComponent, selector: "cx-sorting", inputs: ["sortOptions", "selectedOption", "placeholder", "sortLabels"], outputs: ["sortListEvent"] }, { type: i5.PaginationComponent, selector: "cx-pagination", inputs: ["pageRoute", "queryParam", "defaultPage", "pagination"], outputs: ["viewPageEvent"] }, { type: i6.ProductViewComponent, selector: "cx-product-view", inputs: ["mode"], outputs: ["modeChange"] }, { type: i7.ProductGridItemComponent, selector: "cx-product-grid-item", inputs: ["product"] }, { type: i8.ProductListItemComponent, selector: "cx-product-list-item", inputs: ["product"] }, { type: i9.ProductScrollComponent, selector: "cx-product-scroll", inputs: ["scrollConfig", "model", "inputViewMode"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i10.AsyncPipe, "cxTranslate": i11.TranslatePipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ProductListComponent, decorators: [{ type: Component, args: [{ selector: 'cx-product-list', templateUrl: './product-list.component.html', }] }], ctorParameters: function () { return [{ type: i1.PageLayoutService }, { type: i2.ProductListComponentService }, { type: i3.ViewConfig }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLWNvbXBvbmVudHMvcHJvZHVjdC9wcm9kdWN0LWxpc3QvY29udGFpbmVyL3Byb2R1Y3QtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL2Ntcy1jb21wb25lbnRzL3Byb2R1Y3QvcHJvZHVjdC1saXN0L2NvbnRhaW5lci9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU9uRSxNQUFNLE9BQU8sb0JBQW9CO0lBVy9CLFlBQ1UsaUJBQW9DLEVBQ3BDLDJCQUF3RCxFQUN6RCxZQUF3QjtRQUZ2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUFDekQsaUJBQVksR0FBWixZQUFZLENBQVk7UUFiekIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSTFDLFdBQU0sR0FDSixJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDO1FBRTFDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBWSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsY0FBUyxHQUFHLFNBQVMsQ0FBQztJQU1uQixDQUFDO0lBRUosUUFBUTs7UUFDTixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBQSxNQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSwwQ0FBRSxjQUFjLDBDQUFFLE1BQU0sQ0FBQztRQUV2RSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWE7YUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNqQixRQUFRLEtBQUsseUJBQXlCO2dCQUNwQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUk7Z0JBQ2hCLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNuQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsUUFBZ0I7UUFDdkIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQWU7UUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7O2lIQTNDVSxvQkFBb0I7cUdBQXBCLG9CQUFvQix1RENiakMsazNJQWdIQTsyRkRuR2Esb0JBQW9CO2tCQUpoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFdBQVcsRUFBRSwrQkFBK0I7aUJBQzdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvZHVjdFNlYXJjaFBhZ2UgfSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQYWdlTGF5b3V0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2Ntcy1zdHJ1Y3R1cmUvcGFnZS9pbmRleCc7XG5pbXBvcnQgeyBWaWV3Q29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2NvbmZpZy92aWV3LWNvbmZpZyc7XG5pbXBvcnQgeyBWaWV3TW9kZXMgfSBmcm9tICcuLi9wcm9kdWN0LXZpZXcvcHJvZHVjdC12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0TGlzdENvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuL3Byb2R1Y3QtbGlzdC1jb21wb25lbnQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N4LXByb2R1Y3QtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgaXNJbmZpbml0ZVNjcm9sbDogYm9vbGVhbjtcblxuICBtb2RlbCQ6IE9ic2VydmFibGU8UHJvZHVjdFNlYXJjaFBhZ2U+ID1cbiAgICB0aGlzLnByb2R1Y3RMaXN0Q29tcG9uZW50U2VydmljZS5tb2RlbCQ7XG5cbiAgdmlld01vZGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWaWV3TW9kZXM+KFZpZXdNb2Rlcy5HcmlkKTtcbiAgVmlld01vZGVzID0gVmlld01vZGVzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGFnZUxheW91dFNlcnZpY2U6IFBhZ2VMYXlvdXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJvZHVjdExpc3RDb21wb25lbnRTZXJ2aWNlOiBQcm9kdWN0TGlzdENvbXBvbmVudFNlcnZpY2UsXG4gICAgcHVibGljIHNjcm9sbENvbmZpZzogVmlld0NvbmZpZ1xuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0luZmluaXRlU2Nyb2xsID0gdGhpcy5zY3JvbGxDb25maWcudmlldz8uaW5maW5pdGVTY3JvbGw/LmFjdGl2ZTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMucGFnZUxheW91dFNlcnZpY2UudGVtcGxhdGVOYW1lJFxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgICAgIHRoaXMudmlld01vZGUkLm5leHQoXG4gICAgICAgICAgICB0ZW1wbGF0ZSA9PT0gJ1Byb2R1Y3RHcmlkUGFnZVRlbXBsYXRlJ1xuICAgICAgICAgICAgICA/IFZpZXdNb2Rlcy5HcmlkXG4gICAgICAgICAgICAgIDogVmlld01vZGVzLkxpc3RcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzb3J0TGlzdChzb3J0Q29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcm9kdWN0TGlzdENvbXBvbmVudFNlcnZpY2Uuc29ydChzb3J0Q29kZSk7XG4gIH1cblxuICBzZXRWaWV3TW9kZShtb2RlOiBWaWV3TW9kZXMpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlJC5uZXh0KG1vZGUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImN4LXBhZ2VcIiAqbmdJZj1cIm1vZGVsJCB8IGFzeW5jIGFzIG1vZGVsXCI+XG4gIDxzZWN0aW9uIGNsYXNzPVwiY3gtcGFnZS1zZWN0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1sZy0xMlwiICpuZ0lmPVwidmlld01vZGUkIHwgYXN5bmMgYXMgdmlld01vZGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3gtc29ydGluZyB0b3BcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIGN4LXNvcnQtZHJvcGRvd24gY29sLTEyIGNvbC1sZy00IG1yLWF1dG9cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ3Byb2R1Y3RMaXN0LnNvcnRCeScgfCBjeFRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Y3gtc29ydGluZ1xuICAgICAgICAgICAgICAgICAgW3NvcnRPcHRpb25zXT1cIm1vZGVsLnNvcnRzXCJcbiAgICAgICAgICAgICAgICAgIChzb3J0TGlzdEV2ZW50KT1cInNvcnRMaXN0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkT3B0aW9uXT1cIm1vZGVsLnBhZ2luYXRpb24uc29ydFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdwcm9kdWN0TGlzdC5zb3J0QnknIHwgY3hUcmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgID48L2N4LXNvcnRpbmc+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbmZpbml0ZVNjcm9sbFwiIGNsYXNzPVwiY29sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN4LXBhZ2luYXRpb25cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y3RMaXN0LnByb2R1Y3RTZWFyY2hQYWdpbmF0aW9uJyB8IGN4VHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxjeC1wYWdpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uXT1cIm1vZGVsLnBhZ2luYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFBhZ2VdPVwiMFwiXG4gICAgICAgICAgICAgICAgICA+PC9jeC1wYWdpbmF0aW9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIG1sLWF1dG8gbWwtbGctMFwiPlxuICAgICAgICAgICAgICAgIDxjeC1wcm9kdWN0LXZpZXdcbiAgICAgICAgICAgICAgICAgIChtb2RlQ2hhbmdlKT1cInNldFZpZXdNb2RlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW21vZGVdPVwidmlld01vZGVcIlxuICAgICAgICAgICAgICAgID48L2N4LXByb2R1Y3Qtdmlldz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3gtcHJvZHVjdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDwhLS0gUHJvZHVjdCBsaXN0IHdoZW4gdXNpbmcgcGFnaW5hdGlvbiAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNJbmZpbml0ZVNjcm9sbDsgZWxzZSBpbmZpbml0ZVNjcm9sbFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlld01vZGUgPT09IFZpZXdNb2Rlcy5HcmlkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGN4LXByb2R1Y3QtZ3JpZC1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIG1vZGVsPy5wcm9kdWN0c1wiXG4gICAgICAgICAgICAgICAgICAgIFtwcm9kdWN0XT1cInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBjb2wtc20tNiBjb2wtbWQtNFwiXG4gICAgICAgICAgICAgICAgICA+PC9jeC1wcm9kdWN0LWdyaWQtaXRlbT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdNb2RlID09PSBWaWV3TW9kZXMuTGlzdFwiPlxuICAgICAgICAgICAgICAgIDxjeC1wcm9kdWN0LWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgbW9kZWw/LnByb2R1Y3RzXCJcbiAgICAgICAgICAgICAgICAgIFtwcm9kdWN0XT1cInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjeC1wcm9kdWN0LXNlYXJjaC1saXN0XCJcbiAgICAgICAgICAgICAgICA+PC9jeC1wcm9kdWN0LWxpc3QtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBQcm9kdWN0IGxpc3Qgd2hlbiB1c2luZyBpbmZpbml0ZSBzY3JvbGwgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2luZmluaXRlU2Nyb2xsPlxuICAgICAgICAgICAgICA8Y3gtcHJvZHVjdC1zY3JvbGxcbiAgICAgICAgICAgICAgICBbc2Nyb2xsQ29uZmlnXT1cInNjcm9sbENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRWaWV3TW9kZV09XCJ2aWV3TW9kZVwiXG4gICAgICAgICAgICAgID48L2N4LXByb2R1Y3Qtc2Nyb2xsPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3gtc29ydGluZyBib3R0b21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIGN4LXNvcnQtZHJvcGRvd24gY29sLTEyIGNvbC1sZy00IG1yLWF1dG9cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ3Byb2R1Y3RMaXN0LnNvcnRCeScgfCBjeFRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8Y3gtc29ydGluZ1xuICAgICAgICAgICAgICAgICAgW3NvcnRPcHRpb25zXT1cIm1vZGVsLnNvcnRzXCJcbiAgICAgICAgICAgICAgICAgIChzb3J0TGlzdEV2ZW50KT1cInNvcnRMaXN0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkT3B0aW9uXT1cIm1vZGVsLnBhZ2luYXRpb24uc29ydFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdwcm9kdWN0TGlzdC5zb3J0QnknIHwgY3hUcmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgID48L2N4LXNvcnRpbmc+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0luZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1hdXRvXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ3Byb2R1Y3RMaXN0LnByb2R1Y3RTZWFyY2hQYWdpbmF0aW9uJyB8IGN4VHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjeC1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICA8Y3gtcGFnaW5hdGlvblxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdGlvbl09XCJtb2RlbC5wYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbT1cImN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRQYWdlXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgPjwvY3gtcGFnaW5hdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBtbC1hdXRvIG1sLWxnLTBcIj5cbiAgICAgICAgICAgICAgICA8Y3gtcHJvZHVjdC12aWV3XG4gICAgICAgICAgICAgICAgICAobW9kZUNoYW5nZSk9XCJzZXRWaWV3TW9kZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFttb2RlXT1cInZpZXdNb2RlXCJcbiAgICAgICAgICAgICAgICA+PC9jeC1wcm9kdWN0LXZpZXc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvc2VjdGlvbj5cbjwvZGl2PlxuIl19