angular-io-pager
Version:
239 lines (233 loc) • 22.4 kB
JavaScript
import { Component, Input, Output, EventEmitter, NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class AngularIoPagerComponent {
constructor() {
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;
}
/**
* @param {?} value
* @return {?}
*/
set totalRecords(value) {
this._total = value;
if (value > 0) {
this.pagePreparation();
}
}
/**
* @return {?}
*/
get totalRecords() {
return this._total;
}
/**
* @return {?}
*/
ngOnInit() {
for (let i = 1; i <= this.pageLength; i++) {
this.pages.push(i * this.pageGap);
}
this.to = this.pages[0];
}
/**
* @return {?}
*/
pagePreparation() {
this.reCalculatePageNumbers();
setTimeout(() => {
this.setSelectedPage();
}, 0);
}
/**
* @return {?}
*/
reCalculatePageNumbers() {
/** @type {?} */
const divided = (this.totalRecords / this.pageGap).toString().split('.');
/** @type {?} */
const wholePageLen = parseInt(divided[0], 10);
/** @type {?} */
let 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 {?}
*/
populatePages(start) {
/** @type {?} */
let until = 1;
this.pageNum.length = 0;
for (let i = start; i <= this.totalPageLength && until <= this.noOfPages; i++) {
this.pageNum.push(i);
until++;
}
this.currentPage = this.lastPageMin = Math.min(...this.pageNum);
this.lastPageMax = Math.max(...this.pageNum);
this.setPrevNextNav();
}
/**
* @return {?}
*/
pageLengthChange() {
this.reCalculatePageNumbers();
this.setSelectedPage();
}
/**
* @param {?} e
* @return {?}
*/
pageChange(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 {?}
*/
setSelectedPage(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(() => {
el = /** @type {?} */ (((el == null
? document
.getElementById('pager' + this.id)
.querySelector('.pageElements')
: el)));
/** @type {?} */
let closePageNum = el;
while ((closePageNum = closePageNum.parentElement) &&
!closePageNum.classList.contains('pageNumbers')) { }
Array.from(closePageNum.children).forEach(x => x.classList.remove('selected'));
el.classList.add('selected');
}, 0);
this.emitPageClick();
}
/**
* @return {?}
*/
setPrevNextNav() {
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 {?} */
const currentPageIsInBetween = (this.currentPage / this.noOfPages).toString().split('.')
.length === 2;
/** @type {?} */
const currHighestPageShowing = parseInt((this.currentPage / this.noOfPages).toString(), 10) *
this.noOfPages +
(currentPageIsInBetween ? this.noOfPages : 0);
if (currHighestPageShowing < this.totalPageLength) {
this.showRightNav = true;
}
}
/**
* @return {?}
*/
emitPageClick() {
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">
<div class="left">
Show
<select [(ngModel)]="pageGap" (change)="pageLengthChange()"
id="pageGap">
<option *ngFor="let pg of pages" [value]="pg">{{pg}}</option>
</select>
Showing {{from}}-{{to}} of {{totalRecords}}
</div>
<div class="right">
<ul class="pageNumbers" id="pageList">
<li *ngIf="showLeftNav" (click)="pageChange($event)"
class="cmdLeft"> {{leftNavString}} </li>
<li *ngFor="let pn of pageNum" (click)="pageChange($event)"
class="pageElements">{{pn}}</li>
<li *ngIf="showRightNav" (click)="pageChange($event)"
class="cmdRight"> {{rightNavString}} </li>
</ul>
</div>
</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 = () => [];
AngularIoPagerComponent.propDecorators = {
pageGap: [{ type: Input }],
id: [{ type: Input }],
noOfPages: [{ type: Input }],
totalRecords: [{ type: Input }],
pageClick: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class AngularIoPagerModule {
}
AngularIoPagerModule.decorators = [
{ type: NgModule, args: [{
imports: [
FormsModule, BrowserModule
],
declarations: [AngularIoPagerComponent],
exports: [AngularIoPagerComponent]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { AngularIoPagerModule, AngularIoPagerComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1pby1wYWdlci5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vYW5ndWxhci1pby1wYWdlci9saWIvYW5ndWxhci1pby1wYWdlci9wYWdlci5jb21wb25lbnQudHMiLCJuZzovL2FuZ3VsYXItaW8tcGFnZXIvbGliL2FuZ3VsYXItaW8tcGFnZXIubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3ItYW5ndWxhci1pby1wYWdlcicsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBhZ2VyXCIgW25nQ2xhc3NdPVwieydoaWRkZW4nOiB0b3RhbFJlY29yZHMgPD0gMH1cIiBbaWRdPVwiJ3BhZ2VyJyArIGlkXCI+XG4gIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICBTaG93XG4gICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwicGFnZUdhcFwiIChjaGFuZ2UpPVwicGFnZUxlbmd0aENoYW5nZSgpXCJcbiAgICAgICAgICBpZD1cInBhZ2VHYXBcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBwZyBvZiBwYWdlc1wiIFt2YWx1ZV09XCJwZ1wiPnt7cGd9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgICBTaG93aW5nIHt7ZnJvbX19LXt7dG99fSBvZiB7e3RvdGFsUmVjb3Jkc319XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgIDx1bCBjbGFzcz1cInBhZ2VOdW1iZXJzXCIgaWQ9XCJwYWdlTGlzdFwiPlxuICAgICAgICAgIDxsaSAqbmdJZj1cInNob3dMZWZ0TmF2XCIgKGNsaWNrKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY21kTGVmdFwiPiB7e2xlZnROYXZTdHJpbmd9fSA8L2xpPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgcG4gb2YgcGFnZU51bVwiIChjbGljayk9XCJwYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInBhZ2VFbGVtZW50c1wiPnt7cG59fTwvbGk+XG4gICAgICAgICAgPGxpICpuZ0lmPVwic2hvd1JpZ2h0TmF2XCIgKGNsaWNrKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY21kUmlnaHRcIj4ge3tyaWdodE5hdlN0cmluZ319IDwvbGk+XG4gICAgICA8L3VsPlxuICA8L2Rpdj5cbjwvZGl2PmAsXG4gIHN0eWxlczogW2AucGFnZXJ7Zm9udDpib2xkIDEzcHggQXJpYWw7Y29sb3I6IzM3N2JiYX0ucGFnZU51bWJlcnN7bGlzdC1zdHlsZTpub25lO2JvcmRlcjoxcHggc29saWQgI2RmZGZkZjtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nLWxlZnQ6MDttYXJnaW46MH0ucGFnZU51bWJlcnMgbGl7ZmxvYXQ6bGVmdDtwYWRkaW5nOjhweCAxMHB4O2JhY2tncm91bmQ6I2ZmZjtib3JkZXItbGVmdDoxcHggc29saWQgI2RmZGZkZjtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Y29sb3I6IzM3N2JiYTtjdXJzb3I6cG9pbnRlcjttaW4td2lkdGg6MTVweDt0ZXh0LWFsaWduOmNlbnRlcn0ucGFnZU51bWJlcnMgbGkuc2VsZWN0ZWR7YmFja2dyb3VuZDojMzc3YmJhO2NvbG9yOiNmZmZ9LnBhZ2VOdW1iZXJzIGxpOmZpcnN0LW9mLXR5cGV7Ym9yZGVyLWxlZnQ6MH0ucGFnZU51bWJlcnMgbGk6aG92ZXJ7YmFja2dyb3VuZDojM2E0MDQ2O2NvbG9yOiNmZmZ9ZGl2LmxlZnR7cGFkZGluZzo5cHggMH1zZWxlY3R7Y29sb3I6IzM3N2JiYTtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOi45ZW07cGFkZGluZzoycHg7Ym9yZGVyOjFweCBzb2xpZCAjMzc3YmJhfS5sZWZ0e2Zsb2F0OmxlZnR9LnJpZ2h0e2Zsb2F0OnJpZ2h0fS5oaWRkZW57ZGlzcGxheTpub25lfWBdXG59KVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJJb1BhZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcGFnZUdhcCA9IDEwO1xuICBASW5wdXQoKVxuICBpZCA9IDE7XG4gIEBJbnB1dCgpXG4gIG5vT2ZQYWdlcyA9IDEwO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHRvdGFsUmVjb3Jkcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdG90YWwgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgIHRoaXMucGFnZVByZXBhcmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB0b3RhbFJlY29yZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWw7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgcGFnZUNsaWNrOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyBwYWdlIHZpZXcgY291bnQgc2VsZWN0b3JzXG4gIGZyb20gPSAxO1xuICB0byA9IDA7XG4gIHBhZ2VMZW5ndGggPSAyMDtcbiAgY3VycmVudFBhZ2UgPSAxO1xuICBwYWdlczogbnVtYmVyW10gPSBbXTtcbiAgcGFnZU51bTogbnVtYmVyW10gPSBbXTtcbiAgc2hvd0xlZnROYXYgPSBmYWxzZTtcbiAgc2hvd1JpZ2h0TmF2ID0gZmFsc2U7XG4gIHRvdGFsUGFnZUxlbmd0aCA9IDA7XG4gIGxlZnROYXZTdHJpbmcgPSAnPDwnO1xuICByaWdodE5hdlN0cmluZyA9ICc+Pic7XG4gIGxhc3RQYWdlTWF4ID0gMDtcbiAgbGFzdFBhZ2VNaW4gPSAwO1xuICBfdG90YWwgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLnBhZ2VMZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlcy5wdXNoKGkgKiB0aGlzLnBhZ2VHYXApO1xuICAgIH1cblxuICAgIHRoaXMudG8gPSB0aGlzLnBhZ2VzWzBdO1xuICB9XG5cbiAgcGFnZVByZXBhcmF0aW9uKCkge1xuICAgIHRoaXMucmVDYWxjdWxhdGVQYWdlTnVtYmVycygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNldFNlbGVjdGVkUGFnZSgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcmVDYWxjdWxhdGVQYWdlTnVtYmVycygpIHtcbiAgICBjb25zdCBkaXZpZGVkID0gKHRoaXMudG90YWxSZWNvcmRzIC8gdGhpcy5wYWdlR2FwKS50b1N0cmluZygpLnNwbGl0KCcuJyk7XG4gICAgY29uc3Qgd2hvbGVQYWdlTGVuID0gcGFyc2VJbnQoZGl2aWRlZFswXSwgMTApO1xuICAgIGxldCBwYXJ0aWFsUGFnZUxlbiA9IDA7XG4gICAgaWYgKGRpdmlkZWQubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBoYXMgb25lIG1vcmUgcGFnZSB3aXRoIGxpbWl0ZWQgcmVjb3Jkc1xuICAgICAgcGFydGlhbFBhZ2VMZW4gPSAxO1xuICAgIH1cblxuICAgIHRoaXMudG90YWxQYWdlTGVuZ3RoID0gd2hvbGVQYWdlTGVuICsgcGFydGlhbFBhZ2VMZW47XG4gICAgdGhpcy5wYWdlTnVtLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wb3B1bGF0ZVBhZ2VzKDEpO1xuICB9XG5cbiAgcG9wdWxhdGVQYWdlcyhzdGFydDogbnVtYmVyKSB7XG4gICAgbGV0IHVudGlsID0gMTtcbiAgICB0aGlzLnBhZ2VOdW0ubGVuZ3RoID0gMDtcblxuICAgIGZvciAoXG4gICAgICBsZXQgaSA9IHN0YXJ0O1xuICAgICAgaSA8PSB0aGlzLnRvdGFsUGFnZUxlbmd0aCAmJiB1bnRpbCA8PSB0aGlzLm5vT2ZQYWdlcztcbiAgICAgIGkrK1xuICAgICkge1xuICAgICAgdGhpcy5wYWdlTnVtLnB1c2goaSk7XG4gICAgICB1bnRpbCsrO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmxhc3RQYWdlTWluID0gTWF0aC5taW4oLi4udGhpcy5wYWdlTnVtKTtcbiAgICB0aGlzLmxhc3RQYWdlTWF4ID0gTWF0aC5tYXgoLi4udGhpcy5wYWdlTnVtKTtcbiAgICB0aGlzLnNldFByZXZOZXh0TmF2KCk7XG4gIH1cblxuICBwYWdlTGVuZ3RoQ2hhbmdlKCkge1xuICAgIHRoaXMucmVDYWxjdWxhdGVQYWdlTnVtYmVycygpO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWRQYWdlKCk7XG4gIH1cblxuICBwYWdlQ2hhbmdlKGUpIHtcbiAgICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbWRMZWZ0JykpIHtcbiAgICAgIHRoaXMucG9wdWxhdGVQYWdlcyh0aGlzLmxhc3RQYWdlTWluIC0gdGhpcy5ub09mUGFnZXMpO1xuICAgICAgdGhpcy5zZXRTZWxlY3RlZFBhZ2UoKTtcbiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnY21kUmlnaHQnKSkge1xuICAgICAgdGhpcy5wb3B1bGF0ZVBhZ2VzKCsrdGhpcy5sYXN0UGFnZU1heCk7XG4gICAgICB0aGlzLnNldFNlbGVjdGVkUGFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFNlbGVjdGVkUGFnZShlLnRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U2VsZWN0ZWRQYWdlKGVsOiBIVE1MRWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAoZWwgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhcnNlSW50KGVsLmlubmVyVGV4dCwgMTApO1xuICAgIH1cbiAgICB0aGlzLnRvID0gTWF0aC5taW4odGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucGFnZUdhcCwgdGhpcy50b3RhbFJlY29yZHMpO1xuICAgIHRoaXMuZnJvbSA9IHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VHYXAgLSB0aGlzLnBhZ2VHYXAgKyAxO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBlbCA9IDxIVE1MRWxlbWVudD4oXG4gICAgICAgIChlbCA9PSBudWxsXG4gICAgICAgICAgPyBkb2N1bWVudFxuICAgICAgICAgICAgICAuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2VyJyArIHRoaXMuaWQpXG4gICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcucGFnZUVsZW1lbnRzJylcbiAgICAgICAgICA6IGVsKVxuICAgICAgKTtcblxuICAgICAgbGV0IGNsb3NlUGFnZU51bSA9IGVsO1xuICAgICAgd2hpbGUgKFxuICAgICAgICAoY2xvc2VQYWdlTnVtID0gY2xvc2VQYWdlTnVtLnBhcmVudEVsZW1lbnQpICYmXG4gICAgICAgICFjbG9zZVBhZ2VOdW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdwYWdlTnVtYmVycycpXG4gICAgICApIHt9XG5cbiAgICAgIEFycmF5LmZyb20oY2xvc2VQYWdlTnVtLmNoaWxkcmVuKS5mb3JFYWNoKHggPT5cbiAgICAgICAgeC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpXG4gICAgICApO1xuXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIH0sIDApO1xuXG4gICAgdGhpcy5lbWl0UGFnZUNsaWNrKCk7XG4gIH1cblxuICBzZXRQcmV2TmV4dE5hdigpIHtcbiAgICB0aGlzLnNob3dMZWZ0TmF2ID0gdGhpcy5zaG93UmlnaHROYXYgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IHRoaXMubm9PZlBhZ2VzKSB7XG4gICAgICAvLyBjdXJyZW50IHBhZ2UgaXMgb3V0IG9mIG1heGltdW0gcGFnZXMgY2FuIGJlIHNob3duLCBpdCBtZWFucyBpdCBpcyBub3QgdGhlIGZpcnN0IHNldCBvZiBwYWdlIG51bWJlcnMuIHNob3cgbGVmdFxuICAgICAgdGhpcy5zaG93TGVmdE5hdiA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHdoZXRoZXIgcGFnZSBpcyBub3QgYSBtdWx0aXBsZSBvZiBQYWdlc1RvU2hvd1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlSXNJbkJldHdlZW4gPVxuICAgICAgKHRoaXMuY3VycmVudFBhZ2UgLyB0aGlzLm5vT2ZQYWdlcykudG9TdHJpbmcoKS5zcGxpdCgnLicpXG4gICAgICAgIC5sZW5ndGggPT09IDI7XG5cbiAgICAvLyBnZXQgaGlnaGVzdCBwYWdlIG51bWJlciBpbiB0aGUgY3VycmVudCBwYWdlXG4gICAgLy8gZm9ybXVsYSB1c2VkID0gY3VycmVudCBwYWdlIGRpdmlkZWQgd2l0aCBtYXhQYWdldG9TaG93LCBpZiBmb3VuZCByZW1haW5kZXIsXG4gICAgLy8gcGFnZSBtaWdodCBoYXZlIHVwY29taW5nIHBhZ2UgbGlua3MsIHNvIGZpbmRpbmcgbGFyZ2VzdCBwYWdlIG51bWJlciBpbiB0aGF0IHBhZ2UuXG4gICAgLy8gZXguIGlmIHRoZSBiYXNlIHNob3dpbmcgaXMgNDAgaW4gdGhlIGNhc2Ugb2YgMTAgYXMgdGhlIHBhZ2UgbGVuZ3RoLlxuICAgIC8vIG5vdyA0MCBpcyB0aGUgaGlnaGVzdCBwYWdlIHNob3dpbmcsIGlmIDQyIHRoZW4gNTAgaXMgdGhlIGhpZ2hlc3QgcGFnZSBzaG93aW5nLlxuXG4gICAgY29uc3QgY3VyckhpZ2hlc3RQYWdlU2hvd2luZyA9XG4gICAgICBwYXJzZUludCgodGhpcy5jdXJyZW50UGFnZSAvIHRoaXMubm9PZlBhZ2VzKS50b1N0cmluZygpLCAxMCkgKlxuICAgICAgICB0aGlzLm5vT2ZQYWdlcyArXG4gICAgICAoY3VycmVudFBhZ2VJc0luQmV0d2VlbiA/IHRoaXMubm9PZlBhZ2VzIDogMCk7XG5cbiAgICBpZiAoY3VyckhpZ2hlc3RQYWdlU2hvd2luZyA8IHRoaXMudG90YWxQYWdlTGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3dSaWdodE5hdiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZW1pdFBhZ2VDbGljaygpIHtcbiAgICB0aGlzLnBhZ2VDbGljay5lbWl0KHsgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZ3VsYXJJb1BhZ2VyQ29tcG9uZW50IH0gZnJvbSAnLi9hbmd1bGFyLWlvLXBhZ2VyL3BhZ2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLCBCcm93c2VyTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW0FuZ3VsYXJJb1BhZ2VyQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0FuZ3VsYXJJb1BhZ2VyQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFySW9QYWdlck1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0lBaUVFO3VCQXJDVSxFQUFFO2tCQUVQLENBQUM7eUJBRU0sRUFBRTt5QkFlb0IsSUFBSSxZQUFZLEVBQUU7O29CQUc3QyxDQUFDO2tCQUNILENBQUM7MEJBQ08sRUFBRTsyQkFDRCxDQUFDO3FCQUNHLEVBQUU7dUJBQ0EsRUFBRTsyQkFDUixLQUFLOzRCQUNKLEtBQUs7K0JBQ0YsQ0FBQzs2QkFDSCxJQUFJOzhCQUNILElBQUk7MkJBQ1AsQ0FBQzsyQkFDRCxDQUFDO3NCQUNOLENBQUM7S0FFTTs7Ozs7SUFoQ2hCLElBQ1csWUFBWSxDQUFDLEtBQWE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0tBQ0Y7Ozs7UUFFVSxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7SUF3QnJCLFFBQVE7UUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3pCOzs7O0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLFVBQVUsQ0FBQztZQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QixFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ1A7Ozs7SUFFRCxzQkFBc0I7O1FBQ3BCLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7UUFDekUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzs7UUFDOUMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O1lBRXhCLGNBQWMsR0FBRyxDQUFDLENBQUM7U0FDcEI7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksR0FBRyxjQUFjLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7Ozs7O0lBRUQsYUFBYSxDQUFDLEtBQWE7O1FBQ3pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUV4QixLQUNFLElBQUksQ0FBQyxHQUFHLEtBQUssRUFDYixDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFDcEQsQ0FBQyxFQUFFLEVBQ0g7WUFDQSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixLQUFLLEVBQUUsQ0FBQztTQUNUO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztLQUN2Qjs7OztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztLQUN4Qjs7Ozs7SUFFRCxVQUFVLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO2FBQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO0tBQ0Y7Ozs7O0lBRUQsZUFBZSxDQUFDLEtBQWtCLElBQUk7UUFDcEMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMvQztRQUNELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBRS9ELFVBQVUsQ0FBQztZQUNULEVBQUUsdUJBQ0MsRUFBRSxJQUFJLElBQUk7a0JBQ1AsUUFBUTtxQkFDTCxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7cUJBQ2pDLGFBQWEsQ0FBQyxlQUFlLENBQUM7a0JBQ2pDLEVBQUUsR0FDUCxDQUFDOztZQUVGLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN0QixPQUNFLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxhQUFhO2dCQUMxQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUMvQyxHQUFFO1lBRUosS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFDekMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQy9CLENBQUM7WUFFRixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM5QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQ3RCOzs7O0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7O1lBRXJDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3pCOztRQUdELE1BQU0sc0JBQXNCLEdBQzFCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDdEQsTUFBTSxLQUFLLENBQUMsQ0FBQzs7UUFRbEIsTUFBTSxzQkFBc0IsR0FDMUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsU0FBUzthQUNmLHNCQUFzQixHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFaEQsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO0tBQ0Y7Ozs7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDdkQ7OztZQWhNRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJMO2dCQUNMLE1BQU0sRUFBRSxDQUFDLGdvQkFBZ29CLENBQUM7YUFDM29COzs7OztzQkFFRSxLQUFLO2lCQUVMLEtBQUs7d0JBRUwsS0FBSzsyQkFFTCxLQUFLO3dCQWFMLE1BQU07Ozs7Ozs7QUM5Q1Q7OztZQUtDLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUU7b0JBQ1AsV0FBVyxFQUFFLGFBQWE7aUJBQzNCO2dCQUNELFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO2dCQUN2QyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQzthQUNuQzs7Ozs7Ozs7Ozs7Ozs7OyJ9