UNPKG

@blare/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

453 lines (450 loc) 50.6 kB
/** * @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