UNPKG

@wizco/fenixds-ngx

Version:

Componentes fenix design system para Angular.

113 lines 25.4 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class PaginationComponent { /** * Evento que se emite quando se clica em um item da paginação */ changePage = new EventEmitter(); /** * Total de páginas * @default 0 * @type number */ totalPage = 0; /** * Página atual * @default 1 * @type number * */ currenPage = 1; /** * Modo de exibição da paginação * @default default * @type string */ mode = 'default'; /** * Verifica tamanho da tela para exibir modo simples */ ngAfterContentInit() { if (window.innerWidth < 768) { this.mode = 'simple'; } } /** * Retorna um array com os números das páginas e os pontos de suspensão */ pagination() { const current = this.currenPage; const last = this.totalPage; const delta = current >= 2 ? current >= 4 ? 1 : 2 : 3; const left = current - delta; const right = current + delta + 1; const range = []; const rangeWithDots = []; let l; for (let i = 1; i <= last; i++) { if (i === 1 || i === last || (i >= left && i < right)) { range.push(i); } } for (const i of range) { if (l) { if (i - l === 2) { rangeWithDots.push(l + 1); } else if (i - l !== 1) { rangeWithDots.push('...'); } else { // empty } } rangeWithDots.push(i); l = i; } return rangeWithDots; } /** * Seguir para a próxima página */ nextPage() { if (this.currenPage < this.totalPage) { this.currenPage += 1; this.changePage.emit(this.currenPage); } } /** * Voltar para a página anterior */ previousPage() { if (this.currenPage >= 2) { this.currenPage -= 1; this.changePage.emit(this.currenPage); } } /** * Ir para a página selecionada * @param i * @returns void */ out(i) { this.currenPage = parseInt(`${i}`, 10); console.log(i, this.currenPage); this.changePage.emit(i); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaginationComponent, isStandalone: true, selector: "wco-pagination", inputs: { totalPage: "totalPage", currenPage: "currenPage", mode: "mode" }, outputs: { changePage: "changePage" }, ngImport: i0, template: "<div class=\"pagination\"\n *ngIf=\"!!totalPage && totalPage >= 2\"\n ngClass=\"pagination-{{mode}}\"\n>\n\n <ng-container *ngIf=\"mode === 'simple'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button class=\"active\">{{currenPage}}</button>\n <span>/</span>\n <button>{{totalPage}}</button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"mode === 'default'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button *ngFor=\"let i of pagination()\" [ngClass]=\"{ \n active: currenPage === i,\n disable: i === '...'\n }\" (click)=\"out(i)\">\n {{ i }}\n </button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n</div>\n\n", styles: [".pagination{--wco-paginator-size: 32px;--wco-paginator-border-radius: var(--wco-radius-sm);--wco-paginator-color: var(--wco-color-primary-900);--wco-paginator-bg: transparent;display:flex;gap:var(--wco-spacing-nano);justify-content:center;align-items:center}.pagination.pagination-simple{gap:var(--wco-spacing-quark);--wco-paginator-size: 26px;--wco-paginator-padding: 0 var(--wco-spacing-quark)}.pagination.pagination-simple>span{color:var(--wco-color-neutral-500)}.pagination button{border:0px solid transparent;display:flex;justify-content:center;align-items:center;background-color:transparent;transition:all .2s ease-in-out;color:var(--wco-color-primary-900);min-width:var(--wco-paginator-size, 32px);min-height:var(--wco-paginator-size, 32px);border-radius:var(--wco-paginator-border-radius);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xs);font-weight:var(--wco-paginator-fontweight);letter-spacing:var(--wco-paginator-letterspacing);padding:var(--wco-paginator-padding, 0)}.pagination button:hover:not(.active){background-color:var(--wco-color-primary-50);color:var(--wco-color-primary-700);cursor:pointer}.pagination button:focus-within{outline:none;box-shadow:inset 0 0 0 2px var(--wco-color-primary-700)}.pagination button.last-button svg{transform:scale(-1)}.pagination button.disable{cursor:default;color:#999;pointer-events:none}.pagination button.disable svg path{fill:var(--wco-color-neutral-300)}.pagination .active{background-color:var(--wco-color-primary-600);color:var(--wco-color-neutral-50)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, decorators: [{ type: Component, args: [{ selector: 'wco-pagination', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"pagination\"\n *ngIf=\"!!totalPage && totalPage >= 2\"\n ngClass=\"pagination-{{mode}}\"\n>\n\n <ng-container *ngIf=\"mode === 'simple'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button class=\"active\">{{currenPage}}</button>\n <span>/</span>\n <button>{{totalPage}}</button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"mode === 'default'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button *ngFor=\"let i of pagination()\" [ngClass]=\"{ \n active: currenPage === i,\n disable: i === '...'\n }\" (click)=\"out(i)\">\n {{ i }}\n </button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n</div>\n\n", styles: [".pagination{--wco-paginator-size: 32px;--wco-paginator-border-radius: var(--wco-radius-sm);--wco-paginator-color: var(--wco-color-primary-900);--wco-paginator-bg: transparent;display:flex;gap:var(--wco-spacing-nano);justify-content:center;align-items:center}.pagination.pagination-simple{gap:var(--wco-spacing-quark);--wco-paginator-size: 26px;--wco-paginator-padding: 0 var(--wco-spacing-quark)}.pagination.pagination-simple>span{color:var(--wco-color-neutral-500)}.pagination button{border:0px solid transparent;display:flex;justify-content:center;align-items:center;background-color:transparent;transition:all .2s ease-in-out;color:var(--wco-color-primary-900);min-width:var(--wco-paginator-size, 32px);min-height:var(--wco-paginator-size, 32px);border-radius:var(--wco-paginator-border-radius);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xs);font-weight:var(--wco-paginator-fontweight);letter-spacing:var(--wco-paginator-letterspacing);padding:var(--wco-paginator-padding, 0)}.pagination button:hover:not(.active){background-color:var(--wco-color-primary-50);color:var(--wco-color-primary-700);cursor:pointer}.pagination button:focus-within{outline:none;box-shadow:inset 0 0 0 2px var(--wco-color-primary-700)}.pagination button.last-button svg{transform:scale(-1)}.pagination button.disable{cursor:default;color:#999;pointer-events:none}.pagination button.disable svg path{fill:var(--wco-color-neutral-300)}.pagination .active{background-color:var(--wco-color-primary-600);color:var(--wco-color-neutral-50)}\n"] }] }], propDecorators: { changePage: [{ type: Output }], totalPage: [{ type: Input }], currenPage: [{ type: Input }], mode: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7OztBQVV2QixNQUFNLE9BQU8sbUJBQW1CO0lBQzlCOztNQUVFO0lBRUssVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFdkM7Ozs7TUFJRTtJQUVLLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFHckI7Ozs7U0FJSztJQUVFLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFdEI7Ozs7TUFJRTtJQUVLLElBQUksR0FBeUIsU0FBUyxDQUFDO0lBSTlDOztNQUVFO0lBQ0Ysa0JBQWtCO1FBQ2hCLElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUdEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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JztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3djby1wYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAvKipcbiAgKiBFdmVudG8gcXVlIHNlIGVtaXRlIHF1YW5kbyBzZSBjbGljYSBlbSB1bSBpdGVtIGRhIHBhZ2luYcOnw6NvXG4gICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2hhbmdlUGFnZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgKiBUb3RhbCBkZSBww6FnaW5hc1xuICAqIEBkZWZhdWx0IDBcbiAgKiBAdHlwZSBudW1iZXJcbiAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRvdGFsUGFnZSA9IDA7XG5cblxuICAvKipcbiAgICogUMOhZ2luYSBhdHVhbFxuICAgKiBAZGVmYXVsdCAxXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY3VycmVuUGFnZSA9IDE7XG5cbiAgLyoqXG4gICAqICBNb2RvIGRlIGV4aWJpw6fDo28gZGEgcGFnaW5hw6fDo29cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG1vZGU6ICdkZWZhdWx0JyB8ICdzaW1wbGUnID0gJ2RlZmF1bHQnO1xuXG4gIFxuXG4gIC8qKlxuICAqIFZlcmlmaWNhIHRhbWFuaG8gZGEgdGVsYSBwYXJhIGV4aWJpciBtb2RvIHNpbXBsZXNcbiAgKi9cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDc2OCkge1xuICAgICAgdGhpcy5tb2RlID0gJ3NpbXBsZSc7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogUmV0b3JuYSB1bSBhcnJheSBjb20gb3MgbsO6bWVyb3MgZGFzIHDDoWdpbmFzIGUgb3MgcG9udG9zIGRlIHN1c3BlbnPDo29cbiAgICovXG4gIHB1YmxpYyBwYWdpbmF0aW9uKCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlblBhZ2U7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMudG90YWxQYWdlO1xuICAgIGNvbnN0IGRlbHRhID0gY3VycmVudCA+PSAyID8gY3VycmVudCA+PSA0ID8gMSA6IDIgOiAzO1xuICAgIGNvbnN0IGxlZnQgPSBjdXJyZW50IC0gZGVsdGE7XG4gICAgY29uc3QgcmlnaHQgPSBjdXJyZW50ICsgZGVsdGEgKyAxO1xuICAgIGNvbnN0IHJhbmdlID0gW107XG4gICAgY29uc3QgcmFuZ2VXaXRoRG90cyA9IFtdO1xuICAgIGxldCBsO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbGFzdDsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gMSB8fCBpID09PSBsYXN0IHx8IChpID49IGxlZnQgJiYgaSA8IHJpZ2h0KSkge1xuICAgICAgICByYW5nZS5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgaSBvZiByYW5nZSkge1xuICAgICAgaWYgKGwpIHtcbiAgICAgICAgaWYgKGkgLSBsID09PSAyKSB7XG4gICAgICAgICAgcmFuZ2VXaXRoRG90cy5wdXNoKGwgKyAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChpIC0gbCAhPT0gMSkge1xuICAgICAgICAgIHJhbmdlV2l0aERvdHMucHVzaCgnLi4uJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZW1wdHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmFuZ2VXaXRoRG90cy5wdXNoKGkpO1xuICAgICAgbCA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlV2l0aERvdHM7XG4gIH1cblxuICAvKipcbiAgKiBTZWd1aXIgcGFyYSBhIHByw7N4aW1hIHDDoWdpbmFcbiAgKi9cbiAgcHVibGljIG5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlblBhZ2UgPCB0aGlzLnRvdGFsUGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW5QYWdlICs9IDE7XG4gICAgICB0aGlzLmNoYW5nZVBhZ2UuZW1pdCh0aGlzLmN1cnJlblBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIFZvbHRhciBwYXJhIGEgcMOhZ2luYSBhbnRlcmlvclxuICAqL1xuICBwdWJsaWMgcHJldmlvdXNQYWdlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlblBhZ2UgPj0gMikge1xuICAgICAgdGhpcy5jdXJyZW5QYWdlIC09IDE7XG4gICAgICB0aGlzLmNoYW5nZVBhZ2UuZW1pdCh0aGlzLmN1cnJlblBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJciBwYXJhIGEgcMOhZ2luYSBzZWxlY2lvbmFkYVxuICAgKiBAcGFyYW0gaVxuICAgKiBAcmV0dXJucyB2b2lkXG4gICovXG4gIHB1YmxpYyBvdXQoaTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW5QYWdlID0gcGFyc2VJbnQoYCR7aX1gLCAxMCk7XG4gICAgY29uc29sZS5sb2coaSwgdGhpcy5jdXJyZW5QYWdlKTtcbiAgICB0aGlzLmNoYW5nZVBhZ2UuZW1pdChpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBhZ2luYXRpb25cIlxuICAqbmdJZj1cIiEhdG90YWxQYWdlICYmIHRvdGFsUGFnZSA+PSAyXCJcbiAgbmdDbGFzcz1cInBhZ2luYXRpb24te3ttb2RlfX1cIlxuPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAnc2ltcGxlJ1wiPlxuICAgIDxidXR0b24gKGNsaWNrKT1cInByZXZpb3VzUGFnZSgpXCIgW25nQ2xhc3NdPVwieyBkaXNhYmxlOiBjdXJyZW5QYWdlID09PSAxIH1cIiB0aXRsZT1cIlDDoWdpbmEgYW50ZXJpb3JcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTcuMDAwMDIgOS44NzQ5OEwzLjEyMDAyIDUuOTk0OThMNy4wMDAwMiAyLjExNDk4QzcuMzkwMDIgMS43MjQ5OCA3LjM5MDAyIDEuMDk0OTggNy4wMDAwMiAwLjcwNDk3NkM2LjYxMDAyIDAuMzE0OTc2IDUuOTgwMDIgMC4zMTQ5NzYgNS41OTAwMiAwLjcwNDk3NkwxLjAwMDAyIDUuMjk0OThDMC42MTAwMiA1LjY4NDk4IDAuNjEwMDIgNi4zMTQ5OCAxLjAwMDAyIDYuNzA0OThMNS41OTAwMiAxMS4yOTVDNS45ODAwMiAxMS42ODUgNi42MTAwMiAxMS42ODUgNy4wMDAwMiAxMS4yOTVDNy4zODAwMiAxMC45MDUgNy4zOTAwMiAxMC4yNjUgNy4wMDAwMiA5Ljg3NDk4WlwiXG4gICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImFjdGl2ZVwiPnt7Y3VycmVuUGFnZX19PC9idXR0b24+XG4gICAgPHNwYW4+Lzwvc3Bhbj5cbiAgICA8YnV0dG9uPnt7dG90YWxQYWdlfX08L2J1dHRvbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJuZXh0UGFnZSgpXCIgY2xhc3M9XCJsYXN0LWJ1dHRvblwiIFtuZ0NsYXNzXT1cInsgZGlzYWJsZTogY3VycmVuUGFnZSA9PT0gdG90YWxQYWdlIH1cIlxuICAgICAgdGl0bGU9XCJQcm94aW1hIFDDoWdpbmFcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTcuMDAwMDIgOS44NzQ5OEwzLjEyMDAyIDUuOTk0OThMNy4wMDAwMiAyLjExNDk4QzcuMzkwMDIgMS43MjQ5OCA3LjM5MDAyIDEuMDk0OTggNy4wMDAwMiAwLjcwNDk3NkM2LjYxMDAyIDAuMzE0OTc2IDUuOTgwMDIgMC4zMTQ5NzYgNS41OTAwMiAwLjcwNDk3NkwxLjAwMDAyIDUuMjk0OThDMC42MTAwMiA1LjY4NDk4IDAuNjEwMDIgNi4zMTQ5OCAxLjAwMDAyIDYuNzA0OThMNS41OTAwMiAxMS4yOTVDNS45ODAwMiAxMS42ODUgNi42MTAwMiAxMS42ODUgNy4wMDAwMiAxMS4yOTVDNy4zODAwMiAxMC45MDUgNy4zOTAwMiAxMC4yNjUgNy4wMDAwMiA5Ljg3NDk4WlwiXG4gICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gIDwvbmctY29udGFpbmVyPlxuXG5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ2RlZmF1bHQnXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJwcmV2aW91c1BhZ2UoKVwiIFtuZ0NsYXNzXT1cInsgZGlzYWJsZTogY3VycmVuUGFnZSA9PT0gMSB9XCIgdGl0bGU9XCJQw6FnaW5hIGFudGVyaW9yXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk03LjAwMDAyIDkuODc0OThMMy4xMjAwMiA1Ljk5NDk4TDcuMDAwMDIgMi4xMTQ5OEM3LjM5MDAyIDEuNzI0OTggNy4zOTAwMiAxLjA5NDk4IDcuMDAwMDIgMC43MDQ5NzZDNi42MTAwMiAwLjMxNDk3NiA1Ljk4MDAyIDAuMzE0OTc2IDUuNTkwMDIgMC43MDQ5NzZMMS4wMDAwMiA1LjI5NDk4QzAuNjEwMDIgNS42ODQ5OCAwLjYxMDAyIDYuMzE0OTggMS4wMDAwMiA2LjcwNDk4TDUuNTkwMDIgMTEuMjk1QzUuOTgwMDIgMTEuNjg1IDYuNjEwMDIgMTEuNjg1IDcuMDAwMDIgMTEuMjk1QzcuMzgwMDIgMTAuOTA1IDcuMzkwMDIgMTAuMjY1IDcuMDAwMDIgOS44NzQ5OFpcIlxuICAgICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgaSBvZiBwYWdpbmF0aW9uKClcIiBbbmdDbGFzc109XCJ7IFxuICAgICAgICAgICAgYWN0aXZlOiBjdXJyZW5QYWdlID09PSBpLFxuICAgICAgICAgICAgZGlzYWJsZTogaSA9PT0gJy4uLidcbiAgICAgICAgICB9XCIgKGNsaWNrKT1cIm91dChpKVwiPlxuICAgICAgICB7eyBpIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5leHRQYWdlKClcIiBjbGFzcz1cImxhc3QtYnV0dG9uXCIgW25nQ2xhc3NdPVwieyBkaXNhYmxlOiBjdXJyZW5QYWdlID09PSB0b3RhbFBhZ2UgfVwiXG4gICAgICAgIHRpdGxlPVwiUHJveGltYSBQw6FnaW5hXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk03LjAwMDAyIDkuODc0OThMMy4xMjAwMiA1Ljk5NDk4TDcuMDAwMDIgMi4xMTQ5OEM3LjM5MDAyIDEuNzI0OTggNy4zOTAwMiAxLjA5NDk4IDcuMDAwMDIgMC43MDQ5NzZDNi42MTAwMiAwLjMxNDk3NiA1Ljk4MDAyIDAuMzE0OTc2IDUuNTkwMDIgMC43MDQ5NzZMMS4wMDAwMiA1LjI5NDk4QzAuNjEwMDIgNS42ODQ5OCAwLjYxMDAyIDYuMzE0OTggMS4wMDAwMiA2LjcwNDk4TDUuNTkwMDIgMTEuMjk1QzUuOTgwMDIgMTEuNjg1IDYuNjEwMDIgMTEuNjg1IDcuMDAwMDIgMTEuMjk1QzcuMzgwMDIgMTAuOTA1IDcuMzkwMDIgMTAuMjY1IDcuMDAwMDIgOS44NzQ5OFpcIlxuICAgICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj5cblxuXG5cbjwvZGl2PlxuXG4iXX0=