angular-io-pager
Version:
269 lines (268 loc) • 24.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter } from '@angular/core';
var AngularIoPagerComponent = /** @class */ (function () {
function AngularIoPagerComponent() {
this.pageGap = 10;
this.id = 1;
this.noOfPages = 10;
this.pageClick = new EventEmitter();
// page view count selectors
this.from = 1;
this.to = 0;
this.pageLength = 20;
this.currentPage = 1;
this.pages = [];
this.pageNum = [];
this.showLeftNav = false;
this.showRightNav = false;
this.totalPageLength = 0;
this.leftNavString = '<<';
this.rightNavString = '>>';
this.lastPageMax = 0;
this.lastPageMin = 0;
this._total = 0;
}
Object.defineProperty(AngularIoPagerComponent.prototype, "totalRecords", {
get: /**
* @return {?}
*/
function () {
return this._total;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._total = value;
if (value > 0) {
this.pagePreparation();
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
AngularIoPagerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
for (var i = 1; i <= this.pageLength; i++) {
this.pages.push(i * this.pageGap);
}
this.to = this.pages[0];
};
/**
* @return {?}
*/
AngularIoPagerComponent.prototype.pagePreparation = /**
* @return {?}
*/
function () {
var _this = this;
this.reCalculatePageNumbers();
setTimeout(function () {
_this.setSelectedPage();
}, 0);
};
/**
* @return {?}
*/
AngularIoPagerComponent.prototype.reCalculatePageNumbers = /**
* @return {?}
*/
function () {
/** @type {?} */
var divided = (this.totalRecords / this.pageGap).toString().split('.');
/** @type {?} */
var wholePageLen = parseInt(divided[0], 10);
/** @type {?} */
var partialPageLen = 0;
if (divided.length === 2) {
// has one more page with limited records
partialPageLen = 1;
}
this.totalPageLength = wholePageLen + partialPageLen;
this.pageNum.length = 0;
this.populatePages(1);
};
/**
* @param {?} start
* @return {?}
*/
AngularIoPagerComponent.prototype.populatePages = /**
* @param {?} start
* @return {?}
*/
function (start) {
/** @type {?} */
var until = 1;
this.pageNum.length = 0;
for (var i = start; i <= this.totalPageLength && until <= this.noOfPages; i++) {
this.pageNum.push(i);
until++;
}
this.currentPage = this.lastPageMin = Math.min.apply(Math, tslib_1.__spread(this.pageNum));
this.lastPageMax = Math.max.apply(Math, tslib_1.__spread(this.pageNum));
this.setPrevNextNav();
};
/**
* @return {?}
*/
AngularIoPagerComponent.prototype.pageLengthChange = /**
* @return {?}
*/
function () {
this.reCalculatePageNumbers();
this.setSelectedPage();
};
/**
* @param {?} e
* @return {?}
*/
AngularIoPagerComponent.prototype.pageChange = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (e.target.classList.contains('cmdLeft')) {
this.populatePages(this.lastPageMin - this.noOfPages);
this.setSelectedPage();
}
else if (e.target.classList.contains('cmdRight')) {
this.populatePages(++this.lastPageMax);
this.setSelectedPage();
}
else {
this.setSelectedPage(e.target);
}
};
/**
* @param {?=} el
* @return {?}
*/
AngularIoPagerComponent.prototype.setSelectedPage = /**
* @param {?=} el
* @return {?}
*/
function (el) {
var _this = this;
if (el === void 0) { el = null; }
if (el != null) {
this.currentPage = parseInt(el.innerText, 10);
}
this.to = Math.min(this.currentPage * this.pageGap, this.totalRecords);
this.from = this.currentPage * this.pageGap - this.pageGap + 1;
setTimeout(function () {
el = /** @type {?} */ (((el == null
? document
.getElementById('pager' + _this.id)
.querySelector('.pageElements')
: el)));
/** @type {?} */
var closePageNum = el;
while ((closePageNum = closePageNum.parentElement) &&
!closePageNum.classList.contains('pageNumbers')) { }
Array.from(closePageNum.children).forEach(function (x) {
return x.classList.remove('selected');
});
el.classList.add('selected');
}, 0);
this.emitPageClick();
};
/**
* @return {?}
*/
AngularIoPagerComponent.prototype.setPrevNextNav = /**
* @return {?}
*/
function () {
this.showLeftNav = this.showRightNav = false;
if (this.currentPage > this.noOfPages) {
// current page is out of maximum pages can be shown, it means it is not the first set of page numbers. show left
this.showLeftNav = true;
}
/** @type {?} */
var currentPageIsInBetween = (this.currentPage / this.noOfPages).toString().split('.')
.length === 2;
/** @type {?} */
var currHighestPageShowing = parseInt((this.currentPage / this.noOfPages).toString(), 10) *
this.noOfPages +
(currentPageIsInBetween ? this.noOfPages : 0);
if (currHighestPageShowing < this.totalPageLength) {
this.showRightNav = true;
}
};
/**
* @return {?}
*/
AngularIoPagerComponent.prototype.emitPageClick = /**
* @return {?}
*/
function () {
this.pageClick.emit({ from: this.from, to: this.to });
};
AngularIoPagerComponent.decorators = [
{ type: Component, args: [{
selector: 'sr-angular-io-pager',
template: "<div class=\"pager\" [ngClass]=\"{'hidden': totalRecords <= 0}\" [id]=\"'pager' + id\">\n <div class=\"left\">\n Show\n <select [(ngModel)]=\"pageGap\" (change)=\"pageLengthChange()\"\n id=\"pageGap\">\n <option *ngFor=\"let pg of pages\" [value]=\"pg\">{{pg}}</option>\n </select>\n Showing {{from}}-{{to}} of {{totalRecords}}\n </div>\n <div class=\"right\">\n <ul class=\"pageNumbers\" id=\"pageList\">\n <li *ngIf=\"showLeftNav\" (click)=\"pageChange($event)\"\n class=\"cmdLeft\"> {{leftNavString}} </li>\n <li *ngFor=\"let pn of pageNum\" (click)=\"pageChange($event)\"\n class=\"pageElements\">{{pn}}</li>\n <li *ngIf=\"showRightNav\" (click)=\"pageChange($event)\"\n class=\"cmdRight\"> {{rightNavString}} </li>\n </ul>\n </div>\n</div>",
styles: [".pager{font:bold 13px Arial;color:#377bba}.pageNumbers{list-style:none;border:1px solid #dfdfdf;display:inline-block;padding-left:0;margin:0}.pageNumbers li{float:left;padding:8px 10px;background:#fff;border-left:1px solid #dfdfdf;border-collapse:collapse;color:#377bba;cursor:pointer;min-width:15px;text-align:center}.pageNumbers li.selected{background:#377bba;color:#fff}.pageNumbers li:first-of-type{border-left:0}.pageNumbers li:hover{background:#3a4046;color:#fff}div.left{padding:9px 0}select{color:#377bba;font-weight:700;font-size:.9em;padding:2px;border:1px solid #377bba}.left{float:left}.right{float:right}.hidden{display:none}"]
},] },
];
/** @nocollapse */
AngularIoPagerComponent.ctorParameters = function () { return []; };
AngularIoPagerComponent.propDecorators = {
pageGap: [{ type: Input }],
id: [{ type: Input }],
noOfPages: [{ type: Input }],
totalRecords: [{ type: Input }],
pageClick: [{ type: Output }]
};
return AngularIoPagerComponent;
}());
export { AngularIoPagerComponent };
if (false) {
/** @type {?} */
AngularIoPagerComponent.prototype.pageGap;
/** @type {?} */
AngularIoPagerComponent.prototype.id;
/** @type {?} */
AngularIoPagerComponent.prototype.noOfPages;
/** @type {?} */
AngularIoPagerComponent.prototype.pageClick;
/** @type {?} */
AngularIoPagerComponent.prototype.from;
/** @type {?} */
AngularIoPagerComponent.prototype.to;
/** @type {?} */
AngularIoPagerComponent.prototype.pageLength;
/** @type {?} */
AngularIoPagerComponent.prototype.currentPage;
/** @type {?} */
AngularIoPagerComponent.prototype.pages;
/** @type {?} */
AngularIoPagerComponent.prototype.pageNum;
/** @type {?} */
AngularIoPagerComponent.prototype.showLeftNav;
/** @type {?} */
AngularIoPagerComponent.prototype.showRightNav;
/** @type {?} */
AngularIoPagerComponent.prototype.totalPageLength;
/** @type {?} */
AngularIoPagerComponent.prototype.leftNavString;
/** @type {?} */
AngularIoPagerComponent.prototype.rightNavString;
/** @type {?} */
AngularIoPagerComponent.prototype.lastPageMax;
/** @type {?} */
AngularIoPagerComponent.prototype.lastPageMin;
/** @type {?} */
AngularIoPagerComponent.prototype._total;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1pby1wYWdlci8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLWlvLXBhZ2VyL3BhZ2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7O0lBaUU3RTt1QkFyQ1UsRUFBRTtrQkFFUCxDQUFDO3lCQUVNLEVBQUU7eUJBZW9CLElBQUksWUFBWSxFQUFFOztvQkFHN0MsQ0FBQztrQkFDSCxDQUFDOzBCQUNPLEVBQUU7MkJBQ0QsQ0FBQztxQkFDRyxFQUFFO3VCQUNBLEVBQUU7MkJBQ1IsS0FBSzs0QkFDSixLQUFLOytCQUNGLENBQUM7NkJBQ0gsSUFBSTs4QkFDSCxJQUFJOzJCQUNQLENBQUM7MkJBQ0QsQ0FBQztzQkFDTixDQUFDO0tBRU07SUFoQ2hCLHNCQUNXLGlEQUFZOzs7OztZQVNyQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7O1FBVnJCLFVBQ3dCLEtBQWE7WUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFFcEIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7OztPQUFBOzs7O0lBMkJELDBDQUFROzs7SUFBUjtRQUNFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7UUFFRCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FB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QUFFLGcyQkFtQkw7b0JBQ0wsTUFBTSxFQUFFLENBQUMsZ29CQUFnb0IsQ0FBQztpQkFDM29COzs7OzswQkFFRSxLQUFLO3FCQUVMLEtBQUs7NEJBRUwsS0FBSzsrQkFFTCxLQUFLOzRCQWFMLE1BQU07O2tDQTlDVDs7U0EwQmEsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzci1hbmd1bGFyLWlvLXBhZ2VyJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGFnZXJcIiBbbmdDbGFzc109XCJ7J2hpZGRlbic6IHRvdGFsUmVjb3JkcyA8PSAwfVwiIFtpZF09XCIncGFnZXInICsgaWRcIj5cbiAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgIFNob3dcbiAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJwYWdlR2FwXCIgKGNoYW5nZSk9XCJwYWdlTGVuZ3RoQ2hhbmdlKClcIlxuICAgICAgICAgIGlkPVwicGFnZUdhcFwiPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHBnIG9mIHBhZ2VzXCIgW3ZhbHVlXT1cInBnXCI+e3twZ319PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICAgIFNob3dpbmcge3tmcm9tfX0te3t0b319IG9mIHt7dG90YWxSZWNvcmRzfX1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgPHVsIGNsYXNzPVwicGFnZU51bWJlcnNcIiBpZD1cInBhZ2VMaXN0XCI+XG4gICAgICAgICAgPGxpICpuZ0lmPVwic2hvd0xlZnROYXZcIiAoY2xpY2spPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbWRMZWZ0XCI+IHt7bGVmdE5hdlN0cmluZ319IDwvbGk+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBwbiBvZiBwYWdlTnVtXCIgKGNsaWNrKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicGFnZUVsZW1lbnRzXCI+e3twbn19PC9saT5cbiAgICAgICAgICA8bGkgKm5nSWY9XCJzaG93UmlnaHROYXZcIiAoY2xpY2spPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbWRSaWdodFwiPiB7e3JpZ2h0TmF2U3RyaW5nfX0gPC9saT5cbiAgICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9kaXY+YCxcbiAgc3R5bGVzOiBbYC5wYWdlcntmb250OmJvbGQgMTNweCBBcmlhbDtjb2xvcjojMzc3YmJhfS5wYWdlTnVtYmVyc3tsaXN0LXN0eWxlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZGZkZmRmO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctbGVmdDowO21hcmdpbjowfS5wYWdlTnVtYmVycyBsaXtmbG9hdDpsZWZ0O3BhZGRpbmc6OHB4IDEwcHg7YmFja2dyb3VuZDojZmZmO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZGZkZmRmO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtjb2xvcjojMzc3YmJhO2N1cnNvcjpwb2ludGVyO21pbi13aWR0aDoxNXB4O3RleHQtYWxpZ246Y2VudGVyfS5wYWdlTnVtYmVycyBsaS5zZWxlY3RlZHtiYWNrZ3JvdW5kOiMzNzdiYmE7Y29sb3I6I2ZmZn0ucGFnZU51bWJlcnMgbGk6Zmlyc3Qtb2YtdHlwZXtib3JkZXItbGVmdDowfS5wYWdlTnVtYmVycyBsaTpob3ZlcntiYWNrZ3JvdW5kOiMzYTQwNDY7Y29sb3I6I2ZmZn1kaXYubGVmdHtwYWRkaW5nOjlweCAwfXNlbGVjdHtjb2xvcjojMzc3YmJhO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6LjllbTtwYWRkaW5nOjJweDtib3JkZXI6MXB4IHNvbGlkICMzNzdiYmF9LmxlZnR7ZmxvYXQ6bGVmdH0ucmlnaHR7ZmxvYXQ6cmlnaHR9LmhpZGRlbntkaXNwbGF5Om5vbmV9YF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhcklvUGFnZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwYWdlR2FwID0gMTA7XG4gIEBJbnB1dCgpXG4gIGlkID0gMTtcbiAgQElucHV0KClcbiAgbm9PZlBhZ2VzID0gMTA7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90b3RhbCA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlID4gMCkge1xuICAgICAgdGhpcy5wYWdlUHJlcGFyYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBwYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjxvYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIHBhZ2UgdmlldyBjb3VudCBzZWxlY3RvcnNcbiAgZnJvbSA9IDE7XG4gIHRvID0gMDtcbiAgcGFnZUxlbmd0aCA9IDIwO1xuICBjdXJyZW50UGFnZSA9IDE7XG4gIHBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuICBwYWdlTnVtOiBudW1iZXJbXSA9IFtdO1xuICBzaG93TGVmdE5hdiA9IGZhbHNlO1xuICBzaG93UmlnaHROYXYgPSBmYWxzZTtcbiAgdG90YWxQYWdlTGVuZ3RoID0gMDtcbiAgbGVmdE5hdlN0cmluZyA9ICc8PCc7XG4gIHJpZ2h0TmF2U3RyaW5nID0gJz4+JztcbiAgbGFzdFBhZ2VNYXggPSAwO1xuICBsYXN0UGFnZU1pbiA9IDA7XG4gIF90b3RhbCA9IDA7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMucGFnZUxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzLnB1c2goaSAqIHRoaXMucGFnZUdhcCk7XG4gICAgfVxuXG4gICAgdGhpcy50byA9IHRoaXMucGFnZXNbMF07XG4gIH1cblxuICBwYWdlUHJlcGFyYXRpb24oKSB7XG4gICAgdGhpcy5yZUNhbGN1bGF0ZVBhZ2VOdW1iZXJzKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRQYWdlKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZUNhbGN1bGF0ZVBhZ2VOdW1iZXJzKCkge1xuICAgIGNvbnN0IGRpdmlkZWQgPSAodGhpcy50b3RhbFJlY29yZHMgLyB0aGlzLnBhZ2VHYXApLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCB3aG9sZVBhZ2VMZW4gPSBwYXJzZUludChkaXZpZGVkWzBdLCAxMCk7XG4gICAgbGV0IHBhcnRpYWxQYWdlTGVuID0gMDtcbiAgICBpZiAoZGl2aWRlZC5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIGhhcyBvbmUgbW9yZSBwYWdlIHdpdGggbGltaXRlZCByZWNvcmRzXG4gICAgICBwYXJ0aWFsUGFnZUxlbiA9IDE7XG4gICAgfVxuXG4gICAgdGhpcy50b3RhbFBhZ2VMZW5ndGggPSB3aG9sZVBhZ2VMZW4gKyBwYXJ0aWFsUGFnZUxlbjtcbiAgICB0aGlzLnBhZ2VOdW0ubGVuZ3RoID0gMDtcbiAgICB0aGlzLnBvcHVsYXRlUGFnZXMoMSk7XG4gIH1cblxuICBwb3B1bGF0ZVBhZ2VzKHN0YXJ0OiBudW1iZXIpIHtcbiAgICBsZXQgdW50aWwgPSAxO1xuICAgIHRoaXMucGFnZU51bS5sZW5ndGggPSAwO1xuXG4gICAgZm9yIChcbiAgICAgIGxldCBpID0gc3RhcnQ7XG4gICAgICBpIDw9IHRoaXMudG90YWxQYWdlTGVuZ3RoICYmIHVudGlsIDw9IHRoaXMubm9PZlBhZ2VzO1xuICAgICAgaSsrXG4gICAgKSB7XG4gICAgICB0aGlzLnBhZ2VOdW0ucHVzaChpKTtcbiAgICAgIHVudGlsKys7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMubGFzdFBhZ2VNaW4gPSBNYXRoLm1pbiguLi50aGlzLnBhZ2VOdW0pO1xuICAgIHRoaXMubGFzdFBhZ2VNYXggPSBNYXRoLm1heCguLi50aGlzLnBhZ2VOdW0pO1xuICAgIHRoaXMuc2V0UHJldk5leHROYXYoKTtcbiAgfVxuXG4gIHBhZ2VMZW5ndGhDaGFuZ2UoKSB7XG4gICAgdGhpcy5yZUNhbGN1bGF0ZVBhZ2VOdW1iZXJzKCk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFBhZ2UoKTtcbiAgfVxuXG4gIHBhZ2VDaGFuZ2UoZSkge1xuICAgIGlmIChlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2NtZExlZnQnKSkge1xuICAgICAgdGhpcy5wb3B1bGF0ZVBhZ2VzKHRoaXMubGFzdFBhZ2VNaW4gLSB0aGlzLm5vT2ZQYWdlcyk7XG4gICAgICB0aGlzLnNldFNlbGVjdGVkUGFnZSgpO1xuICAgIH0gZWxzZSBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbWRSaWdodCcpKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlUGFnZXMoKyt0aGlzLmxhc3RQYWdlTWF4KTtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRQYWdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRQYWdlKGUudGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3RlZFBhZ2UoZWw6IEhUTUxFbGVtZW50ID0gbnVsbCkge1xuICAgIGlmIChlbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQoZWwuaW5uZXJUZXh0LCAxMCk7XG4gICAgfVxuICAgIHRoaXMudG8gPSBNYXRoLm1pbih0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlR2FwLCB0aGlzLnRvdGFsUmVjb3Jkcyk7XG4gICAgdGhpcy5mcm9tID0gdGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucGFnZUdhcCAtIHRoaXMucGFnZUdhcCArIDE7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVsID0gPEhUTUxFbGVtZW50PihcbiAgICAgICAgKGVsID09IG51bGxcbiAgICAgICAgICA/IGRvY3VtZW50XG4gICAgICAgICAgICAgIC5nZXRFbGVtZW50QnlJZCgncGFnZXInICsgdGhpcy5pZClcbiAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5wYWdlRWxlbWVudHMnKVxuICAgICAgICAgIDogZWwpXG4gICAgICApO1xuXG4gICAgICBsZXQgY2xvc2VQYWdlTnVtID0gZWw7XG4gICAgICB3aGlsZSAoXG4gICAgICAgIChjbG9zZVBhZ2VOdW0gPSBjbG9zZVBhZ2VOdW0ucGFyZW50RWxlbWVudCkgJiZcbiAgICAgICAgIWNsb3NlUGFnZU51bS5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2VOdW1iZXJzJylcbiAgICAgICkge31cblxuICAgICAgQXJyYXkuZnJvbShjbG9zZVBhZ2VOdW0uY2hpbGRyZW4pLmZvckVhY2goeCA9PlxuICAgICAgICB4LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJylcbiAgICAgICk7XG5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLmVtaXRQYWdlQ2xpY2soKTtcbiAgfVxuXG4gIHNldFByZXZOZXh0TmF2KCkge1xuICAgIHRoaXMuc2hvd0xlZnROYXYgPSB0aGlzLnNob3dSaWdodE5hdiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy5ub09mUGFnZXMpIHtcbiAgICAgIC8vIGN1cnJlbnQgcGFnZSBpcyBvdXQgb2YgbWF4aW11bSBwYWdlcyBjYW4gYmUgc2hvd24sIGl0IG1lYW5zIGl0IGlzIG5vdCB0aGUgZmlyc3Qgc2V0IG9mIHBhZ2UgbnVtYmVycy4gc2hvdyBsZWZ0XG4gICAgICB0aGlzLnNob3dMZWZ0TmF2ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBnZXQgd2hldGhlciBwYWdlIGlzIG5vdCBhIG11bHRpcGxlIG9mIFBhZ2VzVG9TaG93XG4gICAgY29uc3QgY3VycmVudFBhZ2VJc0luQmV0d2VlbiA9XG4gICAgICAodGhpcy5jdXJyZW50UGFnZSAvIHRoaXMubm9PZlBhZ2VzKS50b1N0cmluZygpLnNwbGl0KCcuJylcbiAgICAgICAgLmxlbmd0aCA9PT0gMjtcblxuICAgIC8vIGdldCBoaWdoZXN0IHBhZ2UgbnVtYmVyIGluIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAvLyBmb3JtdWxhIHVzZWQgPSBjdXJyZW50IHBhZ2UgZGl2aWRlZCB3aXRoIG1heFBhZ2V0b1Nob3csIGlmIGZvdW5kIHJlbWFpbmRlcixcbiAgICAvLyBwYWdlIG1pZ2h0IGhhdmUgdXBjb21pbmcgcGFnZSBsaW5rcywgc28gZmluZGluZyBsYXJnZXN0IHBhZ2UgbnVtYmVyIGluIHRoYXQgcGFnZS5cbiAgICAvLyBleC4gaWYgdGhlIGJhc2Ugc2hvd2luZyBpcyA0MCBpbiB0aGUgY2FzZSBvZiAxMCBhcyB0aGUgcGFnZSBsZW5ndGguXG4gICAgLy8gbm93IDQwIGlzIHRoZSBoaWdoZXN0IHBhZ2Ugc2hvd2luZywgaWYgNDIgdGhlbiA1MCBpcyB0aGUgaGlnaGVzdCBwYWdlIHNob3dpbmcuXG5cbiAgICBjb25zdCBjdXJySGlnaGVzdFBhZ2VTaG93aW5nID1cbiAgICAgIHBhcnNlSW50KCh0aGlzLmN1cnJlbnRQYWdlIC8gdGhpcy5ub09mUGFnZXMpLnRvU3RyaW5nKCksIDEwKSAqXG4gICAgICAgIHRoaXMubm9PZlBhZ2VzICtcbiAgICAgIChjdXJyZW50UGFnZUlzSW5CZXR3ZWVuID8gdGhpcy5ub09mUGFnZXMgOiAwKTtcblxuICAgIGlmIChjdXJySGlnaGVzdFBhZ2VTaG93aW5nIDwgdGhpcy50b3RhbFBhZ2VMZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvd1JpZ2h0TmF2ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBlbWl0UGFnZUNsaWNrKCkge1xuICAgIHRoaXMucGFnZUNsaWNrLmVtaXQoeyBmcm9tOiB0aGlzLmZyb20sIHRvOiB0aGlzLnRvIH0pO1xuICB9XG59XG4iXX0=