@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
453 lines (450 loc) • 50.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Component, ElementRef, ViewChild, NgZone, Input, Output, EventEmitter, ChangeDetectionStrategy, HostBinding, ViewEncapsulation } from '@angular/core';
import { Subscription, fromEvent } from 'rxjs';
import { debounceTime, filter, publish } from 'rxjs/operators';
import { utils } from './utils/utils';
import { GridsterService } from './gridster.service';
import { GridsterPrototypeService } from './gridster-prototype/gridster-prototype.service';
import { GridsterOptions } from './GridsterOptions';
export class GridsterComponent {
/**
* @param {?} zone
* @param {?} elementRef
* @param {?} gridster
* @param {?} gridsterPrototype
*/
constructor(zone, elementRef, gridster, gridsterPrototype) {
this.zone = zone;
this.gridsterPrototype = gridsterPrototype;
this.optionsChange = new EventEmitter();
this.ready = new EventEmitter();
this.reflow = new EventEmitter();
this.prototypeDrop = new EventEmitter();
this.prototypeEnter = new EventEmitter();
this.prototypeOut = new EventEmitter();
this.draggableOptions = {};
this.isDragging = false;
this.isResizing = false;
this.isReady = false;
this.isPrototypeEntered = false;
this.isDisabled = false;
this.subscription = new Subscription();
this.gridster = gridster;
this.$element = elementRef.nativeElement;
}
/**
* @return {?}
*/
ngOnInit() {
this.gridsterOptions = new GridsterOptions(this.options, this.container);
if (this.options.useCSSTransforms) {
this.$element.classList.add('css-transform');
}
this.subscription.add(this.gridsterOptions.change.subscribe(options => {
this.gridster.options = options;
if (this.gridster.gridList) {
this.gridster.gridList.options = options;
}
this.optionsChange.emit(options);
}));
this.gridster.init(this);
this.subscription.add(fromEvent(window, 'resize')
.pipe(debounceTime(this.gridster.options.responsiveDebounce || 0), filter(() => this.gridster.options.responsiveView))
.subscribe(() => this.reload()));
this.zone.runOutsideAngular(() => {
this.subscription.add(fromEvent(document, 'scroll', { passive: true }).subscribe(() => this.updateGridsterElementData()));
/** @type {?} */
const scrollableContainer = utils.getScrollableContainer(this.$element);
if (scrollableContainer) {
this.subscription.add(fromEvent(scrollableContainer, 'scroll', { passive: true })
.subscribe(() => this.updateGridsterElementData()));
}
});
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.gridster.start();
this.updateGridsterElementData();
this.connectGridsterPrototype();
this.gridster.$positionHighlight = this.$positionHighlight.nativeElement;
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscription.unsubscribe();
}
/**
* Change gridster config option and rebuild
* @template THIS
* @this {THIS}
* @param {?} name
* @param {?} value
* @return {THIS}
*/
setOption(name, value) {
if (name === 'dragAndDrop') {
if (value) {
(/** @type {?} */ (this)).enableDraggable();
}
else {
(/** @type {?} */ (this)).disableDraggable();
}
}
if (name === 'resizable') {
if (value) {
(/** @type {?} */ (this)).enableResizable();
}
else {
(/** @type {?} */ (this)).disableResizable();
}
}
if (name === 'lanes') {
(/** @type {?} */ (this)).gridster.options.lanes = value;
(/** @type {?} */ (this)).gridster.gridList.fixItemsPositions((/** @type {?} */ (this)).gridster.options);
(/** @type {?} */ (this)).reflowGridster();
}
if (name === 'direction') {
(/** @type {?} */ (this)).gridster.options.direction = value;
(/** @type {?} */ (this)).gridster.gridList.pullItemsToLeft();
}
if (name === 'widthHeightRatio') {
(/** @type {?} */ (this)).gridster.options.widthHeightRatio = parseFloat(value || 1);
}
if (name === 'responsiveView') {
(/** @type {?} */ (this)).gridster.options.responsiveView = !!value;
}
(/** @type {?} */ (this)).gridster.gridList.setOption(name, value);
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
reload() {
setTimeout(() => {
(/** @type {?} */ (this)).gridster.fixItemsPositions();
(/** @type {?} */ (this)).reflowGridster();
});
return (/** @type {?} */ (this));
}
/**
* @param {?=} isInit
* @return {?}
*/
reflowGridster(isInit = false) {
this.gridster.reflow();
this.reflow.emit({
isInit: isInit,
gridsterComponent: this
});
}
/**
* @return {?}
*/
updateGridsterElementData() {
this.gridster.gridsterScrollData = this.getScrollPositionFromParents(this.$element);
this.gridster.gridsterRect = this.$element.getBoundingClientRect();
}
/**
* @return {?}
*/
setReady() {
setTimeout(() => (this.isReady = true));
this.ready.emit();
}
/**
* @param {?=} scrollableItemElementSelector
* @return {?}
*/
adjustItemsHeightToContent(scrollableItemElementSelector = '.gridster-item-inner') {
this.gridster.items
// convert each item to object with information about content height and scroll height
.map((item) => {
/** @type {?} */
const scrollEl = item.$element.querySelector(scrollableItemElementSelector);
/** @type {?} */
const contentEl = scrollEl.lastElementChild;
/** @type {?} */
const scrollElDistance = utils.getRelativeCoordinates(scrollEl, item.$element);
/** @type {?} */
const scrollElRect = scrollEl.getBoundingClientRect();
/** @type {?} */
const contentRect = contentEl.getBoundingClientRect();
return {
item,
contentHeight: contentRect.bottom - scrollElRect.top,
scrollElDistance
};
})
// calculate required height in lanes amount and update item "h"
.forEach(data => {
data.item.h = Math.ceil((/** @type {?} */ (((data.contentHeight /
(this.gridster.cellHeight - data.scrollElDistance.top))))));
});
this.gridster.fixItemsPositions();
this.gridster.reflow();
}
/**
* @param {?} item
* @return {?}
*/
disable(item) {
/** @type {?} */
const itemIdx = this.gridster.items.indexOf(item.itemComponent);
this.isDisabled = true;
if (itemIdx >= 0) {
delete this.gridster.items[this.gridster.items.indexOf(item.itemComponent)];
}
this.gridster.onDragOut(item);
}
/**
* @return {?}
*/
enable() {
this.isDisabled = false;
}
/**
* @param {?} element
* @param {?=} data
* @return {?}
*/
getScrollPositionFromParents(element, data = { scrollTop: 0, scrollLeft: 0 }) {
if (element.parentElement && element.parentElement !== document.body) {
data.scrollTop += element.parentElement.scrollTop;
data.scrollLeft += element.parentElement.scrollLeft;
return this.getScrollPositionFromParents(element.parentElement, data);
}
return {
scrollTop: data.scrollTop,
scrollLeft: data.scrollLeft
};
}
/**
* Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop).
* @return {?}
*/
connectGridsterPrototype() {
this.gridsterPrototype.observeDropOut(this.gridster).subscribe();
/** @type {?} */
const dropOverObservable = (/** @type {?} */ ((this.gridsterPrototype
.observeDropOver(this.gridster)
.pipe(publish()))));
/** @type {?} */
const dragObservable = this.gridsterPrototype.observeDragOver(this.gridster);
dragObservable.dragOver
.pipe(filter(() => !this.isDisabled))
.subscribe((prototype) => {
if (!this.isPrototypeEntered) {
return;
}
this.gridster.onDrag(prototype.item);
});
dragObservable.dragEnter
.pipe(filter(() => !this.isDisabled))
.subscribe((prototype) => {
this.isPrototypeEntered = true;
if (this.gridster.items.indexOf(prototype.item) < 0) {
this.gridster.items.push(prototype.item);
}
this.gridster.onStart(prototype.item);
prototype.setDragContextGridster(this.gridster);
if (this.parent) {
this.parent.disable(prototype.item);
}
this.prototypeEnter.emit({ item: prototype.item });
});
dragObservable.dragOut
.pipe(filter(() => !this.isDisabled))
.subscribe((prototype) => {
if (!this.isPrototypeEntered) {
return;
}
this.gridster.onDragOut(prototype.item);
this.isPrototypeEntered = false;
this.prototypeOut.emit({ item: prototype.item });
if (this.parent) {
this.parent.enable();
this.parent.isPrototypeEntered = true;
if (this.parent.gridster.items.indexOf(prototype.item) < 0) {
this.parent.gridster.items.push(prototype.item);
}
this.parent.gridster.onStart(prototype.item);
prototype.setDragContextGridster(this.parent.gridster);
// timeout is needed to be sure that "enter" event is fired after "out"
setTimeout(() => {
this.parent.prototypeEnter.emit({
item: prototype.item
});
prototype.onEnter(this.parent.gridster);
});
}
});
dropOverObservable
.pipe(filter(() => !this.isDisabled))
.subscribe(data => {
if (!this.isPrototypeEntered) {
return;
}
this.gridster.onStop(data.item.item);
this.gridster.removeItem(data.item.item);
this.isPrototypeEntered = false;
if (this.parent) {
this.parent.enable();
}
this.prototypeDrop.emit({ item: data.item.item });
});
dropOverObservable.connect();
}
/**
* @return {?}
*/
enableDraggable() {
this.gridster.options.dragAndDrop = true;
this.gridster.items
.filter(item => item.itemComponent && item.itemComponent.dragAndDrop)
.forEach((item) => item.itemComponent.enableDragDrop());
}
/**
* @return {?}
*/
disableDraggable() {
this.gridster.options.dragAndDrop = false;
this.gridster.items
.filter(item => item.itemComponent)
.forEach((item) => item.itemComponent.disableDraggable());
}
/**
* @return {?}
*/
enableResizable() {
this.gridster.options.resizable = true;
this.gridster.items
.filter(item => item.itemComponent && item.itemComponent.resizable)
.forEach((item) => item.itemComponent.enableResizable());
}
/**
* @return {?}
*/
disableResizable() {
this.gridster.options.resizable = false;
this.gridster.items.forEach((item) => item.itemComponent.disableResizable());
}
}
GridsterComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-gridster',
template: `<div class="gridster-container" #container>
<ng-content></ng-content>
<div class="position-highlight" style="display:none;" #positionHighlight>
<div class="inner"></div>
</div>
</div>`,
providers: [GridsterService],
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
styles: [`
ngx-gridster {
position: relative;
display: block;
left: 0;
width: 100%;
}
ngx-gridster.gridster--dragging {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
ngx-gridster .gridster-container {
position: relative;
width: 100%;
list-style: none;
-webkit-transition: width 0.2s, height 0.2s;
transition: width 0.2s, height 0.2s;
}
ngx-gridster .position-highlight {
display: block;
position: absolute;
z-index: 1;
}
`]
}] }
];
/** @nocollapse */
GridsterComponent.ctorParameters = () => [
{ type: NgZone },
{ type: ElementRef },
{ type: GridsterService },
{ type: GridsterPrototypeService }
];
GridsterComponent.propDecorators = {
options: [{ type: Input }],
optionsChange: [{ type: Output }],
ready: [{ type: Output }],
reflow: [{ type: Output }],
prototypeDrop: [{ type: Output }],
prototypeEnter: [{ type: Output }],
prototypeOut: [{ type: Output }],
draggableOptions: [{ type: Input }],
parent: [{ type: Input }],
$positionHighlight: [{ type: ViewChild, args: ['positionHighlight',] }],
isDragging: [{ type: HostBinding, args: ['class.gridster--dragging',] }],
isResizing: [{ type: HostBinding, args: ['class.gridster--resizing',] }],
isReady: [{ type: HostBinding, args: ['class.gridster--ready',] }],
container: [{ type: ViewChild, args: ['container',] }]
};
if (false) {
/** @type {?} */
GridsterComponent.prototype.options;
/** @type {?} */
GridsterComponent.prototype.optionsChange;
/** @type {?} */
GridsterComponent.prototype.ready;
/** @type {?} */
GridsterComponent.prototype.reflow;
/** @type {?} */
GridsterComponent.prototype.prototypeDrop;
/** @type {?} */
GridsterComponent.prototype.prototypeEnter;
/** @type {?} */
GridsterComponent.prototype.prototypeOut;
/** @type {?} */
GridsterComponent.prototype.draggableOptions;
/** @type {?} */
GridsterComponent.prototype.parent;
/** @type {?} */
GridsterComponent.prototype.$positionHighlight;
/** @type {?} */
GridsterComponent.prototype.isDragging;
/** @type {?} */
GridsterComponent.prototype.isResizing;
/** @type {?} */
GridsterComponent.prototype.isReady;
/** @type {?} */
GridsterComponent.prototype.container;
/** @type {?} */
GridsterComponent.prototype.gridster;
/** @type {?} */
GridsterComponent.prototype.$element;
/** @type {?} */
GridsterComponent.prototype.gridsterOptions;
/** @type {?} */
GridsterComponent.prototype.isPrototypeEntered;
/** @type {?} */
GridsterComponent.prototype.isDisabled;
/** @type {?} */
GridsterComponent.prototype.subscription;
/** @type {?} */
GridsterComponent.prototype.zone;
/** @type {?} */
GridsterComponent.prototype.gridsterPrototype;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUlULFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixFQUN2QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFSCxZQUFZLEVBQ1osU0FBUyxFQUVaLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFHM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBOENwRCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7O0lBMEIxQixZQUNZLElBQVksRUFDcEIsVUFBc0IsRUFDdEIsUUFBeUIsRUFDakIsaUJBQTJDO1FBSDNDLFNBQUksR0FBSixJQUFJLENBQVE7UUFHWixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBNUI3QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDeEMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDaEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDakMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUMzRCxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUEwQixD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OztJQUMxRCxtQ0FBbUM7O0lBRW5DLCtDQUFtRDs7SUFDbkQsdUNBQTREOztJQUM1RCx1Q0FBNEQ7O0lBRTVELG9DQUFzRDs7SUFFdEQsc0NBQThDOztJQUM5QyxxQ0FBMEI7O0lBQzFCLHFDQUFzQjs7SUFFdEIsNENBQWlDOztJQUNqQywrQ0FBMkI7O0lBQzNCLHVDQUEyQjs7SUFDM0IseUNBQTBDOztJQUd0QyxpQ0FBb0I7O0lBR3BCLDhDQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBFbGVtZW50UmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBOZ1pvbmUsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBIb3N0QmluZGluZyxcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgT2JzZXJ2YWJsZSxcbiAgICBTdWJzY3JpcHRpb24sXG4gICAgZnJvbUV2ZW50LFxuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBwdWJsaXNoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsgR3JpZHN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9ncmlkc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7IElHcmlkc3Rlck9wdGlvbnMgfSBmcm9tICcuL0lHcmlkc3Rlck9wdGlvbnMnO1xuaW1wb3J0IHsgSUdyaWRzdGVyRHJhZ2dhYmxlT3B0aW9ucyB9IGZyb20gJy4vSUdyaWRzdGVyRHJhZ2dhYmxlT3B0aW9ucyc7XG5pbXBvcnQgeyBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2UgfSBmcm9tICcuL2dyaWRzdGVyLXByb3RvdHlwZS9ncmlkc3Rlci1wcm90b3R5cGUuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgfSBmcm9tICcuL2dyaWRzdGVyLXByb3RvdHlwZS9ncmlkc3Rlci1pdGVtLXByb3RvdHlwZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi9ncmlkTGlzdC9HcmlkTGlzdEl0ZW0nO1xuaW1wb3J0IHsgR3JpZHN0ZXJPcHRpb25zIH0gZnJvbSAnLi9Hcmlkc3Rlck9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1ncmlkc3RlcicsXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiZ3JpZHN0ZXItY29udGFpbmVyXCIgI2NvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1oaWdobGlnaHRcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiAjcG9zaXRpb25IaWdobGlnaHQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YCxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgbmd4LWdyaWRzdGVyIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmd4LWdyaWRzdGVyLmdyaWRzdGVyLS1kcmFnZ2luZyB7XG4gICAgICAgICAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgICAgICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5neC1ncmlkc3RlciAuZ3JpZHN0ZXItY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDAuMnMsIGhlaWdodCAwLjJzO1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMsIGhlaWdodCAwLjJzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZ3gtZ3JpZHN0ZXIgLnBvc2l0aW9uLWhpZ2hsaWdodCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIGBcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW0dyaWRzdGVyU2VydmljZV0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBHcmlkc3RlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBvcHRpb25zOiBJR3JpZHN0ZXJPcHRpb25zO1xuICAgIEBPdXRwdXQoKSBvcHRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHJlZmxvdyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBwcm90b3R5cGVEcm9wID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IEdyaWRMaXN0SXRlbSB9PigpO1xuICAgIEBPdXRwdXQoKSBwcm90b3R5cGVFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpdGVtOiBHcmlkTGlzdEl0ZW0gfT4oKTtcbiAgICBAT3V0cHV0KCkgcHJvdG90eXBlT3V0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IEdyaWRMaXN0SXRlbSB9PigpO1xuICAgIEBJbnB1dCgpIGRyYWdnYWJsZU9wdGlvbnM6IElHcmlkc3RlckRyYWdnYWJsZU9wdGlvbnMgPSB7fTtcbiAgICBASW5wdXQoKSBwYXJlbnQ6IEdyaWRzdGVyQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgncG9zaXRpb25IaWdobGlnaHQnKSAkcG9zaXRpb25IaWdobGlnaHQ7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ncmlkc3Rlci0tZHJhZ2dpbmcnKSBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ncmlkc3Rlci0tcmVzaXppbmcnKSBpc1Jlc2l6aW5nID0gZmFsc2U7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmdyaWRzdGVyLS1yZWFkeScpIGlzUmVhZHkgPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlO1xuICAgICRlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIGdyaWRzdGVyT3B0aW9uczogR3JpZHN0ZXJPcHRpb25zO1xuICAgIGlzUHJvdG90eXBlRW50ZXJlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGdyaWRzdGVyUHJvdG90eXBlOiBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5ncmlkc3RlciA9IGdyaWRzdGVyO1xuICAgICAgICB0aGlzLiRlbGVtZW50ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyT3B0aW9ucyA9IG5ldyBHcmlkc3Rlck9wdGlvbnModGhpcy5vcHRpb25zLCB0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VDU1NUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Nzcy10cmFuc2Zvcm0nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXJPcHRpb25zLmNoYW5nZS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncmlkc3Rlci5ncmlkTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRMaXN0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2UuZW1pdChvcHRpb25zKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5pbml0KHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5ncmlkc3Rlci5vcHRpb25zLnJlc3BvbnNpdmVEZWJvdW5jZSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5yZXNwb25zaXZlVmlldylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlbG9hZCgpKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgeyBwYXNzaXZlOiB0cnVlIH0pLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdyaWRzdGVyRWxlbWVudERhdGEoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlQ29udGFpbmVyID0gdXRpbHMuZ2V0U2Nyb2xsYWJsZUNvbnRhaW5lcih0aGlzLiRlbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChzY3JvbGxhYmxlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgICAgICAgICBmcm9tRXZlbnQoc2Nyb2xsYWJsZUNvbnRhaW5lciwgJ3Njcm9sbCcsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdyaWRzdGVyRWxlbWVudERhdGEoKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyLnN0YXJ0KCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVHcmlkc3RlckVsZW1lbnREYXRhKCk7XG5cbiAgICAgICAgdGhpcy5jb25uZWN0R3JpZHN0ZXJQcm90b3R5cGUoKTtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRwb3NpdGlvbkhpZ2hsaWdodCA9IHRoaXMuJHBvc2l0aW9uSGlnaGxpZ2h0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIGdyaWRzdGVyIGNvbmZpZyBvcHRpb24gYW5kIHJlYnVpbGRcbiAgICAgKiBAcGFyYW0gc3RyaW5nIG5hbWVcbiAgICAgKiBAcGFyYW0gYW55IHZhbHVlXG4gICAgICogQHJldHVybiBHcmlkc3RlckNvbXBvbmVudFxuICAgICAqL1xuICAgIHNldE9wdGlvbihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdkcmFnQW5kRHJvcCcpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlRHJhZ2dhYmxlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZURyYWdnYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAncmVzaXphYmxlJykge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVSZXNpemFibGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlUmVzaXphYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICdsYW5lcycpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5sYW5lcyA9IHZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRMaXN0LmZpeEl0ZW1zUG9zaXRpb25zKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnJlZmxvd0dyaWRzdGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICdkaXJlY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZGlyZWN0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRMaXN0LnB1bGxJdGVtc1RvTGVmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAnd2lkdGhIZWlnaHRSYXRpbycpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy53aWR0aEhlaWdodFJhdGlvID0gcGFyc2VGbG9hdCh2YWx1ZSB8fCAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3Jlc3BvbnNpdmVWaWV3Jykge1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLnJlc3BvbnNpdmVWaWV3ID0gISF2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRMaXN0LnNldE9wdGlvbihuYW1lLCB2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVsb2FkKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZml4SXRlbXNQb3NpdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmbG93R3JpZHN0ZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVmbG93R3JpZHN0ZXIoaXNJbml0ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5yZWZsb3coKTtcbiAgICAgICAgdGhpcy5yZWZsb3cuZW1pdCh7XG4gICAgICAgICAgICBpc0luaXQ6IGlzSW5pdCxcbiAgICAgICAgICAgIGdyaWRzdGVyQ29tcG9uZW50OiB0aGlzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZUdyaWRzdGVyRWxlbWVudERhdGEoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZHN0ZXJTY3JvbGxEYXRhID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbkZyb21QYXJlbnRzKFxuICAgICAgICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRzdGVyUmVjdCA9IHRoaXMuJGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuXG4gICAgc2V0UmVhZHkoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuaXNSZWFkeSA9IHRydWUpKTtcbiAgICAgICAgdGhpcy5yZWFkeS5lbWl0KCk7XG4gICAgfVxuXG4gICAgYWRqdXN0SXRlbXNIZWlnaHRUb0NvbnRlbnQoXG4gICAgICAgIHNjcm9sbGFibGVJdGVtRWxlbWVudFNlbGVjdG9yOiBzdHJpbmcgPSAnLmdyaWRzdGVyLWl0ZW0taW5uZXInXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuaXRlbXNcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgZWFjaCBpdGVtIHRvIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGNvbnRlbnQgaGVpZ2h0IGFuZCBzY3JvbGwgaGVpZ2h0XG4gICAgICAgICAgICAubWFwKChpdGVtOiBHcmlkTGlzdEl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxFbCA9IGl0ZW0uJGVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZUl0ZW1FbGVtZW50U2VsZWN0b3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbCA9IHNjcm9sbEVsLmxhc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRWxEaXN0YW5jZSA9IHV0aWxzLmdldFJlbGF0aXZlQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEVsLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLiRlbGVtZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxFbFJlY3QgPSBzY3JvbGxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UmVjdCA9IGNvbnRlbnRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQ6IGNvbnRlbnRSZWN0LmJvdHRvbSAtIHNjcm9sbEVsUmVjdC50b3AsXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEVsRGlzdGFuY2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSByZXF1aXJlZCBoZWlnaHQgaW4gbGFuZXMgYW1vdW50IGFuZCB1cGRhdGUgaXRlbSBcImhcIlxuICAgICAgICAgICAgLmZvckVhY2goZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YS5pdGVtLmggPSBNYXRoLmNlaWwoPGFueT4oXG4gICAgICAgICAgICAgICAgICAgIChkYXRhLmNvbnRlbnRIZWlnaHQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuZ3JpZHN0ZXIuY2VsbEhlaWdodCAtIGRhdGEuc2Nyb2xsRWxEaXN0YW5jZS50b3ApKVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5maXhJdGVtc1Bvc2l0aW9ucygpO1xuICAgICAgICB0aGlzLmdyaWRzdGVyLnJlZmxvdygpO1xuICAgIH1cblxuICAgIGRpc2FibGUoaXRlbSkge1xuICAgICAgICBjb25zdCBpdGVtSWR4ID0gdGhpcy5ncmlkc3Rlci5pdGVtcy5pbmRleE9mKGl0ZW0uaXRlbUNvbXBvbmVudCk7XG5cbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGl0ZW1JZHggPj0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZ3JpZHN0ZXIuaXRlbXNbXG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5pdGVtcy5pbmRleE9mKGl0ZW0uaXRlbUNvbXBvbmVudClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5vbkRyYWdPdXQoaXRlbSk7XG4gICAgfVxuXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNjcm9sbFBvc2l0aW9uRnJvbVBhcmVudHMoXG4gICAgICAgIGVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgICAgIGRhdGEgPSB7IHNjcm9sbFRvcDogMCwgc2Nyb2xsTGVmdDogMCB9XG4gICAgKTogeyBzY3JvbGxUb3A6IG51bWJlcjsgc2Nyb2xsTGVmdDogbnVtYmVyIH0ge1xuICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgZGF0YS5zY3JvbGxUb3AgKz0gZWxlbWVudC5wYXJlbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgIGRhdGEuc2Nyb2xsTGVmdCArPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb25Gcm9tUGFyZW50cyhcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY3JvbGxUb3A6IGRhdGEuc2Nyb2xsVG9wLFxuICAgICAgICAgICAgc2Nyb2xsTGVmdDogZGF0YS5zY3JvbGxMZWZ0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCBncmlkc3RlciBwcm90b3R5cGUgaXRlbSB0byBncmlkc3RlciBkcmFnZ2luZyBob29rcyAob25TdGFydCwgb25EcmFnLCBvblN0b3ApLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29ubmVjdEdyaWRzdGVyUHJvdG90eXBlKCkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyUHJvdG90eXBlLm9ic2VydmVEcm9wT3V0KHRoaXMuZ3JpZHN0ZXIpLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIGNvbnN0IGRyb3BPdmVyT2JzZXJ2YWJsZSA9IDxDb25uZWN0YWJsZU9ic2VydmFibGU8YW55Pj4oXG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyUHJvdG90eXBlXG4gICAgICAgICAgICAgICAgLm9ic2VydmVEcm9wT3Zlcih0aGlzLmdyaWRzdGVyKVxuICAgICAgICAgICAgICAgIC5waXBlKHB1Ymxpc2goKSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkcmFnT2JzZXJ2YWJsZSA9IHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGUub2JzZXJ2ZURyYWdPdmVyKFxuICAgICAgICAgICAgdGhpcy5ncmlkc3RlclxuICAgICAgICApO1xuXG4gICAgICAgIGRyYWdPYnNlcnZhYmxlLmRyYWdPdmVyXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMuaXNEaXNhYmxlZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChwcm90b3R5cGU6IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Byb3RvdHlwZUVudGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVyLm9uRHJhZyhwcm90b3R5cGUuaXRlbSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkcmFnT2JzZXJ2YWJsZS5kcmFnRW50ZXJcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5pc0Rpc2FibGVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByb3RvdHlwZTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Byb3RvdHlwZUVudGVyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuaXRlbXMuaW5kZXhPZihwcm90b3R5cGUuaXRlbSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuaXRlbXMucHVzaChwcm90b3R5cGUuaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIub25TdGFydChwcm90b3R5cGUuaXRlbSk7XG4gICAgICAgICAgICAgICAgcHJvdG90eXBlLnNldERyYWdDb250ZXh0R3JpZHN0ZXIodGhpcy5ncmlkc3Rlcik7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGlzYWJsZShwcm90b3R5cGUuaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdG90eXBlRW50ZXIuZW1pdCh7IGl0ZW06IHByb3RvdHlwZS5pdGVtIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZHJhZ09ic2VydmFibGUuZHJhZ091dFxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLmlzRGlzYWJsZWQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocHJvdG90eXBlOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNQcm90b3R5cGVFbnRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vbkRyYWdPdXQocHJvdG90eXBlLml0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNQcm90b3R5cGVFbnRlcmVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnByb3RvdHlwZU91dC5lbWl0KHsgaXRlbTogcHJvdG90eXBlLml0ZW0gfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW5hYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuaXNQcm90b3R5cGVFbnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZ3JpZHN0ZXIuaXRlbXMuaW5kZXhPZihwcm90b3R5cGUuaXRlbSkgPCAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZ3JpZHN0ZXIuaXRlbXMucHVzaChwcm90b3R5cGUuaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZ3JpZHN0ZXIub25TdGFydChwcm90b3R5cGUuaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZS5zZXREcmFnQ29udGV4dEdyaWRzdGVyKHRoaXMucGFyZW50LmdyaWRzdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dCBpcyBuZWVkZWQgdG8gYmUgc3VyZSB0aGF0IFwiZW50ZXJcIiBldmVudCBpcyBmaXJlZCBhZnRlciBcIm91dFwiXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucHJvdG90eXBlRW50ZXIuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogcHJvdG90eXBlLml0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlLm9uRW50ZXIodGhpcy5wYXJlbnQuZ3JpZHN0ZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkcm9wT3Zlck9ic2VydmFibGVcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5pc0Rpc2FibGVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUHJvdG90eXBlRW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vblN0b3AoZGF0YS5pdGVtLml0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIucmVtb3ZlSXRlbShkYXRhLml0ZW0uaXRlbSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmlzUHJvdG90eXBlRW50ZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wcm90b3R5cGVEcm9wLmVtaXQoeyBpdGVtOiBkYXRhLml0ZW0uaXRlbSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRyb3BPdmVyT2JzZXJ2YWJsZS5jb25uZWN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVEcmFnZ2FibGUoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnQW5kRHJvcCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5pdGVtc1xuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICBpdGVtID0+IGl0ZW0uaXRlbUNvbXBvbmVudCAmJiBpdGVtLml0ZW1Db21wb25lbnQuZHJhZ0FuZERyb3BcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5mb3JFYWNoKChpdGVtOiBHcmlkTGlzdEl0ZW0pID0+XG4gICAgICAgICAgICAgICAgaXRlbS5pdGVtQ29tcG9uZW50LmVuYWJsZURyYWdEcm9wKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlRHJhZ2dhYmxlKCkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ0FuZERyb3AgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyLml0ZW1zXG4gICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pdGVtQ29tcG9uZW50KVxuICAgICAgICAgICAgLmZvckVhY2goKGl0ZW06IEdyaWRMaXN0SXRlbSkgPT5cbiAgICAgICAgICAgICAgICBpdGVtLml0ZW1Db21wb25lbnQuZGlzYWJsZURyYWdnYWJsZSgpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlUmVzaXphYmxlKCkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMucmVz