@hxui/angular
Version:
* * *
490 lines • 39.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, Input, Output, Renderer2, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { PaginationConfig } from './pagination.config';
/**
* @record
*/
export function PageChangedEvent() { }
if (false) {
/** @type {?} */
PageChangedEvent.prototype.itemsPerPage;
/** @type {?} */
PageChangedEvent.prototype.page;
}
/** @type {?} */
export var PAGINATION_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return PaginationComponent; }),
multi: true
};
/** @type {?} */
var PAGINATION_TEMPLATE = "\n <ul class=\"hx-pagination\" [ngClass]=\"classMap\" [class.is-sticky]=\"sticky\">\n <li class=\"is-first\"\n *ngIf=\"boundaryLinks\"\n [class.is-disabled]=\"noPrevious()||disabled\">\n <a href (click)=\"selectPage(1, $event)\" [innerHTML]=\"getText('first')\"></a>\n </li>\n\n <li class=\"is-prev\"\n *ngIf=\"directionLinks\"\n [class.is-disabled]=\"noPrevious()||disabled\">\n <a href (click)=\"selectPage(page - 1, $event)\" [innerHTML]=\"getText('previous')\"></a>\n </li>\n\n <li *ngFor=\"let pg of pages\"\n [class.is-current]=\"pg.active\"\n [class.is-disabled]=\"disabled&&!pg.active\">\n <a href (click)=\"selectPage(pg.number, $event)\" [innerHTML]=\"pg.text\"></a>\n </li>\n\n <li class=\"is-next\"\n *ngIf=\"directionLinks\"\n [class.is-disabled]=\"noNext()||disabled\">\n <a class=\"page-link\" href (click)=\"selectPage(page + 1, $event)\" [innerHTML]=\"getText('next')\"></a></li>\n\n <li class=\"is-last\"\n *ngIf=\"boundaryLinks\"\n [class.is-disabled]=\"noNext()||disabled\">\n <a href (click)=\"selectPage(totalPages, $event)\" [innerHTML]=\"getText('last')\"></a></li>\n </ul>\n ";
var PaginationComponent = /** @class */ (function () {
function PaginationComponent(renderer, elementRef, paginationConfig) {
/**
* fired when total pages count changes, $event:number equals to total pages count
*/
this.numPages = new EventEmitter();
/**
* fired when page was changed, $event:{page, itemsPerPage} equals to object with current page index and number of items per page
*/
this.pageChanged = new EventEmitter();
this.onChange = Function.prototype;
this.onTouched = Function.prototype;
this.inited = false;
this._page = 1;
this.renderer = renderer;
this.elementRef = elementRef;
if (!this.config) {
this.configureOptions(paginationConfig.main);
}
}
Object.defineProperty(PaginationComponent.prototype, "itemsPerPage", {
/** maximum number of items per page. If value less than 1 will display all items on one page */
get: /**
* maximum number of items per page. If value less than 1 will display all items on one page
* @return {?}
*/
function () {
return this._itemsPerPage;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._itemsPerPage = v;
this.totalPages = this.calculateTotalPages();
},
enumerable: true,
configurable: true
});
Object.defineProperty(PaginationComponent.prototype, "totalItems", {
/** total number of items in all pages */
get: /**
* total number of items in all pages
* @return {?}
*/
function () {
return this._totalItems;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._totalItems = v;
this.totalPages = this.calculateTotalPages();
},
enumerable: true,
configurable: true
});
Object.defineProperty(PaginationComponent.prototype, "totalPages", {
get: /**
* @return {?}
*/
function () {
return this._totalPages;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._totalPages = v;
this.numPages.emit(v);
if (this.inited) {
this.selectPage(this.page);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(PaginationComponent.prototype, "page", {
get: /**
* @return {?}
*/
function () {
return this._page;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var _previous = this._page;
this._page = (value > this.totalPages) ? this.totalPages : (value || 1);
if (_previous === this._page || typeof _previous === 'undefined') {
return;
}
this.pageChanged.emit({
page: this._page,
itemsPerPage: this.itemsPerPage
});
},
enumerable: true,
configurable: true
});
/**
* @param {?} config
* @return {?}
*/
PaginationComponent.prototype.configureOptions = /**
* @param {?} config
* @return {?}
*/
function (config) {
this.config = Object.assign({}, config);
};
/**
* @return {?}
*/
PaginationComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.classMap = this.elementRef.nativeElement.getAttribute('class') || '';
// watch for maxSize
this.maxSize = typeof this.maxSize !== 'undefined'
? this.maxSize
: this.config.maxSize;
this.rotate = typeof this.rotate !== 'undefined'
? this.rotate
: this.config.rotate;
this.boundaryLinks = typeof this.boundaryLinks !== 'undefined'
? this.boundaryLinks
: this.config.boundaryLinks;
this.directionLinks = typeof this.directionLinks !== 'undefined'
? this.directionLinks
: this.config.directionLinks;
this.pageBtnClass = typeof this.pageBtnClass !== 'undefined'
? this.pageBtnClass
: this.config.pageBtnClass;
// base class
this.itemsPerPage = typeof this.itemsPerPage !== 'undefined'
? this.itemsPerPage
: this.config.itemsPerPage;
this.totalPages = this.calculateTotalPages();
// this class
this.pages = this.getPages(this.page, this.totalPages);
this.inited = true;
};
/**
* @param {?} value
* @return {?}
*/
PaginationComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.page = value;
this.pages = this.getPages(this.page, this.totalPages);
};
/**
* @param {?} key
* @return {?}
*/
PaginationComponent.prototype.getText = /**
* @param {?} key
* @return {?}
*/
function (key) {
return ((/** @type {?} */ (this)))[key + 'Text'] || this.config[key + 'Text'];
};
/**
* @return {?}
*/
PaginationComponent.prototype.noPrevious = /**
* @return {?}
*/
function () {
return this.page === 1;
};
/**
* @return {?}
*/
PaginationComponent.prototype.noNext = /**
* @return {?}
*/
function () {
return this.page === this.totalPages;
};
/**
* @param {?} fn
* @return {?}
*/
PaginationComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
PaginationComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} page
* @param {?=} event
* @return {?}
*/
PaginationComponent.prototype.selectPage = /**
* @param {?} page
* @param {?=} event
* @return {?}
*/
function (page, event) {
if (event) {
event.preventDefault();
}
if (!this.disabled) {
if (event && event.target) {
/** @type {?} */
var target = event.target;
target.blur();
}
this.writeValue(page);
this.onChange(this.page);
}
};
// Create page object used in template
// Create page object used in template
/**
* @param {?} num
* @param {?} text
* @param {?} active
* @return {?}
*/
PaginationComponent.prototype.makePage =
// Create page object used in template
/**
* @param {?} num
* @param {?} text
* @param {?} active
* @return {?}
*/
function (num, text, active) {
return { text: text, number: num, active: active };
};
/**
* @param {?} currentPage
* @param {?} totalPages
* @return {?}
*/
PaginationComponent.prototype.getPages = /**
* @param {?} currentPage
* @param {?} totalPages
* @return {?}
*/
function (currentPage, totalPages) {
/** @type {?} */
var pages = [];
// Default page limits
/** @type {?} */
var startPage = 1;
/** @type {?} */
var endPage = totalPages;
/** @type {?} */
var isMaxSized = typeof this.maxSize !== 'undefined' && this.maxSize < totalPages;
// recompute if maxSize
if (isMaxSized) {
if (this.rotate) {
// Current page is displayed in the middle of the visible ones
startPage = Math.max(currentPage - Math.floor(this.maxSize / 2), 1);
endPage = startPage + this.maxSize - 1;
// Adjust if limit is exceeded
if (endPage > totalPages) {
endPage = totalPages;
startPage = endPage - this.maxSize + 1;
}
}
else {
// Visible pages are paginated with maxSize
startPage = ((Math.ceil(currentPage / this.maxSize) - 1) * this.maxSize) + 1;
// Adjust last page if limit is exceeded
endPage = Math.min(startPage + this.maxSize - 1, totalPages);
}
}
// Add page number links
for (var num = startPage; num <= endPage; num++) {
/** @type {?} */
var page = this.makePage(num, num.toString(), num === currentPage);
pages.push(page);
}
// Add links to move between page sets
if (isMaxSized && !this.rotate) {
if (startPage > 1) {
/** @type {?} */
var previousPageSet = this.makePage(startPage - 1, '...', false);
pages.unshift(previousPageSet);
}
if (endPage < totalPages) {
/** @type {?} */
var nextPageSet = this.makePage(endPage + 1, '...', false);
pages.push(nextPageSet);
}
}
return pages;
};
// base class
// base class
/**
* @return {?}
*/
PaginationComponent.prototype.calculateTotalPages =
// base class
/**
* @return {?}
*/
function () {
/** @type {?} */
var totalPages = this.itemsPerPage < 1
? 1
: Math.ceil(this.totalItems / this.itemsPerPage);
return Math.max(totalPages || 0, 1);
};
PaginationComponent.decorators = [
{ type: Component, args: [{
selector: 'hx-pagination',
template: PAGINATION_TEMPLATE,
providers: [PAGINATION_CONTROL_VALUE_ACCESSOR]
},] },
];
/** @nocollapse */
PaginationComponent.ctorParameters = function () { return [
{ type: Renderer2 },
{ type: ElementRef },
{ type: PaginationConfig }
]; };
PaginationComponent.propDecorators = {
align: [{ type: Input }],
maxSize: [{ type: Input }],
boundaryLinks: [{ type: Input }],
directionLinks: [{ type: Input }],
firstText: [{ type: Input }],
previousText: [{ type: Input }],
nextText: [{ type: Input }],
lastText: [{ type: Input }],
rotate: [{ type: Input }],
sticky: [{ type: Input }],
pageBtnClass: [{ type: Input }],
disabled: [{ type: Input }],
numPages: [{ type: Output }],
pageChanged: [{ type: Output }],
itemsPerPage: [{ type: Input }],
totalItems: [{ type: Input }]
};
return PaginationComponent;
}());
export { PaginationComponent };
if (false) {
/** @type {?} */
PaginationComponent.prototype.config;
/**
* if `true` aligns each link to the sides of pager
* @type {?}
*/
PaginationComponent.prototype.align;
/**
* limit number for page links in pager
* @type {?}
*/
PaginationComponent.prototype.maxSize;
/**
* if false first and last buttons will be hidden
* @type {?}
*/
PaginationComponent.prototype.boundaryLinks;
/**
* if false previous and next buttons will be hidden
* @type {?}
*/
PaginationComponent.prototype.directionLinks;
/**
* first button text
* @type {?}
*/
PaginationComponent.prototype.firstText;
/**
* previous button text
* @type {?}
*/
PaginationComponent.prototype.previousText;
/**
* next button text
* @type {?}
*/
PaginationComponent.prototype.nextText;
/**
* last button text
* @type {?}
*/
PaginationComponent.prototype.lastText;
/**
* if true current page will in the middle of pages list
* @type {?}
*/
PaginationComponent.prototype.rotate;
/**
* if true the .is-sticky modifier will be added to the pagination component
* @type {?}
*/
PaginationComponent.prototype.sticky;
/**
* add class to <li>
* @type {?}
*/
PaginationComponent.prototype.pageBtnClass;
/**
* if true pagination component will be disabled
* @type {?}
*/
PaginationComponent.prototype.disabled;
/**
* fired when total pages count changes, $event:number equals to total pages count
* @type {?}
*/
PaginationComponent.prototype.numPages;
/**
* fired when page was changed, $event:{page, itemsPerPage} equals to object with current page index and number of items per page
* @type {?}
*/
PaginationComponent.prototype.pageChanged;
/** @type {?} */
PaginationComponent.prototype.onChange;
/** @type {?} */
PaginationComponent.prototype.onTouched;
/** @type {?} */
PaginationComponent.prototype.renderer;
/** @type {?} */
PaginationComponent.prototype.elementRef;
/** @type {?} */
PaginationComponent.prototype.classMap;
/** @type {?} */
PaginationComponent.prototype.pages;
/** @type {?} */
PaginationComponent.prototype._itemsPerPage;
/** @type {?} */
PaginationComponent.prototype._totalItems;
/** @type {?} */
PaginationComponent.prototype._totalPages;
/** @type {?} */
PaginationComponent.prototype.inited;
/** @type {?} */
PaginationComponent.prototype._page;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBUSxVQUFVLEVBQ3hGLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUV2RCxzQ0FHQzs7O0lBRkMsd0NBQXFCOztJQUNyQixnQ0FBYTs7O0FBR2YsTUFBTSxLQUFPLGlDQUFpQyxHQUFRO0lBQ3BELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsbUJBQW1CLEVBQW5CLENBQW1CLENBQUM7SUFDbEQsS0FBSyxFQUFFLElBQUk7Q0FDWjs7SUFFSyxtQkFBbUIsR0FBRywwc0NBOEJ6QjtBQUVIO0lBeUdFLDZCQUFtQixRQUFtQixFQUFFLFVBQXNCLEVBQUUsZ0JBQWtDOzs7O1FBckVqRixhQUFRLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7Ozs7UUFFNUQsZ0JBQVcsR0FBbUMsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFzRDdGLGFBQVEsR0FBUSxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQ25DLGNBQVMsR0FBUSxRQUFRLENBQUMsU0FBUyxDQUFDO1FBU2pDLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBR2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FB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LENBQUM7O2dCQXhQRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFNBQVMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDO2lCQUMvQzs7OztnQkFyRDZELFNBQVM7Z0JBQTFELFVBQVU7Z0JBSWQsZ0JBQWdCOzs7d0JBcUR0QixLQUFLOzBCQUVMLEtBQUs7Z0NBRUwsS0FBSztpQ0FFTCxLQUFLOzRCQUdMLEtBQUs7K0JBRUwsS0FBSzsyQkFFTCxLQUFLOzJCQUVMLEtBQUs7eUJBRUwsS0FBSzt5QkFFTCxLQUFLOytCQUdMLEtBQUs7MkJBR0wsS0FBSzsyQkFHTCxNQUFNOzhCQUVOLE1BQU07K0JBR04sS0FBSzs2QkFXTCxLQUFLOztJQXFNUiwwQkFBQztDQUFBLEFBelBELElBeVBDO1NBcFBZLG1CQUFtQjs7O0lBQzlCLHFDQUFtQjs7Ozs7SUFFbkIsb0NBQStCOzs7OztJQUUvQixzQ0FBZ0M7Ozs7O0lBRWhDLDRDQUF1Qzs7Ozs7SUFFdkMsNkNBQXdDOzs7OztJQUd4Qyx3Q0FBa0M7Ozs7O0lBRWxDLDJDQUFxQzs7Ozs7SUFFckMsdUNBQWlDOzs7OztJQUVqQyx1Q0FBaUM7Ozs7O0lBRWpDLHFDQUFnQzs7Ozs7SUFFaEMscUNBQWdDOzs7OztJQUdoQywyQ0FBcUM7Ozs7O0lBR3JDLHVDQUFrQzs7Ozs7SUFHbEMsdUNBQTZFOzs7OztJQUU3RSwwQ0FBb0c7O0lBc0RwRyx1Q0FBMEM7O0lBQzFDLHdDQUEyQzs7SUFDM0MsdUNBQTJCOztJQUMzQix5Q0FBOEI7O0lBQzlCLHVDQUF3Qjs7SUFDeEIsb0NBQW9COztJQUVwQiw0Q0FBZ0M7O0lBQ2hDLDBDQUE4Qjs7SUFDOUIsMENBQThCOztJQUM5QixxQ0FBeUI7O0lBQ3pCLG9DQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyLCBTZWxmLCBmb3J3YXJkUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IFBhZ2luYXRpb25Db25maWcgfSBmcm9tICcuL3BhZ2luYXRpb24uY29uZmlnJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUNoYW5nZWRFdmVudCB7XHJcbiAgaXRlbXNQZXJQYWdlOiBudW1iZXI7XHJcbiAgcGFnZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUEFHSU5BVElPTl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGFnaW5hdGlvbkNvbXBvbmVudCksXHJcbiAgbXVsdGk6IHRydWVcclxufTtcclxuXHJcbmNvbnN0IFBBR0lOQVRJT05fVEVNUExBVEUgPSBgXHJcbiAgPHVsIGNsYXNzPVwiaHgtcGFnaW5hdGlvblwiIFtuZ0NsYXNzXT1cImNsYXNzTWFwXCIgW2NsYXNzLmlzLXN0aWNreV09XCJzdGlja3lcIj5cclxuICAgIDxsaSBjbGFzcz1cImlzLWZpcnN0XCJcclxuICAgICAgICAqbmdJZj1cImJvdW5kYXJ5TGlua3NcIlxyXG4gICAgICAgIFtjbGFzcy5pcy1kaXNhYmxlZF09XCJub1ByZXZpb3VzKCl8fGRpc2FibGVkXCI+XHJcbiAgICAgIDxhIGhyZWYgKGNsaWNrKT1cInNlbGVjdFBhZ2UoMSwgJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwiZ2V0VGV4dCgnZmlyc3QnKVwiPjwvYT5cclxuICAgIDwvbGk+XHJcblxyXG4gICAgPGxpIGNsYXNzPVwiaXMtcHJldlwiXHJcbiAgICAgICAgKm5nSWY9XCJkaXJlY3Rpb25MaW5rc1wiXHJcbiAgICAgICAgW2NsYXNzLmlzLWRpc2FibGVkXT1cIm5vUHJldmlvdXMoKXx8ZGlzYWJsZWRcIj5cclxuICAgICAgPGEgaHJlZiAoY2xpY2spPVwic2VsZWN0UGFnZShwYWdlIC0gMSwgJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwiZ2V0VGV4dCgncHJldmlvdXMnKVwiPjwvYT5cclxuICAgICAgPC9saT5cclxuXHJcbiAgICA8bGkgKm5nRm9yPVwibGV0IHBnIG9mIHBhZ2VzXCJcclxuICAgICAgICBbY2xhc3MuaXMtY3VycmVudF09XCJwZy5hY3RpdmVcIlxyXG4gICAgICAgIFtjbGFzcy5pcy1kaXNhYmxlZF09XCJkaXNhYmxlZCYmIXBnLmFjdGl2ZVwiPlxyXG4gICAgICA8YSBocmVmIChjbGljayk9XCJzZWxlY3RQYWdlKHBnLm51bWJlciwgJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwicGcudGV4dFwiPjwvYT5cclxuICAgIDwvbGk+XHJcblxyXG4gICAgPGxpIGNsYXNzPVwiaXMtbmV4dFwiXHJcbiAgICAgICAgKm5nSWY9XCJkaXJlY3Rpb25MaW5rc1wiXHJcbiAgICAgICAgW2NsYXNzLmlzLWRpc2FibGVkXT1cIm5vTmV4dCgpfHxkaXNhYmxlZFwiPlxyXG4gICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIGhyZWYgKGNsaWNrKT1cInNlbGVjdFBhZ2UocGFnZSArIDEsICRldmVudClcIiBbaW5uZXJIVE1MXT1cImdldFRleHQoJ25leHQnKVwiPjwvYT48L2xpPlxyXG5cclxuICAgIDxsaSBjbGFzcz1cImlzLWxhc3RcIlxyXG4gICAgICAgICpuZ0lmPVwiYm91bmRhcnlMaW5rc1wiXHJcbiAgICAgICAgW2NsYXNzLmlzLWRpc2FibGVkXT1cIm5vTmV4dCgpfHxkaXNhYmxlZFwiPlxyXG4gICAgICA8YSBocmVmIChjbGljayk9XCJzZWxlY3RQYWdlKHRvdGFsUGFnZXMsICRldmVudClcIiBbaW5uZXJIVE1MXT1cImdldFRleHQoJ2xhc3QnKVwiPjwvYT48L2xpPlxyXG4gIDwvdWw+XHJcbiAgYDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaHgtcGFnaW5hdGlvbicsXHJcbiAgdGVtcGxhdGU6IFBBR0lOQVRJT05fVEVNUExBVEUsXHJcbiAgcHJvdmlkZXJzOiBbUEFHSU5BVElPTl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQge1xyXG4gIHB1YmxpYyBjb25maWc6IGFueTtcclxuICAvKiogaWYgYHRydWVgIGFsaWducyBlYWNoIGxpbmsgdG8gdGhlIHNpZGVzIG9mIHBhZ2VyICovXHJcbiAgQElucHV0KCkgcHVibGljIGFsaWduOiBib29sZWFuO1xyXG4gIC8qKiBsaW1pdCBudW1iZXIgZm9yIHBhZ2UgbGlua3MgaW4gcGFnZXIgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbWF4U2l6ZTogbnVtYmVyO1xyXG4gIC8qKiBpZiBmYWxzZSBmaXJzdCBhbmQgbGFzdCBidXR0b25zIHdpbGwgYmUgaGlkZGVuICovXHJcbiAgQElucHV0KCkgcHVibGljIGJvdW5kYXJ5TGlua3M6IGJvb2xlYW47XHJcbiAgLyoqIGlmIGZhbHNlIHByZXZpb3VzIGFuZCBuZXh0IGJ1dHRvbnMgd2lsbCBiZSBoaWRkZW4gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZGlyZWN0aW9uTGlua3M6IGJvb2xlYW47XHJcbiAgLy8gbGFiZWxzXHJcbiAgLyoqIGZpcnN0IGJ1dHRvbiB0ZXh0ICovXHJcbiAgQElucHV0KCkgcHVibGljIGZpcnN0VGV4dDogc3RyaW5nO1xyXG4gIC8qKiBwcmV2aW91cyBidXR0b24gdGV4dCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwcmV2aW91c1RleHQ6IHN0cmluZztcclxuICAvKiogbmV4dCBidXR0b24gdGV4dCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBuZXh0VGV4dDogc3RyaW5nO1xyXG4gIC8qKiBsYXN0IGJ1dHRvbiB0ZXh0ICovXHJcbiAgQElucHV0KCkgcHVibGljIGxhc3RUZXh0OiBzdHJpbmc7XHJcbiAgLyoqIGlmIHRydWUgY3VycmVudCBwYWdlIHdpbGwgaW4gdGhlIG1pZGRsZSBvZiBwYWdlcyBsaXN0ICovXHJcbiAgQElucHV0KCkgcHVibGljIHJvdGF0ZTogYm9vbGVhbjtcclxuICAvKiogaWYgdHJ1ZSB0aGUgLmlzLXN0aWNreSBtb2RpZmllciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudCovXHJcbiAgQElucHV0KCkgcHVibGljIHN0aWNreTogYm9vbGVhbjtcclxuICAvLyBjc3NcclxuICAvKiogYWRkIGNsYXNzIHRvIDxsaT4gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcGFnZUJ0bkNsYXNzOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBpZiB0cnVlIHBhZ2luYXRpb24gY29tcG9uZW50IHdpbGwgYmUgZGlzYWJsZWQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8qKiBmaXJlZCB3aGVuIHRvdGFsIHBhZ2VzIGNvdW50IGNoYW5nZXMsICRldmVudDpudW1iZXIgZXF1YWxzIHRvIHRvdGFsIHBhZ2VzIGNvdW50ICovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBudW1QYWdlczogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICAvKiogZmlyZWQgd2hlbiBwYWdlIHdhcyBjaGFuZ2VkLCAkZXZlbnQ6e3BhZ2UsIGl0ZW1zUGVyUGFnZX0gZXF1YWxzIHRvIG9iamVjdCB3aXRoIGN1cnJlbnQgcGFnZSBpbmRleCBhbmQgbnVtYmVyIG9mIGl0ZW1zIHBlciBwYWdlICovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBwYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPFBhZ2VDaGFuZ2VkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlQ2hhbmdlZEV2ZW50PigpO1xyXG5cclxuICAvKiogbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgcGVyIHBhZ2UuIElmIHZhbHVlIGxlc3MgdGhhbiAxIHdpbGwgZGlzcGxheSBhbGwgaXRlbXMgb24gb25lIHBhZ2UgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgaXRlbXNQZXJQYWdlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXNQZXJQYWdlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBpdGVtc1BlclBhZ2UodjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9pdGVtc1BlclBhZ2UgPSB2O1xyXG4gICAgdGhpcy50b3RhbFBhZ2VzID0gdGhpcy5jYWxjdWxhdGVUb3RhbFBhZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIGFsbCBwYWdlcyAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB0b3RhbEl0ZW1zKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdG90YWxJdGVtcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdG90YWxJdGVtcyh2OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3RvdGFsSXRlbXMgPSB2O1xyXG4gICAgdGhpcy50b3RhbFBhZ2VzID0gdGhpcy5jYWxjdWxhdGVUb3RhbFBhZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCB0b3RhbFBhZ2VzKHY6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdG90YWxQYWdlcyA9IHY7XHJcbiAgICB0aGlzLm51bVBhZ2VzLmVtaXQodik7XHJcbiAgICBpZiAodGhpcy5pbml0ZWQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RQYWdlKHRoaXMucGFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHBhZ2UodmFsdWU6IG51bWJlcikge1xyXG4gICAgY29uc3QgX3ByZXZpb3VzID0gdGhpcy5fcGFnZTtcclxuICAgIHRoaXMuX3BhZ2UgPSAodmFsdWUgPiB0aGlzLnRvdGFsUGFnZXMpID8gdGhpcy50b3RhbFBhZ2VzIDogKHZhbHVlIHx8IDEpO1xyXG5cclxuICAgIGlmIChfcHJldmlvdXMgPT09IHRoaXMuX3BhZ2UgfHwgdHlwZW9mIF9wcmV2aW91cyA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCh7XHJcbiAgICAgIHBhZ2U6IHRoaXMuX3BhZ2UsXHJcbiAgICAgIGl0ZW1zUGVyUGFnZTogdGhpcy5pdGVtc1BlclBhZ2VcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBwYWdlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNoYW5nZTogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xyXG4gIHB1YmxpYyBvblRvdWNoZWQ6IGFueSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcclxuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcclxuICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcclxuICBwdWJsaWMgY2xhc3NNYXA6IHN0cmluZztcclxuICBwdWJsaWMgcGFnZXM6IGFueVtdO1xyXG5cclxuICBwcm90ZWN0ZWQgX2l0ZW1zUGVyUGFnZTogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBfdG90YWxJdGVtczogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBfdG90YWxQYWdlczogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBpbml0ZWQgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX3BhZ2UgPSAxO1xyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IocmVuZGVyZXI6IFJlbmRlcmVyMiwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcGFnaW5hdGlvbkNvbmZpZzogUGFnaW5hdGlvbkNvbmZpZykge1xyXG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcclxuICAgIGlmICghdGhpcy5jb25maWcpIHtcclxuICAgICAgdGhpcy5jb25maWd1cmVPcHRpb25zKHBhZ2luYXRpb25Db25maWcubWFpbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29uZmlndXJlT3B0aW9ucyhjb25maWc6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGFzc01hcCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJztcclxuICAgIC8vIHdhdGNoIGZvciBtYXhTaXplXHJcbiAgICB0aGlzLm1heFNpemUgPSB0eXBlb2YgdGhpcy5tYXhTaXplICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICA/IHRoaXMubWF4U2l6ZVxyXG4gICAgICA6IHRoaXMuY29uZmlnLm1heFNpemU7XHJcbiAgICB0aGlzLnJvdGF0ZSA9IHR5cGVvZiB0aGlzLnJvdGF0ZSAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICAgPyB0aGlzLnJvdGF0ZVxyXG4gICAgICA6IHRoaXMuY29uZmlnLnJvdGF0ZTtcclxuICAgIHRoaXMuYm91bmRhcnlMaW5rcyA9IHR5cGVvZiB0aGlzLmJvdW5kYXJ5TGlua3MgIT09ICd1bmRlZmluZWQnXHJcbiAgICAgID8gdGhpcy5ib3VuZGFyeUxpbmtzXHJcbiAgICAgIDogdGhpcy5jb25maWcuYm91bmRhcnlMaW5rcztcclxuICAgIHRoaXMuZGlyZWN0aW9uTGlua3MgPSB0eXBlb2YgdGhpcy5kaXJlY3Rpb25MaW5rcyAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICAgPyB0aGlzLmRpcmVjdGlvbkxpbmtzXHJcbiAgICAgIDogdGhpcy5jb25maWcuZGlyZWN0aW9uTGlua3M7XHJcbiAgICB0aGlzLnBhZ2VCdG5DbGFzcyA9IHR5cGVvZiB0aGlzLnBhZ2VCdG5DbGFzcyAhPT0gJ3VuZGVmaW5lZCdcclxuICAgID8gdGhpcy5wYWdlQnRuQ2xhc3NcclxuICAgIDogdGhpcy5jb25maWcucGFnZUJ0bkNsYXNzO1xyXG5cclxuICAgIC8vIGJhc2UgY2xhc3NcclxuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gdHlwZW9mIHRoaXMuaXRlbXNQZXJQYWdlICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICA/IHRoaXMuaXRlbXNQZXJQYWdlXHJcbiAgICAgIDogdGhpcy5jb25maWcuaXRlbXNQZXJQYWdlO1xyXG4gICAgdGhpcy50b3RhbFBhZ2VzID0gdGhpcy5jYWxjdWxhdGVUb3RhbFBhZ2VzKCk7XHJcbiAgICAvLyB0aGlzIGNsYXNzXHJcbiAgICB0aGlzLnBhZ2VzID0gdGhpcy5nZXRQYWdlcyh0aGlzLnBhZ2UsIHRoaXMudG90YWxQYWdlcyk7XHJcbiAgICB0aGlzLmluaXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSB2YWx1ZTtcclxuICAgIHRoaXMucGFnZXMgPSB0aGlzLmdldFBhZ2VzKHRoaXMucGFnZSwgdGhpcy50b3RhbFBhZ2VzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUZXh0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpW2tleSArICdUZXh0J10gfHwgdGhpcy5jb25maWdba2V5ICsgJ1RleHQnXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBub1ByZXZpb3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZSA9PT0gMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBub05leHQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID09PSB0aGlzLnRvdGFsUGFnZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4ge30pOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0UGFnZShwYWdlOiBudW1iZXIsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgdGFyZ2V0LmJsdXIoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLndyaXRlVmFsdWUocGFnZSk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5wYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENyZWF0ZSBwYWdlIG9iamVjdCB1c2VkIGluIHRlbXBsYXRlXHJcbiAgcHJvdGVjdGVkIG1ha2VQYWdlKG51bTogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGFjdGl2ZTogYm9vbGVhbik6IHtudW1iZXI6IG51bWJlciwgdGV4dDogc3RyaW5nLCBhY3RpdmU6IGJvb2xlYW59IHtcclxuICAgIHJldHVybiB7IHRleHQsIG51bWJlcjogbnVtLCBhY3RpdmUgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRQYWdlcyhjdXJyZW50UGFnZTogbnVtYmVyLCB0b3RhbFBhZ2VzOiBudW1iZXIpOiBhbnlbXSB7XHJcbiAgICBjb25zdCBwYWdlczogYW55W10gPSBbXTtcclxuXHJcbiAgICAvLyBEZWZhdWx0IHBhZ2UgbGltaXRzXHJcbiAgICBsZXQgc3RhcnRQYWdlID0gMTtcclxuICAgIGxldCBlbmRQYWdlID0gdG90YWxQYWdlcztcclxuICAgIGNvbnN0IGlzTWF4U2l6ZWQgPSB0eXBlb2YgdGhpcy5tYXhTaXplICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1heFNpemUgPCB0b3RhbFBhZ2VzO1xyXG5cclxuICAgIC8vIHJlY29tcHV0ZSBpZiBtYXhTaXplXHJcbiAgICBpZiAoaXNNYXhTaXplZCkge1xyXG4gICAgICBpZiAodGhpcy5yb3RhdGUpIHtcclxuICAgICAgICAvLyBDdXJyZW50IHBhZ2UgaXMgZGlzcGxheWVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHZpc2libGUgb25lc1xyXG4gICAgICAgIHN0YXJ0UGFnZSA9IE1hdGgubWF4KGN1cnJlbnRQYWdlIC0gTWF0aC5mbG9vcih0aGlzLm1heFNpemUgLyAyKSwgMSk7XHJcbiAgICAgICAgZW5kUGFnZSA9IHN0YXJ0UGFnZSArIHRoaXMubWF4U2l6ZSAtIDE7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBpZiBsaW1pdCBpcyBleGNlZWRlZFxyXG4gICAgICAgIGlmIChlbmRQYWdlID4gdG90YWxQYWdlcykge1xyXG4gICAgICAgICAgZW5kUGFnZSA9IHRvdGFsUGFnZXM7XHJcbiAgICAgICAgICBzdGFydFBhZ2UgPSBlbmRQYWdlIC0gdGhpcy5tYXhTaXplICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVmlzaWJsZSBwYWdlcyBhcmUgcGFnaW5hdGVkIHdpdGggbWF4U2l6ZVxyXG4gICAgICAgIHN0YXJ0UGFnZSA9ICgoTWF0aC5jZWlsKGN1cnJlbnRQYWdlIC8gdGhpcy5tYXhTaXplKSAtIDEpICogdGhpcy5tYXhTaXplKSArIDE7XHJcblxyXG4gICAgICAgIC8vIEFkanVzdCBsYXN0IHBhZ2UgaWYgbGltaXQgaXMgZXhjZWVkZWRcclxuICAgICAgICBlbmRQYWdlID0gTWF0aC5taW4oc3RhcnRQYWdlICsgdGhpcy5tYXhTaXplIC0gMSwgdG90YWxQYWdlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgcGFnZSBudW1iZXIgbGlua3NcclxuICAgIGZvciAobGV0IG51bSA9IHN0YXJ0UGFnZTsgbnVtIDw9IGVuZFBhZ2U7IG51bSsrKSB7XHJcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLm1ha2VQYWdlKG51bSwgbnVtLnRvU3RyaW5nKCksIG51bSA9PT0gY3VycmVudFBhZ2UpO1xyXG4gICAgICBwYWdlcy5wdXNoKHBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBsaW5rcyB0byBtb3ZlIGJldHdlZW4gcGFnZSBzZXRzXHJcbiAgICBpZiAoaXNNYXhTaXplZCAmJiAhdGhpcy5yb3RhdGUpIHtcclxuICAgICAgaWYgKHN0YXJ0UGFnZSA+IDEpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1BhZ2VTZXQgPSB0aGlzLm1ha2VQYWdlKHN0YXJ0UGFnZSAtIDEsICcuLi4nLCBmYWxzZSk7XHJcbiAgICAgICAgcGFnZXMudW5zaGlmdChwcmV2aW91c1BhZ2VTZXQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZW5kUGFnZSA8IHRvdGFsUGFnZXMpIHtcclxuICAgICAgICBjb25zdCBuZXh0UGFnZVNldCA9IHRoaXMubWFrZVBhZ2UoZW5kUGFnZSArIDEsICcuLi4nLCBmYWxzZSk7XHJcbiAgICAgICAgcGFnZXMucHVzaChuZXh0UGFnZVNldCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGFnZXM7XHJcbiAgfVxyXG5cclxuICAvLyBiYXNlIGNsYXNzXHJcbiAgcHJvdGVjdGVkIGNhbGN1bGF0ZVRvdGFsUGFnZXMoKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSB0aGlzLml0ZW1zUGVyUGFnZSA8IDFcclxuICAgICAgPyAxXHJcbiAgICAgIDogTWF0aC5jZWlsKHRoaXMudG90YWxJdGVtcyAvIHRoaXMuaXRlbXNQZXJQYWdlKTtcclxuICAgIHJldHVybiBNYXRoLm1heCh0b3RhbFBhZ2VzIHx8IDAsIDEpO1xyXG4gIH1cclxufVxyXG4iXX0=