@covalent/core
Version:
Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.
228 lines • 36.7 kB
JavaScript
/* tslint:disable */
import { Directive, Inject, Injectable, InjectFlags, InjectionToken, Injector, Optional, SkipSelf, TemplateRef, Type, } from '@angular/core';
import { Overlay, OverlayConfig, } from '@angular/cdk/overlay';
import { ComponentPortal, TemplatePortal, } from '@angular/cdk/portal';
import { MAT_DIALOG_DATA, MAT_DIALOG_DEFAULT_OPTIONS, } from '@angular/material/dialog';
import { AnimationCurves, AnimationDurations } from '@angular/material/core';
import { CovalentSideSheetContainerComponent, } from './side-sheet-container';
import { Subject, of } from 'rxjs';
import { filter, take } from 'rxjs/operators';
import { Directionality } from '@angular/cdk/bidi';
import { CovalentSideSheetRef } from './side-sheet-ref';
import { SubPageMode, CovalentSideSheetConfig } from './side-sheet.config';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
import * as i2 from "./side-sheet.config";
export class _CovalentSideSheetBase {
constructor(_overlay, _injector, _defaultOptions, _parentSideSheet, _sideSheetRefConstructor, _sideSheetContainerType, _sideSheetDataToken) {
this._overlay = _overlay;
this._injector = _injector;
this._defaultOptions = _defaultOptions;
this._parentSideSheet = _parentSideSheet;
this._sideSheetRefConstructor = _sideSheetRefConstructor;
this._sideSheetContainerType = _sideSheetContainerType;
this._sideSheetDataToken = _sideSheetDataToken;
this._openSideSheetsAtThisLevel = [];
this._afterAllClosedAtThisLevel = new Subject();
this._afterOpenedAtThisLevel = new Subject();
this.defaultSidebarConfig = {
minWidth: '400px',
maxWidth: '100vw',
};
}
/** Keeps track of the currently-open side-sheets. */
get openSideSheets() {
return this._parentSideSheet
? this._parentSideSheet.openSideSheets
: this._openSideSheetsAtThisLevel;
}
open(componentOrTemplateRef, config) {
config = {
...(this._defaultOptions || new CovalentSideSheetConfig()),
...this.defaultSidebarConfig,
...config,
};
const overlayRef = this._createOverlay(config);
const sideSheetContainer = this._attachSideSheetContainer(overlayRef, config);
const sideSheetRef = this._attachSideSheetContent(componentOrTemplateRef, sideSheetContainer, overlayRef, config);
const prevSideSheetRef = this.openSideSheets.slice(-1)[0];
const prevOverlayRef = prevSideSheetRef?.overlayRef;
if (prevOverlayRef?.overlayElement &&
config.subPageMode !== SubPageMode.none) {
prevOverlayRef.overlayElement.style.transition = `${AnimationDurations.COMPLEX} ${AnimationCurves.DECELERATION_CURVE}`;
if (config.subPageMode === SubPageMode.pushed) {
// Animate previous side sheet to full width
prevOverlayRef.overlayElement.style.minWidth = `${window.innerWidth}px`;
}
else if (config.subPageMode === SubPageMode.shifted) {
// Animate previous side sheet to current sidesheet width + 200px
prevOverlayRef.overlayElement.style.minWidth = `${sideSheetRef.overlayRef.overlayElement.offsetWidth + 200}px`;
}
}
// Revert the previous side sheet config & size
sideSheetRef._containerInstance._animationStateChanged
.pipe(filter((event) => event.state === 'closing' && !!(prevSideSheetRef && prevOverlayRef)), take(1))
.subscribe(() => {
prevOverlayRef.overlayElement.style.transition = `${AnimationDurations.EXITING} ${AnimationCurves.DECELERATION_CURVE}`;
prevSideSheetRef.updateSize();
});
// Add new side sheet to open list
this.openSideSheets.push(sideSheetRef);
// Remove side sheet ref after closed
sideSheetRef
.afterClosed()
.pipe(take(1))
.subscribe(() => this._removeOpenSideSheet(sideSheetRef));
// Notify the side-sheet container that the content has been attached.
sideSheetContainer._initializeWithAttachedContent();
return sideSheetRef;
}
ngOnDestroy() {
// Only close the side-sheets at this level on destroy
// since the parent service may still be active.
this._closeSideSheets(this._openSideSheetsAtThisLevel);
this._afterAllClosedAtThisLevel.complete();
this._afterOpenedAtThisLevel.complete();
// Clean up any subscriptions to side-sheet that never finished opening.
if (this._animationStateSubscriptions) {
this._animationStateSubscriptions.unsubscribe();
}
}
/**
* Closes all of the currently-open side-sheets.
*/
closeAll() {
this._closeSideSheets(this.openSideSheets);
}
_createOverlay(config) {
const overlayConfig = new OverlayConfig({
positionStrategy: this._overlay.position().global(),
scrollStrategy: this._overlay.scrollStrategies.block(),
panelClass: config.panelClass,
hasBackdrop: config.hasBackdrop,
direction: config.direction,
minWidth: config.minWidth,
minHeight: config.minHeight,
maxWidth: config.maxWidth,
});
const overlayRef = this._overlay.create(overlayConfig);
const positionStrategy = overlayRef.getConfig()
.positionStrategy;
positionStrategy.right('0px');
return overlayRef;
}
/**
* Attaches a container to a side-sheets's already-created overlay.
* @param overlay Reference to the side-sheet's underlying overlay.
* @param config The side-sheet configuration.
* @returns A promise resolving to a ComponentRef for the attached container.
*/
_attachSideSheetContainer(overlay, config) {
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
const injector = Injector.create({
parent: userInjector || this._injector,
providers: [{ provide: CovalentSideSheetConfig, useValue: config }],
});
const containerPortal = new ComponentPortal(this._sideSheetContainerType, config.viewContainerRef, injector, config.componentFactoryResolver);
const containerRef = overlay.attach(containerPortal);
return containerRef.instance;
}
/**
* Attaches the user-provided component to the already-created side sheet container.
* @param componentOrTemplateRef The type of component being loaded into the side-sheet,
* or a TemplateRef to instantiate as the content.
* @param dialogContainer Reference to the wrapping side-sheet container.
* @param overlayRef Reference to the overlay in which the side-sheet resides.
* @param config The side-sheet configuration.
* @returns A promise resolving to the CovalentSideSheetRef that should be returned to the user.
*/
_attachSideSheetContent(componentOrTemplateRef, sideSheetContainer, overlayRef, config) {
// Create a reference to the side-sheet we're creating in order to give the user a handle
// to modify and close it.
const sideSheetRef = new this._sideSheetRefConstructor(overlayRef, sideSheetContainer, config.id);
if (componentOrTemplateRef instanceof TemplateRef) {
sideSheetContainer.attachTemplatePortal(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
new TemplatePortal(componentOrTemplateRef, null, {
$implicit: config.data,
sideSheetRef,
}));
}
else {
const injector = this._createInjector(config, sideSheetRef, sideSheetContainer);
const contentRef = sideSheetContainer.attach(new ComponentPortal(componentOrTemplateRef, config.viewContainerRef, injector));
sideSheetRef.componentInstance = contentRef.instance;
}
sideSheetRef.updateSize(config.width, config.height);
return sideSheetRef;
}
_createInjector(config, sideSheetRef, sideSheetContainer) {
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
// The side-sheet container should be provided as the side-sheet container and the side-sheet's
// content are created out of the same `ViewContainerRef` and as such, are siblings
// for injector purposes. To allow the hierarchy that is expected, the side-sheet
// container is explicitly provided in the injector.
const providers = [
{ provide: this._sideSheetContainerType, useValue: sideSheetContainer },
{ provide: this._sideSheetDataToken, useValue: config.data },
{ provide: this._sideSheetRefConstructor, useValue: sideSheetRef },
];
if (config.direction &&
(!userInjector ||
!userInjector.get(Directionality, null, InjectFlags.Optional))) {
providers.push({
provide: Directionality,
useValue: { value: config.direction, change: of() },
});
}
return Injector.create({
parent: userInjector || this._injector,
providers,
});
}
/**
* Removes a side sheet from the array of open side sheets.
* @param sideSheetRef Side Sheet to be removed.
*/
_removeOpenSideSheet(sideSheetRef) {
const index = this.openSideSheets.indexOf(sideSheetRef);
if (index > -1) {
this.openSideSheets.splice(index, 1);
}
}
/** Closes all of the side-sheet in an array. */
_closeSideSheets(sideSheets) {
let i = sideSheets.length;
while (i--) {
sideSheets[i].close();
}
}
}
_CovalentSideSheetBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: _CovalentSideSheetBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
_CovalentSideSheetBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.2", type: _CovalentSideSheetBase, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: _CovalentSideSheetBase, decorators: [{
type: Directive
}], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }, { type: undefined }, { type: undefined }, { type: i0.Type }, { type: i0.Type }, { type: i0.InjectionToken }]; } });
/**
* Service to open Covalent Design side-sheet.
*/
export class CovalentSideSheet extends _CovalentSideSheetBase {
constructor(overlay, injector, defaultOptions, parentSideSheet) {
super(overlay, injector, defaultOptions, parentSideSheet, CovalentSideSheetRef, CovalentSideSheetContainerComponent, MAT_DIALOG_DATA);
}
}
CovalentSideSheet.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: CovalentSideSheet, deps: [{ token: i1.Overlay }, { token: i0.Injector }, { token: MAT_DIALOG_DEFAULT_OPTIONS, optional: true }, { token: CovalentSideSheet, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Injectable });
CovalentSideSheet.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: CovalentSideSheet });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: CovalentSideSheet, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }, { type: i2.CovalentSideSheetConfig, decorators: [{
type: Optional
}, {
type: Inject,
args: [MAT_DIALOG_DEFAULT_OPTIONS]
}] }, { type: CovalentSideSheet, decorators: [{
type: Optional
}, {
type: SkipSelf
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1zaGVldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zaWRlLXNoZWV0L3NyYy9zaWRlLXNoZWV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLGNBQWMsRUFDZCxRQUFRLEVBRVIsUUFBUSxFQUNSLFFBQVEsRUFFUixXQUFXLEVBQ1gsSUFBSSxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGVBQWUsRUFFZixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RSxPQUFPLEVBQ0wsbUNBQW1DLEdBRXBDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUczRSxNQUFNLE9BQU8sc0JBQXNCO0lBZWpDLFlBQ1UsUUFBaUIsRUFDakIsU0FBbUIsRUFDbkIsZUFBb0QsRUFDcEQsZ0JBQXVELEVBQ3ZELHdCQUF5RCxFQUN6RCx1QkFBZ0MsRUFDaEMsbUJBQTRDO1FBTjVDLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBcUM7UUFDcEQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF1QztRQUN2RCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWlDO1FBQ3pELDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBUztRQUNoQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXlCO1FBbkI5QywrQkFBMEIsR0FBb0MsRUFBRSxDQUFDO1FBQ3hELCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDakQsNEJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBRW5ELENBQUM7UUFHSSx5QkFBb0IsR0FBRztZQUM3QixRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUUsT0FBTztTQUNsQixDQUFDO0lBVUMsQ0FBQztJQUVKLHFEQUFxRDtJQUNyRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCO1lBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYztZQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLENBQ0Ysc0JBQXlELEVBQ3pELE1BQW1DO1FBRW5DLE1BQU0sR0FBRztZQUNQLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksdUJBQXVCLEVBQUUsQ0FBQztZQUMxRCxHQUFHLElBQUksQ0FBQyxvQkFBb0I7WUFDNUIsR0FBRyxNQUFNO1NBQ1YsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQ3ZELFVBQVUsRUFDVixNQUFNLENBQ1AsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDL0Msc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsTUFBTSxDQUNQLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixFQUFFLFVBQVUsQ0FBQztRQUVwRCxJQUNFLGNBQWMsRUFBRSxjQUFjO1lBQzlCLE1BQU0sQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLElBQUksRUFDdkM7WUFDQSxjQUFjLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdkgsSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdDLDRDQUE0QztnQkFDNUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQzVDLE1BQWMsQ0FBQyxVQUNsQixJQUFJLENBQUM7YUFDTjtpQkFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDckQsaUVBQWlFO2dCQUNqRSxjQUFjLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FDN0MsWUFBWSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLEdBQ3ZELElBQUksQ0FBQzthQUNOO1NBQ0Y7UUFFRCwrQ0FBK0M7UUFDL0MsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQjthQUNuRCxJQUFJLENBQ0gsTUFBTSxDQUNKLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxjQUFjLENBQUMsQ0FDdEUsRUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1I7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsY0FBYyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZILGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUwsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXZDLHFDQUFxQztRQUNyQyxZQUFZO2FBQ1QsV0FBVyxFQUFFO2FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUU1RCxzRUFBc0U7UUFDdEUsa0JBQWtCLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUVwRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNULHNEQUFzRDtRQUN0RCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsd0VBQXdFO1FBQ3hFLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ3JDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyxjQUFjLENBQUksTUFBK0I7UUFDdkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDdEMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDbkQsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQ3RELFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRTthQUM1QyxnQkFBMEMsQ0FBQztRQUM5QyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUIsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sseUJBQXlCLENBQy9CLE9BQW1CLEVBQ25CLE1BQStCO1FBRS9CLE1BQU0sWUFBWSxHQUNoQixNQUFNLElBQUksTUFBTSxDQUFDLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7UUFDeEUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQixNQUFNLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTO1lBQ3RDLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUNwRSxDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FDekMsSUFBSSxDQUFDLHVCQUF1QixFQUM1QixNQUFNLENBQUMsZ0JBQWdCLEVBQ3ZCLFFBQVEsRUFDUixNQUFNLENBQUMsd0JBQXdCLENBQ2hDLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFJLGVBQWUsQ0FBQyxDQUFDO1FBRXhELE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyx1QkFBdUIsQ0FDN0Isc0JBQXlELEVBQ3pELGtCQUFxQixFQUNyQixVQUFzQixFQUN0QixNQUErQjtRQUUvQix5RkFBeUY7UUFDekYsMEJBQTBCO1FBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUNwRCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLE1BQU0sQ0FBQyxFQUFFLENBQ1YsQ0FBQztRQUVGLElBQUksc0JBQXNCLFlBQVksV0FBVyxFQUFFO1lBQ2pELGtCQUFrQixDQUFDLG9CQUFvQjtZQUNyQyxvRUFBb0U7WUFDcEUsSUFBSSxjQUFjLENBQUksc0JBQXNCLEVBQUUsSUFBSyxFQUFPO2dCQUN4RCxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ3RCLFlBQVk7YUFDYixDQUFDLENBQ0gsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUNuQyxNQUFNLEVBQ04sWUFBWSxFQUNaLGtCQUFrQixDQUNuQixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUMxQyxJQUFJLGVBQWUsQ0FDakIsc0JBQXNCLEVBQ3RCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsUUFBUSxDQUNULENBQ0YsQ0FBQztZQUNGLFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3REO1FBRUQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZSxDQUNyQixNQUErQixFQUMvQixZQUFxQyxFQUNyQyxrQkFBcUI7UUFFckIsTUFBTSxZQUFZLEdBQ2hCLE1BQU0sSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztRQUV4RSwrRkFBK0Y7UUFDL0YsbUZBQW1GO1FBQ25GLGlGQUFpRjtRQUNqRixvREFBb0Q7UUFDcEQsTUFBTSxTQUFTLEdBQXFCO1lBQ2xDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7WUFDdkUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQzVELEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO1NBQ25FLENBQUM7UUFFRixJQUNFLE1BQU0sQ0FBQyxTQUFTO1lBQ2hCLENBQUMsQ0FBQyxZQUFZO2dCQUNaLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDZixjQUFjLEVBQ2QsSUFBSSxFQUNKLFdBQVcsQ0FBQyxRQUFRLENBQ3JCLENBQUMsRUFDSjtZQUNBLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTthQUNwRCxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNyQixNQUFNLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTO1lBQ3RDLFNBQVM7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQUMsWUFBMkM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsZ0RBQWdEO0lBQ3hDLGdCQUFnQixDQUFDLFVBQXVDO1FBQzlELElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFMUIsT0FBTyxDQUFDLEVBQUUsRUFBRTtZQUNWLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7O21IQXhSVSxzQkFBc0I7dUdBQXRCLHNCQUFzQjsyRkFBdEIsc0JBQXNCO2tCQURsQyxTQUFTOztBQTRSVjs7R0FFRztBQUVILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxzQkFBMkQ7SUFDaEcsWUFDRSxPQUFnQixFQUNoQixRQUFrQixFQUdsQixjQUF1QyxFQUNmLGVBQWtDO1FBRTFELEtBQUssQ0FDSCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLG1DQUFtQyxFQUNuQyxlQUFlLENBQ2hCLENBQUM7SUFDSixDQUFDOzs4R0FsQlUsaUJBQWlCLGlFQUtsQiwwQkFBMEIsNkJBRU8saUJBQWlCO2tIQVBqRCxpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTs7MEJBS04sUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQywwQkFBMEI7OEJBRU8saUJBQWlCOzBCQUF6RCxRQUFROzswQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBJbmplY3RGbGFncyxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBTa2lwU2VsZixcbiAgU3RhdGljUHJvdmlkZXIsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE92ZXJsYXksXG4gIE92ZXJsYXlDb25maWcsXG4gIE92ZXJsYXlSZWYsXG4gIEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3ksXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7XG4gIENvbXBvbmVudFBvcnRhbCxcbiAgQ29tcG9uZW50VHlwZSxcbiAgVGVtcGxhdGVQb3J0YWwsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgTUFUX0RJQUxPR19EQVRBLFxuICBNQVRfRElBTE9HX0RFRkFVTFRfT1BUSU9OUyxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEFuaW1hdGlvbkN1cnZlcywgQW5pbWF0aW9uRHVyYXRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge1xuICBDb3ZhbGVudFNpZGVTaGVldENvbnRhaW5lckNvbXBvbmVudCxcbiAgX0NvdmFsZW50U2lkZVNoZWV0Q29udGFpbmVyQmFzZSxcbn0gZnJvbSAnLi9zaWRlLXNoZWV0LWNvbnRhaW5lcic7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcblxuaW1wb3J0IHsgQ292YWxlbnRTaWRlU2hlZXRSZWYgfSBmcm9tICcuL3NpZGUtc2hlZXQtcmVmJztcbmltcG9ydCB7IFN1YlBhZ2VNb2RlLCBDb3ZhbGVudFNpZGVTaGVldENvbmZpZyB9IGZyb20gJy4vc2lkZS1zaGVldC5jb25maWcnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBfQ292YWxlbnRTaWRlU2hlZXRCYXNlPEMgZXh0ZW5kcyBfQ292YWxlbnRTaWRlU2hlZXRDb250YWluZXJCYXNlPlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveVxue1xuICBwcml2YXRlIF9vcGVuU2lkZVNoZWV0c0F0VGhpc0xldmVsOiBDb3ZhbGVudFNpZGVTaGVldFJlZjx1bmtub3duPltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWwgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZnRlck9wZW5lZEF0VGhpc0xldmVsID0gbmV3IFN1YmplY3Q8XG4gICAgQ292YWxlbnRTaWRlU2hlZXRSZWY8dW5rbm93bj5cbiAgPigpO1xuICBwcml2YXRlIF9hbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbnMhOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBkZWZhdWx0U2lkZWJhckNvbmZpZyA9IHtcbiAgICBtaW5XaWR0aDogJzQwMHB4JyxcbiAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9vdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIF9kZWZhdWx0T3B0aW9uczogQ292YWxlbnRTaWRlU2hlZXRDb25maWcgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfcGFyZW50U2lkZVNoZWV0OiBfQ292YWxlbnRTaWRlU2hlZXRCYXNlPEM+IHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgX3NpZGVTaGVldFJlZkNvbnN0cnVjdG9yOiBUeXBlPENvdmFsZW50U2lkZVNoZWV0UmVmPGFueT4+LFxuICAgIHByaXZhdGUgX3NpZGVTaGVldENvbnRhaW5lclR5cGU6IFR5cGU8Qz4sXG4gICAgcHJpdmF0ZSBfc2lkZVNoZWV0RGF0YVRva2VuOiBJbmplY3Rpb25Ub2tlbjx1bmtub3duPlxuICApIHt9XG5cbiAgLyoqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50bHktb3BlbiBzaWRlLXNoZWV0cy4gKi9cbiAgZ2V0IG9wZW5TaWRlU2hlZXRzKCk6IENvdmFsZW50U2lkZVNoZWV0UmVmPHVua25vd24+W10ge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTaWRlU2hlZXRcbiAgICAgID8gdGhpcy5fcGFyZW50U2lkZVNoZWV0Lm9wZW5TaWRlU2hlZXRzXG4gICAgICA6IHRoaXMuX29wZW5TaWRlU2hlZXRzQXRUaGlzTGV2ZWw7XG4gIH1cblxuICBvcGVuPFQsIEQgPSB1bmtub3duLCBSID0gdW5rbm93bj4oXG4gICAgY29tcG9uZW50T3JUZW1wbGF0ZVJlZjogQ29tcG9uZW50VHlwZTxUPiB8IFRlbXBsYXRlUmVmPFQ+LFxuICAgIGNvbmZpZz86IENvdmFsZW50U2lkZVNoZWV0Q29uZmlnPEQ+XG4gICk6IENvdmFsZW50U2lkZVNoZWV0UmVmPFQsIFI+IHtcbiAgICBjb25maWcgPSB7XG4gICAgICAuLi4odGhpcy5fZGVmYXVsdE9wdGlvbnMgfHwgbmV3IENvdmFsZW50U2lkZVNoZWV0Q29uZmlnKCkpLFxuICAgICAgLi4udGhpcy5kZWZhdWx0U2lkZWJhckNvbmZpZyxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXkoY29uZmlnKTtcbiAgICBjb25zdCBzaWRlU2hlZXRDb250YWluZXIgPSB0aGlzLl9hdHRhY2hTaWRlU2hlZXRDb250YWluZXIoXG4gICAgICBvdmVybGF5UmVmLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgICBjb25zdCBzaWRlU2hlZXRSZWYgPSB0aGlzLl9hdHRhY2hTaWRlU2hlZXRDb250ZW50PFQsIFI+KFxuICAgICAgY29tcG9uZW50T3JUZW1wbGF0ZVJlZixcbiAgICAgIHNpZGVTaGVldENvbnRhaW5lcixcbiAgICAgIG92ZXJsYXlSZWYsXG4gICAgICBjb25maWdcbiAgICApO1xuICAgIGNvbnN0IHByZXZTaWRlU2hlZXRSZWY6IENvdmFsZW50U2lkZVNoZWV0UmVmPHVua25vd24+ID1cbiAgICAgIHRoaXMub3BlblNpZGVTaGVldHMuc2xpY2UoLTEpWzBdO1xuICAgIGNvbnN0IHByZXZPdmVybGF5UmVmID0gcHJldlNpZGVTaGVldFJlZj8ub3ZlcmxheVJlZjtcblxuICAgIGlmIChcbiAgICAgIHByZXZPdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudCAmJlxuICAgICAgY29uZmlnLnN1YlBhZ2VNb2RlICE9PSBTdWJQYWdlTW9kZS5ub25lXG4gICAgKSB7XG4gICAgICBwcmV2T3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gYCR7QW5pbWF0aW9uRHVyYXRpb25zLkNPTVBMRVh9ICR7QW5pbWF0aW9uQ3VydmVzLkRFQ0VMRVJBVElPTl9DVVJWRX1gO1xuICAgICAgaWYgKGNvbmZpZy5zdWJQYWdlTW9kZSA9PT0gU3ViUGFnZU1vZGUucHVzaGVkKSB7XG4gICAgICAgIC8vIEFuaW1hdGUgcHJldmlvdXMgc2lkZSBzaGVldCB0byBmdWxsIHdpZHRoXG4gICAgICAgIHByZXZPdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlLm1pbldpZHRoID0gYCR7XG4gICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLmlubmVyV2lkdGhcbiAgICAgICAgfXB4YDtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnN1YlBhZ2VNb2RlID09PSBTdWJQYWdlTW9kZS5zaGlmdGVkKSB7XG4gICAgICAgIC8vIEFuaW1hdGUgcHJldmlvdXMgc2lkZSBzaGVldCB0byBjdXJyZW50IHNpZGVzaGVldCB3aWR0aCArIDIwMHB4XG4gICAgICAgIHByZXZPdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlLm1pbldpZHRoID0gYCR7XG4gICAgICAgICAgc2lkZVNoZWV0UmVmLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQub2Zmc2V0V2lkdGggKyAyMDBcbiAgICAgICAgfXB4YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXZlcnQgdGhlIHByZXZpb3VzIHNpZGUgc2hlZXQgY29uZmlnICYgc2l6ZVxuICAgIHNpZGVTaGVldFJlZi5fY29udGFpbmVySW5zdGFuY2UuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihcbiAgICAgICAgICAoZXZlbnQpID0+XG4gICAgICAgICAgICBldmVudC5zdGF0ZSA9PT0gJ2Nsb3NpbmcnICYmICEhKHByZXZTaWRlU2hlZXRSZWYgJiYgcHJldk92ZXJsYXlSZWYpXG4gICAgICAgICksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBwcmV2T3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gYCR7QW5pbWF0aW9uRHVyYXRpb25zLkVYSVRJTkd9ICR7QW5pbWF0aW9uQ3VydmVzLkRFQ0VMRVJBVElPTl9DVVJWRX1gO1xuICAgICAgICBwcmV2U2lkZVNoZWV0UmVmLnVwZGF0ZVNpemUoKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQWRkIG5ldyBzaWRlIHNoZWV0IHRvIG9wZW4gbGlzdFxuICAgIHRoaXMub3BlblNpZGVTaGVldHMucHVzaChzaWRlU2hlZXRSZWYpO1xuXG4gICAgLy8gUmVtb3ZlIHNpZGUgc2hlZXQgcmVmIGFmdGVyIGNsb3NlZFxuICAgIHNpZGVTaGVldFJlZlxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3JlbW92ZU9wZW5TaWRlU2hlZXQoc2lkZVNoZWV0UmVmKSk7XG5cbiAgICAvLyBOb3RpZnkgdGhlIHNpZGUtc2hlZXQgY29udGFpbmVyIHRoYXQgdGhlIGNvbnRlbnQgaGFzIGJlZW4gYXR0YWNoZWQuXG4gICAgc2lkZVNoZWV0Q29udGFpbmVyLl9pbml0aWFsaXplV2l0aEF0dGFjaGVkQ29udGVudCgpO1xuXG4gICAgcmV0dXJuIHNpZGVTaGVldFJlZjtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIE9ubHkgY2xvc2UgdGhlIHNpZGUtc2hlZXRzIGF0IHRoaXMgbGV2ZWwgb24gZGVzdHJveVxuICAgIC8vIHNpbmNlIHRoZSBwYXJlbnQgc2VydmljZSBtYXkgc3RpbGwgYmUgYWN0aXZlLlxuICAgIHRoaXMuX2Nsb3NlU2lkZVNoZWV0cyh0aGlzLl9vcGVuU2lkZVNoZWV0c0F0VGhpc0xldmVsKTtcbiAgICB0aGlzLl9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpO1xuICAgIC8vIENsZWFuIHVwIGFueSBzdWJzY3JpcHRpb25zIHRvIHNpZGUtc2hlZXQgdGhhdCBuZXZlciBmaW5pc2hlZCBvcGVuaW5nLlxuICAgIGlmICh0aGlzLl9hbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlU3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYWxsIG9mIHRoZSBjdXJyZW50bHktb3BlbiBzaWRlLXNoZWV0cy5cbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX2Nsb3NlU2lkZVNoZWV0cyh0aGlzLm9wZW5TaWRlU2hlZXRzKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXk8VD4oY29uZmlnOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZyk6IE92ZXJsYXlSZWYge1xuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCksXG4gICAgICBwYW5lbENsYXNzOiBjb25maWcucGFuZWxDbGFzcyxcbiAgICAgIGhhc0JhY2tkcm9wOiBjb25maWcuaGFzQmFja2Ryb3AsXG4gICAgICBkaXJlY3Rpb246IGNvbmZpZy5kaXJlY3Rpb24sXG4gICAgICBtaW5XaWR0aDogY29uZmlnLm1pbldpZHRoLFxuICAgICAgbWluSGVpZ2h0OiBjb25maWcubWluSGVpZ2h0LFxuICAgICAgbWF4V2lkdGg6IGNvbmZpZy5tYXhXaWR0aCxcbiAgICB9KTtcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IG92ZXJsYXlSZWYuZ2V0Q29uZmlnKClcbiAgICAgIC5wb3NpdGlvblN0cmF0ZWd5IGFzIEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3k7XG4gICAgcG9zaXRpb25TdHJhdGVneS5yaWdodCgnMHB4Jyk7XG5cbiAgICByZXR1cm4gb3ZlcmxheVJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIGNvbnRhaW5lciB0byBhIHNpZGUtc2hlZXRzJ3MgYWxyZWFkeS1jcmVhdGVkIG92ZXJsYXkuXG4gICAqIEBwYXJhbSBvdmVybGF5IFJlZmVyZW5jZSB0byB0aGUgc2lkZS1zaGVldCdzIHVuZGVybHlpbmcgb3ZlcmxheS5cbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgc2lkZS1zaGVldCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2aW5nIHRvIGEgQ29tcG9uZW50UmVmIGZvciB0aGUgYXR0YWNoZWQgY29udGFpbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0YWNoU2lkZVNoZWV0Q29udGFpbmVyKFxuICAgIG92ZXJsYXk6IE92ZXJsYXlSZWYsXG4gICAgY29uZmlnOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZ1xuICApOiBDIHtcbiAgICBjb25zdCB1c2VySW5qZWN0b3IgPVxuICAgICAgY29uZmlnICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZywgdXNlVmFsdWU6IGNvbmZpZyB9XSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbnRhaW5lclBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoXG4gICAgICB0aGlzLl9zaWRlU2hlZXRDb250YWluZXJUeXBlLFxuICAgICAgY29uZmlnLnZpZXdDb250YWluZXJSZWYsXG4gICAgICBpbmplY3RvcixcbiAgICAgIGNvbmZpZy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgICApO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IG92ZXJsYXkuYXR0YWNoPEM+KGNvbnRhaW5lclBvcnRhbCk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyUmVmLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIHRoZSB1c2VyLXByb3ZpZGVkIGNvbXBvbmVudCB0byB0aGUgYWxyZWFkeS1jcmVhdGVkIHNpZGUgc2hlZXQgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gY29tcG9uZW50T3JUZW1wbGF0ZVJlZiBUaGUgdHlwZSBvZiBjb21wb25lbnQgYmVpbmcgbG9hZGVkIGludG8gdGhlIHNpZGUtc2hlZXQsXG4gICAqICAgICBvciBhIFRlbXBsYXRlUmVmIHRvIGluc3RhbnRpYXRlIGFzIHRoZSBjb250ZW50LlxuICAgKiBAcGFyYW0gZGlhbG9nQ29udGFpbmVyIFJlZmVyZW5jZSB0byB0aGUgd3JhcHBpbmcgc2lkZS1zaGVldCBjb250YWluZXIuXG4gICAqIEBwYXJhbSBvdmVybGF5UmVmIFJlZmVyZW5jZSB0byB0aGUgb3ZlcmxheSBpbiB3aGljaCB0aGUgc2lkZS1zaGVldCByZXNpZGVzLlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBzaWRlLXNoZWV0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIENvdmFsZW50U2lkZVNoZWV0UmVmIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0YWNoU2lkZVNoZWV0Q29udGVudDxULCBSPihcbiAgICBjb21wb25lbnRPclRlbXBsYXRlUmVmOiBDb21wb25lbnRUeXBlPFQ+IHwgVGVtcGxhdGVSZWY8VD4sXG4gICAgc2lkZVNoZWV0Q29udGFpbmVyOiBDLFxuICAgIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgY29uZmlnOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZ1xuICApOiBDb3ZhbGVudFNpZGVTaGVldFJlZjxULCBSPiB7XG4gICAgLy8gQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSBzaWRlLXNoZWV0IHdlJ3JlIGNyZWF0aW5nIGluIG9yZGVyIHRvIGdpdmUgdGhlIHVzZXIgYSBoYW5kbGVcbiAgICAvLyB0byBtb2RpZnkgYW5kIGNsb3NlIGl0LlxuICAgIGNvbnN0IHNpZGVTaGVldFJlZiA9IG5ldyB0aGlzLl9zaWRlU2hlZXRSZWZDb25zdHJ1Y3RvcihcbiAgICAgIG92ZXJsYXlSZWYsXG4gICAgICBzaWRlU2hlZXRDb250YWluZXIsXG4gICAgICBjb25maWcuaWRcbiAgICApO1xuXG4gICAgaWYgKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgc2lkZVNoZWV0Q29udGFpbmVyLmF0dGFjaFRlbXBsYXRlUG9ydGFsKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBuZXcgVGVtcGxhdGVQb3J0YWw8VD4oY29tcG9uZW50T3JUZW1wbGF0ZVJlZiwgbnVsbCEsIDxhbnk+e1xuICAgICAgICAgICRpbXBsaWNpdDogY29uZmlnLmRhdGEsXG4gICAgICAgICAgc2lkZVNoZWV0UmVmLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLl9jcmVhdGVJbmplY3RvcjxUPihcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBzaWRlU2hlZXRSZWYsXG4gICAgICAgIHNpZGVTaGVldENvbnRhaW5lclxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRSZWYgPSBzaWRlU2hlZXRDb250YWluZXIuYXR0YWNoPFQ+KFxuICAgICAgICBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsXG4gICAgICAgICAgY29uZmlnLnZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHNpZGVTaGVldFJlZi5jb21wb25lbnRJbnN0YW5jZSA9IGNvbnRlbnRSZWYuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgc2lkZVNoZWV0UmVmLnVwZGF0ZVNpemUoY29uZmlnLndpZHRoLCBjb25maWcuaGVpZ2h0KTtcblxuICAgIHJldHVybiBzaWRlU2hlZXRSZWY7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVJbmplY3RvcjxUPihcbiAgICBjb25maWc6IENvdmFsZW50U2lkZVNoZWV0Q29uZmlnLFxuICAgIHNpZGVTaGVldFJlZjogQ292YWxlbnRTaWRlU2hlZXRSZWY8VD4sXG4gICAgc2lkZVNoZWV0Q29udGFpbmVyOiBDXG4gICk6IEluamVjdG9yIHtcbiAgICBjb25zdCB1c2VySW5qZWN0b3IgPVxuICAgICAgY29uZmlnICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xuXG4gICAgLy8gVGhlIHNpZGUtc2hlZXQgY29udGFpbmVyIHNob3VsZCBiZSBwcm92aWRlZCBhcyB0aGUgc2lkZS1zaGVldCBjb250YWluZXIgYW5kIHRoZSBzaWRlLXNoZWV0J3NcbiAgICAvLyBjb250ZW50IGFyZSBjcmVhdGVkIG91dCBvZiB0aGUgc2FtZSBgVmlld0NvbnRhaW5lclJlZmAgYW5kIGFzIHN1Y2gsIGFyZSBzaWJsaW5nc1xuICAgIC8vIGZvciBpbmplY3RvciBwdXJwb3Nlcy4gVG8gYWxsb3cgdGhlIGhpZXJhcmNoeSB0aGF0IGlzIGV4cGVjdGVkLCB0aGUgc2lkZS1zaGVldFxuICAgIC8vIGNvbnRhaW5lciBpcyBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBpbmplY3Rvci5cbiAgICBjb25zdCBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10gPSBbXG4gICAgICB7IHByb3ZpZGU6IHRoaXMuX3NpZGVTaGVldENvbnRhaW5lclR5cGUsIHVzZVZhbHVlOiBzaWRlU2hlZXRDb250YWluZXIgfSxcbiAgICAgIHsgcHJvdmlkZTogdGhpcy5fc2lkZVNoZWV0RGF0YVRva2VuLCB1c2VWYWx1ZTogY29uZmlnLmRhdGEgfSxcbiAgICAgIHsgcHJvdmlkZTogdGhpcy5fc2lkZVNoZWV0UmVmQ29uc3RydWN0b3IsIHVzZVZhbHVlOiBzaWRlU2hlZXRSZWYgfSxcbiAgICBdO1xuXG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRpcmVjdGlvbiAmJlxuICAgICAgKCF1c2VySW5qZWN0b3IgfHxcbiAgICAgICAgIXVzZXJJbmplY3Rvci5nZXQ8RGlyZWN0aW9uYWxpdHkgfCBudWxsPihcbiAgICAgICAgICBEaXJlY3Rpb25hbGl0eSxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIEluamVjdEZsYWdzLk9wdGlvbmFsXG4gICAgICAgICkpXG4gICAgKSB7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICB1c2VWYWx1ZTogeyB2YWx1ZTogY29uZmlnLmRpcmVjdGlvbiwgY2hhbmdlOiBvZigpIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLFxuICAgICAgcHJvdmlkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBzaWRlIHNoZWV0IGZyb20gdGhlIGFycmF5IG9mIG9wZW4gc2lkZSBzaGVldHMuXG4gICAqIEBwYXJhbSBzaWRlU2hlZXRSZWYgU2lkZSBTaGVldCB0byBiZSByZW1vdmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlT3BlblNpZGVTaGVldChzaWRlU2hlZXRSZWY6IENvdmFsZW50U2lkZVNoZWV0UmVmPHVua25vd24+KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5TaWRlU2hlZXRzLmluZGV4T2Yoc2lkZVNoZWV0UmVmKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLm9wZW5TaWRlU2hlZXRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlcyBhbGwgb2YgdGhlIHNpZGUtc2hlZXQgaW4gYW4gYXJyYXkuICovXG4gIHByaXZhdGUgX2Nsb3NlU2lkZVNoZWV0cyhzaWRlU2hlZXRzOiBDb3ZhbGVudFNpZGVTaGVldFJlZjxhbnk+W10pIHtcbiAgICBsZXQgaSA9IHNpZGVTaGVldHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgc2lkZVNoZWV0c1tpXS5jbG9zZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlcnZpY2UgdG8gb3BlbiBDb3ZhbGVudCBEZXNpZ24gc2lkZS1zaGVldC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvdmFsZW50U2lkZVNoZWV0IGV4dGVuZHMgX0NvdmFsZW50U2lkZVNoZWV0QmFzZTxDb3ZhbGVudFNpZGVTaGVldENvbnRhaW5lckNvbXBvbmVudD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBvdmVybGF5OiBPdmVybGF5LFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19ERUZBVUxUX09QVElPTlMpXG4gICAgZGVmYXVsdE9wdGlvbnM6IENvdmFsZW50U2lkZVNoZWV0Q29uZmlnLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHBhcmVudFNpZGVTaGVldDogQ292YWxlbnRTaWRlU2hlZXRcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBvdmVybGF5LFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBkZWZhdWx0T3B0aW9ucyxcbiAgICAgIHBhcmVudFNpZGVTaGVldCxcbiAgICAgIENvdmFsZW50U2lkZVNoZWV0UmVmLFxuICAgICAgQ292YWxlbnRTaWRlU2hlZXRDb250YWluZXJDb21wb25lbnQsXG4gICAgICBNQVRfRElBTE9HX0RBVEFcbiAgICApO1xuICB9XG59XG4iXX0=