UNPKG

@taiga-ui/kit

Version:
319 lines 36.6 kB
import { __decorate, __extends, __param } from "tslib"; import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, Inject, Input, Optional, Output, QueryList, ViewChildren, } from '@angular/core'; import { AbstractTuiInteractive, clamp, EMPTY_QUERY, isNativeFocusedIn, setNativeFocused, TUI_FOCUSABLE_ITEM_ACCESSOR, tuiDefaultProp, } from '@taiga-ui/cdk'; import { TuiAppearance, TuiBrightness, TuiButtonComponent, TuiHorizontalDirection, TuiModeDirective, TuiSizeS, } from '@taiga-ui/core'; import { TUI_PAGINATION_TEXTS } from '@taiga-ui/kit/tokens'; import { horizontalDirectionToNumber } from '@taiga-ui/kit/utils/math'; import { Observable } from 'rxjs'; var DOTS_LENGTH = 1; var ACTIVE_ITEM_LENGTH = 1; export function nonNegativeInteger(length) { return Number.isInteger(length) && length >= 0; } // @dynamic var TuiPaginationComponent = /** @class */ (function (_super) { __extends(TuiPaginationComponent, _super); function TuiPaginationComponent(elementRef, modeDirective, texts$) { var _this = _super.call(this) || this; _this.elementRef = elementRef; _this.modeDirective = modeDirective; _this.texts$ = texts$; _this.length = 1; _this.size = 'm'; _this.disabled = false; /** * Amount of visible pages around active page */ _this.activePadding = 1; /** * Amount of visible pages at the edges */ _this.sidePadding = 1; /** * Customization for page number display. */ _this.content = null; /** * Active page index */ _this.index = 0; _this.indexChange = new EventEmitter(); _this.elements = EMPTY_QUERY; return _this; } TuiPaginationComponent_1 = TuiPaginationComponent; Object.defineProperty(TuiPaginationComponent.prototype, "nativeFocusableElement", { get: function () { if (this.disabled) { return null; } var activeElementIndex = 0; var elementsLength = this.elementsLength; for (var i = 0; i < elementsLength; i++) { var itemIndex = this.getItemIndexByElementIndex(i); if (itemIndex) { activeElementIndex++; } if (itemIndex === this.index) { break; } } var activeElement = this.elements.find(function (_, index) { return index === activeElementIndex; }); return activeElement ? activeElement.nativeFocusableElement : null; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "focused", { get: function () { return isNativeFocusedIn(this.elementRef.nativeElement); }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "elementsLength", { /** * Number of items in a container. */ get: function () { return this.itemsFit ? this.length : this.maxElementsLength; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "sizeM", { get: function () { return this.size === 'm'; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "mode", { get: function () { return this.modeDirective ? this.modeDirective.mode : null; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "arrowIsDisabledLeft", { get: function () { return this.index === 0; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "arrowIsDisabledRight", { get: function () { return this.reverseIndex === 0; }, enumerable: true, configurable: true }); TuiPaginationComponent.prototype.elementIsFocusable = function (index) { return this.index === index && !this.focused; }; TuiPaginationComponent.prototype.getItemContext = function (index) { return { $implicit: index }; }; /** * Get index by element index * @param elementIndex * @returns index or null (for '…') */ TuiPaginationComponent.prototype.getItemIndexByElementIndex = function (elementIndex) { if (!this.sizeM) { return elementIndex; } if (elementIndex < this.sidePadding) { return elementIndex; } if (elementIndex === this.sidePadding && this.hasCollapsedItems(this.index)) { return null; } var reverseElementIndex = this.lastElementIndex - elementIndex; if (reverseElementIndex === this.sidePadding && this.hasCollapsedItems(this.reverseIndex)) { return null; } if (reverseElementIndex < this.sidePadding) { return this.lastIndex - reverseElementIndex; } var computedIndex = this.index - this.maxHalfLength + elementIndex; return clamp(computedIndex, elementIndex, this.lastIndex - reverseElementIndex); }; TuiPaginationComponent.prototype.getElementMode = function (index) { return this.index === index ? "primary" /* Primary */ : "flat" /* Flat */; }; TuiPaginationComponent.prototype.getSmallElementMode = function (index, mode) { return this.index === index && mode !== 'onLight' ? "primary" /* Primary */ : "secondary" /* Secondary */; }; TuiPaginationComponent.prototype.onElementClick = function (index) { this.updateIndex(index); }; TuiPaginationComponent.prototype.onElementKeyDownArrowLeft = function (element) { if (element === this.elements.first) { return; } var previous = this.elements.find(function (_, index, array) { return array[index + 1] === element; }); if (previous && previous.nativeFocusableElement) { setNativeFocused(previous.nativeFocusableElement); } }; TuiPaginationComponent.prototype.onElementKeyDownArrowRight = function (element) { if (element === this.elements.last) { return; } var next = this.elements.find(function (_, index, array) { return array[index - 1] === element; }); if (next && next.nativeFocusableElement) { setNativeFocused(next.nativeFocusableElement); } }; TuiPaginationComponent.prototype.onArrowClick = function (direction) { this.tryChangeTo(direction); this.focusActive(); }; TuiPaginationComponent.prototype.onActiveZone = function (focused) { this.updateFocused(focused); }; Object.defineProperty(TuiPaginationComponent.prototype, "reverseIndex", { /** * Active index from the end */ get: function () { return this.lastIndex - this.index; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "maxHalfLength", { /** * Max number of elements in half (not counting the middle one). */ get: function () { return this.sidePadding + DOTS_LENGTH + this.activePadding; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "itemsFit", { /** * Is there '...' anywhere */ get: function () { return this.length <= this.maxElementsLength; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "maxElementsLength", { /** * Max number of elements */ get: function () { return this.maxHalfLength * 2 + ACTIVE_ITEM_LENGTH; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "lastIndex", { get: function () { return this.length - 1; }, enumerable: true, configurable: true }); Object.defineProperty(TuiPaginationComponent.prototype, "lastElementIndex", { get: function () { return this.elementsLength - 1; }, enumerable: true, configurable: true }); /** * Are there collapsed items at that index * @param index * @returns there are collapsed items */ TuiPaginationComponent.prototype.hasCollapsedItems = function (index) { return !this.itemsFit && index > this.maxHalfLength; }; TuiPaginationComponent.prototype.tryChangeTo = function (direction) { this.updateIndex(clamp(this.index + horizontalDirectionToNumber(direction), 0, this.lastIndex)); }; TuiPaginationComponent.prototype.focusActive = function () { var nativeFocusableElement = this.nativeFocusableElement; if (nativeFocusableElement) { setNativeFocused(nativeFocusableElement); } }; TuiPaginationComponent.prototype.updateIndex = function (index) { if (this.index === index) { return; } this.index = index; this.indexChange.emit(index); }; var TuiPaginationComponent_1; TuiPaginationComponent.ctorParameters = function () { return [ { type: ElementRef, decorators: [{ type: Inject, args: [ElementRef,] }] }, { type: TuiModeDirective, decorators: [{ type: Optional }, { type: Inject, args: [TuiModeDirective,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_PAGINATION_TEXTS,] }] } ]; }; __decorate([ Input(), tuiDefaultProp(nonNegativeInteger, 'Must be non-negative integer') ], TuiPaginationComponent.prototype, "length", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "size", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "disabled", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "activePadding", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "sidePadding", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "content", void 0); __decorate([ Input(), tuiDefaultProp(nonNegativeInteger, 'Must be non-negative integer') ], TuiPaginationComponent.prototype, "index", void 0); __decorate([ Output() ], TuiPaginationComponent.prototype, "indexChange", void 0); __decorate([ ViewChildren('element', { read: TUI_FOCUSABLE_ITEM_ACCESSOR }) ], TuiPaginationComponent.prototype, "elements", void 0); TuiPaginationComponent = TuiPaginationComponent_1 = __decorate([ Component({ selector: 'tui-pagination', template: "<div class=\"content\" (tuiActiveZoneChange)=\"onActiveZone($event)\">\n <ng-container *ngIf=\"sizeM && (texts$ | async) as texts; else smallButtons\">\n <button\n tuiIconButton\n type=\"button\"\n tuiPreventDefault=\"mousedown\"\n class=\"button\"\n size=\"s\"\n appearance=\"flat\"\n icon=\"tuiIconChevronLeft\"\n [title]=\"texts[0]\"\n [disabled]=\"arrowIsDisabledLeft\"\n [focusable]=\"false\"\n (click)=\"onArrowClick('left')\"\n ></button>\n <ng-container *tuiRepeatTimes=\"let elementIndex of elementsLength\">\n <ng-container\n *tuiLet=\"getItemIndexByElementIndex(elementIndex) as index\"\n >\n <button\n *ngIf=\"index !== null; else dotsTemplate\"\n #element\n tuiButton\n type=\"button\"\n automation-id=\"tui-pagination__element\"\n class=\"button\"\n shape=\"square\"\n size=\"s\"\n [disabled]=\"disabled\"\n [focusable]=\"elementIsFocusable(index)\"\n [appearance]=\"getElementMode(index)\"\n (click)=\"onElementClick(index)\"\n (keydown.arrowLeft.prevent)=\"onElementKeyDownArrowLeft(element)\"\n (keydown.arrowRight.prevent)=\"onElementKeyDownArrowRight(element)\"\n >\n <div\n polymorpheus-outlet\n [content]=\"content || index + 1\"\n [context]=\"getItemContext(index)\"\n ></div>\n </button>\n </ng-container>\n </ng-container>\n <button\n tuiIconButton\n type=\"button\"\n tuiPreventDefault=\"mousedown\"\n class=\"button\"\n size=\"s\"\n appearance=\"flat\"\n icon=\"tuiIconChevronRight\"\n [title]=\"texts[1]\"\n [disabled]=\"arrowIsDisabledRight\"\n [focusable]=\"false\"\n (click)=\"onArrowClick('right')\"\n ></button>\n </ng-container>\n <ng-template #smallButtons>\n <button\n *tuiRepeatTimes=\"let indexItem of length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n shape=\"square\"\n [class.button_active]=\"indexItem === index\"\n [disabled]=\"disabled\"\n [focusable]=\"elementIsFocusable(indexItem)\"\n [appearance]=\"getSmallElementMode(indexItem, mode)\"\n (click)=\"onElementClick(indexItem)\"\n (keydown.arrowLeft.prevent)=\"onElementKeyDownArrowLeft(element)\"\n (keydown.arrowRight.prevent)=\"onElementKeyDownArrowRight(element)\"\n ></button>\n </ng-template>\n <ng-template #dotsTemplate>\n <div automation-id=\"tui-pagination__element\" class=\"dots\"></div>\n </ng-template>\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: TUI_FOCUSABLE_ITEM_ACCESSOR, useExisting: forwardRef(function () { return TuiPaginationComponent_1; }), }, ], styles: [":host{font:var(--tui-font-text-s);color:var(--tui-text-01);display:block;text-align:center}.content{display:flex;justify-content:center}.button{margin:0 2px;flex-shrink:0}.button_active{background:currentColor}.button.button.button_small{width:8px;height:8px;margin:0}.button.button.button_small:not(:first-child){margin-left:8px}.dots{width:var(--tui-height-s);height:var(--tui-height-s);line-height:var(--tui-height-s);margin:0 2px;flex-shrink:0;color:var(--tui-text-03);text-align:center;cursor:default}.dots:before{content:'\\2026'}"] }), __param(0, Inject(ElementRef)), __param(1, Optional()), __param(1, Inject(TuiModeDirective)), __param(2, Inject(TUI_PAGINATION_TEXTS)) ], TuiPaginationComponent); return TuiPaginationComponent; }(AbstractTuiInteractive)); export { TuiPaginationComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvcGFnaW5hdGlvbi8iLCJzb3VyY2VzIjpbInBhZ2luYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksR0FDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsc0JBQXNCLEVBQ3RCLEtBQUssRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFFM0IsY0FBYyxHQUdqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsYUFBYSxFQUNiLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixRQUFRLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhDLElBQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUU3QixNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBYztJQUM3QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsV0FBVztBQWFYO0lBQ1ksMENBQXNCO0lBZ0Q5QixnQ0FDeUMsVUFBbUMsRUFHdkQsYUFBc0MsRUFDaEIsTUFBb0M7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R2xEO1FBREMsWUFBWSxDQUFDLFNBQVMsRUFBRSxFQUFDLElBQUksRUFBRSwyQkFBMkIsRUFBQyxDQUFDOzREQUNtQjtJQS9DdkUsc0JBQXNCO1FBWmxDLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsK25HQUF5QztZQUV6QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtZQUMvQyxTQUFTLEVBQUU7Z0JBQ1A7b0JBQ0ksT0FBTyxFQUFFLDJCQUEyQjtvQkFDcEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsd0JBQXNCLEVBQXRCLENBQXNCLENBQUM7aUJBQ3hEO2FBQ0o7O1NBQ0osQ0FBQztRQW1ETyxXQUFBLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNsQixXQUFBLFFBQVEsRUFBRSxDQUFBO1FBQ1YsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUV4QixXQUFBLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO09BdER4QixzQkFBc0IsQ0FtUmxDO0lBQUQsNkJBQUM7Q0FBQSxBQW5SRCxDQUNZLHNCQUFzQixHQWtSakM7U0FuUlksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aUludGVyYWN0aXZlLFxuICAgIGNsYW1wLFxuICAgIEVNUFRZX1FVRVJZLFxuICAgIGlzTmF0aXZlRm9jdXNlZEluLFxuICAgIHNldE5hdGl2ZUZvY3VzZWQsXG4gICAgVFVJX0ZPQ1VTQUJMRV9JVEVNX0FDQ0VTU09SLFxuICAgIFR1aUNvbnRleHRXaXRoSW1wbGljaXQsXG4gICAgdHVpRGVmYXVsdFByb3AsXG4gICAgVHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yLFxuICAgIFR1aU5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHtcbiAgICBUdWlBcHBlYXJhbmNlLFxuICAgIFR1aUJyaWdodG5lc3MsXG4gICAgVHVpQnV0dG9uQ29tcG9uZW50LFxuICAgIFR1aUhvcml6b250YWxEaXJlY3Rpb24sXG4gICAgVHVpTW9kZURpcmVjdGl2ZSxcbiAgICBUdWlTaXplUyxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtUVUlfUEFHSU5BVElPTl9URVhUU30gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuaW1wb3J0IHtob3Jpem9udGFsRGlyZWN0aW9uVG9OdW1iZXJ9IGZyb20gJ0B0YWlnYS11aS9raXQvdXRpbHMvbWF0aCc7XG5pbXBvcnQge1BvbHltb3JwaGV1c0NvbnRlbnR9IGZyb20gJ0B0aW5rb2ZmL25nLXBvbHltb3JwaGV1cyc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5jb25zdCBET1RTX0xFTkdUSCA9IDE7XG5jb25zdCBBQ1RJVkVfSVRFTV9MRU5HVEggPSAxO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTmVnYXRpdmVJbnRlZ2VyKGxlbmd0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobGVuZ3RoKSAmJiBsZW5ndGggPj0gMDtcbn1cblxuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndHVpLXBhZ2luYXRpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3BhZ2luYXRpb24uc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUdWlQYWdpbmF0aW9uQ29tcG9uZW50KSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBBYnN0cmFjdFR1aUludGVyYWN0aXZlXG4gICAgaW1wbGVtZW50cyBUdWlGb2N1c2FibGVFbGVtZW50QWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKG5vbk5lZ2F0aXZlSW50ZWdlciwgJ011c3QgYmUgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICAgIGxlbmd0aCA9IDE7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc2l6ZTogVHVpU2l6ZVMgPSAnbSc7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgcmVhZG9ubHkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB2aXNpYmxlIHBhZ2VzIGFyb3VuZCBhY3RpdmUgcGFnZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBhY3RpdmVQYWRkaW5nID0gMTtcblxuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB2aXNpYmxlIHBhZ2VzIGF0IHRoZSBlZGdlc1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBzaWRlUGFkZGluZyA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b21pemF0aW9uIGZvciBwYWdlIG51bWJlciBkaXNwbGF5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBjb250ZW50OiBQb2x5bW9ycGhldXNDb250ZW50PFR1aUNvbnRleHRXaXRoSW1wbGljaXQ8bnVtYmVyPj4gfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEFjdGl2ZSBwYWdlIGluZGV4XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3Aobm9uTmVnYXRpdmVJbnRlZ2VyLCAnTXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gICAgaW5kZXggPSAwO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgaW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ2VsZW1lbnQnLCB7cmVhZDogVFVJX0ZPQ1VTQUJMRV9JVEVNX0FDQ0VTU09SfSlcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRzOiBRdWVyeUxpc3Q8VHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yPiA9IEVNUFRZX1FVRVJZO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRWxlbWVudFJlZikgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChUdWlNb2RlRGlyZWN0aXZlKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGVEaXJlY3RpdmU6IFR1aU1vZGVEaXJlY3RpdmUgfCBudWxsLFxuICAgICAgICBASW5qZWN0KFRVSV9QQUdJTkFUSU9OX1RFWFRTKSByZWFkb25seSB0ZXh0cyQ6IE9ic2VydmFibGU8W3N0cmluZywgc3RyaW5nXT4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgZ2V0IG5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQoKTogVHVpTmF0aXZlRm9jdXNhYmxlRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlRWxlbWVudEluZGV4ID0gMDtcbiAgICAgICAgY29uc3Qge2VsZW1lbnRzTGVuZ3RofSA9IHRoaXM7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50c0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleEJ5RWxlbWVudEluZGV4KGkpO1xuXG4gICAgICAgICAgICBpZiAoaXRlbUluZGV4KSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudEluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPT09IHRoaXMuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgICAoXywgaW5kZXgpID0+IGluZGV4ID09PSBhY3RpdmVFbGVtZW50SW5kZXgsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgPyBhY3RpdmVFbGVtZW50Lm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNOYXRpdmVGb2N1c2VkSW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpdGVtcyBpbiBhIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBnZXQgZWxlbWVudHNMZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNGaXQgPyB0aGlzLmxlbmd0aCA6IHRoaXMubWF4RWxlbWVudHNMZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0IHNpemVNKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplID09PSAnbSc7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGUoKTogVHVpQnJpZ2h0bmVzcyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlRGlyZWN0aXZlID8gdGhpcy5tb2RlRGlyZWN0aXZlLm1vZGUgOiBudWxsO1xuICAgIH1cblxuICAgIGdldCBhcnJvd0lzRGlzYWJsZWRMZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDtcbiAgICB9XG5cbiAgICBnZXQgYXJyb3dJc0Rpc2FibGVkUmlnaHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmVyc2VJbmRleCA9PT0gMDtcbiAgICB9XG5cbiAgICBlbGVtZW50SXNGb2N1c2FibGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gaW5kZXggJiYgIXRoaXMuZm9jdXNlZDtcbiAgICB9XG5cbiAgICBnZXRJdGVtQ29udGV4dChpbmRleDogbnVtYmVyKTogVHVpQ29udGV4dFdpdGhJbXBsaWNpdDxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHskaW1wbGljaXQ6IGluZGV4fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5kZXggYnkgZWxlbWVudCBpbmRleFxuICAgICAqIEBwYXJhbSBlbGVtZW50SW5kZXhcbiAgICAgKiBAcmV0dXJucyBpbmRleCBvciBudWxsIChmb3IgJ+KApicpXG4gICAgICovXG4gICAgZ2V0SXRlbUluZGV4QnlFbGVtZW50SW5kZXgoZWxlbWVudEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnNpemVNKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnRJbmRleCA8IHRoaXMuc2lkZVBhZGRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50SW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxlbWVudEluZGV4ID09PSB0aGlzLnNpZGVQYWRkaW5nICYmIHRoaXMuaGFzQ29sbGFwc2VkSXRlbXModGhpcy5pbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2ZXJzZUVsZW1lbnRJbmRleCA9IHRoaXMubGFzdEVsZW1lbnRJbmRleCAtIGVsZW1lbnRJbmRleDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICByZXZlcnNlRWxlbWVudEluZGV4ID09PSB0aGlzLnNpZGVQYWRkaW5nICYmXG4gICAgICAgICAgICB0aGlzLmhhc0NvbGxhcHNlZEl0ZW1zKHRoaXMucmV2ZXJzZUluZGV4KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldmVyc2VFbGVtZW50SW5kZXggPCB0aGlzLnNpZGVQYWRkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0SW5kZXggLSByZXZlcnNlRWxlbWVudEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcHV0ZWRJbmRleCA9IHRoaXMuaW5kZXggLSB0aGlzLm1heEhhbGZMZW5ndGggKyBlbGVtZW50SW5kZXg7XG5cbiAgICAgICAgcmV0dXJuIGNsYW1wKGNvbXB1dGVkSW5kZXgsIGVsZW1lbnRJbmRleCwgdGhpcy5sYXN0SW5kZXggLSByZXZlcnNlRWxlbWVudEluZGV4KTtcbiAgICB9XG5cbiAgICBnZXRFbGVtZW50TW9kZShpbmRleDogbnVtYmVyKTogVHVpQXBwZWFyYW5jZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSBpbmRleCA/IFR1aUFwcGVhcmFuY2UuUHJpbWFyeSA6IFR1aUFwcGVhcmFuY2UuRmxhdDtcbiAgICB9XG5cbiAgICBnZXRTbWFsbEVsZW1lbnRNb2RlKGluZGV4OiBudW1iZXIsIG1vZGU6IFR1aUJyaWdodG5lc3MgfCBudWxsKTogVHVpQXBwZWFyYW5jZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSBpbmRleCAmJiBtb2RlICE9PSAnb25MaWdodCdcbiAgICAgICAgICAgID8gVHVpQXBwZWFyYW5jZS5QcmltYXJ5XG4gICAgICAgICAgICA6IFR1aUFwcGVhcmFuY2UuU2Vjb25kYXJ5O1xuICAgIH1cblxuICAgIG9uRWxlbWVudENsaWNrKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRleChpbmRleCk7XG4gICAgfVxuXG4gICAgb25FbGVtZW50S2V5RG93bkFycm93TGVmdChlbGVtZW50OiBUdWlCdXR0b25Db21wb25lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMuZWxlbWVudHMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5lbGVtZW50cy5maW5kKFxuICAgICAgICAgICAgKF8sIGluZGV4LCBhcnJheSkgPT4gYXJyYXlbaW5kZXggKyAxXSA9PT0gZWxlbWVudCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocHJldmlvdXMgJiYgcHJldmlvdXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgc2V0TmF0aXZlRm9jdXNlZChwcmV2aW91cy5uYXRpdmVGb2N1c2FibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRWxlbWVudEtleURvd25BcnJvd1JpZ2h0KGVsZW1lbnQ6IFR1aUJ1dHRvbkNvbXBvbmVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gdGhpcy5lbGVtZW50cy5sYXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5lbGVtZW50cy5maW5kKFxuICAgICAgICAgICAgKF8sIGluZGV4LCBhcnJheSkgPT4gYXJyYXlbaW5kZXggLSAxXSA9PT0gZWxlbWVudCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobmV4dCAmJiBuZXh0Lm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQobmV4dC5uYXRpdmVGb2N1c2FibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQXJyb3dDbGljayhkaXJlY3Rpb246IFR1aUhvcml6b250YWxEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy50cnlDaGFuZ2VUbyhkaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgb25BY3RpdmVab25lKGZvY3VzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb2N1c2VkKGZvY3VzZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjdGl2ZSBpbmRleCBmcm9tIHRoZSBlbmRcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCByZXZlcnNlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdEluZGV4IC0gdGhpcy5pbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhbGYgKG5vdCBjb3VudGluZyB0aGUgbWlkZGxlIG9uZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgbWF4SGFsZkxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zaWRlUGFkZGluZyArIERPVFNfTEVOR1RIICsgdGhpcy5hY3RpdmVQYWRkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIHRoZXJlICcuLi4nIGFueXdoZXJlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaXRlbXNGaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA8PSB0aGlzLm1heEVsZW1lbnRzTGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBudW1iZXIgb2YgZWxlbWVudHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBtYXhFbGVtZW50c0xlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhIYWxmTGVuZ3RoICogMiArIEFDVElWRV9JVEVNX0xFTkdUSDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYXN0SW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYXN0RWxlbWVudEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzTGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcmUgdGhlcmUgY29sbGFwc2VkIGl0ZW1zIGF0IHRoYXQgaW5kZXhcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB0aGVyZSBhcmUgY29sbGFwc2VkIGl0ZW1zXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYXNDb2xsYXBzZWRJdGVtcyhpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pdGVtc0ZpdCAmJiBpbmRleCA+IHRoaXMubWF4SGFsZkxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRyeUNoYW5nZVRvKGRpcmVjdGlvbjogVHVpSG9yaXpvbnRhbERpcmVjdGlvbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUluZGV4KFxuICAgICAgICAgICAgY2xhbXAodGhpcy5pbmRleCArIGhvcml6b250YWxEaXJlY3Rpb25Ub051bWJlcihkaXJlY3Rpb24pLCAwLCB0aGlzLmxhc3RJbmRleCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0FjdGl2ZSgpIHtcbiAgICAgICAgY29uc3Qge25hdGl2ZUZvY3VzYWJsZUVsZW1lbnR9ID0gdGhpcztcblxuICAgICAgICBpZiAobmF0aXZlRm9jdXNhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgc2V0TmF0aXZlRm9jdXNlZChuYXRpdmVGb2N1c2FibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5pbmRleENoYW5nZS5lbWl0KGluZGV4KTtcbiAgICB9XG59XG4iXX0=