bc-adal-angular
Version:
Library wrapper for Angular 6+, development over Microsoft ADAL (Azure Active Directory Authentication Library) - [https://github.com/AzureAD/azure-activedirectory-library-for-js](https://github.com/AzureAD/azure-activedirectory-library-for-js) that helps
341 lines (332 loc) • 23.3 kB
JavaScript
import { InjectionToken, Inject, Injectable, NgModule } from '@angular/core';
import * as AuthenticationContext from 'adal-angular';
import { Observable } from 'rxjs';
import { retry } from 'rxjs/operators';
import { Router } from '@angular/router';
import { mergeMap } from 'rxjs/internal/operators/mergeMap';
import { CommonModule } from '@angular/common';
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
var ADAL_OPTIONS = new InjectionToken('bc.adal.angular.options');
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var BcAdalAngularService = /** @class */ (function () {
function BcAdalAngularService(adalOptions) {
this.adalOptions = adalOptions;
this.setOptions(adalOptions);
this.initAuthenticationContext();
}
/**
* @return {?}
*/
BcAdalAngularService.prototype.login = /**
* @return {?}
*/
function () {
this.context.login();
};
/**
* @return {?}
*/
BcAdalAngularService.prototype.logout = /**
* @return {?}
*/
function () {
this.context.logOut();
};
/**
* @return {?}
*/
BcAdalAngularService.prototype.getOptions = /**
* @return {?}
*/
function () {
return this.options;
};
/**
* @param {?} adalOptions
* @return {?}
*/
BcAdalAngularService.prototype.setOptions = /**
* @param {?} adalOptions
* @return {?}
*/
function (adalOptions) {
this.options = adalOptions;
};
Object.defineProperty(BcAdalAngularService.prototype, "authContext", {
get: /**
* @return {?}
*/
function () {
return this.context;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
BcAdalAngularService.prototype.handleWindowCallback = /**
* @return {?}
*/
function () {
this.context.handleWindowCallback();
};
Object.defineProperty(BcAdalAngularService.prototype, "userInfo", {
get: /**
* @return {?}
*/
function () {
return this.context.getCachedUser();
},
enumerable: true,
configurable: true
});
Object.defineProperty(BcAdalAngularService.prototype, "accessToken", {
get: /**
* @return {?}
*/
function () {
return this.context.getCachedToken(this.options.clientId);
},
enumerable: true,
configurable: true
});
Object.defineProperty(BcAdalAngularService.prototype, "isAuthenticated", {
get: /**
* @return {?}
*/
function () {
return this.userInfo && this.accessToken;
},
enumerable: true,
configurable: true
});
/**
* @param {?} url
* @return {?}
*/
BcAdalAngularService.prototype.getResourceForEndpoint = /**
* @param {?} url
* @return {?}
*/
function (url) {
return this.context.getResourceForEndpoint(url);
};
/**
* @param {?} hash
* @return {?}
*/
BcAdalAngularService.prototype.isCallback = /**
* @param {?} hash
* @return {?}
*/
function (hash) {
return this.context.isCallback(hash);
};
/**
* @return {?}
*/
BcAdalAngularService.prototype.getLoginError = /**
* @return {?}
*/
function () {
return this.context.getLoginError();
};
/**
* @param {?} endpoint
* @param {?} callbacks
* @return {?}
*/
BcAdalAngularService.prototype.getAccessToken = /**
* @param {?} endpoint
* @param {?} callbacks
* @return {?}
*/
function (endpoint, callbacks) {
return this.context.acquireToken(endpoint, callbacks);
};
/* istanbul ignore next */
/* istanbul ignore next */
/**
* @param {?} resource
* @return {?}
*/
BcAdalAngularService.prototype.acquireTokenResilient = /* istanbul ignore next */
/**
* @param {?} resource
* @return {?}
*/
function (resource) {
var _this = this;
return new Observable(function (subscriber) {
return _this.context.acquireToken(resource, function (message, token) {
if (token) {
subscriber.next(token);
}
else {
subscriber.error(message);
}
});
}).pipe(retry(3));
};
/**
* @private
* @return {?}
*/
BcAdalAngularService.prototype.initAuthenticationContext = /**
* @private
* @return {?}
*/
function () {
this.context = new AuthenticationContext(this.options);
};
BcAdalAngularService.decorators = [
{ type: Injectable }
];
BcAdalAngularService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [ADAL_OPTIONS,] }] }
]; };
return BcAdalAngularService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var AdalAccessGuard = /** @class */ (function () {
function AdalAccessGuard(router, adalService) {
this.router = router;
this.adalService = adalService;
}
/**
* @param {?} route
* @param {?} state
* @return {?}
*/
AdalAccessGuard.prototype.canActivate = /**
* @param {?} route
* @param {?} state
* @return {?}
*/
function (route, state) {
/** @type {?} */
var navigationExtras = {
queryParams: { redirectUrl: route.url }
};
if (this.adalService.userInfo) {
return true;
}
this.router.navigate(['accessdenied'], navigationExtras);
return false;
};
AdalAccessGuard.decorators = [
{ type: Injectable }
];
AdalAccessGuard.ctorParameters = function () { return [
{ type: Router },
{ type: BcAdalAngularService }
]; };
return AdalAccessGuard;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var BcAdalAngularInterceptor = /** @class */ (function () {
function BcAdalAngularInterceptor(adalService) {
this.adalService = adalService;
}
/**
* @param {?} request
* @param {?} next
* @return {?}
*/
BcAdalAngularInterceptor.prototype.intercept = /**
* @param {?} request
* @param {?} next
* @return {?}
*/
function (request, next) {
/** @type {?} */
var resource = this.adalService.getOptions()['resource'] ||
this.adalService.getResourceForEndpoint(request.url);
if (!resource) {
return next.handle(request);
}
if (!this.adalService.isAuthenticated) {
throw new Error('Cannot send request to registered endpoint if the user is not authenticated.');
}
return this.adalService.acquireTokenResilient(resource).pipe(mergeMap(function (token) {
if (!token) {
return next.handle(request);
}
/** @type {?} */
var requestWithAuthorization = request.clone({
headers: request.headers.set('Authorization', 'Bearer ' + token)
});
return next.handle(requestWithAuthorization);
}));
};
BcAdalAngularInterceptor.decorators = [
{ type: Injectable }
];
BcAdalAngularInterceptor.ctorParameters = function () { return [
{ type: BcAdalAngularService }
]; };
return BcAdalAngularInterceptor;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var BcAdalAngularModule = /** @class */ (function () {
function BcAdalAngularModule() {
}
/**
* @param {?} options
* @return {?}
*/
BcAdalAngularModule.forRoot = /**
* @param {?} options
* @return {?}
*/
function (options) {
return {
ngModule: BcAdalAngularModule,
providers: [
BcAdalAngularService,
AdalAccessGuard,
{
provide: HTTP_INTERCEPTORS,
useClass: BcAdalAngularInterceptor,
multi: true
},
{ provide: ADAL_OPTIONS, useValue: options }
]
};
};
BcAdalAngularModule.decorators = [
{ type: NgModule, args: [{
imports: [CommonModule, HttpClientModule],
declarations: []
},] }
];
return BcAdalAngularModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
export { BcAdalAngularService, AdalAccessGuard, BcAdalAngularModule, ADAL_OPTIONS as ɵb, BcAdalAngularInterceptor as ɵc };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmMtYWRhbC1hbmd1bGFyLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9iYy1hZGFsLWFuZ3VsYXIvbGliL2NvbmZpZy9hZGFsLm9wdGlvbnMudHMiLCJuZzovL2JjLWFkYWwtYW5ndWxhci9saWIvc2VydmljZXMvYmMtYWRhbC1hbmd1bGFyLnNlcnZpY2UudHMiLCJuZzovL2JjLWFkYWwtYW5ndWxhci9saWIvZ3VhcmRzL2FkYWwtYWNjZXNzLmd1YXJkLnRzIiwibmc6Ly9iYy1hZGFsLWFuZ3VsYXIvbGliL3NlcnZpY2VzL2JjLWFkYWwtYW5ndWxhci5pbnRlcmNlcHRvci50cyIsIm5nOi8vYmMtYWRhbC1hbmd1bGFyL2xpYi9iYy1hZGFsLWFuZ3VsYXIubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIEF1dGhlbnRpY2F0aW9uQ29udGV4dCBmcm9tICdhZGFsLWFuZ3VsYXInO1xyXG5cclxuZXhwb3J0IHR5cGUgQWRhbE9wdGlvbnMgPSBBdXRoZW50aWNhdGlvbkNvbnRleHQuT3B0aW9ucztcclxuXHJcbmV4cG9ydCBjb25zdCBBREFMX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48QWRhbE9wdGlvbnM+KFxyXG4gICdiYy5hZGFsLmFuZ3VsYXIub3B0aW9ucydcclxuKTtcclxuIiwiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIEF1dGhlbnRpY2F0aW9uQ29udGV4dCBmcm9tICdhZGFsLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHJldHJ5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQURBTF9PUFRJT05TLCBBZGFsT3B0aW9ucyB9IGZyb20gJy4vLi4vY29uZmlnL2FkYWwub3B0aW9ucyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCY0FkYWxBbmd1bGFyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjb250ZXh0OiBBdXRoZW50aWNhdGlvbkNvbnRleHQ7XHJcbiAgcHJpdmF0ZSBvcHRpb25zOiBBZGFsT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChBREFMX09QVElPTlMpIHByaXZhdGUgYWRhbE9wdGlvbnM6IEFkYWxPcHRpb25zKSB7XHJcbiAgICB0aGlzLnNldE9wdGlvbnMoYWRhbE9wdGlvbnMpO1xyXG4gICAgdGhpcy5pbml0QXV0aGVudGljYXRpb25Db250ZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9naW4oKSB7XHJcbiAgICB0aGlzLmNvbnRleHQubG9naW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2dvdXQoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQubG9nT3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0T3B0aW9ucygpOiBBZGFsT3B0aW9ucyB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE9wdGlvbnMoYWRhbE9wdGlvbnM6IEFkYWxPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBhZGFsT3B0aW9ucztcclxuICB9XHJcblxyXG4gIGdldCBhdXRoQ29udGV4dCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVXaW5kb3dDYWxsYmFjaygpIHtcclxuICAgIHRoaXMuY29udGV4dC5oYW5kbGVXaW5kb3dDYWxsYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB1c2VySW5mbygpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHQuZ2V0Q2FjaGVkVXNlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY2Nlc3NUb2tlbigpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHQuZ2V0Q2FjaGVkVG9rZW4odGhpcy5vcHRpb25zLmNsaWVudElkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNBdXRoZW50aWNhdGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckluZm8gJiYgdGhpcy5hY2Nlc3NUb2tlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldFJlc291cmNlRm9yRW5kcG9pbnQodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0NhbGxiYWNrKGhhc2g6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5pc0NhbGxiYWNrKGhhc2gpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldExvZ2luRXJyb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldExvZ2luRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRBY2Nlc3NUb2tlbihcclxuICAgIGVuZHBvaW50OiBzdHJpbmcsXHJcbiAgICBjYWxsYmFja3M6IChtZXNzYWdlOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IGFueVxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5hY3F1aXJlVG9rZW4oZW5kcG9pbnQsIGNhbGxiYWNrcyk7XHJcbiAgfVxyXG5cclxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xyXG4gIHB1YmxpYyBhY3F1aXJlVG9rZW5SZXNpbGllbnQocmVzb3VyY2U6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8YW55Pigoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxhbnk+KSA9PlxyXG4gICAgICB0aGlzLmNvbnRleHQuYWNxdWlyZVRva2VuKHJlc291cmNlLCAobWVzc2FnZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodG9rZW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICkucGlwZShyZXRyeSgzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRBdXRoZW50aWNhdGlvbkNvbnRleHQoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBuZXcgQXV0aGVudGljYXRpb25Db250ZXh0KHRoaXMub3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gIENhbkFjdGl2YXRlLFxyXG4gIE5hdmlnYXRpb25FeHRyYXMsXHJcbiAgUm91dGVyLFxyXG4gIFJvdXRlclN0YXRlU25hcHNob3RcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBCY0FkYWxBbmd1bGFyU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvYmMtYWRhbC1hbmd1bGFyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQWRhbEFjY2Vzc0d1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWRhbFNlcnZpY2U6IEJjQWRhbEFuZ3VsYXJTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBjYW5BY3RpdmF0ZShcclxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gICAgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3RcclxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHtcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgcmVkaXJlY3RVcmw6IHJvdXRlLnVybCB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmFkYWxTZXJ2aWNlLnVzZXJJbmZvKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnYWNjZXNzZGVuaWVkJ10sIG5hdmlnYXRpb25FeHRyYXMpO1xyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuICBIdHRwRXZlbnQsXHJcbiAgSHR0cEhhbmRsZXIsXHJcbiAgSHR0cEludGVyY2VwdG9yLFxyXG4gIEh0dHBSZXF1ZXN0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcCc7XHJcblxyXG5pbXBvcnQgeyBCY0FkYWxBbmd1bGFyU2VydmljZSB9IGZyb20gJy4vYmMtYWRhbC1hbmd1bGFyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQmNBZGFsQW5ndWxhckludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFkYWxTZXJ2aWNlOiBCY0FkYWxBbmd1bGFyU2VydmljZSkge31cclxuXHJcbiAgaW50ZXJjZXB0KFxyXG4gICAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PixcclxuICAgIG5leHQ6IEh0dHBIYW5kbGVyXHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgY29uc3QgcmVzb3VyY2UgPVxyXG4gICAgICB0aGlzLmFkYWxTZXJ2aWNlLmdldE9wdGlvbnMoKVsncmVzb3VyY2UnXSB8fFxyXG4gICAgICB0aGlzLmFkYWxTZXJ2aWNlLmdldFJlc291cmNlRm9yRW5kcG9pbnQocmVxdWVzdC51cmwpO1xyXG5cclxuICAgIGlmICghcmVzb3VyY2UpIHtcclxuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5hZGFsU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdDYW5ub3Qgc2VuZCByZXF1ZXN0IHRvIHJlZ2lzdGVyZWQgZW5kcG9pbnQgaWYgdGhlIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFkYWxTZXJ2aWNlLmFjcXVpcmVUb2tlblJlc2lsaWVudChyZXNvdXJjZSkucGlwZShcclxuICAgICAgbWVyZ2VNYXAoKHRva2VuOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXRva2VuKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXF1ZXN0V2l0aEF1dGhvcml6YXRpb24gPSByZXF1ZXN0LmNsb25lKHtcclxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0b2tlbilcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3RXaXRoQXV0aG9yaXphdGlvbik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIVFRQX0lOVEVSQ0VQVE9SUywgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyL3NyYy9jb3JlJztcclxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IEFEQUxfT1BUSU9OUywgQWRhbE9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9hZGFsLm9wdGlvbnMnO1xyXG5pbXBvcnQgeyBBZGFsQWNjZXNzR3VhcmQgfSBmcm9tICcuL2d1YXJkcy9hZGFsLWFjY2Vzcy5ndWFyZCc7XHJcbmltcG9ydCB7IEJjQWRhbEFuZ3VsYXJJbnRlcmNlcHRvciB9IGZyb20gJy4vc2VydmljZXMvYmMtYWRhbC1hbmd1bGFyLmludGVyY2VwdG9yJztcclxuaW1wb3J0IHsgQmNBZGFsQW5ndWxhclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2JjLWFkYWwtYW5ndWxhci5zZXJ2aWNlJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSHR0cENsaWVudE1vZHVsZV0sXHJcbiAgZGVjbGFyYXRpb25zOiBbXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmNBZGFsQW5ndWxhck1vZHVsZSB7XHJcbiAgc3RhdGljIGZvclJvb3Qob3B0aW9uczogQWRhbE9wdGlvbnMpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBCY0FkYWxBbmd1bGFyTW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBCY0FkYWxBbmd1bGFyU2VydmljZSxcclxuICAgICAgICBBZGFsQWNjZXNzR3VhcmQsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXHJcbiAgICAgICAgICB1c2VDbGFzczogQmNBZGFsQW5ndWxhckludGVyY2VwdG9yLFxyXG4gICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgcHJvdmlkZTogQURBTF9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFLQSxJQUFhLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FDNUMseUJBQXlCLENBQzFCOzs7Ozs7QUNQRDtJQVlFLDhCQUEwQyxXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0tBQ2xDOzs7O0lBRU0sb0NBQUs7OztJQUFaO1FBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUN0Qjs7OztJQUVNLHFDQUFNOzs7SUFBYjtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDdkI7Ozs7SUFFTSx5Q0FBVTs7O0lBQWpCO1FBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0tBQ3JCOzs7OztJQUVNLHlDQUFVOzs7O0lBQWpCLFVBQWtCLFdBQXdCO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDO0tBQzVCO0lBRUQsc0JBQUksNkNBQVc7Ozs7UUFBZjtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNyQjs7O09BQUE7Ozs7SUFFRCxtREFBb0I7OztJQUFwQjtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztL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