@vendasta/store
Version:
Components and data for Store
60 lines • 16.7 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/icon";
import * as i2 from "@vendasta/uikit";
import * as i3 from "@angular/common";
import * as i4 from "@ngx-translate/core";
export class VaProductsNavComponent {
constructor() {
this.itemSelected = new EventEmitter();
this.selectedIndex = 0;
this.pageMarker = 0;
}
onItemSelected(index) {
this.selectedIndex = index;
this.itemSelected.emit(index);
}
moveSlides(slides) {
const sliderWidth = Math.round(slides.offsetWidth / slides.children[0].clientWidth);
const numSlides = Math.ceil(slides.children.length / sliderWidth);
if (numSlides === 0) {
return;
}
const pageWidth = slides.offsetWidth;
let move = 0;
if (this.pageMarker === -1) {
this.pageMarker = numSlides - 1; // go to end
move = pageWidth * this.pageMarker;
slides.style.left = `-${move}px`;
}
else if (this.pageMarker >= numSlides) {
slides.style.left = '0px';
this.pageMarker = 0; // reset
}
else {
move = pageWidth * this.pageMarker;
slides.style.left = `-${move}px`;
}
}
pageNext(slides) {
this.pageMarker++;
this.moveSlides(slides);
}
pagePrev(slides) {
this.pageMarker--;
this.moveSlides(slides);
}
}
VaProductsNavComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaProductsNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
VaProductsNavComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: VaProductsNavComponent, selector: "app-products-nav", inputs: { items: "items", hideItemsNav: "hideItemsNav" }, outputs: { itemSelected: "itemSelected" }, ngImport: i0, template: "<p *ngIf=\"items?.length > 1\" class=\"item-amount\">\n {{\n 'FRONTEND.STORE.CONTAINS_NUM_ITEMS' | translate: { itemCount: items.length }\n }}\n</p>\n<div class=\"wrapper\">\n <nav\n *ngIf=\"items && !hideItemsNav\"\n (swipeleft)=\"pageNext(slides)\"\n (swiperight)=\"pagePrev(slides)\"\n >\n <div [ngClass]=\"{ 'hide-arrows': items && items.length < 5 }\">\n <span class=\"prev\" (click)=\"pagePrev(slides)\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </span>\n <span class=\"next\" (click)=\"pageNext(slides)\">\n <mat-icon>keyboard_arrow_right</mat-icon>\n </span>\n </div>\n <ul class=\"slides\" #slides>\n <li *ngFor=\"let item of items; index as i\" (click)=\"onItemSelected(i)\">\n <a [ngClass]=\"{ active: i === selectedIndex }\">\n <span class=\"icon-area\">\n <va-icon\n [iconUrl]=\"item.icon || item.iconUrl\"\n [name]=\"item.name || item.title\"\n [diameter]=\"80\"\n ></va-icon>\n <va-icon\n *ngIf=\"item.addonId\"\n class=\"addon-indicator\"\n [iconUrl]=\"item.productIcon\"\n [name]=\"item.productName\"\n [diameter]=\"24\"\n ></va-icon>\n </span>\n <p>{{ item.name || item.title }}</p>\n <div *ngIf=\"item.addonId\">\n <span class=\"requires-text\">\n {{ 'FRONTEND.STORE.REQUIRES' | translate }}\n </span>\n <span>{{ item.productName }}</span>\n </div>\n </a>\n </li>\n </ul>\n </nav>\n</div>\n", styles: ["nav{position:relative;width:350px;margin:0 auto;background:#ffffff;border:1px solid #e0e0e0;border-width:1px 0;overflow:hidden}nav ul{display:flex;flex-wrap:nowrap;list-style:none;margin:0 50px;padding:0;position:relative;left:0;transition:.3s left ease;word-break:break-word}nav li{min-width:100%;flex:1 0 25%;text-align:center;font-size:14px}nav li:first-child a{border-right:1px solid #e0e0e0}nav a{position:relative;display:block;height:100%;padding:20px;text-decoration:none;color:#212121;transition:.3s background;align-items:center;border-right:1px solid #e0e0e0;cursor:pointer}nav a:hover{background-color:rgba(255,255,255,.6)}nav a.active{background-color:#fff}nav a.active:after{content:\"\";display:block;position:absolute;bottom:-1px;left:0;width:100%;height:1px;background-color:#fff}nav p{margin-bottom:0}nav .icon img{width:80px;min-width:80px;height:80px}nav .prev,nav .next{position:absolute;height:100%;width:50px;top:0;background:rgba(33,33,33,.1);cursor:pointer;text-align:center;opacity:1;transition:.3s opacity ease;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1}nav .prev:not(.disabled):hover,nav .next:not(.disabled):hover{background:rgba(33,33,33,.3)}nav .prev{left:0}nav .next{right:0}nav .disabled{cursor:default;opacity:0}@media screen and (min-width: 600px){nav{width:auto;overflow:visible;overflow:initial}nav li{min-width:0;width:25%;flex-grow:0}}@media screen and (min-width: 600px){nav .hide-arrows{display:none}nav .hide-arrows+.slides{margin:0}}va-icon{display:inline-block}.item-amount{color:#9e9e9e;font-size:14px;text-align:right;margin:0 24px 8px}.wrapper{overflow:hidden}.requires-text{color:#9e9e9e}.icon-area{position:relative;display:inline-block}.addon-indicator{position:absolute;border:2px solid #ffffff;border-radius:50%;bottom:-2px;right:-2px}\n"], components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.IconComponent, selector: "va-icon", inputs: ["iconUrl", "name", "diameter", "backgroundColor", "borderColor", "fontColor"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i4.TranslatePipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaProductsNavComponent, decorators: [{
type: Component,
args: [{ selector: 'app-products-nav', template: "<p *ngIf=\"items?.length > 1\" class=\"item-amount\">\n {{\n 'FRONTEND.STORE.CONTAINS_NUM_ITEMS' | translate: { itemCount: items.length }\n }}\n</p>\n<div class=\"wrapper\">\n <nav\n *ngIf=\"items && !hideItemsNav\"\n (swipeleft)=\"pageNext(slides)\"\n (swiperight)=\"pagePrev(slides)\"\n >\n <div [ngClass]=\"{ 'hide-arrows': items && items.length < 5 }\">\n <span class=\"prev\" (click)=\"pagePrev(slides)\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </span>\n <span class=\"next\" (click)=\"pageNext(slides)\">\n <mat-icon>keyboard_arrow_right</mat-icon>\n </span>\n </div>\n <ul class=\"slides\" #slides>\n <li *ngFor=\"let item of items; index as i\" (click)=\"onItemSelected(i)\">\n <a [ngClass]=\"{ active: i === selectedIndex }\">\n <span class=\"icon-area\">\n <va-icon\n [iconUrl]=\"item.icon || item.iconUrl\"\n [name]=\"item.name || item.title\"\n [diameter]=\"80\"\n ></va-icon>\n <va-icon\n *ngIf=\"item.addonId\"\n class=\"addon-indicator\"\n [iconUrl]=\"item.productIcon\"\n [name]=\"item.productName\"\n [diameter]=\"24\"\n ></va-icon>\n </span>\n <p>{{ item.name || item.title }}</p>\n <div *ngIf=\"item.addonId\">\n <span class=\"requires-text\">\n {{ 'FRONTEND.STORE.REQUIRES' | translate }}\n </span>\n <span>{{ item.productName }}</span>\n </div>\n </a>\n </li>\n </ul>\n </nav>\n</div>\n", styles: ["nav{position:relative;width:350px;margin:0 auto;background:#ffffff;border:1px solid #e0e0e0;border-width:1px 0;overflow:hidden}nav ul{display:flex;flex-wrap:nowrap;list-style:none;margin:0 50px;padding:0;position:relative;left:0;transition:.3s left ease;word-break:break-word}nav li{min-width:100%;flex:1 0 25%;text-align:center;font-size:14px}nav li:first-child a{border-right:1px solid #e0e0e0}nav a{position:relative;display:block;height:100%;padding:20px;text-decoration:none;color:#212121;transition:.3s background;align-items:center;border-right:1px solid #e0e0e0;cursor:pointer}nav a:hover{background-color:rgba(255,255,255,.6)}nav a.active{background-color:#fff}nav a.active:after{content:\"\";display:block;position:absolute;bottom:-1px;left:0;width:100%;height:1px;background-color:#fff}nav p{margin-bottom:0}nav .icon img{width:80px;min-width:80px;height:80px}nav .prev,nav .next{position:absolute;height:100%;width:50px;top:0;background:rgba(33,33,33,.1);cursor:pointer;text-align:center;opacity:1;transition:.3s opacity ease;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1}nav .prev:not(.disabled):hover,nav .next:not(.disabled):hover{background:rgba(33,33,33,.3)}nav .prev{left:0}nav .next{right:0}nav .disabled{cursor:default;opacity:0}@media screen and (min-width: 600px){nav{width:auto;overflow:visible;overflow:initial}nav li{min-width:0;width:25%;flex-grow:0}}@media screen and (min-width: 600px){nav .hide-arrows{display:none}nav .hide-arrows+.slides{margin:0}}va-icon{display:inline-block}.item-amount{color:#9e9e9e;font-size:14px;text-align:right;margin:0 24px 8px}.wrapper{overflow:hidden}.requires-text{color:#9e9e9e}.icon-area{position:relative;display:inline-block}.addon-indicator{position:absolute;border:2px solid #ffffff;border-radius:50%;bottom:-2px;right:-2px}\n"] }]
}], propDecorators: { items: [{
type: Input
}], hideItemsNav: [{
type: Input
}], itemSelected: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdHMtbmF2LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wcm9kdWN0cy1uYXYvcHJvZHVjdHMtbmF2LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wcm9kdWN0cy1uYXYvcHJvZHVjdHMtbmF2LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVN2RSxNQUFNLE9BQU8sc0JBQXNCO0lBTG5DO1FBUVksaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTVDLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxDQUFDLENBQUM7S0FzQ2hCO0lBcENDLGNBQWMsQ0FBQyxLQUFVO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBdUI7UUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQztRQUNsRSxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsT0FBTztTQUNSO1FBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFFYixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWTtZQUM3QyxJQUFJLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQztTQUNsQzthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUM5QjthQUFNO1lBQ0wsSUFBSSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQXVCO1FBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBdUI7UUFDOUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQzs7bUhBM0NVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDZKQ1RuQyx5bURBZ0RBOzJGRHZDYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usa0JBQWtCOzhCQUtuQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFkZG9uIH0gZnJvbSAnQHZlbmRhc3RhL2NvcmUvc2hhcmVkJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi9zaGFyZWQvcHJvZHVjdCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9kdWN0cy1uYXYnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdHMtbmF2LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvZHVjdHMtbmF2LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFZhUHJvZHVjdHNOYXZDb21wb25lbnQge1xuICBASW5wdXQoKSBpdGVtczogKEFkZG9uIHwgUHJvZHVjdClbXTtcbiAgQElucHV0KCkgaGlkZUl0ZW1zTmF2OiBib29sZWFuO1xuICBAT3V0cHV0KCkgaXRlbVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNlbGVjdGVkSW5kZXggPSAwO1xuICBwYWdlTWFya2VyID0gMDtcblxuICBvbkl0ZW1TZWxlY3RlZChpbmRleDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5pdGVtU2VsZWN0ZWQuZW1pdChpbmRleCk7XG4gIH1cblxuICBtb3ZlU2xpZGVzKHNsaWRlczogSFRNTEJvZHlFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2xpZGVyV2lkdGggPSBNYXRoLnJvdW5kKHNsaWRlcy5vZmZzZXRXaWR0aCAvIHNsaWRlcy5jaGlsZHJlblswXS5jbGllbnRXaWR0aCk7XG4gICAgY29uc3QgbnVtU2xpZGVzID0gTWF0aC5jZWlsKHNsaWRlcy5jaGlsZHJlbi5sZW5ndGggLyBzbGlkZXJXaWR0aCk7XG4gICAgaWYgKG51bVNsaWRlcyA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYWdlV2lkdGggPSBzbGlkZXMub2Zmc2V0V2lkdGg7XG4gICAgbGV0IG1vdmUgPSAwO1xuXG4gICAgaWYgKHRoaXMucGFnZU1hcmtlciA9PT0gLTEpIHtcbiAgICAgIHRoaXMucGFnZU1hcmtlciA9IG51bVNsaWRlcyAtIDE7IC8vIGdvIHRvIGVuZFxuICAgICAgbW92ZSA9IHBhZ2VXaWR0aCAqIHRoaXMucGFnZU1hcmtlcjtcbiAgICAgIHNsaWRlcy5zdHlsZS5sZWZ0ID0gYC0ke21vdmV9cHhgO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYWdlTWFya2VyID49IG51bVNsaWRlcykge1xuICAgICAgc2xpZGVzLnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICAgIHRoaXMucGFnZU1hcmtlciA9IDA7IC8vIHJlc2V0XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdmUgPSBwYWdlV2lkdGggKiB0aGlzLnBhZ2VNYXJrZXI7XG4gICAgICBzbGlkZXMuc3R5bGUubGVmdCA9IGAtJHttb3ZlfXB4YDtcbiAgICB9XG4gIH1cblxuICBwYWdlTmV4dChzbGlkZXM6IEhUTUxCb2R5RWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGFnZU1hcmtlcisrO1xuICAgIHRoaXMubW92ZVNsaWRlcyhzbGlkZXMpO1xuICB9XG5cbiAgcGFnZVByZXYoc2xpZGVzOiBIVE1MQm9keUVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VNYXJrZXItLTtcbiAgICB0aGlzLm1vdmVTbGlkZXMoc2xpZGVzKTtcbiAgfVxufVxuIiwiPHAgKm5nSWY9XCJpdGVtcz8ubGVuZ3RoID4gMVwiIGNsYXNzPVwiaXRlbS1hbW91bnRcIj5cbiAge3tcbiAgICAnRlJPTlRFTkQuU1RPUkUuQ09OVEFJTlNfTlVNX0lURU1TJyB8IHRyYW5zbGF0ZTogeyBpdGVtQ291bnQ6IGl0ZW1zLmxlbmd0aCB9XG4gIH19XG48L3A+XG48ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICA8bmF2XG4gICAgKm5nSWY9XCJpdGVtcyAmJiAhaGlkZUl0ZW1zTmF2XCJcbiAgICAoc3dpcGVsZWZ0KT1cInBhZ2VOZXh0KHNsaWRlcylcIlxuICAgIChzd2lwZXJpZ2h0KT1cInBhZ2VQcmV2KHNsaWRlcylcIlxuICA+XG4gICAgPGRpdiBbbmdDbGFzc109XCJ7ICdoaWRlLWFycm93cyc6IGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA8IDUgfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwcmV2XCIgKGNsaWNrKT1cInBhZ2VQcmV2KHNsaWRlcylcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X2xlZnQ8L21hdC1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJuZXh0XCIgKGNsaWNrKT1cInBhZ2VOZXh0KHNsaWRlcylcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8dWwgY2xhc3M9XCJzbGlkZXNcIiAjc2xpZGVzPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpXCIgKGNsaWNrKT1cIm9uSXRlbVNlbGVjdGVkKGkpXCI+XG4gICAgICAgIDxhIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBpID09PSBzZWxlY3RlZEluZGV4IH1cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tYXJlYVwiPlxuICAgICAgICAgICAgPHZhLWljb25cbiAgICAgICAgICAgICAgW2ljb25VcmxdPVwiaXRlbS5pY29uIHx8IGl0ZW0uaWNvblVybFwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0ubmFtZSB8fCBpdGVtLnRpdGxlXCJcbiAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjgwXCJcbiAgICAgICAgICAgID48L3ZhLWljb24+XG4gICAgICAgICAgICA8dmEtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uYWRkb25JZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWRkb24taW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgW2ljb25VcmxdPVwiaXRlbS5wcm9kdWN0SWNvblwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0ucHJvZHVjdE5hbWVcIlxuICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMjRcIlxuICAgICAgICAgICAgPjwvdmEtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHA+e3sgaXRlbS5uYW1lIHx8IGl0ZW0udGl0bGUgfX08L3A+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uYWRkb25JZFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlcy10ZXh0XCI+XG4gICAgICAgICAgICAgIHt7ICdGUk9OVEVORC5TVE9SRS5SRVFVSVJFUycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ucHJvZHVjdE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgPC9uYXY+XG48L2Rpdj5cbiJdfQ==