@kephas/angular
Version:
Provides integration capabilities with Angular.
136 lines • 18.3 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { HttpClient } from '@angular/common/http';
import { LogLevel, AppService, Priority, Logger } from '@kephas/core';
import { CommandProcessorClient, CommandError } from '@kephas/commands';
import { Notification } from '@kephas/ui';
import { AppSettings } from '../../public-api';
import { retry, map, catchError } from 'rxjs/operators';
/**
* Provides proxied command execution over HTTP.
*
* @export
* @class HttpCommandProcessorClient
*/
let HttpCommandProcessorClient = class HttpCommandProcessorClient extends CommandProcessorClient {
/**
* Initializes a new instance of the CommandProcessor class.
* @param {Notification} notification The notification service.
* @param {HttpClient} http The HTTP client.
* @param {AppSettings} appSettings The application settings.
*/
constructor(appSettings, http, notification, logger) {
super();
this.appSettings = appSettings;
this.http = http;
this.notification = notification;
this.logger = logger;
/**
* Gets or sets the base route for the command execution.
*
* @protected
* @type {string}
* @memberof CommandProcessor
*/
this.baseRoute = 'api/cmd/';
}
/**
* Processes the command asynchronously.
* @tparam T The command response type.
* @param {string} command The command.
* @param {{}} [args] Optional. The arguments.
* @param {CommandClientContext} [options] Optional. Options controlling the command processing.
* @returns {Observable{T}} An observable over the result.
*/
process(command, args, options) {
const url = this.getHttpGetUrl(command, args, options);
let obs = this.http.get(url, this.getHttpGetOptions(command, args, options));
if (options && options.retries) {
obs = obs.pipe(retry(options.retries), map(response => this._processResponse(response, options)), catchError(error => this._processError(error, options)));
}
else {
obs = obs.pipe(map(response => this._processResponse(response, options)), catchError(error => this._processError(error, options)));
}
return obs;
}
/**
* Gets the HTTP GET URL.
*
* @protected
* @param {string} command The command.
* @param {{}} [args] Optional. The arguments.
* @param {CommandClientContext} [options] Optional. Options controlling the command processing.
* @returns {string} The HTTP GET URL.
* @memberof CommandProcessor
*/
getHttpGetUrl(command, args, options) {
let baseUrl = this.appSettings.baseUrl;
if (!baseUrl.endsWith('/')) {
baseUrl = baseUrl + '/';
}
let url = `${baseUrl}${this.baseRoute}${command}/`;
if (args) {
url = url + '?' + Object.keys(args)
.map(key => `${key}=${args[key]}`)
.join('&');
}
return url;
}
/**
* Gets the HTTP GET options. By default it does not return any options.
*
* @protected
* @param {string} command The command.
* @param {{}} [args] Optional. The arguments.
* @param {CommandClientContext} [options] Optional. Options controlling the command processing.
* @returns {({
* headers?: HttpHeaders | {
* [header: string]: string | string[];
* };
* observe?: 'body';
* params?: HttpParams | {
* [param: string]: string | string[];
* };
* reportProgress?: boolean;
* responseType?: 'json';
* withCredentials?: boolean;
* } | undefined)} The options or undefined.
* @memberof CommandProcessor
*/
getHttpGetOptions(command, args, options) {
return undefined;
}
_processResponse(response, options) {
if (typeof response.severity === 'string') {
response.severity = LogLevel[response.severity];
}
if (response.severity <= LogLevel.Error) {
throw new CommandError(response.message, response);
}
if (response.severity === LogLevel.Warning) {
this.logger.log(response.severity, null, response.message);
if (!(options && (options.notifyWarnings === undefined || options.notifyWarnings))) {
this.notification.notifyWarning(response);
}
}
if (response.severity <= LogLevel.Error) {
throw new Error(response.message);
}
return response;
}
_processError(error, options) {
this.logger.error(error);
if (!(options && (options.notifyErrors === undefined || options.notifyErrors))) {
this.notification.notifyError(error);
}
throw error;
}
};
HttpCommandProcessorClient = __decorate([
AppService({ overridePriority: Priority.Low }),
__metadata("design:paramtypes", [AppSettings,
HttpClient,
Notification,
Logger])
], HttpCommandProcessorClient);
export { HttpCommandProcessorClient };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cENvbW1hbmRQcm9jZXNzb3JDbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvaHR0cENvbW1hbmRQcm9jZXNzb3JDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQTJCLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUNILFFBQVEsRUFBRSxVQUFVLEVBQ3BCLFFBQVEsRUFBRSxNQUFNLEVBQ25CLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDSCxzQkFBc0IsRUFBeUMsWUFBWSxFQUM5RSxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhEOzs7OztHQUtHO0lBRVUsMEJBQTBCLFNBQTFCLDBCQUEyQixTQUFRLHNCQUFzQjtJQVdsRTs7Ozs7T0FLRztJQUNILFlBQ2MsV0FBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsWUFBMEIsRUFDMUIsTUFBYztRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUpFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5CNUI7Ozs7OztXQU1HO1FBQ08sY0FBUyxHQUFHLFVBQVUsQ0FBQztJQWNqQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE9BQU8sQ0FBNEIsT0FBZSxFQUFFLElBQVMsRUFBRSxPQUE4QjtRQUNoRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8s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RTtnQkFDaEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0M7U0FDSjtRQUVELElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVPLGFBQWEsQ0FBNEIsS0FBVSxFQUFFLE9BQThCO1FBQ3ZGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFO1lBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsTUFBTSxLQUFLLENBQUM7SUFDaEIsQ0FBQztDQUNKLENBQUE7QUEvSVksMEJBQTBCO0lBRHRDLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQ0FtQmhCLFdBQVc7UUFDbEIsVUFBVTtRQUNGLFlBQVk7UUFDbEIsTUFBTTtHQXJCbkIsMEJBQTBCLENBK0l0QztTQS9JWSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICAgIExvZ0xldmVsLCBBcHBTZXJ2aWNlLFxyXG4gICAgUHJpb3JpdHksIExvZ2dlciwgRXhwYW5kb1xyXG59IGZyb20gJ0BrZXBoYXMvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBDb21tYW5kUHJvY2Vzc29yQ2xpZW50LCBDb21tYW5kQ2xpZW50Q29udGV4dCwgQ29tbWFuZFJlc3BvbnNlLCBDb21tYW5kRXJyb3JcclxufSBmcm9tICdAa2VwaGFzL2NvbW1hbmRzJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uIH0gZnJvbSAnQGtlcGhhcy91aSc7XHJcbmltcG9ydCB7IEFwcFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vcHVibGljLWFwaSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmFibGVJbnB1dCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyByZXRyeSwgbWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIHByb3hpZWQgY29tbWFuZCBleGVjdXRpb24gb3ZlciBIVFRQLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBIdHRwQ29tbWFuZFByb2Nlc3NvckNsaWVudFxyXG4gKi9cclxuQEFwcFNlcnZpY2UoeyBvdmVycmlkZVByaW9yaXR5OiBQcmlvcml0eS5Mb3cgfSlcclxuZXhwb3J0IGNsYXNzIEh0dHBDb21tYW5kUHJvY2Vzc29yQ2xpZW50IGV4dGVuZHMgQ29tbWFuZFByb2Nlc3NvckNsaWVudCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGJhc2Ugcm91dGUgZm9yIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIENvbW1hbmRQcm9jZXNzb3JcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGJhc2VSb3V0ZSA9ICdhcGkvY21kLyc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQ29tbWFuZFByb2Nlc3NvciBjbGFzcy5cclxuICAgICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9ufSBub3RpZmljYXRpb24gVGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLlxyXG4gICAgICogQHBhcmFtIHtIdHRwQ2xpZW50fSBodHRwIFRoZSBIVFRQIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSB7QXBwU2V0dGluZ3N9IGFwcFNldHRpbmdzIFRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJvdGVjdGVkIGFwcFNldHRpbmdzOiBBcHBTZXR0aW5ncyxcclxuICAgICAgICBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sXHJcbiAgICAgICAgcHJvdGVjdGVkIGxvZ2dlcjogTG9nZ2VyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyB0aGUgY29tbWFuZCBhc3luY2hyb25vdXNseS5cclxuICAgICAqIEB0cGFyYW0gVCBUaGUgY29tbWFuZCByZXNwb25zZSB0eXBlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgVGhlIGNvbW1hbmQuXHJcbiAgICAgKiBAcGFyYW0ge3t9fSBbYXJnc10gT3B0aW9uYWwuIFRoZSBhcmd1bWVudHMuXHJcbiAgICAgKiBAcGFyYW0ge0NvbW1hbmRDbGllbnRDb250ZXh0fSBbb3B0aW9uc10gT3B0aW9uYWwuIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbW1hbmQgcHJvY2Vzc2luZy5cclxuICAgICAqIEByZXR1cm5zIHtPYnNlcnZhYmxle1R9fSBBbiBvYnNlcnZhYmxlIG92ZXIgdGhlIHJlc3VsdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2Nlc3M8VCBleHRlbmRzIENvbW1hbmRSZXNwb25zZT4oY29tbWFuZDogc3RyaW5nLCBhcmdzPzoge30sIG9wdGlvbnM/OiBDb21tYW5kQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0SHR0cEdldFVybChjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcclxuICAgICAgICBsZXQgb2JzID0gdGhpcy5odHRwLmdldDxUPih1cmwsIHRoaXMuZ2V0SHR0cEdldE9wdGlvbnMoY29tbWFuZCwgYXJncywgb3B0aW9ucykpO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmV0cmllcykge1xyXG4gICAgICAgICAgICBvYnMgPSBvYnMucGlwZShcclxuICAgICAgICAgICAgICAgIHJldHJ5KG9wdGlvbnMucmV0cmllcyksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVzcG9uc2UgPT4gdGhpcy5fcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlLCBvcHRpb25zKSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMuX3Byb2Nlc3NFcnJvcjxUPihlcnJvciwgb3B0aW9ucykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9icyA9IG9icy5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXNwb25zZSwgb3B0aW9ucykpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLl9wcm9jZXNzRXJyb3I8VD4oZXJyb3IsIG9wdGlvbnMpKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2JzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgSFRUUCBHRVQgVVJMLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIFRoZSBjb21tYW5kLlxyXG4gICAgICogQHBhcmFtIHt7fX0gW2FyZ3NdIE9wdGlvbmFsLiBUaGUgYXJndW1lbnRzLlxyXG4gICAgICogQHBhcmFtIHtDb21tYW5kQ2xpZW50Q29udGV4dH0gW29wdGlvbnNdIE9wdGlvbmFsLiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgSFRUUCBHRVQgVVJMLlxyXG4gICAgICogQG1lbWJlcm9mIENvbW1hbmRQcm9jZXNzb3JcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEh0dHBHZXRVcmwoY29tbWFuZDogc3RyaW5nLCBhcmdzPzoge30sIG9wdGlvbnM/OiBDb21tYW5kQ2xpZW50Q29udGV4dCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGJhc2VVcmwgPSB0aGlzLmFwcFNldHRpbmdzLmJhc2VVcmw7XHJcbiAgICAgICAgaWYgKCFiYXNlVXJsLmVuZHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgICAgYmFzZVVybCA9IGJhc2VVcmwgKyAnLyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdXJsID0gYCR7YmFzZVVybH0ke3RoaXMuYmFzZVJvdXRlfSR7Y29tbWFuZH0vYDtcclxuICAgICAgICBpZiAoYXJncykge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwgKyAnPycgKyBPYmplY3Qua2V5cyhhcmdzKVxyXG4gICAgICAgICAgICAgICAgLm1hcChrZXkgPT4gYCR7a2V5fT0keyhhcmdzIGFzIEV4cGFuZG8pW2tleV19YClcclxuICAgICAgICAgICAgICAgIC5qb2luKCcmJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgSFRUUCBHRVQgb3B0aW9ucy4gQnkgZGVmYXVsdCBpdCBkb2VzIG5vdCByZXR1cm4gYW55IG9wdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgVGhlIGNvbW1hbmQuXHJcbiAgICAgKiBAcGFyYW0ge3t9fSBbYXJnc10gT3B0aW9uYWwuIFRoZSBhcmd1bWVudHMuXHJcbiAgICAgKiBAcGFyYW0ge0NvbW1hbmRDbGllbnRDb250ZXh0fSBbb3B0aW9uc10gT3B0aW9uYWwuIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbW1hbmQgcHJvY2Vzc2luZy5cclxuICAgICAqIEByZXR1cm5zIHsoe1xyXG4gICAgICogICAgICAgICAgICAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwge1xyXG4gICAgICogICAgICAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICogICAgICAgICAgICAgfTtcclxuICAgICAqICAgICAgICAgICAgIG9ic2VydmU/OiAnYm9keSc7XHJcbiAgICAgKiAgICAgICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xyXG4gICAgICogICAgICAgICAgICAgICAgIFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICAgKiAgICAgICAgICAgICB9O1xyXG4gICAgICogICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAgICogICAgICAgICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xyXG4gICAgICogICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICAgICAqICAgICAgICAgfSB8IHVuZGVmaW5lZCl9IFRoZSBvcHRpb25zIG9yIHVuZGVmaW5lZC5cclxuICAgICAqIEBtZW1iZXJvZiBDb21tYW5kUHJvY2Vzc29yXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRIdHRwR2V0T3B0aW9ucyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M/OiB7fSwgb3B0aW9ucz86IENvbW1hbmRDbGllbnRDb250ZXh0KToge1xyXG4gICAgICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyB8IHtcclxuICAgICAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICAgICAgfTtcclxuICAgICAgICBvYnNlcnZlPzogJ2JvZHknO1xyXG4gICAgICAgIHBhcmFtcz86IEh0dHBQYXJhbXMgfCB7XHJcbiAgICAgICAgICAgIFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xyXG4gICAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XHJcbiAgICB9IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Byb2Nlc3NSZXNwb25zZTxUIGV4dGVuZHMgQ29tbWFuZFJlc3BvbnNlPihyZXNwb25zZTogVCwgb3B0aW9ucz86IENvbW1hbmRDbGllbnRDb250ZXh0KTogVCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5zZXZlcml0eSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc2V2ZXJpdHkgPSAoTG9nTGV2ZWwgYXMgRXhwYW5kbylbcmVzcG9uc2Uuc2V2ZXJpdHkgYXMgc3RyaW5nXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXZlcml0eSA8PSBMb2dMZXZlbC5FcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbWFuZEVycm9yKHJlc3BvbnNlLm1lc3NhZ2UhLCByZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc2V2ZXJpdHkgPT09IExvZ0xldmVsLldhcm5pbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKHJlc3BvbnNlLnNldmVyaXR5LCBudWxsLCByZXNwb25zZS5tZXNzYWdlISk7XHJcbiAgICAgICAgICAgIGlmICghKG9wdGlvbnMgJiYgKG9wdGlvbnMubm90aWZ5V2FybmluZ3MgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeVdhcm5pbmdzKSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uLm5vdGlmeVdhcm5pbmcocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc2V2ZXJpdHkgPD0gTG9nTGV2ZWwuRXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJvY2Vzc0Vycm9yPFQgZXh0ZW5kcyBDb21tYW5kUmVzcG9uc2U+KGVycm9yOiBhbnksIG9wdGlvbnM/OiBDb21tYW5kQ2xpZW50Q29udGV4dCk6IE9ic2VydmFibGVJbnB1dDxUPiB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIGlmICghKG9wdGlvbnMgJiYgKG9wdGlvbnMubm90aWZ5RXJyb3JzID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5ub3RpZnlFcnJvcnMpKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxufVxyXG4iXX0=