UNPKG

carbon-components-angular

Version:
350 lines 30.2 kB
import { Component, Input, Output, EventEmitter, HostBinding } from "@angular/core"; import { merge } from "carbon-components-angular/utils"; import { range } from "carbon-components-angular/common"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/i18n"; import * as i2 from "carbon-components-angular/experimental"; import * as i3 from "@angular/common"; import * as i4 from "carbon-components-angular/icon"; import * as i5 from "carbon-components-angular/forms"; import * as i6 from "./pagination-item.component"; import * as i7 from "./pagination-overflow.component"; /** * Use pagination when you have multiple pages of data to handle. Get started with importing the module: * * ```typescript * import { PaginationModule } from 'carbon-components-angular'; * ``` * * ```html * <cds-pagination-nav [model]="model" (selectPage)="selectPage($event)"></cds-pagination-nav> * ``` * * In your `selectPage()` method set the `model.currentPage` to selected page, _after_ * you load the page. * * ```typescript * selectPage(page) { * // ... your code to load the page goes here * * this.model.currentPage = page; * * // ... anything you want to do after page selection changes goes here * } * ``` * * [See demo](../../?path=/story/components-pagination-nav--basic) */ export class PaginationNav { constructor(i18n, experimental) { this.i18n = i18n; this.experimental = experimental; /** * Set to `true` to disable the backward/forward buttons. */ this.disabled = false; /** * Number of items to show in pagination. Minimum is 4. */ this.numOfItemsToShow = 4; /** * When `true`, navigating past the last/first page wraps around to the * other end. */ this.loop = false; /** * Sets the pagination nav size */ this.size = "lg"; /** * Emits the new page number. * * You should tie into this and update `model.currentPage` once the fresh * data is finally loaded. */ this.selectPage = new EventEmitter(); this.nextItemText = this.i18n.getOverridable("PAGINATION.NEXT"); this.previousItemText = this.i18n.getOverridable("PAGINATION.PREVIOUS"); PaginationNav.paginationCounter++; } /** * Expects an object that contains some or all of: * ``` * { * "NEXT": "Next", * "PREVIOUS": "Previous", * } * ``` */ set translations(value) { const valueWithDefaults = merge(this.i18n.getMultiple("PAGINATION"), value); this.nextItemText.override(valueWithDefaults.NEXT); this.previousItemText.override(valueWithDefaults.PREVIOUS); } // Size get smallLayoutSize() { return this.size === "sm"; } get mediumLayoutSize() { return this.size === "md"; } get largeLayoutSize() { return this.size === "lg"; } get totalNumbersArray() { return range(this.totalDataLength + 1, 1); } get currentPage() { return this.model.currentPage; } set currentPage(value) { value = Number(value); // emits the value to allow the user to update current page // in the model once the page is loaded this.selectPage.emit(value); } get totalDataLength() { return this.model.totalDataLength; } get startOffset() { return this.numOfItemsToShow <= 4 && this.currentPage > 1 ? 0 : 1; } get frontCuts() { const cuts = this.getCuts(); return cuts.front; } get backCuts() { const cuts = this.getCuts(); return cuts.back; } get leftArrowDisabled() { return this.disabled || (!this.loop && this.currentPage === 1); } get rightArrowDisabled() { return this.disabled || (!this.loop && this.currentPage === this.totalDataLength); } handleOverflowSelection(page) { if (typeof page === "number") { this.currentPage = page; } } jumpToNext() { if (this.currentPage < this.totalDataLength) { this.currentPage = this.currentPage + 1; } else if (this.loop) { this.currentPage = 1; } else { this.currentPage = this.totalDataLength; } } jumpToPrevious() { if (this.currentPage > 1) { this.currentPage = this.currentPage - 1; } else if (this.loop) { this.currentPage = this.totalDataLength; } else { this.currentPage = 1; } } getPages() { if (this.totalDataLength <= 1) { return null; } const cuts = this.getCuts(); return this.totalNumbersArray.slice(this.startOffset + cuts.front, (1 + cuts.back) * -1); } getCuts(splitPoint = null) { const page = this.currentPage - 1; const totalItems = this.totalDataLength; const itemsThatFit = this.numOfItemsToShow; if (itemsThatFit >= totalItems) { return { front: 0, back: 0 }; } const split = splitPoint || Math.ceil(itemsThatFit / 2) - 1; let frontHidden = page + 1 - split; let backHidden = totalItems - page - (itemsThatFit - split) + 1; if (frontHidden <= 1) { backHidden -= frontHidden <= 0 ? Math.abs(frontHidden) + 1 : 0; frontHidden = 0; } if (backHidden <= 1) { frontHidden -= backHidden <= 0 ? Math.abs(backHidden) + 1 : 0; backHidden = 0; } return { front: frontHidden, back: backHidden }; } } PaginationNav.paginationCounter = 0; PaginationNav.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PaginationNav, deps: [{ token: i1.I18n }, { token: i2.ExperimentalService }], target: i0.ɵɵFactoryTarget.Component }); PaginationNav.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PaginationNav, selector: "cds-pagination-nav, ibm-pagination-navm", inputs: { model: "model", disabled: "disabled", numOfItemsToShow: "numOfItemsToShow", loop: "loop", translations: "translations", size: "size" }, outputs: { selectPage: "selectPage" }, host: { properties: { "class.cds--layout--size-sm": "this.smallLayoutSize", "class.cds--layout--size-md": "this.mediumLayoutSize", "class.cds--layout--size-lg": "this.largeLayoutSize" } }, ngImport: i0, template: ` <div> <div class="cds--pagination-nav"> <ul class="cds--pagination-nav__list"> <li class="cds--pagination-nav__list-item"> <cds-icon-button kind="ghost" [size]="size" (click)="jumpToPrevious()" [disabled]="leftArrowDisabled" [description]="previousItemText.subject | async"> <svg cdsIcon="caret--left" size="16" class="cds--btn__icon"> </svg> </cds-icon-button> </li> <cds-pagination-nav-item *ngIf="this.numOfItemsToShow >= 5 || (this.numOfItemsToShow <= 4 && currentPage <= 1)" page="1" (click)="currentPage = 1" [isActive]="currentPage == 1"> </cds-pagination-nav-item> <cds-pagination-overflow *ngIf="frontCuts" [count]="frontCuts" [fromIndex]="startOffset" (change)="handleOverflowSelection($event)"> </cds-pagination-overflow> <cds-pagination-nav-item *ngFor="let page of getPages();" [page]="page" (click)="currentPage = page" [isActive]="currentPage == page"> </cds-pagination-nav-item> <cds-pagination-overflow *ngIf="backCuts" [count]="backCuts" [fromIndex]="totalNumbersArray.length - backCuts - 1" (change)="handleOverflowSelection($event)"> </cds-pagination-overflow> <cds-pagination-nav-item *ngIf="totalDataLength > 1" [page]="totalNumbersArray.length" (click)="currentPage = totalNumbersArray.length" [isActive]="currentPage == totalNumbersArray.length"> </cds-pagination-nav-item> <li class="cds--pagination-nav__list-item"> <cds-icon-button kind="ghost" [size]="size" (click)="jumpToNext()" [disabled]="rightArrowDisabled" [description]="nextItemText.subject | async"> <svg cdsIcon="caret--right" size="16" class="cds--btn__icon"> </svg> </cds-icon-button> </li> </ul> </div> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i5.IconButton, selector: "cds-icon-button, ibm-icon-button", inputs: ["buttonNgClass", "buttonAttributes", "buttonId", "kind", "size", "type", "isExpressive", "disabled", "description", "showTooltipWhenDisabled"], outputs: ["click", "focus", "blur", "tooltipClick"] }, { kind: "component", type: i6.PaginationNavItem, selector: "cds-pagination-nav-item, ibm-pagination-nav-item", inputs: ["page", "isActive"], outputs: ["click"] }, { kind: "component", type: i7.PaginationOverflow, selector: "cds-pagination-overflow, ibm-pagination-overflow", inputs: ["fromIndex", "count", "ariaLabel"], outputs: ["change"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PaginationNav, decorators: [{ type: Component, args: [{ selector: "cds-pagination-nav, ibm-pagination-navm", template: ` <div> <div class="cds--pagination-nav"> <ul class="cds--pagination-nav__list"> <li class="cds--pagination-nav__list-item"> <cds-icon-button kind="ghost" [size]="size" (click)="jumpToPrevious()" [disabled]="leftArrowDisabled" [description]="previousItemText.subject | async"> <svg cdsIcon="caret--left" size="16" class="cds--btn__icon"> </svg> </cds-icon-button> </li> <cds-pagination-nav-item *ngIf="this.numOfItemsToShow >= 5 || (this.numOfItemsToShow <= 4 && currentPage <= 1)" page="1" (click)="currentPage = 1" [isActive]="currentPage == 1"> </cds-pagination-nav-item> <cds-pagination-overflow *ngIf="frontCuts" [count]="frontCuts" [fromIndex]="startOffset" (change)="handleOverflowSelection($event)"> </cds-pagination-overflow> <cds-pagination-nav-item *ngFor="let page of getPages();" [page]="page" (click)="currentPage = page" [isActive]="currentPage == page"> </cds-pagination-nav-item> <cds-pagination-overflow *ngIf="backCuts" [count]="backCuts" [fromIndex]="totalNumbersArray.length - backCuts - 1" (change)="handleOverflowSelection($event)"> </cds-pagination-overflow> <cds-pagination-nav-item *ngIf="totalDataLength > 1" [page]="totalNumbersArray.length" (click)="currentPage = totalNumbersArray.length" [isActive]="currentPage == totalNumbersArray.length"> </cds-pagination-nav-item> <li class="cds--pagination-nav__list-item"> <cds-icon-button kind="ghost" [size]="size" (click)="jumpToNext()" [disabled]="rightArrowDisabled" [description]="nextItemText.subject | async"> <svg cdsIcon="caret--right" size="16" class="cds--btn__icon"> </svg> </cds-icon-button> </li> </ul> </div> </div> ` }] }], ctorParameters: function () { return [{ type: i1.I18n }, { type: i2.ExperimentalService }]; }, propDecorators: { model: [{ type: Input }], disabled: [{ type: Input }], numOfItemsToShow: [{ type: Input }], loop: [{ type: Input }], translations: [{ type: Input }], size: [{ type: Input }], smallLayoutSize: [{ type: HostBinding, args: ["class.cds--layout--size-sm"] }], mediumLayoutSize: [{ type: HostBinding, args: ["class.cds--layout--size-md"] }], largeLayoutSize: [{ type: HostBinding, args: ["class.cds--layout--size-lg"] }], selectPage: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi1uYXYuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhZ2luYXRpb24vcGFnaW5hdGlvbi1uYXYvcGFnaW5hdGlvbi1uYXYuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7OztBQU96RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQXNFSCxNQUFNLE9BQU8sYUFBYTtJQXdHekIsWUFBc0IsSUFBVSxFQUFZLFlBQWlDO1FBQXZELFNBQUksR0FBSixJQUFJLENBQU07UUFBWSxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFsRzdFOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQjs7V0FFRztRQUNNLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUM5Qjs7O1dBR0c7UUFDTSxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBa0J0Qjs7V0FFRztRQUNNLFNBQUksR0FBdUIsSUFBSSxDQUFDO1FBYXpDOzs7OztXQUtHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUEyQ2xELGlCQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzRCxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBR2xFLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUF0RkQ7Ozs7Ozs7O09BUUc7SUFDSCxJQUNJLFlBQVksQ0FB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Z0JBWUYsWUFBWTtzQkFEZixLQUFLO2dCQVVHLElBQUk7c0JBQVosS0FBSztnQkFHeUMsZUFBZTtzQkFBN0QsV0FBVzt1QkFBQyw0QkFBNEI7Z0JBR00sZ0JBQWdCO3NCQUE5RCxXQUFXO3VCQUFDLDRCQUE0QjtnQkFHTSxlQUFlO3NCQUE3RCxXQUFXO3VCQUFDLDRCQUE0QjtnQkFVL0IsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhZ2luYXRpb25Nb2RlbCB9IGZyb20gXCIuLi9wYWdpbmF0aW9uLW1vZGVsLmNsYXNzXCI7XG5pbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmdcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgSTE4biwgT3ZlcnJpZGFibGUgfSBmcm9tIFwiY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhci9pMThuXCI7XG5pbXBvcnQgeyBFeHBlcmltZW50YWxTZXJ2aWNlIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3V0aWxzXCI7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25OYXZUcmFuc2xhdGlvbnMge1xuXHRORVhUOiBzdHJpbmc7XG5cdFBSRVZJT1VTOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVXNlIHBhZ2luYXRpb24gd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBwYWdlcyBvZiBkYXRhIHRvIGhhbmRsZS4gR2V0IHN0YXJ0ZWQgd2l0aCBpbXBvcnRpbmcgdGhlIG1vZHVsZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBQYWdpbmF0aW9uTW9kdWxlIH0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG4gKiBgYGBcbiAqXG4gKiBgYGBodG1sXG4gKiA8Y2RzLXBhZ2luYXRpb24tbmF2IFttb2RlbF09XCJtb2RlbFwiIChzZWxlY3RQYWdlKT1cInNlbGVjdFBhZ2UoJGV2ZW50KVwiPjwvY2RzLXBhZ2luYXRpb24tbmF2PlxuICogYGBgXG4gKlxuICogSW4geW91ciBgc2VsZWN0UGFnZSgpYCBtZXRob2Qgc2V0IHRoZSBgbW9kZWwuY3VycmVudFBhZ2VgIHRvIHNlbGVjdGVkIHBhZ2UsIF9hZnRlcl9cbiAqIHlvdSBsb2FkIHRoZSBwYWdlLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNlbGVjdFBhZ2UocGFnZSkge1xuICogXHQvLyAuLi4geW91ciBjb2RlIHRvIGxvYWQgdGhlIHBhZ2UgZ29lcyBoZXJlXG4gKlxuICogXHR0aGlzLm1vZGVsLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAqXG4gKiBcdC8vIC4uLiBhbnl0aGluZyB5b3Ugd2FudCB0byBkbyBhZnRlciBwYWdlIHNlbGVjdGlvbiBjaGFuZ2VzIGdvZXMgaGVyZVxuICogfVxuICogYGBgXG4gKlxuICogW1NlZSBkZW1vXSguLi8uLi8/cGF0aD0vc3RvcnkvY29tcG9uZW50cy1wYWdpbmF0aW9uLW5hdi0tYmFzaWMpXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtcGFnaW5hdGlvbi1uYXYsIGlibS1wYWdpbmF0aW9uLW5hdm1cIixcblx0dGVtcGxhdGU6IGBcblx0PGRpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1wYWdpbmF0aW9uLW5hdlwiPlxuXHRcdFx0PHVsIGNsYXNzPVwiY2RzLS1wYWdpbmF0aW9uLW5hdl9fbGlzdFwiPlxuXHRcdFx0XHQ8bGkgY2xhc3M9XCJjZHMtLXBhZ2luYXRpb24tbmF2X19saXN0LWl0ZW1cIj5cblx0XHRcdFx0XHQ8Y2RzLWljb24tYnV0dG9uXG5cdFx0XHRcdFx0XHRraW5kPVwiZ2hvc3RcIlxuXHRcdFx0XHRcdFx0W3NpemVdPVwic2l6ZVwiXG5cdFx0XHRcdFx0XHQoY2xpY2spPVwianVtcFRvUHJldmlvdXMoKVwiXG5cdFx0XHRcdFx0XHRbZGlzYWJsZWRdPVwibGVmdEFycm93RGlzYWJsZWRcIlxuXHRcdFx0XHRcdFx0W2Rlc2NyaXB0aW9uXT1cInByZXZpb3VzSXRlbVRleHQuc3ViamVjdCB8IGFzeW5jXCI+XG5cdFx0XHRcdFx0XHQ8c3ZnXG5cdFx0XHRcdFx0XHRcdGNkc0ljb249XCJjYXJldC0tbGVmdFwiXG5cdFx0XHRcdFx0XHRcdHNpemU9XCIxNlwiXG5cdFx0XHRcdFx0XHRcdGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIj5cblx0XHRcdFx0XHRcdDwvc3ZnPlxuXHRcdFx0XHRcdDwvY2RzLWljb24tYnV0dG9uPlxuXHRcdFx0XHQ8L2xpPlxuXHRcdFx0XHQ8Y2RzLXBhZ2luYXRpb24tbmF2LWl0ZW1cblx0XHRcdFx0XHQqbmdJZj1cInRoaXMubnVtT2ZJdGVtc1RvU2hvdyA+PSA1IHx8ICh0aGlzLm51bU9mSXRlbXNUb1Nob3cgPD0gNCAmJiBjdXJyZW50UGFnZSA8PSAxKVwiXG5cdFx0XHRcdFx0cGFnZT1cIjFcIlxuXHRcdFx0XHRcdChjbGljayk9XCJjdXJyZW50UGFnZSA9IDFcIlxuXHRcdFx0XHRcdFtpc0FjdGl2ZV09XCJjdXJyZW50UGFnZSA9PSAxXCI+XG5cdFx0XHRcdDwvY2RzLXBhZ2luYXRpb24tbmF2LWl0ZW0+XG5cdFx0XHRcdDxjZHMtcGFnaW5hdGlvbi1vdmVyZmxvd1xuXHRcdFx0XHRcdCpuZ0lmPVwiZnJvbnRDdXRzXCJcblx0XHRcdFx0XHRbY291bnRdPVwiZnJvbnRDdXRzXCJcblx0XHRcdFx0XHRbZnJvbUluZGV4XT1cInN0YXJ0T2Zmc2V0XCJcblx0XHRcdFx0XHQoY2hhbmdlKT1cImhhbmRsZU92ZXJmbG93U2VsZWN0aW9uKCRldmVudClcIj5cblx0XHRcdFx0PC9jZHMtcGFnaW5hdGlvbi1vdmVyZmxvdz5cblx0XHRcdFx0PGNkcy1wYWdpbmF0aW9uLW5hdi1pdGVtXG5cdFx0XHRcdFx0Km5nRm9yPVwibGV0IHBhZ2Ugb2YgZ2V0UGFnZXMoKTtcIlxuXHRcdFx0XHRcdFtwYWdlXT1cInBhZ2VcIlxuXHRcdFx0XHRcdChjbGljayk9XCJjdXJyZW50UGFnZSA9IHBhZ2VcIlxuXHRcdFx0XHRcdFtpc0FjdGl2ZV09XCJjdXJyZW50UGFnZSA9PSBwYWdlXCI+XG5cdFx0XHRcdDwvY2RzLXBhZ2luYXRpb24tbmF2LWl0ZW0+XG5cdFx0XHRcdDxjZHMtcGFnaW5hdGlvbi1vdmVyZmxvd1xuXHRcdFx0XHRcdCpuZ0lmPVwiYmFja0N1dHNcIlxuXHRcdFx0XHRcdFtjb3VudF09XCJiYWNrQ3V0c1wiXG5cdFx0XHRcdFx0W2Zyb21JbmRleF09XCJ0b3RhbE51bWJlcnNBcnJheS5sZW5ndGggLSBiYWNrQ3V0cyAtIDFcIlxuXHRcdFx0XHRcdChjaGFuZ2UpPVwiaGFuZGxlT3ZlcmZsb3dTZWxlY3Rpb24oJGV2ZW50KVwiPlxuXHRcdFx0XHQ8L2Nkcy1wYWdpbmF0aW9uLW92ZXJmbG93PlxuXHRcdFx0XHQ8Y2RzLXBhZ2luYXRpb24tbmF2LWl0ZW1cblx0XHRcdFx0XHQqbmdJZj1cInRvdGFsRGF0YUxlbmd0aCA+IDFcIlxuXHRcdFx0XHRcdFtwYWdlXT1cInRvdGFsTnVtYmVyc0FycmF5Lmxlbmd0aFwiXG5cdFx0XHRcdFx0KGNsaWNrKT1cImN1cnJlbnRQYWdlID0gdG90YWxOdW1iZXJzQXJyYXkubGVuZ3RoXCJcblx0XHRcdFx0XHRbaXNBY3RpdmVdPVwiY3VycmVudFBhZ2UgPT0gdG90YWxOdW1iZXJzQXJyYXkubGVuZ3RoXCI+XG5cdFx0XHRcdDwvY2RzLXBhZ2luYXRpb24tbmF2LWl0ZW0+XG5cdFx0XHRcdDxsaSBjbGFzcz1cImNkcy0tcGFnaW5hdGlvbi1uYXZfX2xpc3QtaXRlbVwiPlxuXHRcdFx0XHRcdDxjZHMtaWNvbi1idXR0b25cblx0XHRcdFx0XHRcdGtpbmQ9XCJnaG9zdFwiXG5cdFx0XHRcdFx0XHRbc2l6ZV09XCJzaXplXCJcblx0XHRcdFx0XHRcdChjbGljayk9XCJqdW1wVG9OZXh0KClcIlxuXHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cInJpZ2h0QXJyb3dEaXNhYmxlZFwiXG5cdFx0XHRcdFx0XHRbZGVzY3JpcHRpb25dPVwibmV4dEl0ZW1UZXh0LnN1YmplY3QgfCBhc3luY1wiPlxuXHRcdFx0XHRcdFx0PHN2Z1xuXHRcdFx0XHRcdFx0XHRjZHNJY29uPVwiY2FyZXQtLXJpZ2h0XCJcblx0XHRcdFx0XHRcdFx0c2l6ZT1cIjE2XCJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiPlxuXHRcdFx0XHRcdFx0PC9zdmc+XG5cdFx0XHRcdFx0PC9jZHMtaWNvbi1idXR0b24+XG5cdFx0XHRcdDwvbGk+XG5cdFx0XHQ8L3VsPlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uTmF2IHtcblx0c3RhdGljIHBhZ2luYXRpb25Db3VudGVyID0gMDtcblx0LyoqXG5cdCAqIGBQYWdpbmF0aW9uTmF2TW9kZWxgIHdpdGggdGhlIGluZm9ybWF0aW9uIGFib3V0IHBhZ2VzIHlvdSdyZSBjb250cm9sbGluZy5cblx0ICovXG5cdEBJbnB1dCgpIG1vZGVsOiBQYWdpbmF0aW9uTW9kZWw7XG5cdC8qKlxuXHQgICAqIFNldCB0byBgdHJ1ZWAgdG8gZGlzYWJsZSB0aGUgYmFja3dhcmQvZm9yd2FyZCBidXR0b25zLlxuXHQgKi9cblx0QElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblx0LyoqXG5cdCAqIE51bWJlciBvZiBpdGVtcyB0byBzaG93IGluIHBhZ2luYXRpb24uIE1pbmltdW0gaXMgNC5cblx0ICovXG5cdEBJbnB1dCgpIG51bU9mSXRlbXNUb1Nob3cgPSA0O1xuXHQvKipcblx0ICogV2hlbiBgdHJ1ZWAsIG5hdmlnYXRpbmcgcGFzdCB0aGUgbGFzdC9maXJzdCBwYWdlIHdyYXBzIGFyb3VuZCB0byB0aGVcblx0ICogb3RoZXIgZW5kLlxuXHQgKi9cblx0QElucHV0KCkgbG9vcCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBFeHBlY3RzIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHNvbWUgb3IgYWxsIG9mOlxuXHQgKiBgYGBcblx0ICoge1xuXHQgKlx0XHRcIk5FWFRcIjogXCJOZXh0XCIsXG5cdCAqXHRcdFwiUFJFVklPVVNcIjogXCJQcmV2aW91c1wiLFxuXHQgKiB9XG5cdCAqIGBgYFxuXHQgKi9cblx0QElucHV0KClcblx0c2V0IHRyYW5zbGF0aW9ucyh2YWx1ZTogUGFnaW5hdGlvbk5hdlRyYW5zbGF0aW9ucykge1xuXHRcdGNvbnN0IHZhbHVlV2l0aERlZmF1bHRzID0gbWVyZ2UodGhpcy5pMThuLmdldE11bHRpcGxlKFwiUEFHSU5BVElPTlwiKSwgdmFsdWUpO1xuXHRcdHRoaXMubmV4dEl0ZW1UZXh0Lm92ZXJyaWRlKHZhbHVlV2l0aERlZmF1bHRzLk5FWFQpO1xuXHRcdHRoaXMucHJldmlvdXNJdGVtVGV4dC5vdmVycmlkZSh2YWx1ZVdpdGhEZWZhdWx0cy5QUkVWSU9VUyk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgcGFnaW5hdGlvbiBuYXYgc2l6ZVxuXHQgKi9cblx0QElucHV0KCkgc2l6ZTogXCJzbVwiIHwgXCJtZFwiIHwgXCJsZ1wiID0gXCJsZ1wiO1xuXG5cdC8vIFNpemVcblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1sYXlvdXQtLXNpemUtc21cIikgZ2V0IHNtYWxsTGF5b3V0U2l6ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5zaXplID09PSBcInNtXCI7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1sYXlvdXQtLXNpemUtbWRcIikgZ2V0IG1lZGl1bUxheW91dFNpemUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2l6ZSA9PT0gXCJtZFwiO1xuXHR9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tbGF5b3V0LS1zaXplLWxnXCIpIGdldCBsYXJnZUxheW91dFNpemUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2l6ZSA9PT0gXCJsZ1wiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVtaXRzIHRoZSBuZXcgcGFnZSBudW1iZXIuXG5cdCAqXG5cdCAqIFlvdSBzaG91bGQgdGllIGludG8gdGhpcyBhbmQgdXBkYXRlIGBtb2RlbC5jdXJyZW50UGFnZWAgb25jZSB0aGUgZnJlc2hcblx0ICogZGF0YSBpcyBmaW5hbGx5IGxvYWRlZC5cblx0ICovXG5cdEBPdXRwdXQoKSBzZWxlY3RQYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cblx0Z2V0IHRvdGFsTnVtYmVyc0FycmF5KCkge1xuXHRcdHJldHVybiByYW5nZSh0aGlzLnRvdGFsRGF0YUxlbmd0aCArIDEsIDEpO1xuXHR9XG5cblx0Z2V0IGN1cnJlbnRQYWdlKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLmN1cnJlbnRQYWdlO1xuXHR9XG5cblx0c2V0IGN1cnJlbnRQYWdlKHZhbHVlKSB7XG5cdFx0dmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuXHRcdC8vIGVtaXRzIHRoZSB2YWx1ZSB0byBhbGxvdyB0aGUgdXNlciB0byB1cGRhdGUgY3VycmVudCBwYWdlXG5cdFx0Ly8gaW4gdGhlIG1vZGVsIG9uY2UgdGhlIHBhZ2UgaXMgbG9hZGVkXG5cdFx0dGhpcy5zZWxlY3RQYWdlLmVtaXQodmFsdWUpO1xuXHR9XG5cblx0Z2V0IHRvdGFsRGF0YUxlbmd0aCgpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC50b3RhbERhdGFMZW5ndGg7XG5cdH1cblxuXHRnZXQgc3RhcnRPZmZzZXQoKSB7XG5cdFx0cmV0dXJuIHRoaXMubnVtT2ZJdGVtc1RvU2hvdyA8PSA0ICYmIHRoaXMuY3VycmVudFBhZ2UgPiAxID8gMCA6IDE7XG5cdH1cblxuXHRnZXQgZnJvbnRDdXRzKCkge1xuXHRcdGNvbnN0IGN1dHMgPSB0aGlzLmdldEN1dHMoKTtcblx0XHRyZXR1cm4gY3V0cy5mcm9udDtcblx0fVxuXG5cdGdldCBiYWNrQ3V0cygpIHtcblx0XHRjb25zdCBjdXRzID0gdGhpcy5nZXRDdXRzKCk7XG5cdFx0cmV0dXJuIGN1dHMuYmFjaztcblx0fVxuXG5cdGdldCBsZWZ0QXJyb3dEaXNhYmxlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAoIXRoaXMubG9vcCAmJiB0aGlzLmN1cnJlbnRQYWdlID09PSAxKTtcblx0fVxuXG5cdGdldCByaWdodEFycm93RGlzYWJsZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgKCF0aGlzLmxvb3AgJiYgdGhpcy5jdXJyZW50UGFnZSA9PT0gdGhpcy50b3RhbERhdGFMZW5ndGgpO1xuXHR9XG5cblx0bmV4dEl0ZW1UZXh0ID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiUEFHSU5BVElPTi5ORVhUXCIpO1xuXHRwcmV2aW91c0l0ZW1UZXh0ID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiUEFHSU5BVElPTi5QUkVWSU9VU1wiKTtcblxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaTE4bjogSTE4biwgcHJvdGVjdGVkIGV4cGVyaW1lbnRhbDogRXhwZXJpbWVudGFsU2VydmljZSkge1xuXHRcdFBhZ2luYXRpb25OYXYucGFnaW5hdGlvbkNvdW50ZXIrKztcblx0fVxuXG5cdGhhbmRsZU92ZXJmbG93U2VsZWN0aW9uKHBhZ2UpIHtcblx0XHRpZiAodHlwZW9mIHBhZ2UgPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBqdW1wVG9OZXh0KCkge1xuXHRcdGlmICh0aGlzLmN1cnJlbnRQYWdlIDwgdGhpcy50b3RhbERhdGFMZW5ndGgpIHtcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlICsgMTtcblx0XHR9IGVsc2UgaWYgKHRoaXMubG9vcCkge1xuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnRvdGFsRGF0YUxlbmd0aDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMganVtcFRvUHJldmlvdXMoKSB7XG5cdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgPiAxKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZSAtIDE7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmxvb3ApIHtcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnRvdGFsRGF0YUxlbmd0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGdldFBhZ2VzKCkge1xuXHRcdGlmICh0aGlzLnRvdGFsRGF0YUxlbmd0aCA8PSAxKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgY3V0cyA9IHRoaXMuZ2V0Q3V0cygpO1xuXHRcdHJldHVybiB0aGlzLnRvdGFsTnVtYmVyc0FycmF5LnNsaWNlKHRoaXMuc3RhcnRPZmZzZXQgKyBjdXRzLmZyb250LCAoMSArIGN1dHMuYmFjaykgKiAtMSk7XG5cdH1cblxuXHRwcml2YXRlIGdldEN1dHMoc3BsaXRQb2ludCA9IG51bGwpIHtcblx0XHRjb25zdCBwYWdlID0gdGhpcy5jdXJyZW50UGFnZSAtIDE7XG5cdFx0Y29uc3QgdG90YWxJdGVtcyA9IHRoaXMudG90YWxEYXRhTGVuZ3RoO1xuXHRcdGNvbnN0IGl0ZW1zVGhhdEZpdCA9IHRoaXMubnVtT2ZJdGVtc1RvU2hvdztcblxuXHRcdGlmIChpdGVtc1RoYXRGaXQgPj0gdG90YWxJdGVtcykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZnJvbnQ6IDAsXG5cdFx0XHRcdGJhY2s6IDBcblx0XHRcdH07XG5cdFx0fVxuXHRcdGNvbnN0IHNwbGl0ID0gc3BsaXRQb2ludCB8fCBNYXRoLmNlaWwoaXRlbXNUaGF0Rml0IC8gMikgLSAxO1xuXHRcdGxldCBmcm9udEhpZGRlbiA9IHBhZ2UgKyAxIC0gc3BsaXQ7XG5cdFx0bGV0IGJhY2tIaWRkZW4gPSB0b3RhbEl0ZW1zIC0gcGFnZSAtIChpdGVtc1RoYXRGaXQgLSBzcGxpdCkgKyAxO1xuXG5cdFx0aWYgKGZyb250SGlkZGVuIDw9IDEpIHtcblx0XHRcdGJhY2tIaWRkZW4gLT0gZnJvbnRIaWRkZW4gPD0gMCA/IE1hdGguYWJzKGZyb250SGlkZGVuKSArIDEgOiAwO1xuXHRcdFx0ZnJvbnRIaWRkZW4gPSAwO1xuXHRcdH1cblx0XHRpZiAoYmFja0hpZGRlbiA8PSAxKSB7XG5cdFx0XHRmcm9udEhpZGRlbiAtPSBiYWNrSGlkZGVuIDw9IDAgPyBNYXRoLmFicyhiYWNrSGlkZGVuKSArIDEgOiAwO1xuXHRcdFx0YmFja0hpZGRlbiA9IDA7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRmcm9udDogZnJvbnRIaWRkZW4sXG5cdFx0XHRiYWNrOiBiYWNrSGlkZGVuXG5cdFx0fTtcblx0fVxufVxuIl19