@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
436 lines • 57.5 kB
JavaScript
import * as tslib_1 from "tslib";
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Component, Input, Output, ViewChild, ViewChildren, Renderer2, EventEmitter, QueryList, ElementRef, Inject } from '@angular/core';
// Теперь наше
import { GridPart } from '@true-directive/base';
import { UIAction, UIActionType } from '@true-directive/base';
import { Column } from '@true-directive/base';
import { ColumnBand } from '@true-directive/base';
import { GridLayout } from '@true-directive/base';
import { BaseComponent } from './base.component';
import { ScrollerComponent } from './scroller.component';
import { GridStateService } from './grid-state.service';
import { GridHeaderCellComponent } from './grid-header-cell.component';
import { GridHeaderBandComponent } from './grid-header-band.component';
let GridHeaderComponent = class GridHeaderComponent extends BaseComponent {
constructor(state, elementRef, renderer) {
super();
this.state = state;
this.elementRef = elementRef;
this.renderer = renderer;
this.resizeColumn = new EventEmitter();
this.toggleCheckColumn = new EventEmitter();
this._scrollerClientRect = null;
this._touches = false;
this._markerVisible = false;
}
resizeInProcess(value) {
if (!this.gridHeaderTable) {
return;
}
if (value) {
this.gridHeaderTable.nativeElement.classList.add('true-resize-in-process');
}
else {
this.gridHeaderTable.nativeElement.classList.remove('true-resize-in-process');
}
}
dragInProcess(value) {
if (!this.gridHeaderTable) {
return;
}
if (value) {
this.gridHeaderTable.nativeElement.classList.add('true-drag-in-process');
}
else {
this.gridHeaderTable.nativeElement.classList.remove('true-drag-in-process');
}
}
trackCol(i, c) {
return c;
}
//
get isAutoScroll() {
if (this.scroller) {
return this.scroller.isAutoScroll;
}
return false;
}
resizeMouseUp(e) { }
toggleCheck(e, col) {
this.toggleCheckColumn.emit(col);
}
headerCellMouseDown(e, col) {
if (e.button != 0) {
return;
}
const rr = e.target.getBoundingClientRect();
const xx = Math.round(e.clientX);
if (xx < rr.left + rr.width / 2) {
// На самом деле это не перетаскивание, а изменение ширины предыдущей колонки..
this.resizeMouseDownPrev(e, col);
return;
}
if (xx > rr.left + rr.width / 2) {
// На самом деле это не перетаскивание, а изменение ширины..
this.resizeMouseDown(e, col);
return;
}
}
captionTouchMove(e, col) {
//
e.stopPropagation();
const touches = e.changedTouches;
if (touches.length === 1 && this.uiAction.target === col) {
const xx = touches[0].clientX;
const yy = touches[0].clientY;
if (this.checkReordering(xx, yy)) {
// Перемещение только инициализировано
return;
}
if (this.uiAction.action === UIActionType.REORDER_COLUMN) {
this.proceedReordering(xx, yy);
}
}
}
captionTouchEnd(e) {
this.removeTouchMoveListeners();
if (this.scroller) {
this.scroller.stopAutoScroll();
}
if (!this.uiAction) {
return;
}
if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) {
this.stopReordering();
}
e.stopPropagation();
if (e.cancelable) {
e.preventDefault();
}
}
captionStartDrag(e, col) {
if (col.isCheckbox) {
return;
}
let xx;
let yy;
if (e.touches) {
if (!e.changedTouches || e.changedTouches.length !== 1) {
return;
}
xx = e.changedTouches[0].clientX;
yy = e.changedTouches[0].clientY;
this.removeTouchMoveListeners();
this.touchMoveListenFunc = this.renderer.listen(event.target, 'touchmove', (e) => {
this.captionTouchMove(e, col);
});
this.touchEndListenFunc = this.renderer.listen(event.target, 'touchend', (e) => {
this.captionTouchEnd(e);
});
this.touchCancelListenFunc = this.renderer.listen(event.target, 'touchcancel', (e) => {
this.captionTouchEnd(e);
});
}
else {
// Mouse event
this.addDocumentMouseListeners();
if (e.button != 0) {
return;
}
xx = e.clientX;
yy = e.clientY;
}
let rr = e.target.parentElement.getBoundingClientRect();
this.uiAction = new UIAction(UIActionType.CLICK, col, xx, yy);
this.uiAction.targetOffsetX = rr.left - xx;
this.uiAction.targetOffsetY = rr.top - yy;
e.stopPropagation();
}
captionSort(e, col) {
if (e.touches) {
if (!e.changedTouches || e.changedTouches.length !== 1) {
return;
}
}
else {
if (e.button != 0) {
return;
}
}
if (!this.uiAction) {
return;
}
if (e.defaultPrevented) {
return;
}
if (this.uiAction.target === col && this.uiAction.action === UIActionType.CLICK) {
if (!col.isCheckbox && col.allowSorting) {
this.state.sortByColumn(col, e.shiftKey);
e.stopPropagation();
e.preventDefault();
}
this.uiAction = null;
}
}
resizeMouseDown(e, col) {
if (col.canResize) {
this.initResizing(e, col);
}
e.stopPropagation();
}
resizeMouseDownPrev(e, col) {
let realCol = null;
const ii = this.layout.columns.indexOf(col);
if (ii > 0) {
realCol = this.layout.columns[ii - 1];
this.initResizing(e, realCol);
}
e.stopPropagation();
}
showHeaderBtn(fieldName) {
if (!this.columnElements) {
return;
}
this.columnElements.forEach(el => {
if (el.column.fieldName === fieldName) {
el.setState('btn-visible');
}
});
}
hideHeaderBtns() {
if (!this.columnElements) {
return;
}
this.columnElements.forEach(el => el.removeState('btn-visible'));
}
get renderedColumns() {
const renderedColumns = [];
this.columnElements.forEach(el => {
renderedColumns.push({ boundingRect: el.elementRef.nativeElement.getBoundingClientRect(), item: el.column });
});
return renderedColumns;
}
get renderedBands() {
const renderedBands = [];
this.bandElements.forEach(el => {
renderedBands.push({ boundingRect: el.elementRef.nativeElement.getBoundingClientRect(), item: el.band });
});
return renderedBands;
}
/**
* Проверка позиции при перетаскивании заголовка колонки или бэнда
* @param mouseAction Позиция мыши
* @param show Показывать ли маркер
* @return [description]
*/
canDrop(mouseAction, show) {
//Здесь нужен прямоугольник родителя..
if (!this._scrollerClientRect)
this._scrollerClientRect = this.scroller.clientRect;
let r0 = this._scrollerClientRect;
let hasL = false; // имеется более левая составляющая заголовка
let hasR = false; // имеется более правая составляющая
if (this.layout.place === GridPart.CENTER) {
r0 = this.scroller.headerRect;
hasL = this.state.showFixedLeft;
hasR = this.state.showFixedRight;
}
if (this.layout.place === GridPart.LEFT) {
r0 = this.scroller.headerRectLeft;
hasL = false;
hasR = true;
}
if (this.layout.place === GridPart.RIGHT) {
r0 = this.scroller.headerRectRight;
hasL = true;
hasR = false;
}
const tg = mouseAction.target;
const isColumn = tg instanceof Column;
const isBand = tg instanceof ColumnBand;
let renderedItems;
if (isColumn) {
renderedItems = this.renderedColumns;
}
else {
renderedItems = this.renderedBands;
}
return this.layout.canDrop(mouseAction, renderedItems, r0, hasL, hasR, this.state.columnCollection);
}
autoScrollX(dx) {
if (this.uiAction) {
this.uiAction.x -= dx;
}
}
// Начинаем изменение ширины колонки
initResizing(e, col) {
if (this.state && !this.state.settings.columnResize) {
return;
}
if (col.columnResize === false) {
return;
}
this.addDocumentMouseListeners();
this.uiAction = new UIAction(UIActionType.RESIZE_COLUMN, col, e.clientX, e.clientY);
}
startResizing() {
this.uiAction.initialized = true;
this.scroller.startAutoScroll();
this.resizeColumn.emit({ action: 'start', ui: this.uiAction });
}
initReordering(x, y) {
this.uiAction.action = UIActionType.REORDER_COLUMN;
let ww = this.uiAction.target.headerWidth;
if (this.uiAction.target instanceof ColumnBand) {
ww = 0;
this.uiAction.target.columns.forEach(c => ww += c.displayedWidth);
}
if (ww > 300) {
if (this.uiAction.targetOffsetX < -250)
this.uiAction.targetOffsetX = -150;
ww = 300;
}
this.uiAction.targetWidth = ww;
this.uiAction.initialized = true;
this.uiAction.move(x, y);
this.state.dragDrop.drag(this.uiAction);
}
proceedReordering(xx, yy) {
this.uiAction.move(xx, yy);
this.state.dragDrop.drag(this.uiAction);
}
stopReordering() {
setTimeout(() => {
this.state.dragDrop.drop(this.uiAction);
this.uiAction = null;
});
}
stopActions() {
if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) {
this.stopReordering();
}
}
/**
* Проверка необходимости инициализации перестановки колонки
* @param xx [description]
* @param yy [description]
* @return True, если перестановка колонки инициализирована. False - если
* инициализация не нужна.
*/
checkReordering(xx, yy) {
if (this.uiAction.action === UIActionType.CLICK && this.state.settings.columnReorder) {
if (Math.abs(xx - this.uiAction.x) > 6 || Math.abs(yy - this.uiAction.y) > 6) {
if (this.uiAction.target instanceof Column && this.uiAction.target.canReorder) {
this.initReordering(xx, yy);
return true;
}
if (this.uiAction.target instanceof ColumnBand && this.state.settings.bandReorder) {
this.initReordering(xx, yy);
return true;
}
}
}
return false;
}
documentMouseMove(e) {
super.documentMouseMove(e);
if (!this.uiAction) { // если что-то началось..
return;
}
const xx = e.clientX;
const yy = e.clientY;
if (this.checkReordering(xx, yy)) {
return;
}
if (this.uiAction.action === UIActionType.REORDER_COLUMN) {
this.proceedReordering(xx, yy);
}
if (!this.uiAction.initialized && this.uiAction.action === UIActionType.RESIZE_COLUMN && this.state.settings.columnResize) {
this.startResizing();
return;
}
if (this.uiAction.action === UIActionType.RESIZE_COLUMN) {
this.uiAction.move(xx, yy);
this.resizeColumn.emit({ action: '', ui: this.uiAction });
}
}
documentMouseUp(e) {
super.documentMouseUp(e);
if (this.scroller) {
this.scroller.stopAutoScroll();
}
let xx = e.clientX;
let yy = e.clientY;
if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) {
this.stopReordering();
e.stopPropagation();
e.preventDefault();
}
if (this.uiAction && this.uiAction.action === UIActionType.RESIZE_COLUMN) {
let x0 = this.uiAction.x0;
let x1 = xx;
let newWidth = this.uiAction.target.width + x1 - x0;
if (newWidth < this.state.settings.minColumnWidthOnResize) {
newWidth = this.state.settings.minColumnWidthOnResize;
}
this.state.resizeColumn(this.uiAction.target, newWidth);
setTimeout(() => {
this.resizeColumn.emit({ action: 'end', ui: this.uiAction });
this.scroller.fixScroll(); // Прокрутка может встать в неудобное положение. Чиним.
this.uiAction = null;
});
e.stopPropagation();
e.preventDefault();
}
}
};
tslib_1.__decorate([
Input('layout'),
tslib_1.__metadata("design:type", GridLayout)
], GridHeaderComponent.prototype, "layout", void 0);
tslib_1.__decorate([
Input('scroller'),
tslib_1.__metadata("design:type", ScrollerComponent)
], GridHeaderComponent.prototype, "scroller", void 0);
tslib_1.__decorate([
Output('resizeColumn'),
tslib_1.__metadata("design:type", Object)
], GridHeaderComponent.prototype, "resizeColumn", void 0);
tslib_1.__decorate([
Output('toggleCheckColumn'),
tslib_1.__metadata("design:type", Object)
], GridHeaderComponent.prototype, "toggleCheckColumn", void 0);
tslib_1.__decorate([
ViewChild('gridHeaderTable', { static: true }),
tslib_1.__metadata("design:type", Object)
], GridHeaderComponent.prototype, "gridHeaderTable", void 0);
tslib_1.__decorate([
ViewChild('dropMarker', { static: true }),
tslib_1.__metadata("design:type", Object)
], GridHeaderComponent.prototype, "dropMarker", void 0);
tslib_1.__decorate([
ViewChildren('headerCell', { read: GridHeaderCellComponent }),
tslib_1.__metadata("design:type", QueryList)
], GridHeaderComponent.prototype, "columnElements", void 0);
tslib_1.__decorate([
ViewChildren('headerBand', { read: GridHeaderBandComponent }),
tslib_1.__metadata("design:type", QueryList)
], GridHeaderComponent.prototype, "bandElements", void 0);
GridHeaderComponent = tslib_1.__decorate([
Component({
selector: 'true-grid-header',
template: "<div #gridHeaderTable class=\"true-grid-header\"\r\n [ngClass]=\"state.settings.appearance.getHeaderClass()\">\r\n <table [style.width]=\"layout.headerWidth\">\r\n <colgroup>\r\n <col *ngFor=\"let c of layout.columns\" [style.width]=\"layout.displayedHeaderWidth(c)\" /> <!--layout.columnHeaderWidth(c)-->\r\n <col *ngIf=\"layout.isCenter\" class=\"true-grid-re\" [style.width]=\"state.st.hdWidth\" />\r\n </colgroup>\r\n <thead>\r\n <tr\r\n *ngIf=\"layout.bands.length > 0 && state.settings.showBands\"\r\n [style.height.px]=\"state.settings.rowHeight\">\r\n <td *ngFor=\"let b of layout.bands\"\r\n [attr.colspan]=\"b.columns.length\"\r\n class=\"band\">\r\n <true-grid-header-band\r\n [band]=\"b\"\r\n (bandTouchstart)=\"captionStartDrag($event, b)\"\r\n (mousedown)=\"captionStartDrag($event, b)\"\r\n #headerBand>\r\n </true-grid-header-band>\r\n </td>\r\n <td *ngIf=\"layout.isCenter\" style=\"border:0;\"></td>\r\n </tr>\r\n <tr>\r\n <td *ngFor=\"let c of layout.columns; trackBy: trackCol;\"\r\n [ngClass]=\"state.settings.headerCellClass(c)\"\r\n [style.height.px]=\"state.settings.rowHeight\"\r\n (mousedown)=\"headerCellMouseDown($event, c)\">\r\n <true-grid-header-cell #headerCell\r\n [column]=\"c\"\r\n (toggleCheckColumn)=\"toggleCheck($event, c)\"\r\n (captionTouchStart)=\"captionStartDrag($event, c)\"\r\n (captionMouseDown)=\"captionStartDrag($event, c)\"\r\n (captionMouseUp)=\"captionSort($event, c)\">\r\n </true-grid-header-cell>\r\n </td>\r\n <td *ngIf=\"layout.isCenter\" class=\"true-tt\" style=\"border:0;\"></td>\r\n </tr>\r\n </thead>\r\n </table>\r\n</div>\r\n",
styles: [".true-grid-drag-item>table,.true-grid-header>table{box-sizing:border-box;table-layout:fixed;border-spacing:0;border-collapse:collapse;outline:0}td.true-column-resizable{cursor:ew-resize}td:not(.true-column-resizable){cursor:default}td:not(.true-column-resizable)+td.true-column-resizable{padding-left:0!important}::ng-deep .true-grid-header td:not(.true-column-resizable):not(.true-column-nobtn):not(.true-header-cell__checkbox){padding-right:0!important}::ng-deep .true-grid-header td:not(.true-column-resizable):not(.true-column-nobtn):not(.true-header-cell__checkbox) .true-header-cell{padding-right:0!important}"]
}),
tslib_1.__param(0, Inject('gridState')),
tslib_1.__metadata("design:paramtypes", [GridStateService,
ElementRef,
Renderer2])
], GridHeaderComponent);
export { GridHeaderComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvZ3JpZC1oZWFkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztFQUlFO0FBQ0YsT0FBTyxFQUFZLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzNELFNBQVMsRUFDVCxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUUsY0FBYztBQUNkLE9BQU8sRUFBYyxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU92RSxJQUFhLG1CQUFtQixHQUFoQyxNQUFhLG1CQUFvQixTQUFRLGFBQWE7SUEwZHBELFlBQzhCLEtBQXVCLEVBQzNDLFVBQXNCLEVBQ3RCLFFBQW1CO1FBRXpCLEtBQUssRUFBRSxDQUFDO1FBSmtCLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBQzND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MDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBOZ01vZHVsZSwgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgT25EZXN0cm95LFxyXG4gICAgICAgICBSZW5kZXJlcjIsXHJcbiAgICAgICAgIEV2ZW50RW1pdHRlciwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8vINCi0LXQv9C10YDRjCDQvdCw0YjQtVxyXG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkUGFydCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgVUlBY3Rpb24sIFVJQWN0aW9uVHlwZSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgQ29sdW1uQmFuZCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbiBpbXBvcnQgeyBHcmlkTGF5b3V0IH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJy4vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTY3JvbGxlckNvbXBvbmVudCB9IGZyb20gJy4vc2Nyb2xsZXIuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7IEdyaWRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2dyaWQtc3RhdGUuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBHcmlkSGVhZGVyQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1oZWFkZXItY2VsbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkSGVhZGVyQmFuZENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1oZWFkZXItYmFuZC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLWdyaWQtaGVhZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3N0eWxlcy9ncmlkLWhlYWRlci5iZWhhdmlvci5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KCdsYXlvdXQnKVxyXG4gIGxheW91dDogR3JpZExheW91dDtcclxuXHJcbiAgQElucHV0KCdzY3JvbGxlcicpXHJcbiAgc2Nyb2xsZXI6IFNjcm9sbGVyQ29tcG9uZW50O1xyXG5cclxuICBAT3V0cHV0KCdyZXNpemVDb2x1bW4nKVxyXG4gIHJlc2l6ZUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IHN0cmluZywgdWk6IFVJQWN0aW9uIH0+KCk7XHJcblxyXG4gIEBPdXRwdXQoJ3RvZ2dsZUNoZWNrQ29sdW1uJylcclxuICB0b2dnbGVDaGVja0NvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdncmlkSGVhZGVyVGFibGUnLCB7c3RhdGljOiB0cnVlfSlcclxuICBncmlkSGVhZGVyVGFibGU6IGFueTtcclxuXHJcbiAgLy8g0JzQsNGA0LrQtdGALCDRg9C60LDQt9GL0LLQsNGO0YnQuNC5INC90L7QstGD0Y4g0L/QvtC30LjRhtC40Y4g0L/QtdGA0LXRgtCw0YHQutC40LLQsNC10LzQvtCz0L4g0YHRgtC+0LvQsdGG0LBcclxuICBAVmlld0NoaWxkKCdkcm9wTWFya2VyJywge3N0YXRpYzogdHJ1ZX0pXHJcbiAgZHJvcE1hcmtlcjogYW55OyAgLy8g0J/QvtC60LAg0L3QtSDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8sINGCLtC6LiDQvNGLINC90LAg0LvQtdGC0YMg0L/QtdGA0LXRgdGC0LDQstC70Y/QtdC8INC60L7Qu9C+0L3QutGDINC/0YDQuCDQtNCy0LjQttC10L3QuNC4XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2hlYWRlckNlbGwnLCB7cmVhZDogR3JpZEhlYWRlckNlbGxDb21wb25lbnR9KSBjb2x1bW5FbGVtZW50czogUXVlcnlMaXN0PEdyaWRIZWFkZXJDZWxsQ29tcG9uZW50PjtcclxuICBAVmlld0NoaWxkcmVuKCdoZWFkZXJCYW5kJywge3JlYWQ6IEdyaWRIZWFkZXJCYW5kQ29tcG9uZW50fSkgYmFuZEVsZW1lbnRzOiBRdWVyeUxpc3Q8R3JpZEhlYWRlckJhbmRDb21wb25lbnQ+O1xyXG5cclxuICBwcml2YXRlIF9zY3JvbGxlckNsaWVudFJlY3Q6IGFueSA9IG51bGw7XHJcblxyXG4gIF90b3VjaGVzID0gZmFsc2U7XHJcbiAgX21hcmtlclZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIHJlc2l6ZUluUHJvY2Vzcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRIZWFkZXJUYWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEhlYWRlclRhYmxlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHJ1ZS1yZXNpemUtaW4tcHJvY2VzcycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkSGVhZGVyVGFibGUubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0cnVlLXJlc2l6ZS1pbi1wcm9jZXNzJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZHJhZ0luUHJvY2Vzcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRIZWFkZXJUYWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEhlYWRlclRhYmxlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHJ1ZS1kcmFnLWluLXByb2Nlc3MnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ3JpZEhlYWRlclRhYmxlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndHJ1ZS1kcmFnLWluLXByb2Nlc3MnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFja0NvbChpOiBudW1iZXIsIGM6IENvbHVtbikge1xyXG4gICAgcmV0dXJuIGM7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIGdldCBpc0F1dG9TY3JvbGwoKSB7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxlcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5zY3JvbGxlci5pc0F1dG9TY3JvbGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXNpemVNb3VzZVVwKGU6IGFueSkgeyB9XHJcblxyXG4gIHRvZ2dsZUNoZWNrKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIHRoaXMudG9nZ2xlQ2hlY2tDb2x1bW4uZW1pdChjb2wpO1xyXG4gIH1cclxuXHJcbiAgaGVhZGVyQ2VsbE1vdXNlRG93bihlOiBhbnksIGNvbDogQ29sdW1uKSB7XHJcbiAgICBpZiAoZS5idXR0b24gIT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcnIgPSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHh4ID0gTWF0aC5yb3VuZChlLmNsaWVudFgpO1xyXG5cclxuICAgIGlmICh4eCA8IHJyLmxlZnQgKyByci53aWR0aCAvIDIpIHtcclxuICAgICAgLy8g0J3QsCDRgdCw0LzQvtC8INC00LXQu9C1INGN0YLQviDQvdC1INC/0LXRgNC10YLQsNGB0LrQuNCy0LDQvdC40LUsINCwINC40LfQvNC10L3QtdC90LjQtSDRiNC40YDQuNC90Ysg0L/RgNC10LTRi9C00YPRidC10Lkg0LrQvtC70L7QvdC60LguLlxyXG4gICAgICB0aGlzLnJlc2l6ZU1vdXNlRG93blByZXYoZSwgY29sKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh4eCA+IHJyLmxlZnQgKyByci53aWR0aCAvIDIpIHtcclxuICAgICAgLy8g0J3QsCDRgdCw0LzQvtC8INC00LXQu9C1INGN0YLQviDQvdC1INC/0LXRgNC10YLQsNGB0LrQuNCy0LDQvdC40LUsINCwINC40LfQvNC10L3QtdC90LjQtSDRiNC40YDQuNC90YsuLlxyXG4gICAgICB0aGlzLnJlc2l6ZU1vdXNlRG93bihlLCBjb2wpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXB0aW9uVG91Y2hNb3ZlKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIC8vXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IHRvdWNoZXMgPSBlLmNoYW5nZWRUb3VjaGVzO1xyXG4gICAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAxICYmIHRoaXMudWlBY3Rpb24udGFyZ2V0ID09PSBjb2wpIHtcclxuXHJcbiAgICAgIGNvbnN0IHh4ID0gdG91Y2hlc1swXS5jbGllbnRYO1xyXG4gICAgICBjb25zdCB5eSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmNoZWNrUmVvcmRlcmluZyh4eCwgeXkpKSB7XHJcbiAgICAgICAgLy8g0J/QtdGA0LXQvNC10YnQtdC90LjQtSDRgtC+0LvRjNC60L4g0LjQvdC40YbQuNCw0LvQuNC30LjRgNC+0LLQsNC90L5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnVpQWN0aW9uLmFjdGlvbiA9PT0gVUlBY3Rpb25UeXBlLlJFT1JERVJfQ09MVU1OKSB7XHJcbiAgICAgICAgdGhpcy5wcm9jZWVkUmVvcmRlcmluZyh4eCwgeXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXB0aW9uVG91Y2hFbmQoZTogYW55KSB7XHJcblxyXG4gICAgdGhpcy5yZW1vdmVUb3VjaE1vdmVMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zY3JvbGxlcikge1xyXG4gICAgICB0aGlzLnNjcm9sbGVyLnN0b3BBdXRvU2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnVpQWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy51aUFjdGlvbiAmJiB0aGlzLnVpQWN0aW9uLmFjdGlvbiA9PT0gVUlBY3Rpb25UeXBlLlJFT1JERVJfQ09MVU1OKSB7XHJcbiAgICAgIHRoaXMuc3RvcFJlb3JkZXJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXB0aW9uU3RhcnREcmFnKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuXHJcbiAgICBpZiAoY29sLmlzQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB4eDogbnVtYmVyO1xyXG4gICAgbGV0IHl5OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKGUudG91Y2hlcykge1xyXG4gICAgICBpZiAoIWUuY2hhbmdlZFRvdWNoZXMgfHwgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHh4ID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xyXG4gICAgICB5eSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTtcclxuXHJcbiAgICAgIHRoaXMucmVtb3ZlVG91Y2hNb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgIHRoaXMudG91Y2hNb3ZlTGlzdGVuRnVuYyA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGV2ZW50LnRhcmdldCwgJ3RvdWNobW92ZScsIChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNhcHRpb25Ub3VjaE1vdmUoZSwgY29sKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG91Y2hFbmRMaXN0ZW5GdW5jID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZXZlbnQudGFyZ2V0LCAndG91Y2hlbmQnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXB0aW9uVG91Y2hFbmQoZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRvdWNoQ2FuY2VsTGlzdGVuRnVuYyA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGV2ZW50LnRhcmdldCwgJ3RvdWNoY2FuY2VsJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FwdGlvblRvdWNoRW5kKGUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBNb3VzZSBldmVudFxyXG4gICAgICB0aGlzLmFkZERvY3VtZW50TW91c2VMaXN0ZW5lcnMoKTtcclxuICAgICAgaWYgKGUuYnV0dG9uICE9IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHh4ID0gZS5jbGllbnRYO1xyXG4gICAgICB5eSA9IGUuY2xpZW50WTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcnIgPSBlLnRhcmdldC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIHRoaXMudWlBY3Rpb24gPSBuZXcgVUlBY3Rpb24oVUlBY3Rpb25UeXBlLkNMSUNLLCBjb2wsIHh4LCB5eSk7XHJcbiAgICB0aGlzLnVpQWN0aW9uLnRhcmdldE9mZnNldFggPSByci5sZWZ0IC0geHg7XHJcbiAgICB0aGlzLnVpQWN0aW9uLnRhcmdldE9mZnNldFkgPSByci50b3AgLSB5eTtcclxuXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgY2FwdGlvblNvcnQoZTogYW55LCBjb2w6IENvbHVtbikge1xyXG5cclxuICAgIGlmIChlLnRvdWNoZXMpIHtcclxuICAgICAgaWYgKCFlLmNoYW5nZWRUb3VjaGVzIHx8IGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZS5idXR0b24gIT0gMCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy51aUFjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudWlBY3Rpb24udGFyZ2V0ID09PSBjb2wgJiYgdGhpcy51aUFjdGlvbi5hY3Rpb24gPT09IFVJQWN0aW9uVHlwZS5DTElDSykge1xyXG4gICAgICBpZiAoIWNvbC5pc0NoZWNrYm94ICYmIGNvbC5hbGxvd1NvcnRpbmcpIHtcclxuICAgICAgICB0aGlzLnN0YXRlLnNvcnRCeUNvbHVtbihjb2wsIGUuc2hpZnRLZXkpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudWlBY3Rpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzaXplTW91c2VEb3duKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIGlmIChjb2wuY2FuUmVzaXplKSB7XHJcbiAgICAgIHRoaXMuaW5pdFJlc2l6aW5nKGUsIGNvbCk7XHJcbiAgICB9XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgcmVzaXplTW91c2VEb3duUHJldihlOiBhbnksIGNvbDogQ29sdW1uKSB7XHJcbiAgICBsZXQgcmVhbENvbCA9IG51bGw7XHJcbiAgICBjb25zdCBpaSA9IHRoaXMubGF5b3V0LmNvbHVtbnMuaW5kZXhPZihjb2wpO1xyXG5cclxuICAgIGlmIChpaSA+IDApIHtcclxuICAgICAgcmVhbENvbCA9IHRoaXMubGF5b3V0LmNvbHVtbnNbaWkgLSAxXTtcclxuICAgICAgdGhpcy5pbml0UmVzaXppbmcoZSwgcmVhbENvbCk7XHJcbiAgICB9XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dIZWFkZXJCdG4oZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5FbGVtZW50cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5FbGVtZW50cy5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgaWYgKGVsLmNvbHVtbi5maWVsZE5hbWUgPT09IGZpZWxkTmFtZSkge1xyXG4gICAgICAgIGVsLnNldFN0YXRlKCdidG4tdmlzaWJsZScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlSGVhZGVyQnRucygpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5FbGVtZW50cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbHVtbkVsZW1lbnRzLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlU3RhdGUoJ2J0bi12aXNpYmxlJykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgcmVuZGVyZWRDb2x1bW5zKCk6IGFueVtdIHtcclxuICAgIGNvbnN0IHJlbmRlcmVkQ29sdW1uczogYW55W10gPSBbXTtcclxuICAgIHRoaXMuY29sdW1uRWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgIHJlbmRlcmVkQ29sdW1ucy5wdXNoKHsgYm91bmRpbmdSZWN0OiBlbC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW06IGVsLmNvbHVtbiB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbmRlcmVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IHJlbmRlcmVkQmFuZHMoKTogYW55W10ge1xyXG4gICAgY29uc3QgcmVuZGVyZWRCYW5kczogYW55W10gPSBbXTtcclxuICAgIHRoaXMuYmFuZEVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICByZW5kZXJlZEJhbmRzLnB1c2goeyBib3VuZGluZ1JlY3Q6IGVsLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbTogZWwuYmFuZCB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbmRlcmVkQmFuZHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9GA0L7QstC10YDQutCwINC/0L7Qt9C40YbQuNC4INC/0YDQuCDQv9C10YDQtdGC0LDRgdC60LjQstCw0L3QuNC4INC30LDQs9C+0LvQvtCy0LrQsCDQutC+0LvQvtC90LrQuCDQuNC70Lgg0LHRjdC90LTQsFxyXG4gICAqIEBwYXJhbSAgbW91c2VBY3Rpb24g0J/QvtC30LjRhtC40Y8g0LzRi9GI0LhcclxuICAgKiBAcGFyYW0gIHNob3cgICAgICAgINCf0L7QutCw0LfRi9Cy0LDRgtGMINC70Lgg0LzQsNGA0LrQtdGAXHJcbiAgICogQHJldHVybiAgICAgICAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICovXHJcbiAgcHVibGljIGNhbkRyb3AobW91c2VBY3Rpb246IFVJQWN0aW9uLCBzaG93OiBib29sZWFuKTogeyBpbkNvbHVtbnM6IGJvb2xlYW4sIGl0ZW06IGFueSwgcG9zOiBzdHJpbmcsICB9IHtcclxuXHJcbiAgICAvL9CX0LTQtdGB0Ywg0L3Rg9C20LXQvSDQv9GA0Y/QvNC+0YPQs9C+0LvRjNC90LjQuiDRgNC+0LTQuNGC0LXQu9GPLi5cclxuICAgIGlmICghdGhpcy5fc2Nyb2xsZXJDbGllbnRSZWN0KVxyXG4gICAgICB0aGlzLl9zY3JvbGxlckNsaWVudFJlY3QgPSB0aGlzLnNjcm9sbGVyLmNsaWVudFJlY3Q7XHJcblxyXG4gICAgbGV0IHIwID0gdGhpcy5fc2Nyb2xsZXJDbGllbnRSZWN0O1xyXG5cclxuICAgIGxldCBoYXNMOiBib29sZWFuID0gZmFsc2U7IC8vINC40LzQtdC10YLRgdGPINCx0L7Qu9C10LUg0LvQtdCy0LDRjyDRgdC+0YHRgtCw0LLQu9GP0Y7RidCw0Y8g0LfQsNCz0L7Qu9C+0LLQutCwXHJcbiAgICBsZXQgaGFzUjogYm9vbGVhbiA9IGZhbHNlOyAvLyDQuNC80LXQtdGC0YHRjyDQsdC+0LvQtdC1INC/0YDQsNCy0LDRjyDRgdC+0YHRgtCw0LLQu9GP0Y7RidCw0Y9cclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXQucGxhY2UgPT09IEdyaWRQYXJ0LkNFTlRFUikge1xyXG4gICAgICByMCA9IHRoaXMuc2Nyb2xsZXIuaGVhZGVyUmVjdDtcclxuICAgICAgaGFzTCA9IHRoaXMuc3RhdGUuc2hvd0ZpeGVkTGVmdDtcclxuICAgICAgaGFzUiA9IHRoaXMuc3RhdGUuc2hvd0ZpeGVkUmlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubGF5b3V0LnBsYWNlID09PSBHcmlkUGFydC5MRUZUKSB7XHJcbiAgICAgIHIwID0gdGhpcy5zY3JvbGxlci5oZWFkZXJSZWN0TGVmdDtcclxuICAgICAgaGFzTCA9IGZhbHNlO1xyXG4gICAgICBoYXNSID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXQucGxhY2UgPT09IEdyaWRQYXJ0LlJJR0hUKSB7XHJcbiAgICAgIHIwID0gdGhpcy5zY3JvbGxlci5oZWFkZXJSZWN0UmlnaHQ7XHJcbiAgICAgIGhhc0wgPSB0cnVlO1xyXG4gICAgICBoYXNSID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGcgPSBtb3VzZUFjdGlvbi50YXJnZXQ7XHJcblxyXG4gICAgY29uc3QgaXNDb2x1bW4gPSB0ZyBpbnN0YW5jZW9mIENvbHVtbjtcclxuICAgIGNvbnN0IGlzQmFuZCA9IHRnIGluc3RhbmNlb2YgQ29sdW1uQmFuZDtcclxuICAgIGxldCByZW5kZXJlZEl0ZW1zOiBhbnlbXTtcclxuXHJcbiAgICBpZiAoaXNDb2x1bW4pIHtcclxuICAgICAgcmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRDb2x1bW5zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRCYW5kcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQuY2