@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
475 lines • 45.1 kB
JavaScript
import { __decorate, __metadata, __param, __read, __spread } from "tslib";
import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, NgModule, OnDestroy, OnInit, Optional, Output, Inject } from '@angular/core';
import { IgxNavigationService, IToggleView } from '../../core/navigation';
import { IgxOverlayService } from '../../services/overlay/overlay';
import { ConnectedPositioningStrategy, AbsoluteScrollStrategy } from '../../services';
import { filter, takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
var IgxToggleDirective = /** @class */ (function () {
/**
* @hidden
*/
function IgxToggleDirective(elementRef, cdr, overlayService, navigationService) {
var _this = this;
this.elementRef = elementRef;
this.cdr = cdr;
this.overlayService = overlayService;
this.navigationService = navigationService;
this.destroy$ = new Subject();
this._overlaySubFilter = [
filter(function (x) { return x.id === _this._overlayId; }),
takeUntil(this.destroy$)
];
/**
* Emits an event after the toggle container is opened.
*
* ```typescript
* onToggleOpened(event) {
* alert("Toggle opened!");
* }
* ```
*
* ```html
* <div
* igxToggle
* (onOpened)='onToggleOpened($event)'>
* </div>
* ```
*/
this.onOpened = new EventEmitter();
/**
* Emits an event before the toggle container is opened.
*
* ```typescript
* onToggleOpening(event) {
* alert("Toggle opening!");
* }
* ```
*
* ```html
* <div
* igxToggle
* (onOpening)='onToggleOpening($event)'>
* </div>
* ```
*/
this.onOpening = new EventEmitter();
/**
* Emits an event after the toggle container is closed.
*
* ```typescript
* onToggleClosed(event) {
* alert("Toggle closed!");
* }
* ```
*
* ```html
* <div
* igxToggle
* (onClosed)='onToggleClosed($event)'>
* </div>
* ```
*/
this.onClosed = new EventEmitter();
/**
* Emits an event before the toggle container is closed.
*
* ```typescript
* onToggleClosing(event) {
* alert("Toggle closing!");
* }
* ```
*
* ```html
* <div
* igxToggle
* (onClosing)='onToggleClosing($event)'>
* </div>
* ```
*/
this.onClosing = new EventEmitter();
this._collapsed = true;
this.overlayClosed = function () {
_this._collapsed = true;
_this.cdr.detectChanges();
delete _this._overlayId;
_this.unsubscribe();
_this.onClosed.emit();
};
}
Object.defineProperty(IgxToggleDirective.prototype, "collapsed", {
/**
* @hidden
*/
get: function () {
return this._collapsed;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxToggleDirective.prototype, "element", {
/**
* @hidden
*/
get: function () {
return this.elementRef.nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxToggleDirective.prototype, "hiddenClass", {
/**
* @hidden
*/
get: function () {
return this.collapsed;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxToggleDirective.prototype, "defaultClass", {
/**
* @hidden
*/
get: function () {
return !this.collapsed;
},
enumerable: true,
configurable: true
});
/**
* Opens the toggle.
*
* ```typescript
* this.myToggle.open();
* ```
*/
IgxToggleDirective.prototype.open = function (overlaySettings) {
var _a, _b, _c;
var _this = this;
// if there is open animation do nothing
// if toggle is not collapsed and there is no close animation do nothing
var info = this.overlayService.getOverlayById(this._overlayId);
var hasOpenAnimation = info ? info.openAnimationPlayer : false;
var hasCloseAnimation = info ? info.closeAnimationPlayer : false;
if (hasOpenAnimation || !(this._collapsed || hasCloseAnimation)) {
return;
}
if (!info) {
this._overlayId = this.overlayService.attach(this.elementRef, overlaySettings);
}
this._collapsed = false;
this.cdr.detectChanges();
var openEventArgs = { cancel: false };
this.onOpening.emit(openEventArgs);
if (openEventArgs.cancel) {
this._collapsed = true;
this.cdr.detectChanges();
return;
}
this.overlayService.show(this._overlayId, overlaySettings);
this.unsubscribe();
this._overlayOpenedSub = (_a = this.overlayService.onOpened).pipe.apply(_a, __spread(this._overlaySubFilter)).subscribe(function () {
_this.onOpened.emit();
});
this._overlayClosingSub = (_b = this.overlayService
.onClosing).pipe.apply(_b, __spread(this._overlaySubFilter)).subscribe(function (e) {
var eventArgs = { cancel: false, event: e.event };
_this.onClosing.emit(eventArgs);
e.cancel = eventArgs.cancel;
// in case event is not canceled this will close the toggle and we need to unsubscribe.
// Otherwise if for some reason, e.g. close on outside click, close() gets called before
// onClosed was fired we will end with calling onClosing more than once
if (!e.cancel) {
_this.clearSubscription(_this._overlayClosingSub);
}
});
this._overlayClosedSub = (_c = this.overlayService.onClosed).pipe.apply(_c, __spread(this._overlaySubFilter)).subscribe(this.overlayClosed);
};
/**
* Closes the toggle.
*
* ```typescript
* this.myToggle.close();
* ```
*/
IgxToggleDirective.prototype.close = function () {
// if toggle is collapsed do nothing
// if there is close animation do nothing, toggle will close anyway
var info = this.overlayService.getOverlayById(this._overlayId);
var hasCloseAnimation = info ? info.closeAnimationPlayer : false;
if (this._collapsed || hasCloseAnimation) {
return;
}
this.overlayService.hide(this._overlayId);
};
/**
* Opens or closes the toggle, depending on its current state.
*
* ```typescript
* this.myToggle.toggle();
* ```
*/
IgxToggleDirective.prototype.toggle = function (overlaySettings) {
// if toggle is collapsed call open
// if there is close animation call open
if (this.collapsed || this.isClosing) {
this.open(overlaySettings);
}
else {
this.close();
}
};
Object.defineProperty(IgxToggleDirective.prototype, "isClosing", {
/** @hidden @internal */
get: function () {
var info = this.overlayService.getOverlayById(this._overlayId);
return info ? info.closeAnimationPlayer : false;
},
enumerable: true,
configurable: true
});
/**
* Repositions the toggle.
* ```typescript
* this.myToggle.reposition();
* ```
*/
IgxToggleDirective.prototype.reposition = function () {
this.overlayService.reposition(this._overlayId);
};
/**
* Offsets the content along the corresponding axis by the provided amount
*/
IgxToggleDirective.prototype.setOffset = function (deltaX, deltaY) {
this.overlayService.setOffset(this._overlayId, deltaX, deltaY);
};
/**
* @hidden
*/
IgxToggleDirective.prototype.ngOnInit = function () {
if (this.navigationService && this.id) {
this.navigationService.add(this.id, this);
}
};
/**
* @hidden
*/
IgxToggleDirective.prototype.ngOnDestroy = function () {
if (this.navigationService && this.id) {
this.navigationService.remove(this.id);
}
if (!this.collapsed && this._overlayId) {
this.overlayService.hide(this._overlayId);
}
this.unsubscribe();
this.destroy$.next(true);
this.destroy$.complete();
};
IgxToggleDirective.prototype.unsubscribe = function () {
this.clearSubscription(this._overlayOpenedSub);
this.clearSubscription(this._overlayClosingSub);
this.clearSubscription(this._overlayClosedSub);
};
IgxToggleDirective.prototype.clearSubscription = function (subscription) {
if (subscription && !subscription.closed) {
subscription.unsubscribe();
}
};
IgxToggleDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: IgxOverlayService, decorators: [{ type: Inject, args: [IgxOverlayService,] }] },
{ type: IgxNavigationService, decorators: [{ type: Optional }] }
]; };
__decorate([
Output(),
__metadata("design:type", Object)
], IgxToggleDirective.prototype, "onOpened", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxToggleDirective.prototype, "onOpening", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxToggleDirective.prototype, "onClosed", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxToggleDirective.prototype, "onClosing", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxToggleDirective.prototype, "id", void 0);
__decorate([
HostBinding('class.igx-toggle--hidden'),
HostBinding('attr.aria-hidden'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxToggleDirective.prototype, "hiddenClass", null);
__decorate([
HostBinding('class.igx-toggle'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxToggleDirective.prototype, "defaultClass", null);
IgxToggleDirective = __decorate([
Directive({
exportAs: 'toggle',
selector: '[igxToggle]'
}),
__param(2, Inject(IgxOverlayService)),
__param(3, Optional()),
__metadata("design:paramtypes", [ElementRef,
ChangeDetectorRef,
IgxOverlayService,
IgxNavigationService])
], IgxToggleDirective);
return IgxToggleDirective;
}());
export { IgxToggleDirective };
var IgxToggleActionDirective = /** @class */ (function () {
function IgxToggleActionDirective(element, navigationService) {
this.element = element;
this.navigationService = navigationService;
}
Object.defineProperty(IgxToggleActionDirective.prototype, "target", {
/**
* @hidden
*/
get: function () {
if (typeof this._target === 'string') {
return this.navigationService.get(this._target);
}
return this._target;
},
/**
* @hidden
*/
set: function (target) {
if (target !== null && target !== '') {
this._target = target;
}
},
enumerable: true,
configurable: true
});
/**
* @hidden
*/
IgxToggleActionDirective.prototype.ngOnInit = function () {
this._overlayDefaults = {
positionStrategy: new ConnectedPositioningStrategy({ target: this.element.nativeElement }),
scrollStrategy: new AbsoluteScrollStrategy(),
closeOnOutsideClick: true,
modal: false,
excludePositionTarget: true
};
};
/**
* @hidden
*/
IgxToggleActionDirective.prototype.onClick = function () {
if (this.outlet) {
this._overlayDefaults.outlet = this.outlet;
}
var clonedSettings = Object.assign({}, this._overlayDefaults, this.overlaySettings);
this.updateOverlaySettings(clonedSettings);
this.target.toggle(clonedSettings);
};
/**
* Updates provided overlay settings
* @param settings settings to update
* @returns returns updated copy of provided overlay settings
*/
IgxToggleActionDirective.prototype.updateOverlaySettings = function (settings) {
if (settings && settings.positionStrategy) {
var positionStrategyClone = settings.positionStrategy.clone();
positionStrategyClone.settings.target = this.element.nativeElement;
settings.positionStrategy = positionStrategyClone;
}
return settings;
};
IgxToggleActionDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: IgxNavigationService, decorators: [{ type: Optional }] }
]; };
__decorate([
Input(),
__metadata("design:type", Object)
], IgxToggleActionDirective.prototype, "overlaySettings", void 0);
__decorate([
Input('igxToggleOutlet'),
__metadata("design:type", Object)
], IgxToggleActionDirective.prototype, "outlet", void 0);
__decorate([
Input('igxToggleAction'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxToggleActionDirective.prototype, "target", null);
__decorate([
HostListener('click'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxToggleActionDirective.prototype, "onClick", null);
IgxToggleActionDirective = __decorate([
Directive({
exportAs: 'toggle-action',
selector: '[igxToggleAction]'
}),
__param(1, Optional()),
__metadata("design:paramtypes", [ElementRef, IgxNavigationService])
], IgxToggleActionDirective);
return IgxToggleActionDirective;
}());
export { IgxToggleActionDirective };
/**
* Mark an element as an igxOverlay outlet container.
* Directive instance is exported as `overlay-outlet` to be assigned to templates variables:
* ```html
* <div igxOverlayOutlet #outlet="overlay-outlet"></div>
* ```
*/
var IgxOverlayOutletDirective = /** @class */ (function () {
function IgxOverlayOutletDirective(element) {
this.element = element;
}
Object.defineProperty(IgxOverlayOutletDirective.prototype, "nativeElement", {
/** @hidden */
get: function () {
return this.element.nativeElement;
},
enumerable: true,
configurable: true
});
IgxOverlayOutletDirective.ctorParameters = function () { return [
{ type: ElementRef }
]; };
IgxOverlayOutletDirective = __decorate([
Directive({
exportAs: 'overlay-outlet',
selector: '[igxOverlayOutlet]'
}),
__metadata("design:paramtypes", [ElementRef])
], IgxOverlayOutletDirective);
return IgxOverlayOutletDirective;
}());
export { IgxOverlayOutletDirective };
/**
* @hidden
*/
var IgxToggleModule = /** @class */ (function () {
function IgxToggleModule() {
}
IgxToggleModule = __decorate([
NgModule({
declarations: [IgxToggleDirective, IgxToggleActionDirective, IgxOverlayOutletDirective],
exports: [IgxToggleDirective, IgxToggleActionDirective, IgxOverlayOutletDirective],
providers: [IgxNavigationService]
})
], IgxToggleModule);
return IgxToggleModule;
}());
export { IgxToggleModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFxQyw0QkFBNEIsRUFBRSxzQkFBc0IsRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1SSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBZ0IsT0FBTyxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQVF2RTtJQWlJSTs7T0FFRztJQUNILDRCQUNZLFVBQXNCLEVBQ3RCLEdBQXNCLEVBQ08sY0FBaUMsRUFDbEQsaUJBQXVDO1FBSi9ELGlCQUtDO1FBSlcsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNPLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNsRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXNCO1FBdEl2RCxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUNsQyxzQkFBaUIsR0FBNkY7WUFDbEgsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxLQUFJLENBQUMsVUFBVSxF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QUErQixDQUFDO0lBQW5CLGVBQWU7UUFMM0IsUUFBUSxDQUFDO1lBQ04sWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLENBQUM7WUFDdkYsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLENBQUM7WUFDbEYsU0FBUyxFQUFFLENBQUMsb0JBQW9CLENBQUM7U0FDcEMsQ0FBQztPQUNXLGVBQWUsQ0FBSTtJQUFELHNCQUFDO0NBQUEsQUFBaEMsSUFBZ0M7U0FBbkIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBJbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hOYXZpZ2F0aW9uU2VydmljZSwgSVRvZ2dsZVZpZXcgfSBmcm9tICcuLi8uLi9jb3JlL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgT3ZlcmxheVNldHRpbmdzLCBPdmVybGF5RXZlbnRBcmdzLCBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5LCBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBJUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0LCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE92ZXJsYXlDbG9zaW5nRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ2FuY2VsYWJsZUV2ZW50QXJncywgQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MsIElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIGV4cG9ydEFzOiAndG9nZ2xlJyxcbiAgICBzZWxlY3RvcjogJ1tpZ3hUb2dnbGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hUb2dnbGVEaXJlY3RpdmUgaW1wbGVtZW50cyBJVG9nZ2xlVmlldywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHByb3RlY3RlZCBfb3ZlcmxheUlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheVN1YkZpbHRlcjogW01vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxPdmVybGF5RXZlbnRBcmdzPiwgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPE92ZXJsYXlFdmVudEFyZ3M+XSA9IFtcbiAgICAgICAgZmlsdGVyKHggPT4geC5pZCA9PT0gdGhpcy5fb3ZlcmxheUlkKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgXTtcbiAgICBwcml2YXRlIF9vdmVybGF5T3BlbmVkU3ViOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBfb3ZlcmxheUNsb3NpbmdTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIF9vdmVybGF5Q2xvc2VkU3ViOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCBhZnRlciB0aGUgdG9nZ2xlIGNvbnRhaW5lciBpcyBvcGVuZWQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogb25Ub2dnbGVPcGVuZWQoZXZlbnQpIHtcbiAgICAgKiAgICBhbGVydChcIlRvZ2dsZSBvcGVuZWQhXCIpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUb2dnbGVcbiAgICAgKiAgIChvbk9wZW5lZCk9J29uVG9nZ2xlT3BlbmVkKCRldmVudCknPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbk9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IGJlZm9yZSB0aGUgdG9nZ2xlIGNvbnRhaW5lciBpcyBvcGVuZWQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogb25Ub2dnbGVPcGVuaW5nKGV2ZW50KSB7XG4gICAgICogIGFsZXJ0KFwiVG9nZ2xlIG9wZW5pbmchXCIpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUb2dnbGVcbiAgICAgKiAgIChvbk9wZW5pbmcpPSdvblRvZ2dsZU9wZW5pbmcoJGV2ZW50KSc+XG4gICAgICogPC9kaXY+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uT3BlbmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FuY2VsYWJsZUV2ZW50QXJncyAmIElCYXNlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYWZ0ZXIgdGhlIHRvZ2dsZSBjb250YWluZXIgaXMgY2xvc2VkLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIG9uVG9nZ2xlQ2xvc2VkKGV2ZW50KSB7XG4gICAgICogIGFsZXJ0KFwiVG9nZ2xlIGNsb3NlZCFcIik7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRvZ2dsZVxuICAgICAqICAgKG9uQ2xvc2VkKT0nb25Ub2dnbGVDbG9zZWQoJGV2ZW50KSc+XG4gICAgICogPC9kaXY+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSB0b2dnbGUgY29udGFpbmVyIGlzIGNsb3NlZC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBvblRvZ2dsZUNsb3NpbmcoZXZlbnQpIHtcbiAgICAgKiAgYWxlcnQoXCJUb2dnbGUgY2xvc2luZyFcIik7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgaWd4VG9nZ2xlXG4gICAgICogIChvbkNsb3NpbmcpPSdvblRvZ2dsZUNsb3NpbmcoJGV2ZW50KSc+XG4gICAgICogPC9kaXY+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2xvc2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MgJiBJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIHByaXZhdGUgX2NvbGxhcHNlZCA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sbGFwc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgd2hpY2ggaXMgcmVnaXN0ZXJlZCBpbnRvIGBJZ3hOYXZpZ2F0aW9uU2VydmljZWBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbXlUb2dnbGVJZCA9IHRoaXMudG9nZ2xlLmlkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10b2dnbGUtLWhpZGRlbicpXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGlkZGVuJylcbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRvZ2dsZScpXG4gICAgcHVibGljIGdldCBkZWZhdWx0Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogSWd4TmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgdG9nZ2xlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMubXlUb2dnbGUub3BlbigpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKG92ZXJsYXlTZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncykge1xuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgb3BlbiBhbmltYXRpb24gZG8gbm90aGluZ1xuICAgICAgICAvLyAgaWYgdG9nZ2xlIGlzIG5vdCBjb2xsYXBzZWQgYW5kIHRoZXJlIGlzIG5vIGNsb3NlIGFuaW1hdGlvbiBkbyBub3RoaW5nXG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIGNvbnN0IGhhc09wZW5BbmltYXRpb24gPSBpbmZvID8gaW5mby5vcGVuQW5pbWF0aW9uUGxheWVyIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGhhc0Nsb3NlQW5pbWF0aW9uID0gaW5mbyA/IGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgOiBmYWxzZTtcbiAgICAgICAgaWYgKGhhc09wZW5BbmltYXRpb24gfHwgISh0aGlzLl9jb2xsYXBzZWQgfHwgaGFzQ2xvc2VBbmltYXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlJZCA9IHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKHRoaXMuZWxlbWVudFJlZiwgb3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgY29uc3Qgb3BlbkV2ZW50QXJnczogQ2FuY2VsYWJsZUV2ZW50QXJncyA9IHsgY2FuY2VsOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLm9uT3BlbmluZy5lbWl0KG9wZW5FdmVudEFyZ3MpO1xuICAgICAgICBpZiAob3BlbkV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLnNob3codGhpcy5fb3ZlcmxheUlkLCBvdmVybGF5U2V0dGluZ3MpO1xuXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheU9wZW5lZFN1YiA9IHRoaXMub3ZlcmxheVNlcnZpY2Uub25PcGVuZWQucGlwZSguLi50aGlzLl9vdmVybGF5U3ViRmlsdGVyKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbk9wZW5lZC5lbWl0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlDbG9zaW5nU3ViID0gdGhpcy5vdmVybGF5U2VydmljZVxuICAgICAgICAgICAgLm9uQ2xvc2luZ1xuICAgICAgICAgICAgLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcilcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGU6IE92ZXJsYXlDbG9zaW5nRXZlbnRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyA9IHsgY2FuY2VsOiBmYWxzZSwgZXZlbnQ6IGUuZXZlbnQgfTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2luZy5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgICAgICAgICAgZS5jYW5jZWwgPSBldmVudEFyZ3MuY2FuY2VsO1xuXG4gICAgICAgICAgICAgICAgLy8gIGluIGNhc2UgZXZlbnQgaXMgbm90IGNhbmNlbGVkIHRoaXMgd2lsbCBjbG9zZSB0aGUgdG9nZ2xlIGFuZCB3ZSBuZWVkIHRvIHVuc3Vic2NyaWJlLlxuICAgICAgICAgICAgICAgIC8vICBPdGhlcndpc2UgaWYgZm9yIHNvbWUgcmVhc29uLCBlLmcuIGNsb3NlIG9uIG91dHNpZGUgY2xpY2ssIGNsb3NlKCkgZ2V0cyBjYWxsZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gIG9uQ2xvc2VkIHdhcyBmaXJlZCB3ZSB3aWxsIGVuZCB3aXRoIGNhbGxpbmcgb25DbG9zaW5nIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgICAgICAgaWYgKCFlLmNhbmNlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU3Vic2NyaXB0aW9uKHRoaXMuX292ZXJsYXlDbG9zaW5nU3ViKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5Q2xvc2VkU3ViID0gdGhpcy5vdmVybGF5U2VydmljZS5vbkNsb3NlZFxuICAgICAgICAgICAgLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcilcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5vdmVybGF5Q2xvc2VkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHRvZ2dsZS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLm15VG9nZ2xlLmNsb3NlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlKCkge1xuICAgICAgICAvLyAgaWYgdG9nZ2xlIGlzIGNvbGxhcHNlZCBkbyBub3RoaW5nXG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBjbG9zZSBhbmltYXRpb24gZG8gbm90aGluZywgdG9nZ2xlIHdpbGwgY2xvc2UgYW55d2F5XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIGNvbnN0IGhhc0Nsb3NlQW5pbWF0aW9uID0gaW5mbyA/IGluZm8uY2xvc2VBbmltYXRpb25QbGF5ZXIgOiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2NvbGxhcHNlZCB8fCBoYXNDbG9zZUFuaW1hdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgb3IgY2xvc2VzIHRoZSB0b2dnbGUsIGRlcGVuZGluZyBvbiBpdHMgY3VycmVudCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLm15VG9nZ2xlLnRvZ2dsZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUob3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgICAgIC8vICBpZiB0b2dnbGUgaXMgY29sbGFwc2VkIGNhbGwgb3BlblxuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgY2xvc2UgYW5pbWF0aW9uIGNhbGwgb3BlblxuICAgICAgICBpZiAodGhpcy5jb2xsYXBzZWQgfHwgdGhpcy5pc0Nsb3NpbmcpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbihvdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBpc0Nsb3NpbmcoKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIHJldHVybiBpbmZvID8gaW5mby5jbG9zZUFuaW1hdGlvblBsYXllciA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcG9zaXRpb25zIHRoZSB0b2dnbGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMubXlUb2dnbGUucmVwb3NpdGlvbigpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZXBvc2l0aW9uKCkge1xuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLnJlcG9zaXRpb24odGhpcy5fb3ZlcmxheUlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPZmZzZXRzIHRoZSBjb250ZW50IGFsb25nIHRoZSBjb3JyZXNwb25kaW5nIGF4aXMgYnkgdGhlIHByb3ZpZGVkIGFtb3VudFxuICAgICAqL1xuICAgIHNldE9mZnNldChkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5zZXRPZmZzZXQodGhpcy5fb3ZlcmxheUlkLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UgJiYgdGhpcy5pZCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hZGQodGhpcy5pZCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2VydmljZSAmJiB0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlbW92ZSh0aGlzLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2VkICYmIHRoaXMuX292ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG92ZXJsYXlDbG9zZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX292ZXJsYXlJZDtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLm9uQ2xvc2VkLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICB0aGlzLmNsZWFyU3Vic2NyaXB0aW9uKHRoaXMuX292ZXJsYXlPcGVuZWRTdWIpO1xuICAgICAgICB0aGlzLmNsZWFyU3Vic2NyaXB0aW9uKHRoaXMuX292ZXJsYXlDbG9zaW5nU3ViKTtcbiAgICAgICAgdGhpcy5jbGVhclN1YnNjcmlwdGlvbih0aGlzLl9vdmVybGF5Q2xvc2VkU3ViKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24gJiYgIXN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBleHBvcnRBczogJ3RvZ2dsZS1hY3Rpb24nLFxuICAgIHNlbGVjdG9yOiAnW2lneFRvZ2dsZUFjdGlvbl0nXG59KVxuZXhwb3J0IGNsYXNzIElneFRvZ2dsZUFjdGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJvdGVjdGVkIF9vdmVybGF5RGVmYXVsdHM6IE92ZXJsYXlTZXR0aW5ncztcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgc2V0dGluZ3MgdGhhdCBjb250cm9sIHRoZSB0b2dnbGUgb3ZlcmxheSBwb3NpdGlvbmluZywgaW50ZXJhY3Rpb24gYW5kIHNjcm9sbCBiZWhhdmlvci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgKiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAqICAgICAgbW9kYWw6IGZhbHNlXG4gICAgICogIH1cbiAgICAgKiBgYGBcbiAgICAgKiAtLS1cbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxkaXYgaWd4VG9nZ2xlQWN0aW9uIFtvdmVybGF5U2V0dGluZ3NdPVwic2V0dGluZ3NcIj48L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncztcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hlcmUgdGhlIHRvZ2dsZSBlbGVtZW50IG92ZXJsYXkgc2hvdWxkIGJlIGF0dGFjaGVkLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8ZGl2IGlneFRvZ2dsZUFjdGlvbiBbaWd4VG9nZ2xlT3V0bGV0XT1cIm91dGxldFwiPjwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqIFdoZXJlIGBvdXRsZXRgIGluIGFuIGluc3RhbmNlIG9mIGBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlYCBvciBhbiBgRWxlbWVudFJlZmBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneFRvZ2dsZU91dGxldCcpXG4gICAgcHVibGljIG91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hUb2dnbGVBY3Rpb24nKVxuICAgIHNldCB0YXJnZXQodGFyZ2V0OiBhbnkpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IHRhcmdldCgpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3RhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldCh0aGlzLl90YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90YXJnZXQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF90YXJnZXQ6IElUb2dnbGVWaWV3IHwgc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBAT3B0aW9uYWwoKSBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBJZ3hOYXZpZ2F0aW9uU2VydmljZSkgeyB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLl9vdmVybGF5RGVmYXVsdHMgPSB7XG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSh7IHRhcmdldDogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgfSksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBleGNsdWRlUG9zaXRpb25UYXJnZXQ6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICAgIHB1YmxpYyBvbkNsaWNrKCkge1xuICAgICAgICBpZiAodGhpcy5vdXRsZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlEZWZhdWx0cy5vdXRsZXQgPSB0aGlzLm91dGxldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsb25lZFNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fb3ZlcmxheURlZmF1bHRzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMudXBkYXRlT3ZlcmxheVNldHRpbmdzKGNsb25lZFNldHRpbmdzKTtcbiAgICAgICAgdGhpcy50YXJnZXQudG9nZ2xlKGNsb25lZFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHByb3ZpZGVkIG92ZXJsYXkgc2V0dGluZ3NcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3Mgc2V0dGluZ3MgdG8gdXBkYXRlXG4gICAgICogQHJldHVybnMgcmV0dXJucyB1cGRhdGVkIGNvcHkgb2YgcHJvdmlkZWQgb3ZlcmxheSBzZXR0aW5nc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVPdmVybGF5U2V0dGluZ3Moc2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyk6IE92ZXJsYXlTZXR0aW5ncyB7XG4gICAgICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5KSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5Q2xvbmU6IElQb3NpdGlvblN0cmF0ZWd5ID0gc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5jbG9uZSgpO1xuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneUNsb25lLnNldHRpbmdzLnRhcmdldCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgc2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IHBvc2l0aW9uU3RyYXRlZ3lDbG9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZXR0aW5ncztcbiAgICB9XG59XG5cbi8qKlxuICogTWFyayBhbiBlbGVtZW50IGFzIGFuIGlneE92ZXJsYXkgb3V0bGV0IGNvbnRhaW5lci5cbiAqIERpcmVjdGl2ZSBpbnN0YW5jZSBpcyBleHBvcnRlZCBhcyBgb3ZlcmxheS1vdXRsZXRgIHRvIGJlIGFzc2lnbmVkIHRvIHRlbXBsYXRlcyB2YXJpYWJsZXM6XG4gKiBgYGBodG1sXG4gKiA8ZGl2IGlneE92ZXJsYXlPdXRsZXQgI291dGxldD1cIm92ZXJsYXktb3V0bGV0XCI+PC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgZXhwb3J0QXM6ICdvdmVybGF5LW91dGxldCcsXG4gICAgc2VsZWN0b3I6ICdbaWd4T3ZlcmxheU91dGxldF0nXG59KVxuZXhwb3J0IGNsYXNzIElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmKSB7IH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtJZ3hUb2dnbGVEaXJlY3RpdmUsIElneFRvZ2dsZUFjdGlvbkRpcmVjdGl2ZSwgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0lneFRvZ2dsZURpcmVjdGl2ZSwgSWd4VG9nZ2xlQWN0aW9uRGlyZWN0aXZlLCBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlXSxcbiAgICBwcm92aWRlcnM6IFtJZ3hOYXZpZ2F0aW9uU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4VG9nZ2xlTW9kdWxlIHsgfVxuIl19