UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

101 lines 23.6 kB
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { calcPages } from './pagination-calc'; import * as i0 from "@angular/core"; import * as i1 from "../../shared"; import * as i2 from "@angular/common"; import * as i3 from "./page-link.component"; export class DsfrPaginationComponent { /** @internal */ constructor(i18n) { this.i18n = i18n; /* Nombre de pages du composant. */ this.pageCount = 0; /* N° de la page active, démarre à : 1 */ this.currentPage = 1; /** @since 1.6 Affiche uniquement l'icône d'accès à la page précédement si vrai. */ this.previousOnly = false; /* Evènement de sélection d'une page, passe le n° de la page en paramètre. L'événement initial n'est pas propagé. */ this.pageSelect = new EventEmitter(); /** @deprecated @since 1.6 utiliser `pageSelect` à la place. */ this.pageSelectEvent = new EventEmitter(); /* Evènement page précédente. L'événement initial n'est pas propagé. */ this.backSelect = new EventEmitter(); /** @deprecated @since 1.6 utiliser `backSelect` à la place. */ this.backEvent = new EventEmitter(); /** @internal */ this.intervals = []; this.ariaLabel = i18n.t('pagination.ariaLabel'); } get prevNum() { return Math.max(1, this.currentPage - 1); } get nextNum() { return Math.min(this.currentPage + 1, this.pageCount); } ngOnChanges(changes) { //FIXME: RPA je me demande si la maj de this.intervals ne devrait pas être conditionnée à la détection de // changement sur les inputs currentPage / pageCount if (this.currentPage && this.pageCount) this.intervals = calcPages(this.currentPage, this.pageCount); } /** @internal */ onBack() { this.backSelect.emit(); this.backEvent.emit(); } /** @internal */ onPage(pageNum) { this.pageSelect.emit(pageNum); this.pageSelectEvent.emit(pageNum); } /** @internal */ previous() { if (!this.isFirstPage()) this.onPage(this.currentPage - 1); return this.currentPage; } next() { if (!this.isLastPage()) this.onPage(this.currentPage + 1); return this.currentPage; } /** @internal */ isFirstPage() { return this.pageCount === 0 || this.currentPage == 1; } /** @internal */ isLastPage() { return this.pageCount === 0 || this.currentPage == this.pageCount; } /** @internal */ pagesFrom(interval) { const firstPage = interval[0]; const lastPage = interval[1]; const count = lastPage - firstPage + 1; return Array(count) .fill(0) .map((e, i) => i + firstPage); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrPaginationComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrPaginationComponent, selector: "dsfr-pagination", inputs: { pageCount: "pageCount", currentPage: "currentPage", previousOnly: "previousOnly", ariaLabel: "ariaLabel" }, outputs: { pageSelect: "pageSelect", pageSelectEvent: "pageSelectEvent", backSelect: "backSelect", backEvent: "backEvent" }, usesOnChanges: true, ngImport: i0, template: "<!-- Page pr\u00E9c\u00E9dente seulement ---------------------------------------------------------------------------------------->\n\n<nav *ngIf=\"previousOnly\" class=\"fr-pagination\" [attr.role]=\"i18n.t('pagination.role')\" [attr.aria-label]=\"ariaLabel\">\n <ul class=\"fr-pagination__list\">\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n label=\"Page pr\u00E9c\u00E9dente\"\n (pageSelectEvent)=\"onBack()\"></edu-page-link>\n </ul>\n</nav>\n\n<!-- Pagination ------------------------------------------------------------------------------------------------------->\n\n<nav *ngIf=\"!previousOnly\" class=\"fr-pagination\" [attr.role]=\"i18n.t('pagination.role')\" [attr.aria-label]=\"ariaLabel\">\n <ul class=\"fr-pagination__list\">\n <!-- Premi\u00E8re page -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--first\"\n [label]=\"i18n.t('pagination.firstPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.firstPage')\"\n [num]=\"1\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Lien vers 'Page pr\u00E9c\u00E9dente' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n [label]=\"i18n.t('pagination.previousPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.previousPage')\"\n [num]=\"prevNum\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Toutes les pages -->\n <ng-container *ngFor=\"let interval of intervals\">\n <li *ngIf=\"interval[0] !== 1\">\n <edu-page-link customClass=\"fr-unhidden-lg\" label=\"\u2026\" [disabled]=\"true\"></edu-page-link>\n </li>\n <li *ngFor=\"let pageNum of pagesFrom(interval); let index = index\">\n <edu-page-link\n [num]=\"pageNum\"\n [label]=\"pageNum + ''\"\n [tooltipMessage]=\"'Page ' + pageNum\"\n [active]=\"pageNum === currentPage\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n </ng-container>\n\n <!-- Lien vers 'Page suivante' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--next fr-pagination__link--lg-label\"\n [label]=\"i18n.t('pagination.nextPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.nextPage')\"\n [num]=\"nextNum\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Derni\u00E8re page (non affich\u00E9e sur mobile) -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--last\"\n [label]=\"i18n.t('pagination.lastPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.lastPage')\"\n [num]=\"pageCount\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n </ul>\n</nav>\n", styles: ["@media (max-width: 36em){/*! media sm et xs */.fr-pagination__list{justify-content:space-between}}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.EduPageLinkComponent, selector: "edu-page-link", inputs: ["active", "customClass", "disabled", "label", "labelCustomClass", "num", "tooltipMessage"], outputs: ["pageSelectEvent"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrPaginationComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-pagination', encapsulation: ViewEncapsulation.None, template: "<!-- Page pr\u00E9c\u00E9dente seulement ---------------------------------------------------------------------------------------->\n\n<nav *ngIf=\"previousOnly\" class=\"fr-pagination\" [attr.role]=\"i18n.t('pagination.role')\" [attr.aria-label]=\"ariaLabel\">\n <ul class=\"fr-pagination__list\">\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n label=\"Page pr\u00E9c\u00E9dente\"\n (pageSelectEvent)=\"onBack()\"></edu-page-link>\n </ul>\n</nav>\n\n<!-- Pagination ------------------------------------------------------------------------------------------------------->\n\n<nav *ngIf=\"!previousOnly\" class=\"fr-pagination\" [attr.role]=\"i18n.t('pagination.role')\" [attr.aria-label]=\"ariaLabel\">\n <ul class=\"fr-pagination__list\">\n <!-- Premi\u00E8re page -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--first\"\n [label]=\"i18n.t('pagination.firstPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.firstPage')\"\n [num]=\"1\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Lien vers 'Page pr\u00E9c\u00E9dente' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n [label]=\"i18n.t('pagination.previousPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.previousPage')\"\n [num]=\"prevNum\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Toutes les pages -->\n <ng-container *ngFor=\"let interval of intervals\">\n <li *ngIf=\"interval[0] !== 1\">\n <edu-page-link customClass=\"fr-unhidden-lg\" label=\"\u2026\" [disabled]=\"true\"></edu-page-link>\n </li>\n <li *ngFor=\"let pageNum of pagesFrom(interval); let index = index\">\n <edu-page-link\n [num]=\"pageNum\"\n [label]=\"pageNum + ''\"\n [tooltipMessage]=\"'Page ' + pageNum\"\n [active]=\"pageNum === currentPage\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n </ng-container>\n\n <!-- Lien vers 'Page suivante' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--next fr-pagination__link--lg-label\"\n [label]=\"i18n.t('pagination.nextPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.nextPage')\"\n [num]=\"nextNum\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Derni\u00E8re page (non affich\u00E9e sur mobile) -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--last\"\n [label]=\"i18n.t('pagination.lastPage')\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"i18n.t('pagination.lastPage')\"\n [num]=\"pageCount\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n </ul>\n</nav>\n", styles: ["@media (max-width: 36em){/*! media sm et xs */.fr-pagination__list{justify-content:space-between}}\n"] }] }], ctorParameters: function () { return [{ type: i1.I18nService }]; }, propDecorators: { pageCount: [{ type: Input }], currentPage: [{ type: Input }], previousOnly: [{ type: Input }], ariaLabel: [{ type: Input }], pageSelect: [{ type: Output }], pageSelectEvent: [{ type: Output }], backSelect: [{ type: Output }], backEvent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBILE9BQU8sRUFBWSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFReEQsTUFBTSxPQUFPLHVCQUF1QjtJQTJCbEMsZ0JBQWdCO0lBQ2hCLFlBQW1CLElBQWlCO1FBQWpCLFNBQUksR0FBSixJQUFJLENBQWE7UUEzQnBDLG1DQUFtQztRQUMxQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLHlDQUF5QztRQUNoQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUV6QixtRkFBbUY7UUFDMUUsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFLOUIsb0hBQW9IO1FBQzFHLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWxELCtEQUErRDtRQUNyRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdkQsdUVBQXVFO1FBQzdELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRWhELCtEQUErRDtRQUNyRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUvQyxnQkFBZ0IsQ0FBQyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBSTFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFB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QVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBJbnRlcnZhbCwgY2FsY1BhZ2VzIH0gZnJvbSAnLi9wYWdpbmF0aW9uLWNhbGMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLXBhZ2luYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BhZ2luYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmclBhZ2luYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiBOb21icmUgZGUgcGFnZXMgZHUgY29tcG9zYW50LiAqL1xuICBASW5wdXQoKSBwYWdlQ291bnQgPSAwO1xuXG4gIC8qIE7CsCBkZSBsYSBwYWdlIGFjdGl2ZSwgZMOpbWFycmUgw6AgOiAxICovXG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlID0gMTtcblxuICAvKiogQHNpbmNlIDEuNiBBZmZpY2hlIHVuaXF1ZW1lbnQgbCdpY8O0bmUgZCdhY2PDqHMgw6AgbGEgcGFnZSBwcsOpY8OpZGVtZW50IHNpIHZyYWkuICovXG4gIEBJbnB1dCgpIHByZXZpb3VzT25seSA9IGZhbHNlO1xuXG4gIC8qKiBBdHRyaWJ1dCBhcmlhTGFiZWwgcGVybWV0dGFudCBkZSBjb250ZXh0dWFsaXNlciBsYSBwYWdpbmF0aW9uICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nO1xuXG4gIC8qIEV2w6huZW1lbnQgZGUgc8OpbGVjdGlvbiBkJ3VuZSBwYWdlLCBwYXNzZSBsZSBuwrAgZGUgbGEgcGFnZSBlbiBwYXJhbcOodHJlLiBMJ8OpdsOpbmVtZW50IGluaXRpYWwgbidlc3QgcGFzIHByb3BhZ8OpLiAqL1xuICBAT3V0cHV0KCkgcGFnZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBAZGVwcmVjYXRlZCBAc2luY2UgMS42IHV0aWxpc2VyIGBwYWdlU2VsZWN0YCDDoCBsYSBwbGFjZS4gKi9cbiAgQE91dHB1dCgpIHBhZ2VTZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qIEV2w6huZW1lbnQgcGFnZSBwcsOpY8OpZGVudGUuIEwnw6l2w6luZW1lbnQgaW5pdGlhbCBuJ2VzdCBwYXMgcHJvcGFnw6kuICovXG4gIEBPdXRwdXQoKSBiYWNrU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBAZGVwcmVjYXRlZCBAc2luY2UgMS42IHV0aWxpc2VyIGBiYWNrU2VsZWN0YCDDoCBsYSBwbGFjZS4gKi9cbiAgQE91dHB1dCgpIGJhY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogQGludGVybmFsICovIGludGVydmFsczogSW50ZXJ2YWxbXSA9IFtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IocHVibGljIGkxOG46IEkxOG5TZXJ2aWNlKSB7XG4gICAgdGhpcy5hcmlhTGFiZWwgPSBpMThuLnQoJ3BhZ2luYXRpb24uYXJpYUxhYmVsJyk7XG4gIH1cblxuICBnZXQgcHJldk51bSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgxLCB0aGlzLmN1cnJlbnRQYWdlIC0gMSk7XG4gIH1cblxuICBnZXQgbmV4dE51bSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmN1cnJlbnRQYWdlICsgMSwgdGhpcy5wYWdlQ291bnQpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vRklYTUU6IFJQQSBqZSBtZSBkZW1hbmRlIHNpIGxhIG1haiBkZSB0aGlzLmludGVydmFscyBuZSBkZXZyYWl0IHBhcyDDqnRyZSBjb25kaXRpb25uw6llIMOgIGxhIGTDqXRlY3Rpb24gZGVcbiAgICAvLyBjaGFuZ2VtZW50IHN1ciBsZXMgaW5wdXRzIGN1cnJlbnRQYWdlIC8gcGFnZUNvdW50XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgJiYgdGhpcy5wYWdlQ291bnQpIHRoaXMuaW50ZXJ2YWxzID0gY2FsY1BhZ2VzKHRoaXMuY3VycmVudFBhZ2UsIHRoaXMucGFnZUNvdW50KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb25CYWNrKCkge1xuICAgIHRoaXMuYmFja1NlbGVjdC5lbWl0KCk7XG4gICAgdGhpcy5iYWNrRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvblBhZ2UocGFnZU51bTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdlU2VsZWN0LmVtaXQocGFnZU51bSk7XG4gICAgdGhpcy5wYWdlU2VsZWN0RXZlbnQuZW1pdChwYWdlTnVtKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJldmlvdXMoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNGaXJzdFBhZ2UoKSkgdGhpcy5vblBhZ2UodGhpcy5jdXJyZW50UGFnZSAtIDEpO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlO1xuICB9XG5cbiAgbmV4dCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKCkpIHRoaXMub25QYWdlKHRoaXMuY3VycmVudFBhZ2UgKyAxKTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUNvdW50ID09PSAwIHx8IHRoaXMuY3VycmVudFBhZ2UgPT0gMTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlQ291bnQgPT09IDAgfHwgdGhpcy5jdXJyZW50UGFnZSA9PSB0aGlzLnBhZ2VDb3VudDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcGFnZXNGcm9tKGludGVydmFsOiBJbnRlcnZhbCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBmaXJzdFBhZ2UgPSBpbnRlcnZhbFswXTtcbiAgICBjb25zdCBsYXN0UGFnZSA9IGludGVydmFsWzFdO1xuICAgIGNvbnN0IGNvdW50ID0gbGFzdFBhZ2UgLSBmaXJzdFBhZ2UgKyAxO1xuICAgIHJldHVybiBBcnJheShjb3VudClcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChlLCBpKSA9PiBpICsgZmlyc3RQYWdlKTtcbiAgfVxufVxuIiwiPCEtLSBQYWdlIHByw6ljw6lkZW50ZSBzZXVsZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cblxuPG5hdiAqbmdJZj1cInByZXZpb3VzT25seVwiIGNsYXNzPVwiZnItcGFnaW5hdGlvblwiIFthdHRyLnJvbGVdPVwiaTE4bi50KCdwYWdpbmF0aW9uLnJvbGUnKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCI+XG4gIDx1bCBjbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpc3RcIj5cbiAgICA8ZWR1LXBhZ2UtbGlua1xuICAgICAgY3VzdG9tQ2xhc3M9XCJmci1wYWdpbmF0aW9uX19saW5rLS1wcmV2IGZyLXBhZ2luYXRpb25fX2xpbmstLWxnLWxhYmVsXCJcbiAgICAgIGxhYmVsPVwiUGFnZSBwcsOpY8OpZGVudGVcIlxuICAgICAgKHBhZ2VTZWxlY3RFdmVudCk9XCJvbkJhY2soKVwiPjwvZWR1LXBhZ2UtbGluaz5cbiAgPC91bD5cbjwvbmF2PlxuXG48IS0tIFBhZ2luYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cblxuPG5hdiAqbmdJZj1cIiFwcmV2aW91c09ubHlcIiBjbGFzcz1cImZyLXBhZ2luYXRpb25cIiBbYXR0ci5yb2xlXT1cImkxOG4udCgncGFnaW5hdGlvbi5yb2xlJylcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiPlxuICA8dWwgY2xhc3M9XCJmci1wYWdpbmF0aW9uX19saXN0XCI+XG4gICAgPCEtLSBQcmVtacOocmUgcGFnZSAtLT5cbiAgICA8bGk+XG4gICAgICA8ZWR1LXBhZ2UtbGlua1xuICAgICAgICBjdXN0b21DbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpbmstLWZpcnN0XCJcbiAgICAgICAgW2xhYmVsXT1cImkxOG4udCgncGFnaW5hdGlvbi5maXJzdFBhZ2UnKVwiXG4gICAgICAgIGxhYmVsQ3VzdG9tQ2xhc3M9XCJsYWJlbC1zbVwiXG4gICAgICAgIFt0b29sdGlwTWVzc2FnZV09XCJpMThuLnQoJ3BhZ2luYXRpb24uZmlyc3RQYWdlJylcIlxuICAgICAgICBbbnVtXT1cIjFcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNGaXJzdFBhZ2UoKVwiXG4gICAgICAgIChwYWdlU2VsZWN0RXZlbnQpPVwib25QYWdlKCRldmVudClcIj48L2VkdS1wYWdlLWxpbms+XG4gICAgPC9saT5cbiAgICA8IS0tIExpZW4gdmVycyAnUGFnZSBwcsOpY8OpZGVudGUnIC0tPlxuICAgIDxsaT5cbiAgICAgIDxlZHUtcGFnZS1saW5rXG4gICAgICAgIGN1c3RvbUNsYXNzPVwiZnItcGFnaW5hdGlvbl9fbGluay0tcHJldiBmci1wYWdpbmF0aW9uX19saW5rLS1sZy1sYWJlbFwiXG4gICAgICAgIFtsYWJlbF09XCJpMThuLnQoJ3BhZ2luYXRpb24ucHJldmlvdXNQYWdlJylcIlxuICAgICAgICBsYWJlbEN1c3RvbUNsYXNzPVwibGFiZWwtc21cIlxuICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwiaTE4bi50KCdwYWdpbmF0aW9uLnByZXZpb3VzUGFnZScpXCJcbiAgICAgICAgW251bV09XCJwcmV2TnVtXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRmlyc3RQYWdlKClcIlxuICAgICAgICAocGFnZVNlbGVjdEV2ZW50KT1cIm9uUGFnZSgkZXZlbnQpXCI+PC9lZHUtcGFnZS1saW5rPlxuICAgIDwvbGk+XG4gICAgPCEtLSBUb3V0ZXMgbGVzIHBhZ2VzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGludGVydmFsIG9mIGludGVydmFsc1wiPlxuICAgICAgPGxpICpuZ0lmPVwiaW50ZXJ2YWxbMF0gIT09IDFcIj5cbiAgICAgICAgPGVkdS1wYWdlLWxpbmsgY3VzdG9tQ2xhc3M9XCJmci11bmhpZGRlbi1sZ1wiIGxhYmVsPVwi4oCmXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L2VkdS1wYWdlLWxpbms+XG4gICAgICA8L2xpPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBwYWdlTnVtIG9mIHBhZ2VzRnJvbShpbnRlcnZhbCk7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgIDxlZHUtcGFnZS1saW5rXG4gICAgICAgICAgW251bV09XCJwYWdlTnVtXCJcbiAgICAgICAgICBbbGFiZWxdPVwicGFnZU51bSArICcnXCJcbiAgICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwiJ1BhZ2UgJyArIHBhZ2VOdW1cIlxuICAgICAgICAgIFthY3RpdmVdPVwicGFnZU51bSA9PT0gY3VycmVudFBhZ2VcIlxuICAgICAgICAgIChwYWdlU2VsZWN0RXZlbnQpPVwib25QYWdlKCRldmVudClcIj48L2VkdS1wYWdlLWxpbms+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBMaWVuIHZlcnMgJ1BhZ2Ugc3VpdmFudGUnIC0tPlxuICAgIDxsaT5cbiAgICAgIDxlZHUtcGFnZS1saW5rXG4gICAgICAgIGN1c3RvbUNsYXNzPVwiZnItcGFnaW5hdGlvbl9fbGluay0tbmV4dCBmci1wYWdpbmF0aW9uX19saW5rLS1sZy1sYWJlbFwiXG4gICAgICAgIFtsYWJlbF09XCJpMThuLnQoJ3BhZ2luYXRpb24ubmV4dFBhZ2UnKVwiXG4gICAgICAgIGxhYmVsQ3VzdG9tQ2xhc3M9XCJsYWJlbC1zbVwiXG4gICAgICAgIFt0b29sdGlwTWVzc2FnZV09XCJpMThuLnQoJ3BhZ2luYXRpb24ubmV4dFBhZ2UnKVwiXG4gICAgICAgIFtudW1dPVwibmV4dE51bVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0xhc3RQYWdlKClcIlxuICAgICAgICAocGFnZVNlbGVjdEV2ZW50KT1cIm9uUGFnZSgkZXZlbnQpXCI+PC9lZHUtcGFnZS1saW5rPlxuICAgIDwvbGk+XG4gICAgPCEtLSBEZXJuacOocmUgcGFnZSAobm9uIGFmZmljaMOpZSBzdXIgbW9iaWxlKSAtLT5cbiAgICA8bGk+XG4gICAgICA8ZWR1LXBhZ2UtbGlua1xuICAgICAgICBjdXN0b21DbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpbmstLWxhc3RcIlxuICAgICAgICBbbGFiZWxdPVwiaTE4bi50KCdwYWdpbmF0aW9uLmxhc3RQYWdlJylcIlxuICAgICAgICBsYWJlbEN1c3RvbUNsYXNzPVwibGFiZWwtc21cIlxuICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwiaTE4bi50KCdwYWdpbmF0aW9uLmxhc3RQYWdlJylcIlxuICAgICAgICBbbnVtXT1cInBhZ2VDb3VudFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0xhc3RQYWdlKClcIlxuICAgICAgICAocGFnZVNlbGVjdEV2ZW50KT1cIm9uUGFnZSgkZXZlbnQpXCI+PC9lZHUtcGFnZS1saW5rPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L25hdj5cbiJdfQ==