UNPKG

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
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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