ngx-obelisco-example
Version:
Componentes funcionales y reutilizables para Angular.
40 lines • 26.7 kB
JavaScript
import { Component, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/router";
export class OAccessListComponent {
constructor() {
this.customClasses = '';
this.accessList = [];
this.accessCategoryList = [];
}
ngOnChanges() {
if (this.items && this.items.children) {
this.items.children.forEach((child) => {
if (this.isAccess(child)) {
this.accessList.push(child);
}
else if (this.isAccessCategory(child)) {
this.accessCategoryList.push(child);
}
});
}
}
isAccess(item) {
return item.hasOwnProperty('link') || item.hasOwnProperty('route');
}
isAccessCategory(item) {
return item.hasOwnProperty('title') && item.hasOwnProperty('children');
}
}
OAccessListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OAccessListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
OAccessListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OAccessListComponent, selector: "o-access-list", inputs: { items: "items", customClasses: "customClasses" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"list-group\" [ngClass]=\"customClasses\">\r\n <div class=\"group-access\">\r\n <div class=\"card-access\">\r\n <!-- Header -->\r\n <div\r\n class=\"card-access-body\"\r\n [ngClass]=\"{\r\n reverse: items.header!.iconPositionLeft\r\n }\"\r\n >\r\n <div>\r\n <h4 class=\"mb-1\">{{ items.header!.title }}</h4>\r\n <p *ngIf=\"items.header!.description\" class=\"mb-0\">{{ items.header!.description }}</p>\r\n </div>\r\n <ng-container *ngIf=\"items.header!.icon\">\r\n <i\r\n *ngIf=\"items.header!.icon.includes('bx'); else materialIcon\"\r\n class=\"card-access-icon {{ items.header!.icon }}\"\r\n ></i>\r\n <ng-template #materialIcon>\r\n <span class=\"card-access-icon material-icons-round\" aria-hidden=\"true\">{{ items.header!.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n <span *ngIf=\"items.header!.iconText\" class=\"card-access-icon descriptive\">{{ items.header!.iconText }}</span>\r\n </div>\r\n <hr class=\"clearfix\" *ngIf=\"items.children\" />\r\n <!-- Items simples -->\r\n <div class=\"container-access\" *ngIf=\"accessList.length > 0\">\r\n <div class=\"access-option\">\r\n <ng-container *ngFor=\"let itemList of accessList\">\r\n <a [routerLink]=\"itemList.route\" class=\"list-group-item item-sm\">\r\n <ng-container *ngIf=\"itemList.icon\">\r\n <i *ngIf=\"itemList.icon.includes('bx'); else materialIcon\" class=\"{{ itemList.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ itemList.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"access-content\">\r\n <span class=\"access-title\">{{ itemList.title }}</span>\r\n <p *ngIf=\"itemList.description\" class=\"access-text\">{{ itemList.description }}</p>\r\n </div>\r\n </a>\r\n </ng-container>\r\n <ng-container *ngFor=\"let itemList of accessList\">\r\n <a *ngIf=\"itemList.link\" [href]=\"itemList.link\" class=\"list-group-item item-sm\">\r\n <ng-container *ngIf=\"itemList.icon\">\r\n <i *ngIf=\"itemList.icon.includes('bx'); else materialIcon\" class=\"{{ itemList.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ itemList.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"access-content\">\r\n <span class=\"access-title\">{{ itemList.title }}</span>\r\n <p *ngIf=\"itemList.description\" class=\"access-text\">{{ itemList.description }}</p>\r\n </div>\r\n </a>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- Items con categorias -->\r\n <div class=\"container-access\" *ngIf=\"accessCategoryList.length > 0\">\r\n <div class=\"access-option\" *ngFor=\"let itemCategory of accessCategoryList; let i = index\">\r\n <h5 class=\"title-option\">{{ itemCategory.title }}</h5>\r\n <ng-container *ngFor=\"let accessItem of itemCategory.children\">\r\n <a *ngIf=\"accessItem.route\" class=\"list-group-item item-sm\" [routerLink]=\"accessItem.route\">\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"accessItem.icon\">\r\n <i *ngIf=\"accessItem.icon.includes('bx'); else materialIcon\" class=\"{{ accessItem.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ accessItem.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ accessItem.title }}\r\n </span>\r\n </a>\r\n <a *ngIf=\"accessItem.link\" class=\"list-group-item item-sm\" [href]=\"accessItem.link\">\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"accessItem.icon\">\r\n <i *ngIf=\"accessItem.icon.includes('bx'); else materialIcon\" class=\"{{ accessItem.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ accessItem.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ accessItem.title }}\r\n </span>\r\n </a>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <hr *ngIf=\"items.footer\" class=\"clearfix\" />\r\n <!-- Footer -->\r\n <a\r\n *ngIf=\"items.footer && items.footer!.route\"\r\n [routerLink]=\"items.footer!.route\"\r\n class=\"list-group-item card-item\"\r\n >\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"items.footer!.icon\">\r\n <i *ngIf=\"items.footer!.icon.includes('bx'); else materialIcon\" class=\"{{ items.footer!.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ items.footer!.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ items.footer!.title }}\r\n </span>\r\n </a>\r\n <a *ngIf=\"items.footer && items.footer!.link\" [href]=\"items.footer!.link\" class=\"list-group-item card-item\">\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"items.footer!.icon\">\r\n <i *ngIf=\"items.footer!.icon.includes('bx'); else materialIcon\" class=\"{{ items.footer!.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ items.footer!.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ items.footer!.title }}\r\n </span>\r\n </a>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["::ng-deep .card-access:has(.container-access) .card-item:not(:hover){box-shadow:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OAccessListComponent, decorators: [{
type: Component,
args: [{ selector: 'o-access-list', template: "<div class=\"list-group\" [ngClass]=\"customClasses\">\r\n <div class=\"group-access\">\r\n <div class=\"card-access\">\r\n <!-- Header -->\r\n <div\r\n class=\"card-access-body\"\r\n [ngClass]=\"{\r\n reverse: items.header!.iconPositionLeft\r\n }\"\r\n >\r\n <div>\r\n <h4 class=\"mb-1\">{{ items.header!.title }}</h4>\r\n <p *ngIf=\"items.header!.description\" class=\"mb-0\">{{ items.header!.description }}</p>\r\n </div>\r\n <ng-container *ngIf=\"items.header!.icon\">\r\n <i\r\n *ngIf=\"items.header!.icon.includes('bx'); else materialIcon\"\r\n class=\"card-access-icon {{ items.header!.icon }}\"\r\n ></i>\r\n <ng-template #materialIcon>\r\n <span class=\"card-access-icon material-icons-round\" aria-hidden=\"true\">{{ items.header!.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n <span *ngIf=\"items.header!.iconText\" class=\"card-access-icon descriptive\">{{ items.header!.iconText }}</span>\r\n </div>\r\n <hr class=\"clearfix\" *ngIf=\"items.children\" />\r\n <!-- Items simples -->\r\n <div class=\"container-access\" *ngIf=\"accessList.length > 0\">\r\n <div class=\"access-option\">\r\n <ng-container *ngFor=\"let itemList of accessList\">\r\n <a [routerLink]=\"itemList.route\" class=\"list-group-item item-sm\">\r\n <ng-container *ngIf=\"itemList.icon\">\r\n <i *ngIf=\"itemList.icon.includes('bx'); else materialIcon\" class=\"{{ itemList.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ itemList.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"access-content\">\r\n <span class=\"access-title\">{{ itemList.title }}</span>\r\n <p *ngIf=\"itemList.description\" class=\"access-text\">{{ itemList.description }}</p>\r\n </div>\r\n </a>\r\n </ng-container>\r\n <ng-container *ngFor=\"let itemList of accessList\">\r\n <a *ngIf=\"itemList.link\" [href]=\"itemList.link\" class=\"list-group-item item-sm\">\r\n <ng-container *ngIf=\"itemList.icon\">\r\n <i *ngIf=\"itemList.icon.includes('bx'); else materialIcon\" class=\"{{ itemList.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ itemList.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n <div class=\"access-content\">\r\n <span class=\"access-title\">{{ itemList.title }}</span>\r\n <p *ngIf=\"itemList.description\" class=\"access-text\">{{ itemList.description }}</p>\r\n </div>\r\n </a>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- Items con categorias -->\r\n <div class=\"container-access\" *ngIf=\"accessCategoryList.length > 0\">\r\n <div class=\"access-option\" *ngFor=\"let itemCategory of accessCategoryList; let i = index\">\r\n <h5 class=\"title-option\">{{ itemCategory.title }}</h5>\r\n <ng-container *ngFor=\"let accessItem of itemCategory.children\">\r\n <a *ngIf=\"accessItem.route\" class=\"list-group-item item-sm\" [routerLink]=\"accessItem.route\">\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"accessItem.icon\">\r\n <i *ngIf=\"accessItem.icon.includes('bx'); else materialIcon\" class=\"{{ accessItem.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ accessItem.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ accessItem.title }}\r\n </span>\r\n </a>\r\n <a *ngIf=\"accessItem.link\" class=\"list-group-item item-sm\" [href]=\"accessItem.link\">\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"accessItem.icon\">\r\n <i *ngIf=\"accessItem.icon.includes('bx'); else materialIcon\" class=\"{{ accessItem.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ accessItem.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ accessItem.title }}\r\n </span>\r\n </a>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <hr *ngIf=\"items.footer\" class=\"clearfix\" />\r\n <!-- Footer -->\r\n <a\r\n *ngIf=\"items.footer && items.footer!.route\"\r\n [routerLink]=\"items.footer!.route\"\r\n class=\"list-group-item card-item\"\r\n >\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"items.footer!.icon\">\r\n <i *ngIf=\"items.footer!.icon.includes('bx'); else materialIcon\" class=\"{{ items.footer!.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ items.footer!.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ items.footer!.title }}\r\n </span>\r\n </a>\r\n <a *ngIf=\"items.footer && items.footer!.link\" [href]=\"items.footer!.link\" class=\"list-group-item card-item\">\r\n <span class=\"access-title\">\r\n <ng-container *ngIf=\"items.footer!.icon\">\r\n <i *ngIf=\"items.footer!.icon.includes('bx'); else materialIcon\" class=\"{{ items.footer!.icon }}\"></i>\r\n <ng-template #materialIcon>\r\n <span class=\"material-icons-round\" aria-hidden=\"true\">{{ items.footer!.icon }}</span>\r\n </ng-template>\r\n </ng-container>\r\n {{ items.footer!.title }}\r\n </span>\r\n </a>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["::ng-deep .card-access:has(.container-access) .card-item:not(:hover){box-shadow:none}\n"] }]
}], propDecorators: { items: [{
type: Input
}], customClasses: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1hY2Nlc3MtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2JlbGlzY28vYWNjZXNzL28tYWNjZXNzLWxpc3Qvby1hY2Nlc3MtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2JlbGlzY28vYWNjZXNzL28tYWNjZXNzLWxpc3Qvby1hY2Nlc3MtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQzs7OztBQVE1RCxNQUFNLE9BQU8sb0JBQW9CO0lBTGpDO1FBT2tCLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsdUJBQWtCLEdBQXFCLEVBQUUsQ0FBQztLQXFCbEQ7SUFuQkMsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFlLENBQUMsQ0FBQztpQkFDdkM7cUJBQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBdUIsQ0FBQyxDQUFDO2lCQUN2RDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU8sUUFBUSxDQUFDLElBQVM7UUFDeEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQVM7UUFDaEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekUsQ0FBQzs7aUhBekJVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLHNJQ1JqQyw0a01Bd0hBOzJGRGhIYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsZUFBZTs4QkFLVCxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWNjZXNzLCBBY2Nlc3NDYXRlZ29yeSwgQWNjZXNzTGlzdCB9IGZyb20gJ25neC1vYmVsaXNjby1leGFtcGxlL2NvcmUvbW9kZWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnby1hY2Nlc3MtbGlzdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL28tYWNjZXNzLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL28tYWNjZXNzLWxpc3QuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgT0FjY2Vzc0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpdGVtcyE6IEFjY2Vzc0xpc3Q7XHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbUNsYXNzZXM6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwdWJsaWMgYWNjZXNzTGlzdDogQWNjZXNzW10gPSBbXTtcclxuICBwdWJsaWMgYWNjZXNzQ2F0ZWdvcnlMaXN0OiBBY2Nlc3NDYXRlZ29yeVtdID0gW107XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5jaGlsZHJlbikge1xyXG4gICAgICB0aGlzLml0ZW1zLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBY2Nlc3MoY2hpbGQpKSB7XHJcbiAgICAgICAgICB0aGlzLmFjY2Vzc0xpc3QucHVzaChjaGlsZCBhcyBBY2Nlc3MpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0FjY2Vzc0NhdGVnb3J5KGNoaWxkKSkge1xyXG4gICAgICAgICAgdGhpcy5hY2Nlc3NDYXRlZ29yeUxpc3QucHVzaChjaGlsZCBhcyBBY2Nlc3NDYXRlZ29yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNBY2Nlc3MoaXRlbTogYW55KTogaXRlbSBpcyBBY2Nlc3Mge1xyXG4gICAgcmV0dXJuIGl0ZW0uaGFzT3duUHJvcGVydHkoJ2xpbmsnKSB8fCBpdGVtLmhhc093blByb3BlcnR5KCdyb3V0ZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0FjY2Vzc0NhdGVnb3J5KGl0ZW06IGFueSk6IGl0ZW0gaXMgQWNjZXNzQ2F0ZWdvcnkge1xyXG4gICAgcmV0dXJuIGl0ZW0uaGFzT3duUHJvcGVydHkoJ3RpdGxlJykgJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnY2hpbGRyZW4nKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXBcIiBbbmdDbGFzc109XCJjdXN0b21DbGFzc2VzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImdyb3VwLWFjY2Vzc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYWNjZXNzXCI+XHJcbiAgICAgIDwhLS0gSGVhZGVyIC0tPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJjYXJkLWFjY2Vzcy1ib2R5XCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICByZXZlcnNlOiBpdGVtcy5oZWFkZXIhLmljb25Qb3NpdGlvbkxlZnRcclxuICAgICAgICB9XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0xXCI+e3sgaXRlbXMuaGVhZGVyIS50aXRsZSB9fTwvaDQ+XHJcbiAgICAgICAgICA8cCAqbmdJZj1cIml0ZW1zLmhlYWRlciEuZGVzY3JpcHRpb25cIiBjbGFzcz1cIm1iLTBcIj57eyBpdGVtcy5oZWFkZXIhLmRlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtcy5oZWFkZXIhLmljb25cIj5cclxuICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbXMuaGVhZGVyIS5pY29uLmluY2x1ZGVzKCdieCcpOyBlbHNlIG1hdGVyaWFsSWNvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1hY2Nlc3MtaWNvbiB7eyBpdGVtcy5oZWFkZXIhLmljb24gfX1cIlxyXG4gICAgICAgICAgPjwvaT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWF0ZXJpYWxJY29uPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtYWNjZXNzLWljb24gbWF0ZXJpYWwtaWNvbnMtcm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBpdGVtcy5oZWFkZXIhLmljb24gfX08L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbXMuaGVhZGVyIS5pY29uVGV4dFwiIGNsYXNzPVwiY2FyZC1hY2Nlc3MtaWNvbiBkZXNjcmlwdGl2ZVwiPnt7IGl0ZW1zLmhlYWRlciEuaWNvblRleHQgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8aHIgY2xhc3M9XCJjbGVhcmZpeFwiICpuZ0lmPVwiaXRlbXMuY2hpbGRyZW5cIiAvPlxyXG4gICAgICA8IS0tIEl0ZW1zIHNpbXBsZXMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItYWNjZXNzXCIgKm5nSWY9XCJhY2Nlc3NMaXN0Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLW9wdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbUxpc3Qgb2YgYWNjZXNzTGlzdFwiPlxyXG4gICAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJpdGVtTGlzdC5yb3V0ZVwiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGl0ZW0tc21cIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbUxpc3QuaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtTGlzdC5pY29uLmluY2x1ZGVzKCdieCcpOyBlbHNlIG1hdGVyaWFsSWNvblwiIGNsYXNzPVwie3sgaXRlbUxpc3QuaWNvbiB9fVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWF0ZXJpYWxJY29uPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLXJvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgaXRlbUxpc3QuaWNvbiB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzcy10aXRsZVwiPnt7IGl0ZW1MaXN0LnRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtTGlzdC5kZXNjcmlwdGlvblwiIGNsYXNzPVwiYWNjZXNzLXRleHRcIj57eyBpdGVtTGlzdC5kZXNjcmlwdGlvbiB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtTGlzdCBvZiBhY2Nlc3NMaXN0XCI+XHJcbiAgICAgICAgICAgIDxhICpuZ0lmPVwiaXRlbUxpc3QubGlua1wiIFtocmVmXT1cIml0ZW1MaXN0LmxpbmtcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBpdGVtLXNtXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1MaXN0Lmljb25cIj5cclxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbUxpc3QuaWNvbi5pbmNsdWRlcygnYngnKTsgZWxzZSBtYXRlcmlhbEljb25cIiBjbGFzcz1cInt7IGl0ZW1MaXN0Lmljb24gfX1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21hdGVyaWFsSWNvbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1yb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGl0ZW1MaXN0Lmljb24gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtdGl0bGVcIj57eyBpdGVtTGlzdC50aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbUxpc3QuZGVzY3JpcHRpb25cIiBjbGFzcz1cImFjY2Vzcy10ZXh0XCI+e3sgaXRlbUxpc3QuZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSBJdGVtcyBjb24gY2F0ZWdvcmlhcyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1hY2Nlc3NcIiAqbmdJZj1cImFjY2Vzc0NhdGVnb3J5TGlzdC5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1vcHRpb25cIiAqbmdGb3I9XCJsZXQgaXRlbUNhdGVnb3J5IG9mIGFjY2Vzc0NhdGVnb3J5TGlzdDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgPGg1IGNsYXNzPVwidGl0bGUtb3B0aW9uXCI+e3sgaXRlbUNhdGVnb3J5LnRpdGxlIH19PC9oNT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjY2Vzc0l0ZW0gb2YgaXRlbUNhdGVnb3J5LmNoaWxkcmVuXCI+XHJcbiAgICAgICAgICAgIDxhICpuZ0lmPVwiYWNjZXNzSXRlbS5yb3V0ZVwiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGl0ZW0tc21cIiBbcm91dGVyTGlua109XCJhY2Nlc3NJdGVtLnJvdXRlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY2Nlc3NJdGVtLmljb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJhY2Nlc3NJdGVtLmljb24uaW5jbHVkZXMoJ2J4Jyk7IGVsc2UgbWF0ZXJpYWxJY29uXCIgY2xhc3M9XCJ7eyBhY2Nlc3NJdGVtLmljb24gfX1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWF0ZXJpYWxJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBhY2Nlc3NJdGVtLmljb24gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIHt7IGFjY2Vzc0l0ZW0udGl0bGUgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPGEgKm5nSWY9XCJhY2Nlc3NJdGVtLmxpbmtcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBpdGVtLXNtXCIgW2hyZWZdPVwiYWNjZXNzSXRlbS5saW5rXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY2Nlc3NJdGVtLmljb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJhY2Nlc3NJdGVtLmljb24uaW5jbHVkZXMoJ2J4Jyk7IGVsc2UgbWF0ZXJpYWxJY29uXCIgY2xhc3M9XCJ7eyBhY2Nlc3NJdGVtLmljb24gfX1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWF0ZXJpYWxJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBhY2Nlc3NJdGVtLmljb24gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIHt7IGFjY2Vzc0l0ZW0udGl0bGUgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGhyICpuZ0lmPVwiaXRlbXMuZm9vdGVyXCIgY2xhc3M9XCJjbGVhcmZpeFwiIC8+XHJcbiAgICAgIDwhLS0gRm9vdGVyIC0tPlxyXG4gICAgICA8YVxyXG4gICAgICAgICpuZ0lmPVwiaXRlbXMuZm9vdGVyICYmIGl0ZW1zLmZvb3RlciEucm91dGVcIlxyXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW1zLmZvb3RlciEucm91dGVcIlxyXG4gICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGNhcmQtaXRlbVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzcy10aXRsZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1zLmZvb3RlciEuaWNvblwiPlxyXG4gICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW1zLmZvb3RlciEuaWNvbi5pbmNsdWRlcygnYngnKTsgZWxzZSBtYXRlcmlhbEljb25cIiBjbGFzcz1cInt7IGl0ZW1zLmZvb3RlciEuaWNvbiB9fVwiPjwvaT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtYXRlcmlhbEljb24+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1yb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGl0ZW1zLmZvb3RlciEuaWNvbiB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAge3sgaXRlbXMuZm9vdGVyIS50aXRsZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9hPlxyXG4gICAgICA8YSAqbmdJZj1cIml0ZW1zLmZvb3RlciAmJiBpdGVtcy5mb290ZXIhLmxpbmtcIiBbaHJlZl09XCJpdGVtcy5mb290ZXIhLmxpbmtcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBjYXJkLWl0ZW1cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzcy10aXRsZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1zLmZvb3RlciEuaWNvblwiPlxyXG4gICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW1zLmZvb3RlciEuaWNvbi5pbmNsdWRlcygnYngnKTsgZWxzZSBtYXRlcmlhbEljb25cIiBjbGFzcz1cInt7IGl0ZW1zLmZvb3RlciEuaWNvbiB9fVwiPjwvaT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtYXRlcmlhbEljb24+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1yb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGl0ZW1zLmZvb3RlciEuaWNvbiB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAge3sgaXRlbXMuZm9vdGVyIS50aXRsZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=