@neocomplexx/ngx-neo-directives
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
595 lines • 45.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/ngx-command/command.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
// tslint:disable:indent
import { Directive, Input, ElementRef, InjectionToken, Renderer2 } from '@angular/core';
import { Subject, BehaviorSubject, combineLatest, timer } from 'rxjs';
import { map, tap, filter, switchMap } from 'rxjs/operators';
import { OnReturnDirective } from '../onReturn.directive';
/** @type {?} */
export const COMMAND_CONFIG = new InjectionToken('COMMAND_CONFIG');
/** @type {?} */
export const COMMAND_DEFAULT_CONFIG = {
executingCssClass: 'executing',
};
/*
export function provideConfig(config: CommandOptions): any {
return Object.assign({}, COMMAND_DEFAULT_CONFIG, config);
} */
/**
*
* ### Example with options
* ```html
* <button [command]='saveCmd' [commandOptions]='{executingCssClass: 'in-progress'}'>Save</button>
* ```
*/
export class CommandDirective {
/**
* @param {?} renderer
* @param {?} element
*/
constructor(renderer, element) {
this.renderer = renderer;
this.element = element;
this.stopPropagation = false;
// @HostBinding('disabled') isDisabled: boolean;
this.setEnabled = true;
this.config = COMMAND_DEFAULT_CONFIG;
this.ownDisabledState = false;
this.commandDisabledChanged = false;
}
/**
* @return {?}
*/
ngOnInit() {
// console.log('[commandDirective::init]');
this.commandOptions = Object.assign({}, this.config, this.commandOptions);
if (!this.command) {
throw new Error('[commandDirective] command should be defined!');
}
else {
this.command.verifyCommandExecutionPipe();
this.command.setNextFocus(this.commandNextFocus);
this.command.setEnabledValue(this.setEnabled);
}
// if (this.element.nativeElement.localName === 'button') {
// let thisAux = this; // Set up a new observer
// var observer = new MutationObserver(function(mutations) {
// mutations.forEach(function(mutation) {
// // Check the modified attributeName is "disabled"
// if(!thisAux.commandDisabledChanged) {
// if (mutation.attributeName === "disabled") {
// thisAux.ownDisabledState = thisAux.element.nativeElement.disabled;
// }
// } else {
// thisAux.commandDisabledChanged = false;
// }
// });
// });
// // Configure to only listen to attribute changes
// var config = { attributes: true };
// // Start observing myElem
// observer.observe(this.element.nativeElement, config);
// }
this.canExecute$$ = this.command.canExecute$.pipe(tap((/**
* @param {?} x
* @return {?}
*/
x => {
if (this.element.nativeElement.localName === 'button') {
this.commandDisabledChanged = true;
if (this.commandValue == this.command.executingParam) {
this.element.nativeElement.disabled = !x;
// } else {
// this.element.nativeElement.disabled = !(!this.ownDisabledState && x);
}
}
}))).subscribe();
this.isExecuting$$ = this.command.isExecuting$.pipe(tap((/**
* @param {?} x
* @return {?}
*/
x => {
// console.log('[commandDirective::isExecuting$]', x);
x ? this.renderer.addClass(this.element.nativeElement, this.commandOptions.executingCssClass) : this.renderer.removeClass(this.element.nativeElement, this.commandOptions.executingCssClass);
}))).subscribe();
if (this.isMobileOperatingSystem()) {
this.element.nativeElement.addEventListener('touchstart', (/**
* @param {?} event
* @return {?}
*/
(event) => tslib_1.__awaiter(this, void 0, void 0, function* () {
event.preventDefault();
event.stopPropagation();
if (this.element.nativeElement.localName === 'input') {
return;
}
this.executeCommand();
})));
this.element.nativeElement.addEventListener('focusin', (/**
* @param {?} event
* @return {?}
*/
(event) => tslib_1.__awaiter(this, void 0, void 0, function* () {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
})));
}
else {
this.element.nativeElement.addEventListener('keydown', (/**
* @param {?} event
* @return {?}
*/
(event) => tslib_1.__awaiter(this, void 0, void 0, function* () {
if ((event.which === 13 || event.keyCode === 13)) {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
}
})));
this.element.nativeElement.addEventListener('click', (/**
* @param {?} event
* @return {?}
*/
(event) => tslib_1.__awaiter(this, void 0, void 0, function* () {
if (this.element.nativeElement.localName === 'input') {
return;
}
event.preventDefault();
if (this.stopPropagation) {
event.stopPropagation();
}
this.executeCommand();
})));
}
}
/**
* @return {?}
*/
executeCommand() {
if (!this.element.nativeElement.disabled)
this.command.canExecute = true;
this.command.verifyCommandExecutionPipe();
this.command.execute(this.commandValue);
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.command) {
this.command.destroy();
}
if (this.canExecute$$) {
this.canExecute$$.unsubscribe();
}
if (this.isExecuting$$) {
this.isExecuting$$.unsubscribe();
}
}
/**
* @private
* @return {?}
*/
isMobileOperatingSystem() {
/** @type {?} */
let isMobile = false;
/** @type {?} */
const userAgent = navigator.userAgent || navigator.vendor;
// Windows Phone must come first because its UA also contains "Android"
if (/windows phone/i.test(userAgent)) {
isMobile = true; // "Windows Phone";
}
else if (/android/i.test(userAgent)) {
isMobile = true; // "Android";
}
else if (/iPad|iPhone|iPod/.test(userAgent)) {
// iOS detection from: http://stackoverflow.com/a/9039885/177710
isMobile = true; // "iOS";
}
isMobile = false;
return isMobile; // "unknown";
}
}
CommandDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '[command]'
},] }
];
/** @nocollapse */
CommandDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef }
];
CommandDirective.propDecorators = {
command: [{ type: Input }],
commandOptions: [{ type: Input }],
commandCanExecute: [{ type: Input }],
commandValue: [{ type: Input }],
stopPropagation: [{ type: Input }],
commandNextFocus: [{ type: Input }],
setEnabled: [{ type: Input }]
};
if (false) {
/** @type {?} */
CommandDirective.prototype.command;
/** @type {?} */
CommandDirective.prototype.commandOptions;
/** @type {?} */
CommandDirective.prototype.commandCanExecute;
/** @type {?} */
CommandDirective.prototype.commandValue;
/** @type {?} */
CommandDirective.prototype.stopPropagation;
/** @type {?} */
CommandDirective.prototype.commandNextFocus;
/** @type {?} */
CommandDirective.prototype.setEnabled;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.canExecute$$;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.isExecuting$$;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.config;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.ownDisabledState;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.commandDisabledChanged;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.element;
}
/**
* @record
*/
export function CommandOptions() { }
if (false) {
/**
* Css Class which gets added/removed on the Command element's host while Command isExecuting$.
*
* @type {?}
*/
CommandOptions.prototype.executingCssClass;
}
/**
* @record
*/
export function ICommand() { }
if (false) {
/** @type {?} */
ICommand.prototype.executingParam;
/**
* Determines whether the command is currently executing.
* @type {?}
*/
ICommand.prototype.isExecuting;
/** @type {?|undefined} */
ICommand.prototype.isExecuting$;
/**
* Determines whether the command can execute or not.
* @type {?}
*/
ICommand.prototype.canExecute;
/** @type {?|undefined} */
ICommand.prototype.canExecute$;
/**
* Execute function to invoke.
* @param {?=} value
* @return {?}
*/
ICommand.prototype.execute = function (value) { };
/**
* Execute function to invoke and return a result in Promise.
* @param {?=} value
* @return {?}
*/
ICommand.prototype.executeWithResult = function (value) { };
/**
* Disposes all resources held by subscriptions.
* @return {?}
*/
ICommand.prototype.destroy = function () { };
/**
* @return {?}
*/
ICommand.prototype.verifyCommandExecutionPipe = function () { };
/**
* @param {?} element
* @return {?}
*/
ICommand.prototype.setNextFocus = function (element) { };
/**
* @param {?} enable
* @return {?}
*/
ICommand.prototype.setEnabledValue = function (enable) { };
}
/**
* Command object used to encapsulate information which is needed to perform an action.
*/
export class Command {
/**
* Creates an instance of Command.
* @param {?} executeParam
* @param {?=} canExecute$
* @param {?=} isAsync
* @param {?=} delay
*/
constructor(executeParam, canExecute$, isAsync, delay) {
this.executeParam = executeParam;
this.isAsync = isAsync;
this.delay = delay;
this.isExecuting = false;
this.isExecuting$ = new BehaviorSubject(false);
this.canExecute = true;
this.executionPipe$ = new Subject();
this.setEnabled = true;
if (canExecute$) {
this.canExecute$ = combineLatest(this.isExecuting$, canExecute$, (/**
* @param {?} isExecuting
* @param {?} canExecuteResult
* @return {?}
*/
(isExecuting, canExecuteResult) => {
// console.log('[command::combineLatest$] update!', { isExecuting, canExecuteResult });
this.isExecuting = isExecuting;
this.canExecute = !isExecuting && canExecuteResult;
return this.canExecute;
}));
this.canExecute$$ = this.canExecute$.subscribe();
}
else {
this.canExecute$ = this.isExecuting$.pipe(map((/**
* @param {?} x
* @return {?}
*/
x => {
/** @type {?} */
const canExecute = !x;
this.canExecute = canExecute;
return canExecute;
})));
this.isExecuting$$ = this.isExecuting$.pipe(tap((/**
* @param {?} x
* @return {?}
*/
x => this.isExecuting = x)))
.subscribe();
}
this.buildExecutionPipe(executeParam, isAsync, delay);
}
/**
* @return {?}
*/
verifyCommandExecutionPipe() {
if (this.executionPipe$.observers.length === 0) {
this.buildExecutionPipe(this.executeParam, this.isAsync, this.delay);
}
}
/**
* @param {?=} value
* @return {?}
*/
execute(value) {
this.executingParam = value;
this.executionPipe$.next(value);
}
/**
* @param {?=} value
* @return {?}
*/
executeWithResult(value) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
this.executingParam = value;
this.executionPipe$.next(value);
return yield this.result;
});
}
/**
* @return {?}
*/
destroy() {
if (this.executionPipe$$) {
this.executionPipe$$.unsubscribe();
}
if (this.canExecute$$) {
this.canExecute$$.unsubscribe();
}
if (this.isExecuting$$) {
this.isExecuting$$.unsubscribe();
}
if (this.isExecuting$) {
this.isExecuting$.complete();
}
if (this.asyncAction != null) {
this.asyncAction = null;
this.resultAsyncAction = null;
}
}
/**
* @private
* @param {?} executeParm
* @param {?=} isAsync
* @param {?=} delay
* @return {?}
*/
buildExecutionPipe(executeParm, isAsync, delay) {
/** @type {?} */
let pipe$ = this.executionPipe$.pipe(filter((/**
* @return {?}
*/
() => this.canExecute)), tap((/**
* @return {?}
*/
() => {
this.isExecuting$.next(true);
if (isAsync && this.asyncAction != null) {
this.resultAsyncAction = this.asyncAction(undefined);
}
})));
pipe$ = isAsync
? pipe$.pipe(switchMap((/**
* @param {?} value
* @return {?}
*/
(value) => {
if (delay && delay > 0) {
if (this.delaySubscribe) {
this.delaySubscribe.unsubscribe();
}
/** @type {?} */
const delayTimer = timer(delay);
this.delaySubscribe = delayTimer.subscribe((/**
* @param {?} t
* @return {?}
*/
t => { executeParm(value); }));
return Promise.resolve(null);
}
else {
/** @type {?} */
const result = executeParm(value);
return Promise.resolve(result);
}
})))
: pipe$.pipe(tap((/**
* @param {?} value
* @return {?}
*/
(value) => { executeParm(value); })));
pipe$ = pipe$.pipe(tap((/**
* @return {?}
*/
() => {
// console.log('[command::excutionPipe$] do#2 - set idle');
this.isExecuting$.next(false);
this.executingParam = undefined;
if (isAsync && this.asyncAction != null) {
this.resultAsyncAction = this.asyncAction(this.resultAsyncAction);
}
OnReturnDirective.setNextFocus(this.elementNextFocus, this.setEnabled);
}), (/**
* @param {?} e
* @return {?}
*/
(e) => {
console.log('[command::excutionPipe$] do#2 error - set idle' + e.toString());
this.isExecuting$.next(false);
this.executingParam = undefined;
if (isAsync && this.asyncAction != null) {
this.resultAsyncAction = this.asyncAction(this.resultAsyncAction);
}
this.buildExecutionPipe(executeParm, isAsync, delay);
})));
this.executionPipe$$ = pipe$.subscribe();
}
/**
* @param {?} element
* @return {?}
*/
setNextFocus(element) {
this.elementNextFocus = element;
}
/**
* @param {?} enabled
* @return {?}
*/
setEnabledValue(enabled) {
this.setEnabled = enabled;
}
}
if (false) {
/** @type {?} */
Command.prototype.isExecuting;
/** @type {?} */
Command.prototype.isExecuting$;
/** @type {?} */
Command.prototype.canExecute;
/** @type {?} */
Command.prototype.canExecute$;
/**
* @type {?}
* @private
*/
Command.prototype.executionPipe$;
/**
* @type {?}
* @private
*/
Command.prototype.isExecuting$$;
/**
* @type {?}
* @private
*/
Command.prototype.canExecute$$;
/**
* @type {?}
* @private
*/
Command.prototype.executionPipe$$;
/**
* @type {?}
* @private
*/
Command.prototype.elementNextFocus;
/** @type {?} */
Command.prototype.result;
/** @type {?} */
Command.prototype.asyncAction;
/** @type {?} */
Command.prototype.resultAsyncAction;
/** @type {?} */
Command.prototype.executingParam;
/**
* @type {?}
* @private
*/
Command.prototype.delaySubscribe;
/**
* @type {?}
* @private
*/
Command.prototype.setEnabled;
/**
* @type {?}
* @private
*/
Command.prototype.executeParam;
/**
* @type {?}
* @private
*/
Command.prototype.isAsync;
/**
* @type {?}
* @private
*/
Command.prototype.delay;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1kaXJlY3RpdmVzLyIsInNvdXJjZXMiOlsibGliL25neC1jb21tYW5kL2NvbW1hbmQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUE0QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUUxRCxNQUFNLE9BQU8sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFTLGdCQUFnQixDQUFDOztBQUUxRSxNQUFNLE9BQU8sc0JBQXNCLEdBQW1CO0lBQ3JELGlCQUFpQixFQUFFLFdBQVc7Q0FDOUI7Ozs7Ozs7Ozs7OztBQWtCRCxNQUFNLE9BQU8sZ0JBQWdCOzs7OztJQWtCNUIsWUFDUyxRQUFtQixFQUNuQixPQUFtQjtRQURuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFkbkIsb0JBQWUsR0FBRyxLQUFLLENBQUM7O1FBR3hCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFJbkIsV0FBTSxHQUFtQixzQkFBc0IsQ0FBQztRQUVoRCxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO0lBS25DLENBQUM7Ozs7SUFFTCxRQUFRO1FBQ1AsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FB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SUFFakMsaUNBQTJDOzs7OztJQUMzQyxnQ0FBb0M7Ozs7O0lBQ3BDLCtCQUFtQzs7Ozs7SUFDbkMsa0NBQXNDOzs7OztJQUV0QyxtQ0FBOEI7O0lBRTlCLHlCQUE0Qjs7SUFFNUIsOEJBQWlDOztJQUNqQyxvQ0FBOEI7O0lBRTlCLGlDQUEyQjs7Ozs7SUFFM0IsaUNBQXFDOzs7OztJQUVyQyw2QkFBMEI7Ozs7O0lBTXpCLCtCQUFtQzs7Ozs7SUFFbkMsMEJBQXlCOzs7OztJQUN6Qix3QkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTppbmRlbnRcblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQsIEVsZW1lbnRSZWYsIEluamVjdGlvblRva2VuLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YXAsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBPblJldHVybkRpcmVjdGl2ZSB9IGZyb20gJy4uL29uUmV0dXJuLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBjb25zdCBDT01NQU5EX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdDT01NQU5EX0NPTkZJRycpO1xuXG5leHBvcnQgY29uc3QgQ09NTUFORF9ERUZBVUxUX0NPTkZJRzogQ29tbWFuZE9wdGlvbnMgPSB7XG5cdGV4ZWN1dGluZ0Nzc0NsYXNzOiAnZXhlY3V0aW5nJyxcbn07XG4vKlxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVDb25maWcoY29uZmlnOiBDb21tYW5kT3B0aW9ucyk6IGFueSB7XG5cdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBDT01NQU5EX0RFRkFVTFRfQ09ORklHLCBjb25maWcpO1xufSAqL1xuXG5cbi8qKlxuICpcbiAqICMjIyBFeGFtcGxlIHdpdGggb3B0aW9uc1xuICogYGBgaHRtbFxuICogPGJ1dHRvbiBbY29tbWFuZF09J3NhdmVDbWQnIFtjb21tYW5kT3B0aW9uc109J3tleGVjdXRpbmdDc3NDbGFzczogJ2luLXByb2dyZXNzJ30nPlNhdmU8L2J1dHRvbj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuXHRzZWxlY3RvcjogJ1tjb21tYW5kXSdcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuXHRASW5wdXQoKSBjb21tYW5kOiBJQ29tbWFuZDtcblx0QElucHV0KCkgY29tbWFuZE9wdGlvbnM6IENvbW1hbmRPcHRpb25zO1xuXHRASW5wdXQoKSBjb21tYW5kQ2FuRXhlY3V0ZTogYm9vbGVhbjtcblx0QElucHV0KCkgY29tbWFuZFZhbHVlOiBhbnk7XG5cdEBJbnB1dCgpIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlO1xuXHRASW5wdXQoKSBjb21tYW5kTmV4dEZvY3VzOiBhbnk7XG5cdC8vIEBIb3N0QmluZGluZygnZGlzYWJsZWQnKSBpc0Rpc2FibGVkOiBib29sZWFuO1xuXHRASW5wdXQoKSBzZXRFbmFibGVkID0gdHJ1ZTtcblx0cHJpdmF0ZSBjYW5FeGVjdXRlJCQ6IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSBpc0V4ZWN1dGluZyQkOiBTdWJzY3JpcHRpb247XG5cblx0cHJpdmF0ZSBjb25maWc6IENvbW1hbmRPcHRpb25zID0gQ09NTUFORF9ERUZBVUxUX0NPTkZJRztcblxuXHRwcml2YXRlIG93bkRpc2FibGVkU3RhdGUgPSBmYWxzZTtcblx0cHJpdmF0ZSBjb21tYW5kRGlzYWJsZWRDaGFuZ2VkID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuXHRcdHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZlxuXHQpIHsgfVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZERpcmVjdGl2ZTo6aW5pdF0nKTtcblx0XHR0aGlzLmNvbW1hbmRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWcsIHRoaXMuY29tbWFuZE9wdGlvbnMpO1xuXG5cdFx0aWYgKCF0aGlzLmNvbW1hbmQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignW2NvbW1hbmREaXJlY3RpdmVdIGNvbW1hbmQgc2hvdWxkIGJlIGRlZmluZWQhJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY29tbWFuZC52ZXJpZnlDb21tYW5kRXhlY3V0aW9uUGlwZSgpO1xuXHRcdFx0dGhpcy5jb21tYW5kLnNldE5leHRGb2N1cyh0aGlzLmNvbW1hbmROZXh0Rm9jdXMpO1xuXHRcdFx0dGhpcy5jb21tYW5kLnNldEVuYWJsZWRWYWx1ZSh0aGlzLnNldEVuYWJsZWQpO1xuXHRcdH1cblxuXHRcdC8vIGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdidXR0b24nKSB7XG5cdFx0Ly8gXHRsZXQgdGhpc0F1eCA9IHRoaXM7XHQvLyBTZXQgdXAgYSBuZXcgb2JzZXJ2ZXJcblx0XHQvLyBcdHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykge1xuXHRcdC8vIFx0XHRtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikge1xuXHRcdC8vIFx0XHRcdC8vIENoZWNrIHRoZSBtb2RpZmllZCBhdHRyaWJ1dGVOYW1lIGlzIFwiZGlzYWJsZWRcIlxuXHRcdC8vIFx0XHRcdGlmKCF0aGlzQXV4LmNvbW1hbmREaXNhYmxlZENoYW5nZWQpIHtcblx0XHQvLyBcdFx0XHRcdGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSBcImRpc2FibGVkXCIpIHtcblx0XHQvLyBcdFx0XHRcdFx0dGhpc0F1eC5vd25EaXNhYmxlZFN0YXRlID0gdGhpc0F1eC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQ7XG5cdFx0Ly8gXHRcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0fSBlbHNlIHtcblx0XHQvLyBcdFx0XHRcdHRoaXNBdXguY29tbWFuZERpc2FibGVkQ2hhbmdlZCA9IGZhbHNlO1xuXHRcdC8vIFx0XHRcdH1cblx0XHQvLyBcdFx0fSk7XG5cdFx0Ly8gXHR9KTtcblx0XHQvLyBcdC8vIENvbmZpZ3VyZSB0byBvbmx5IGxpc3RlbiB0byBhdHRyaWJ1dGUgY2hhbmdlc1xuXHRcdC8vIFx0dmFyIGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSB9O1xuXHRcdC8vIFx0Ly8gU3RhcnQgb2JzZXJ2aW5nIG15RWxlbVxuXHRcdC8vIFx0b2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgY29uZmlnKTtcblx0XHQvLyB9XG5cblx0XHR0aGlzLmNhbkV4ZWN1dGUkJCA9IHRoaXMuY29tbWFuZC5jYW5FeGVjdXRlJC5waXBlKFxuXHRcdFx0dGFwKHggPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQubG9jYWxOYW1lID09PSAnYnV0dG9uJykge1xuXHRcdFx0XHRcdHRoaXMuY29tbWFuZERpc2FibGVkQ2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tbWFuZFZhbHVlID09IHRoaXMuY29tbWFuZC5leGVjdXRpbmdQYXJhbSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgPSAheDtcblx0XHRcdFx0XHRcdC8vIH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gISghdGhpcy5vd25EaXNhYmxlZFN0YXRlICYmIHgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSkpLnN1YnNjcmliZSgpO1xuXHRcdHRoaXMuaXNFeGVjdXRpbmckJCA9IHRoaXMuY29tbWFuZC5pc0V4ZWN1dGluZyQucGlwZShcblx0XHRcdHRhcCh4ID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tjb21tYW5kRGlyZWN0aXZlOjppc0V4ZWN1dGluZyRdJywgeCk7XG4gICAgICAgIHggPyB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbW1hbmRPcHRpb25zLmV4ZWN1dGluZ0Nzc0NsYXNzKSA6IHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuY29tbWFuZE9wdGlvbnMuZXhlY3V0aW5nQ3NzQ2xhc3MpO1xuXHRcdFx0fSkpLnN1YnNjcmliZSgpO1xuXG5cdFx0aWYgKHRoaXMuaXNNb2JpbGVPcGVyYXRpbmdTeXN0ZW0oKSkge1xuXHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0aWYgKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmxvY2FsTmFtZSA9PT0gJ2lucHV0Jykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDb21tYW5kKCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBhc3luYyAoZXZlbnQpID0+IHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYXN5bmMgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmICgoZXZlbnQud2hpY2ggPT09IDEzIHx8IGV2ZW50LmtleUNvZGUgPT09IDEzKSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0aWYgKHRoaXMuc3RvcFByb3BhZ2F0aW9uKSB7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdH1cblxuXHRleGVjdXRlQ29tbWFuZCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB0aGlzLmNvbW1hbmQuY2FuRXhlY3V0ZSA9IHRydWU7XG5cdFx0dGhpcy5jb21tYW5kLnZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XG5cdFx0dGhpcy5jb21tYW5kLmV4ZWN1dGUodGhpcy5jb21tYW5kVmFsdWUpO1xuXHR9XG5cblx0bmdPbkRlc3Ryb3koKSB7XG5cdFx0aWYgKHRoaXMuY29tbWFuZCkgeyB0aGlzLmNvbW1hbmQuZGVzdHJveSgpOyB9XG5cdFx0aWYgKHRoaXMuY2FuRXhlY3V0ZSQkKSB7IHRoaXMuY2FuRXhlY3V0ZSQkLnVuc3Vic2NyaWJlKCk7IH1cblx0XHRpZiAodGhpcy5pc0V4ZWN1dGluZyQkKSB7IHRoaXMuaXNFeGVjdXRpbmckJC51bnN1YnNjcmliZSgpOyB9XG5cdH1cblxuXHRwcml2YXRlIGlzTW9iaWxlT3BlcmF0aW5nU3lzdGVtKCk6IGJvb2xlYW4ge1xuXHRcdGxldCBpc01vYmlsZSA9IGZhbHNlO1xuXHRcdGNvbnN0IHVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvcjtcblxuXHRcdC8vIFdpbmRvd3MgUGhvbmUgbXVzdCBjb21lIGZpcnN0IGJlY2F1c2UgaXRzIFVBIGFsc28gY29udGFpbnMgXCJBbmRyb2lkXCJcblx0XHRpZiAoL3dpbmRvd3MgcGhvbmUvaS50ZXN0KHVzZXJBZ2VudCkpIHtcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJXaW5kb3dzIFBob25lXCI7XG5cdFx0fSBlbHNlIGlmICgvYW5kcm9pZC9pLnRlc3QodXNlckFnZW50KSkge1xuXHRcdFx0aXNNb2JpbGUgPSB0cnVlOyAvLyBcIkFuZHJvaWRcIjtcblx0XHR9IGVsc2UgaWYgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHVzZXJBZ2VudCkpIHtcblx0XHRcdC8vIGlPUyBkZXRlY3Rpb24gZnJvbTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTAzOTg4NS8xNzc3MTBcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJpT1NcIjtcblx0XHR9XG5cblx0XHRpc01vYmlsZSA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGlzTW9iaWxlOyAvLyBcInVua25vd25cIjtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRPcHRpb25zIHtcblx0LyoqXG5cdCAqIENzcyBDbGFzcyB3aGljaCBnZXRzIGFkZGVkL3JlbW92ZWQgb24gdGhlIENvbW1hbmQgZWxlbWVudCdzIGhvc3Qgd2hpbGUgQ29tbWFuZCBpc0V4ZWN1dGluZyQuXG5cdCAqXG5cdCAqL1xuXHRleGVjdXRpbmdDc3NDbGFzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21tYW5kIHtcblxuXHRleGVjdXRpbmdQYXJhbTogYW55O1xuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgY3VycmVudGx5IGV4ZWN1dGluZy5cblx0ICovXG5cdGlzRXhlY3V0aW5nOiBib29sZWFuO1xuXHRpc0V4ZWN1dGluZyQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlIG9yIG5vdC5cblx0ICovXG5cdGNhbkV4ZWN1dGU6IGJvb2xlYW47XG5cdGNhbkV4ZWN1dGUkPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuXHQgKi9cblx0ZXhlY3V0ZSh2YWx1ZT86IGFueSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgZnVuY3Rpb24gdG8gaW52b2tlIGFuZCByZXR1cm4gYSByZXN1bHQgaW4gUHJvbWlzZS5cblx0ICovXG5cdGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBoZWxkIGJ5IHN1YnNjcmlwdGlvbnMuXG5cdCAqL1xuXHRkZXN0cm95KCk6IHZvaWQ7XG5cblx0dmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKTtcblxuXHRzZXROZXh0Rm9jdXMoZWxlbWVudDogYW55KTtcblxuXHRzZXRFbmFibGVkVmFsdWUoZW5hYmxlOiBib29sZWFuKTtcblxufVxuXG5cbi8qKlxuICogQ29tbWFuZCBvYmplY3QgdXNlZCB0byBlbmNhcHN1bGF0ZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBuZWVkZWQgdG8gcGVyZm9ybSBhbiBhY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21tYW5kIGltcGxlbWVudHMgSUNvbW1hbmQge1xuXG5cdGlzRXhlY3V0aW5nID0gZmFsc2U7XG5cdGlzRXhlY3V0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXHRjYW5FeGVjdXRlID0gdHJ1ZTtcblx0Y2FuRXhlY3V0ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cblx0cHJpdmF0ZSBleGVjdXRpb25QaXBlJCA9IG5ldyBTdWJqZWN0PHt9PigpO1xuXHRwcml2YXRlIGlzRXhlY3V0aW5nJCQ6IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSBjYW5FeGVjdXRlJCQ6IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSBleGVjdXRpb25QaXBlJCQ6IFN1YnNjcmlwdGlvbjtcblxuXHRwcml2YXRlIGVsZW1lbnROZXh0Rm9jdXM6IGFueTtcblxuXHRwdWJsaWMgcmVzdWx0OiBQcm9taXNlPGFueT47XG5cblx0cHVibGljIGFzeW5jQWN0aW9uOiAoYW55KSA9PiBhbnk7XG5cdHB1YmxpYyByZXN1bHRBc3luY0FjdGlvbjogYW55O1xuXG5cdHB1YmxpYyBleGVjdXRpbmdQYXJhbTogYW55O1xuXG5cdHByaXZhdGUgZGVsYXlTdWJzY3JpYmU6IFN1YnNjcmlwdGlvbjtcblxuXHRwcml2YXRlIHNldEVuYWJsZWQgPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbW1hbmQuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGV4ZWN1dGVQYXJhbTogKGFueT8pID0+IGFueSxcblx0XHRjYW5FeGVjdXRlJD86IE9ic2VydmFibGU8Ym9vbGVhbj4sXG5cdFx0cHJpdmF0ZSBpc0FzeW5jPzogYm9vbGVhbixcblx0XHRwcml2YXRlIGRlbGF5PzogbnVtYmVyXG5cdCkge1xuXHRcdGlmIChjYW5FeGVjdXRlJCkge1xuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCA9IGNvbWJpbmVMYXRlc3QoXG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLFxuXHRcdFx0XHRjYW5FeGVjdXRlJFxuXHRcdFx0XHQsIChpc0V4ZWN1dGluZywgY2FuRXhlY3V0ZVJlc3VsdCkgPT4ge1xuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZDo6Y29tYmluZUxhdGVzdCRdIHVwZGF0ZSEnLCB7IGlzRXhlY3V0aW5nLCBjYW5FeGVjdXRlUmVzdWx0IH0pO1xuXHRcdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmcgPSBpc0V4ZWN1dGluZztcblx0XHRcdFx0XHR0aGlzLmNhbkV4ZWN1dGUgPSAhaXNFeGVjdXRpbmcgJiYgY2FuRXhlY3V0ZVJlc3VsdDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jYW5FeGVjdXRlO1xuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQkID0gdGhpcy5jYW5FeGVjdXRlJC5zdWJzY3JpYmUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCA9IHRoaXMuaXNFeGVjdXRpbmckLnBpcGUobWFwKHggPT4ge1xuXHRcdFx0XHRjb25zdCBjYW5FeGVjdXRlID0gIXg7XG5cdFx0XHRcdHRoaXMuY2FuRXhlY3V0ZSA9IGNhbkV4ZWN1dGU7XG5cdFx0XHRcdHJldHVybiBjYW5FeGVjdXRlO1xuXHRcdFx0fSkpO1xuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkID0gdGhpcy5pc0V4ZWN1dGluZyQucGlwZShcblx0XHRcdFx0dGFwKHggPT4gdGhpcy5pc0V4ZWN1dGluZyA9IHgpKVxuXHRcdFx0XHQuc3Vic2NyaWJlKCk7XG5cdFx0fVxuXHRcdHRoaXMuYnVpbGRFeGVjdXRpb25QaXBlKGV4ZWN1dGVQYXJhbSwgaXNBc3luYywgZGVsYXkpO1xuXHR9XG5cblx0cHVibGljIHZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCkge1xuXHRcdGlmICh0aGlzLmV4ZWN1dGlvblBpcGUkLm9ic2VydmVycy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMuYnVpbGRFeGVjdXRpb25QaXBlKHRoaXMuZXhlY3V0ZVBhcmFtLCB0aGlzLmlzQXN5bmMsIHRoaXMuZGVsYXkpO1xuXHRcdH1cblx0fVxuXG5cdGV4ZWN1dGUodmFsdWU/OiBhbnkpIHtcblx0XHR0aGlzLmV4ZWN1dGluZ1BhcmFtID0gdmFsdWU7XG5cdFx0dGhpcy5leGVjdXRpb25QaXBlJC5uZXh0KHZhbHVlKTtcblx0fVxuXG5cdGFzeW5jIGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHR0aGlzLmV4ZWN1dGluZ1BhcmFtID0gdmFsdWU7XG5cdFx0dGhpcy5leGVjdXRpb25QaXBlJC5uZXh0KHZhbHVlKTtcblx0XHRyZXR1cm4gYXdhaXQgdGhpcy5yZXN1bHQ7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLmV4ZWN1dGlvblBpcGUkJCkge1xuXHRcdFx0dGhpcy5leGVjdXRpb25QaXBlJCQudW5zdWJzY3JpYmUoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuY2FuRXhlY3V0ZSQkKSB7XG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkJC51bnN1YnNjcmliZSgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5pc0V4ZWN1dGluZyQkKSB7XG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJCQudW5zdWJzY3JpYmUoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuaXNFeGVjdXRpbmckKSB7XG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJC5jb21wbGV0ZSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHtcblx0XHRcdHRoaXMuYXN5bmNBY3Rpb24gPSBudWxsO1xuXHRcdFx0dGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBidWlsZEV4ZWN1dGlvblBpcGUoZXhlY3V0ZVBhcm06IChhbnk/KSA9PiBhbnksIGlzQXN5bmM/OiBib29sZWFuLCBkZWxheT86IG51bWJlcikge1xuXHRcdGxldCBwaXBlJCA9IHRoaXMuZXhlY3V0aW9uUGlwZSQucGlwZShcblx0XHRcdGZpbHRlcigoKSA9PiB0aGlzLmNhbkV4ZWN1dGUpLFxuXHRcdFx0dGFwKCgpID0+IHtcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dCh0cnVlKTtcblx0XHRcdFx0aWYgKGlzQXN5bmMgJiYgdGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7IHRoaXMucmVzdWx0QXN5bmNBY3Rpb24gPSB0aGlzLmFzeW5jQWN0aW9uKHVuZGVmaW5lZCk7IH1cblx0XHRcdH0pKTtcblxuXHRcdHBpcGUkID0gaXNBc3luY1xuXHRcdFx0PyBwaXBlJC5waXBlKHN3aXRjaE1hcCgodmFsdWUpID0+IHtcblx0XHRcdFx0aWYgKGRlbGF5ICYmIGRlbGF5ID4gMCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmRlbGF5U3Vic2NyaWJlKSB7IHRoaXMuZGVsYXlTdWJzY3JpYmUudW5zdWJzY3JpYmUoKTsgfVxuXHRcdFx0XHRcdGNvbnN0IGRlbGF5VGltZXIgPSB0aW1lcihkZWxheSk7XG5cdFx0XHRcdFx0dGhpcy5kZWxheVN1YnNjcmliZSA9IGRlbGF5VGltZXIuc3Vic2NyaWJlKHQgPT4geyBleGVjdXRlUGFybSh2YWx1ZSk7IH0pO1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gZXhlY3V0ZVBhcm0odmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSkpXG5cdFx0XHQ6IHBpcGUkLnBpcGUodGFwKCh2YWx1ZSkgPT4geyBleGVjdXRlUGFybSh2YWx1ZSk7IH0pKTtcblxuXHRcdHBpcGUkID0gcGlwZSQucGlwZSh0YXAoKCkgPT4ge1xuXHRcdFx0Ly8gY29uc29sZS5sb2coJ1tjb21tYW5kOjpleGN1dGlvblBpcGUkXSBkbyMyIC0gc2V0IGlkbGUnKTtcblx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLm5leHQoZmFsc2UpO1xuXHRcdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChpc0FzeW5jICYmIHRoaXMuYXN5bmNBY3Rpb24gIT0gbnVsbCkgeyB0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gdGhpcy5hc3luY0FjdGlvbih0aGlzLnJlc3VsdEFzeW5jQWN0aW9uKTsgfVxuXHRcdFx0T25SZXR1cm5EaXJlY3RpdmUuc2V0TmV4dEZvY3VzKHRoaXMuZWxlbWVudE5leHRGb2N1cywgdGhpcy5zZXRFbmFibGVkKTtcblx0XHR9LFxuXHRcdFx0KGUpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ1tjb21tYW5kOjpleGN1dGlvblBpcGUkXSBkbyMyIGVycm9yIC0gc2V0IGlkbGUnICsgZS50b1N0cmluZygpKTtcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dChmYWxzZSk7XG5cdFx0XHRcdHRoaXMuZXhlY3V0aW5nUGFyYW0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChpc0FzeW5jICYmIHRoaXMuYXN5bmNBY3Rpb24gIT0gbnVsbCkgeyB0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gdGhpcy5hc3luY0FjdGlvbih0aGlzLnJlc3VsdEFzeW5jQWN0aW9uKTsgfVxuXHRcdFx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZShleGVjdXRlUGFybSwgaXNBc3luYywgZGVsYXkpO1xuXHRcdFx0fSkpO1xuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQkID0gcGlwZSQuc3Vic2NyaWJlKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TmV4dEZvY3VzKGVsZW1lbnQ6IGFueSkge1xuXHRcdHRoaXMuZWxlbWVudE5leHRGb2N1cyA9IGVsZW1lbnQ7XG5cdH1cblx0cHVibGljIHNldEVuYWJsZWRWYWx1ZShlbmFibGVkKSB7XG5cdFx0dGhpcy5zZXRFbmFibGVkID0gZW5hYmxlZDtcblx0fVxufVxuIl19