@nebular/auth
Version:
@nebular/auth
270 lines • 37.5 kB
JavaScript
/**
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Injectable } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';
import { of as observableOf } from 'rxjs';
import { switchMap, map, catchError } from 'rxjs/operators';
import { NbAuthResult } from '../../services/auth-result';
import { NbAuthStrategy } from '../auth-strategy';
import { passwordStrategyOptions } from './password-strategy-options';
import { NbAuthIllegalTokenError } from '../../services/token/token';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "@angular/router";
/**
* The most common authentication provider for email/password strategy.
*
* Strategy settings. Note, there is no need to copy over the whole object to change the settings you need.
* Also, this.getOption call won't work outside of the default options declaration
* (which is inside of the `NbPasswordAuthStrategy` class), so you have to replace it with a custom helper function
* if you need it.
*
* ```ts
*export class NbPasswordAuthStrategyOptions extends NbAuthStrategyOptions {
* name: string;
* baseEndpoint? = '/api/auth/';
* login?: boolean | NbPasswordStrategyModule = {
* alwaysFail: false,
* endpoint: 'login',
* method: 'post',
* requireValidToken: true,
* redirect: {
* success: '/',
* failure: null,
* },
* defaultErrors: ['Login/Email combination is not correct, please try again.'],
* defaultMessages: ['You have been successfully logged in.'],
* };
* register?: boolean | NbPasswordStrategyModule = {
* alwaysFail: false,
* endpoint: 'register',
* method: 'post',
* requireValidToken: true,
* redirect: {
* success: '/',
* failure: null,
* },
* defaultErrors: ['Something went wrong, please try again.'],
* defaultMessages: ['You have been successfully registered.'],
* };
* requestPass?: boolean | NbPasswordStrategyModule = {
* endpoint: 'request-pass',
* method: 'post',
* redirect: {
* success: '/',
* failure: null,
* },
* defaultErrors: ['Something went wrong, please try again.'],
* defaultMessages: ['Reset password instructions have been sent to your email.'],
* };
* resetPass?: boolean | NbPasswordStrategyReset = {
* endpoint: 'reset-pass',
* method: 'put',
* redirect: {
* success: '/',
* failure: null,
* },
* resetPasswordTokenKey: 'reset_password_token',
* defaultErrors: ['Something went wrong, please try again.'],
* defaultMessages: ['Your password has been successfully changed.'],
* };
* logout?: boolean | NbPasswordStrategyReset = {
* alwaysFail: false,
* endpoint: 'logout',
* method: 'delete',
* redirect: {
* success: '/',
* failure: null,
* },
* defaultErrors: ['Something went wrong, please try again.'],
* defaultMessages: ['You have been successfully logged out.'],
* };
* refreshToken?: boolean | NbPasswordStrategyModule = {
* endpoint: 'refresh-token',
* method: 'post',
* requireValidToken: true,
* redirect: {
* success: null,
* failure: null,
* },
* defaultErrors: ['Something went wrong, please try again.'],
* defaultMessages: ['Your token has been successfully refreshed.'],
* };
* token?: NbPasswordStrategyToken = {
* class: NbAuthSimpleToken,
* key: 'data.token',
* getter: (module: string, res: HttpResponse<Object>, options: NbPasswordAuthStrategyOptions) => getDeepFromObject(
* res.body,
* options.token.key,
* ),
* };
* errors?: NbPasswordStrategyMessage = {
* key: 'data.errors',
* getter: (module: string, res: HttpErrorResponse, options: NbPasswordAuthStrategyOptions) => getDeepFromObject(
* res.error,
* options.errors.key,
* options[module].defaultErrors,
* ),
* };
* messages?: NbPasswordStrategyMessage = {
* key: 'data.messages',
* getter: (module: string, res: HttpResponse<Object>, options: NbPasswordAuthStrategyOptions) => getDeepFromObject(
* res.body,
* options.messages.key,
* options[module].defaultMessages,
* ),
* };
* validation?: {
* password?: {
* required?: boolean;
* minLength?: number | null;
* maxLength?: number | null;
* regexp?: string | null;
* };
* email?: {
* required?: boolean;
* regexp?: string | null;
* };
* fullName?: {
* required?: boolean;
* minLength?: number | null;
* maxLength?: number | null;
* regexp?: string | null;
* };
* };
*}
* ```
*/
export class NbPasswordAuthStrategy extends NbAuthStrategy {
static setup(options) {
return [NbPasswordAuthStrategy, options];
}
constructor(http, route) {
super();
this.http = http;
this.route = route;
this.defaultOptions = passwordStrategyOptions;
}
authenticate(data) {
const module = 'login';
const method = this.getOption(`${module}.method`);
const url = this.getActionEndpoint(module);
const requireValidToken = this.getOption(`${module}.requireValidToken`);
return this.http.request(method, url, { body: data, observe: 'response', headers: this.getHeaders() }).pipe(map((res) => {
if (this.getOption(`${module}.alwaysFail`)) {
throw this.createFailResponse(data);
}
return res;
}), map((res) => {
return new NbAuthResult(true, res, this.getOption(`${module}.redirect.success`), [], this.getOption('messages.getter')(module, res, this.options), this.createToken(this.getOption('token.getter')(module, res, this.options), requireValidToken));
}), catchError((res) => {
return this.handleResponseError(res, module);
}));
}
register(data) {
const module = 'register';
const method = this.getOption(`${module}.method`);
const url = this.getActionEndpoint(module);
const requireValidToken = this.getOption(`${module}.requireValidToken`);
return this.http.request(method, url, { body: data, observe: 'response', headers: this.getHeaders() }).pipe(map((res) => {
if (this.getOption(`${module}.alwaysFail`)) {
throw this.createFailResponse(data);
}
return res;
}), map((res) => {
return new NbAuthResult(true, res, this.getOption(`${module}.redirect.success`), [], this.getOption('messages.getter')(module, res, this.options), this.createToken(this.getOption('token.getter')('login', res, this.options), requireValidToken));
}), catchError((res) => {
return this.handleResponseError(res, module);
}));
}
requestPassword(data) {
const module = 'requestPass';
const method = this.getOption(`${module}.method`);
const url = this.getActionEndpoint(module);
return this.http.request(method, url, { body: data, observe: 'response', headers: this.getHeaders() }).pipe(map((res) => {
if (this.getOption(`${module}.alwaysFail`)) {
throw this.createFailResponse();
}
return res;
}), map((res) => {
return new NbAuthResult(true, res, this.getOption(`${module}.redirect.success`), [], this.getOption('messages.getter')(module, res, this.options));
}), catchError((res) => {
return this.handleResponseError(res, module);
}));
}
resetPassword(data = {}) {
const module = 'resetPass';
const method = this.getOption(`${module}.method`);
const url = this.getActionEndpoint(module);
const tokenKey = this.getOption(`${module}.resetPasswordTokenKey`);
data[tokenKey] = this.route.snapshot.queryParams[tokenKey];
return this.http.request(method, url, { body: data, observe: 'response', headers: this.getHeaders() }).pipe(map((res) => {
if (this.getOption(`${module}.alwaysFail`)) {
throw this.createFailResponse();
}
return res;
}), map((res) => {
return new NbAuthResult(true, res, this.getOption(`${module}.redirect.success`), [], this.getOption('messages.getter')(module, res, this.options));
}), catchError((res) => {
return this.handleResponseError(res, module);
}));
}
logout() {
const module = 'logout';
const method = this.getOption(`${module}.method`);
const url = this.getActionEndpoint(module);
return observableOf({}).pipe(switchMap((res) => {
if (!url) {
return observableOf(res);
}
return this.http.request(method, url, { observe: 'response', headers: this.getHeaders() });
}), map((res) => {
if (this.getOption(`${module}.alwaysFail`)) {
throw this.createFailResponse();
}
return res;
}), map((res) => {
return new NbAuthResult(true, res, this.getOption(`${module}.redirect.success`), [], this.getOption('messages.getter')(module, res, this.options));
}), catchError((res) => {
return this.handleResponseError(res, module);
}));
}
refreshToken(data) {
const module = 'refreshToken';
const method = this.getOption(`${module}.method`);
const url = this.getActionEndpoint(module);
const requireValidToken = this.getOption(`${module}.requireValidToken`);
return this.http.request(method, url, { body: data, observe: 'response', headers: this.getHeaders() }).pipe(map((res) => {
if (this.getOption(`${module}.alwaysFail`)) {
throw this.createFailResponse(data);
}
return res;
}), map((res) => {
return new NbAuthResult(true, res, this.getOption(`${module}.redirect.success`), [], this.getOption('messages.getter')(module, res, this.options), this.createToken(this.getOption('token.getter')(module, res, this.options), requireValidToken));
}), catchError((res) => {
return this.handleResponseError(res, module);
}));
}
handleResponseError(res, module) {
let errors = [];
if (res instanceof HttpErrorResponse) {
errors = this.getOption('errors.getter')(module, res, this.options);
}
else if (res instanceof NbAuthIllegalTokenError) {
errors.push(res.message);
}
else {
errors.push('Something went wrong.');
}
return observableOf(new NbAuthResult(false, res, this.getOption(`${module}.redirect.failure`), errors));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NbPasswordAuthStrategy, deps: [{ token: i1.HttpClient }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NbPasswordAuthStrategy }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NbPasswordAuthStrategy, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.ActivatedRoute }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZnJhbWV3b3JrL2F1dGgvc3RyYXRlZ2llcy9wYXNzd29yZC9wYXNzd29yZC1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRSxPQUFPLEVBQWMsRUFBRSxJQUFJLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxELE9BQU8sRUFBaUMsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7OztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkhHO0FBRUgsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGNBQWM7SUFHeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFzQztRQUNqRCxPQUFPLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFlBQXNCLElBQWdCLEVBQVUsS0FBcUI7UUFDbkUsS0FBSyxFQUFFLENBQUM7UUFEWSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsVUFBSyxH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QUM7UUFDaEIsSUFBSSxHQUFHLFlBQVksaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO2FBQU0sSUFBSSxHQUFHLFlBQVksdUJBQXVCLEVBQUUsQ0FBQztZQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDMUcsQ0FBQzs4R0F0TVUsc0JBQXNCO2tIQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIGFzIG9ic2VydmFibGVPZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE5iQXV0aFJlc3VsdCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGgtcmVzdWx0JztcbmltcG9ydCB7IE5iQXV0aFN0cmF0ZWd5IH0gZnJvbSAnLi4vYXV0aC1zdHJhdGVneSc7XG5pbXBvcnQgeyBOYkF1dGhTdHJhdGVneUNsYXNzIH0gZnJvbSAnLi4vLi4vYXV0aC5vcHRpb25zJztcbmltcG9ydCB7IE5iUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zLCBwYXNzd29yZFN0cmF0ZWd5T3B0aW9ucyB9IGZyb20gJy4vcGFzc3dvcmQtc3RyYXRlZ3ktb3B0aW9ucyc7XG5pbXBvcnQgeyBOYkF1dGhJbGxlZ2FsVG9rZW5FcnJvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rva2VuL3Rva2VuJztcblxuLyoqXG4gKiBUaGUgbW9zdCBjb21tb24gYXV0aGVudGljYXRpb24gcHJvdmlkZXIgZm9yIGVtYWlsL3Bhc3N3b3JkIHN0cmF0ZWd5LlxuICpcbiAqIFN0cmF0ZWd5IHNldHRpbmdzLiBOb3RlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNvcHkgb3ZlciB0aGUgd2hvbGUgb2JqZWN0IHRvIGNoYW5nZSB0aGUgc2V0dGluZ3MgeW91IG5lZWQuXG4gKiBBbHNvLCB0aGlzLmdldE9wdGlvbiBjYWxsIHdvbid0IHdvcmsgb3V0c2lkZSBvZiB0aGUgZGVmYXVsdCBvcHRpb25zIGRlY2xhcmF0aW9uXG4gKiAod2hpY2ggaXMgaW5zaWRlIG9mIHRoZSBgTmJQYXNzd29yZEF1dGhTdHJhdGVneWAgY2xhc3MpLCBzbyB5b3UgaGF2ZSB0byByZXBsYWNlIGl0IHdpdGggYSBjdXN0b20gaGVscGVyIGZ1bmN0aW9uXG4gKiBpZiB5b3UgbmVlZCBpdC5cbiAqXG4gKiBgYGB0c1xuICpleHBvcnQgY2xhc3MgTmJQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnMgZXh0ZW5kcyBOYkF1dGhTdHJhdGVneU9wdGlvbnMge1xuICogIG5hbWU6IHN0cmluZztcbiAqICBiYXNlRW5kcG9pbnQ/ID0gJy9hcGkvYXV0aC8nO1xuICogIGxvZ2luPzogYm9vbGVhbiB8IE5iUGFzc3dvcmRTdHJhdGVneU1vZHVsZSA9IHtcbiAqICAgIGFsd2F5c0ZhaWw6IGZhbHNlLFxuICogICAgZW5kcG9pbnQ6ICdsb2dpbicsXG4gKiAgICBtZXRob2Q6ICdwb3N0JyxcbiAqICAgIHJlcXVpcmVWYWxpZFRva2VuOiB0cnVlLFxuICogICAgcmVkaXJlY3Q6IHtcbiAqICAgICAgc3VjY2VzczogJy8nLFxuICogICAgICBmYWlsdXJlOiBudWxsLFxuICogICAgfSxcbiAqICAgIGRlZmF1bHRFcnJvcnM6IFsnTG9naW4vRW1haWwgY29tYmluYXRpb24gaXMgbm90IGNvcnJlY3QsIHBsZWFzZSB0cnkgYWdhaW4uJ10sXG4gKiAgICBkZWZhdWx0TWVzc2FnZXM6IFsnWW91IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgbG9nZ2VkIGluLiddLFxuICogIH07XG4gKiAgcmVnaXN0ZXI/OiBib29sZWFuIHwgTmJQYXNzd29yZFN0cmF0ZWd5TW9kdWxlID0ge1xuICogICAgYWx3YXlzRmFpbDogZmFsc2UsXG4gKiAgICBlbmRwb2ludDogJ3JlZ2lzdGVyJyxcbiAqICAgIG1ldGhvZDogJ3Bvc3QnLFxuICogICAgcmVxdWlyZVZhbGlkVG9rZW46IHRydWUsXG4gKiAgICByZWRpcmVjdDoge1xuICogICAgICBzdWNjZXNzOiAnLycsXG4gKiAgICAgIGZhaWx1cmU6IG51bGwsXG4gKiAgICB9LFxuICogICAgZGVmYXVsdEVycm9yczogWydTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2Fpbi4nXSxcbiAqICAgIGRlZmF1bHRNZXNzYWdlczogWydZb3UgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLiddLFxuICogIH07XG4gKiAgcmVxdWVzdFBhc3M/OiBib29sZWFuIHwgTmJQYXNzd29yZFN0cmF0ZWd5TW9kdWxlID0ge1xuICogICAgZW5kcG9pbnQ6ICdyZXF1ZXN0LXBhc3MnLFxuICogICAgbWV0aG9kOiAncG9zdCcsXG4gKiAgICByZWRpcmVjdDoge1xuICogICAgICBzdWNjZXNzOiAnLycsXG4gKiAgICAgIGZhaWx1cmU6IG51bGwsXG4gKiAgICB9LFxuICogICAgZGVmYXVsdEVycm9yczogWydTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2Fpbi4nXSxcbiAqICAgIGRlZmF1bHRNZXNzYWdlczogWydSZXNldCBwYXNzd29yZCBpbnN0cnVjdGlvbnMgaGF2ZSBiZWVuIHNlbnQgdG8geW91ciBlbWFpbC4nXSxcbiAqICB9O1xuICogIHJlc2V0UGFzcz86IGJvb2xlYW4gfCBOYlBhc3N3b3JkU3RyYXRlZ3lSZXNldCA9IHtcbiAqICAgIGVuZHBvaW50OiAncmVzZXQtcGFzcycsXG4gKiAgICBtZXRob2Q6ICdwdXQnLFxuICogICAgcmVkaXJlY3Q6IHtcbiAqICAgICAgc3VjY2VzczogJy8nLFxuICogICAgICBmYWlsdXJlOiBudWxsLFxuICogICAgfSxcbiAqICAgIHJlc2V0UGFzc3dvcmRUb2tlbktleTogJ3Jlc2V0X3Bhc3N3b3JkX3Rva2VuJyxcbiAqICAgIGRlZmF1bHRFcnJvcnM6IFsnU29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4uJ10sXG4gKiAgICBkZWZhdWx0TWVzc2FnZXM6IFsnWW91ciBwYXNzd29yZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2hhbmdlZC4nXSxcbiAqICB9O1xuICogIGxvZ291dD86IGJvb2xlYW4gfCBOYlBhc3N3b3JkU3RyYXRlZ3lSZXNldCA9IHtcbiAqICAgIGFsd2F5c0ZhaWw6IGZhbHNlLFxuICogICAgZW5kcG9pbnQ6ICdsb2dvdXQnLFxuICogICAgbWV0aG9kOiAnZGVsZXRlJyxcbiAqICAgIHJlZGlyZWN0OiB7XG4gKiAgICAgIHN1Y2Nlc3M6ICcvJyxcbiAqICAgICAgZmFpbHVyZTogbnVsbCxcbiAqICAgIH0sXG4gKiAgICBkZWZhdWx0RXJyb3JzOiBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluLiddLFxuICogICAgZGVmYXVsdE1lc3NhZ2VzOiBbJ1lvdSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvZ2dlZCBvdXQuJ10sXG4gKiAgfTtcbiAqICByZWZyZXNoVG9rZW4/OiBib29sZWFuIHwgTmJQYXNzd29yZFN0cmF0ZWd5TW9kdWxlID0ge1xuICogICAgZW5kcG9pbnQ6ICdyZWZyZXNoLXRva2VuJyxcbiAqICAgIG1ldGhvZDogJ3Bvc3QnLFxuICogICAgcmVxdWlyZVZhbGlkVG9rZW46IHRydWUsXG4gKiAgICByZWRpcmVjdDoge1xuICogICAgICBzdWNjZXNzOiBudWxsLFxuICogICAgICBmYWlsdXJlOiBudWxsLFxuICogICAgfSxcbiAqICAgIGRlZmF1bHRFcnJvcnM6IFsnU29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4uJ10sXG4gKiAgICBkZWZhdWx0TWVzc2FnZXM6IFsnWW91ciB0b2tlbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVmcmVzaGVkLiddLFxuICogIH07XG4gKiAgdG9rZW4/OiBOYlBhc3N3b3JkU3RyYXRlZ3lUb2tlbiA9IHtcbiAqICAgIGNsYXNzOiBOYkF1dGhTaW1wbGVUb2tlbixcbiAqICAgIGtleTogJ2RhdGEudG9rZW4nLFxuICogICAgZ2V0dGVyOiAobW9kdWxlOiBzdHJpbmcsIHJlczogSHR0cFJlc3BvbnNlPE9iamVjdD4sIG9wdGlvbnM6IE5iUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zKSA9PiBnZXREZWVwRnJvbU9iamVjdChcbiAqICAgICAgcmVzLmJvZHksXG4gKiAgICAgIG9wdGlvbnMudG9rZW4ua2V5LFxuICogICAgKSxcbiAqICB9O1xuICogIGVycm9ycz86IE5iUGFzc3dvcmRTdHJhdGVneU1lc3NhZ2UgPSB7XG4gKiAgICBrZXk6ICdkYXRhLmVycm9ycycsXG4gKiAgICBnZXR0ZXI6IChtb2R1bGU6IHN0cmluZywgcmVzOiBIdHRwRXJyb3JSZXNwb25zZSwgb3B0aW9uczogTmJQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnMpID0+IGdldERlZXBGcm9tT2JqZWN0KFxuICogICAgICByZXMuZXJyb3IsXG4gKiAgICAgIG9wdGlvbnMuZXJyb3JzLmtleSxcbiAqICAgICAgb3B0aW9uc1ttb2R1bGVdLmRlZmF1bHRFcnJvcnMsXG4gKiAgICApLFxuICogIH07XG4gKiAgbWVzc2FnZXM/OiBOYlBhc3N3b3JkU3RyYXRlZ3lNZXNzYWdlID0ge1xuICogICAga2V5OiAnZGF0YS5tZXNzYWdlcycsXG4gKiAgICBnZXR0ZXI6IChtb2R1bGU6IHN0cmluZywgcmVzOiBIdHRwUmVzcG9uc2U8T2JqZWN0Piwgb3B0aW9uczogTmJQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnMpID0+IGdldERlZXBGcm9tT2JqZWN0KFxuICogICAgICByZXMuYm9keSxcbiAqICAgICAgb3B0aW9ucy5tZXNzYWdlcy5rZXksXG4gKiAgICAgIG9wdGlvbnNbbW9kdWxlXS5kZWZhdWx0TWVzc2FnZXMsXG4gKiAgICApLFxuICogIH07XG4gKiAgdmFsaWRhdGlvbj86IHtcbiAqICAgIHBhc3N3b3JkPzoge1xuICogICAgICByZXF1aXJlZD86IGJvb2xlYW47XG4gKiAgICAgIG1pbkxlbmd0aD86IG51bWJlciB8IG51bGw7XG4gKiAgICAgIG1heExlbmd0aD86IG51bWJlciB8IG51bGw7XG4gKiAgICAgIHJlZ2V4cD86IHN0cmluZyB8IG51bGw7XG4gKiAgICB9O1xuICogICAgZW1haWw/OiB7XG4gKiAgICAgIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAqICAgICAgcmVnZXhwPzogc3RyaW5nIHwgbnVsbDtcbiAqICAgIH07XG4gKiAgICBmdWxsTmFtZT86IHtcbiAqICAgICAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICogICAgICBtaW5MZW5ndGg/OiBudW1iZXIgfCBudWxsO1xuICogICAgICBtYXhMZW5ndGg/OiBudW1iZXIgfCBudWxsO1xuICogICAgICByZWdleHA/OiBzdHJpbmcgfCBudWxsO1xuICogICAgfTtcbiAqICB9O1xuICp9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5iUGFzc3dvcmRBdXRoU3RyYXRlZ3kgZXh0ZW5kcyBOYkF1dGhTdHJhdGVneSB7XG4gIHByb3RlY3RlZCBkZWZhdWx0T3B0aW9uczogTmJQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnMgPSBwYXNzd29yZFN0cmF0ZWd5T3B0aW9ucztcblxuICBzdGF0aWMgc2V0dXAob3B0aW9uczogTmJQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnMpOiBbTmJBdXRoU3RyYXRlZ3lDbGFzcywgTmJQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnNdIHtcbiAgICByZXR1cm4gW05iUGFzc3dvcmRBdXRoU3RyYXRlZ3ksIG9wdGlvbnNdO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGF1dGhlbnRpY2F0ZShkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICBjb25zdCBtb2R1bGUgPSAnbG9naW4nO1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRBY3Rpb25FbmRwb2ludChtb2R1bGUpO1xuICAgIGNvbnN0IHJlcXVpcmVWYWxpZFRva2VuID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZXF1aXJlVmFsaWRUb2tlbmApO1xuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBib2R5OiBkYXRhLCBvYnNlcnZlOiAncmVzcG9uc2UnLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9KS5waXBlKFxuICAgICAgbWFwKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pLFxuICAgICAgbWFwKChyZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICByZXMsXG4gICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXG4gICAgICAgICAgW10sXG4gICAgICAgICAgdGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpLFxuICAgICAgICAgIHRoaXMuY3JlYXRlVG9rZW4odGhpcy5nZXRPcHRpb24oJ3Rva2VuLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpLCByZXF1aXJlVmFsaWRUb2tlbiksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICByZWdpc3RlcihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICBjb25zdCBtb2R1bGUgPSAncmVnaXN0ZXInO1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRBY3Rpb25FbmRwb2ludChtb2R1bGUpO1xuICAgIGNvbnN0IHJlcXVpcmVWYWxpZFRva2VuID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZXF1aXJlVmFsaWRUb2tlbmApO1xuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBib2R5OiBkYXRhLCBvYnNlcnZlOiAncmVzcG9uc2UnLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9KS5waXBlKFxuICAgICAgbWFwKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSksXG4gICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyksXG4gICAgICAgICAgdGhpcy5jcmVhdGVUb2tlbih0aGlzLmdldE9wdGlvbigndG9rZW4uZ2V0dGVyJykoJ2xvZ2luJywgcmVzLCB0aGlzLm9wdGlvbnMpLCByZXF1aXJlVmFsaWRUb2tlbiksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICByZXF1ZXN0UGFzc3dvcmQoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XG4gICAgY29uc3QgbW9kdWxlID0gJ3JlcXVlc3RQYXNzJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgYm9keTogZGF0YSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSkucGlwZShcbiAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSksXG4gICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICByZXNldFBhc3N3b3JkKGRhdGE6IGFueSA9IHt9KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICBjb25zdCBtb2R1bGUgPSAncmVzZXRQYXNzJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcbiAgICBjb25zdCB0b2tlbktleSA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVzZXRQYXNzd29yZFRva2VuS2V5YCk7XG4gICAgZGF0YVt0b2tlbktleV0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW3Rva2VuS2V5XTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgYm9keTogZGF0YSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSkucGlwZShcbiAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSksXG4gICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICBjb25zdCBtb2R1bGUgPSAnbG9nb3V0JztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcblxuICAgIHJldHVybiBvYnNlcnZhYmxlT2Yoe30pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihyZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9KTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KSxcbiAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgcmVzLFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxuICAgICAgICAgIFtdLFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigocmVzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzLCBtb2R1bGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJlZnJlc2hUb2tlbihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICBjb25zdCBtb2R1bGUgPSAncmVmcmVzaFRva2VuJztcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcbiAgICBjb25zdCByZXF1aXJlVmFsaWRUb2tlbiA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVxdWlyZVZhbGlkVG9rZW5gKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBib2R5OiBkYXRhLCBvYnNlcnZlOiAncmVzcG9uc2UnLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9KS5waXBlKFxuICAgICAgbWFwKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSksXG4gICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyksXG4gICAgICAgICAgdGhpcy5jcmVhdGVUb2tlbih0aGlzLmdldE9wdGlvbigndG9rZW4uZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyksIHJlcXVpcmVWYWxpZFRva2VuKSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigocmVzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzLCBtb2R1bGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVSZXNwb25zZUVycm9yKHJlczogYW55LCBtb2R1bGU6IHN0cmluZyk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgZXJyb3JzID0gdGhpcy5nZXRPcHRpb24oJ2Vycm9ycy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIE5iQXV0aElsbGVnYWxUb2tlbkVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChyZXMubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9ycy5wdXNoKCdTb21ldGhpbmcgd2VudCB3cm9uZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG9ic2VydmFibGVPZihuZXcgTmJBdXRoUmVzdWx0KGZhbHNlLCByZXMsIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3QuZmFpbHVyZWApLCBlcnJvcnMpKTtcbiAgfVxufVxuIl19