@pepperi/lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.1.
109 lines • 18.3 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../../common/services/session.service";
export class AuthInterceptor {
// private SESSION_TOKEN_KEY = 'auth_token';
// private token = 'secrettoken';
// private refreshTokenInProgress = false;
// private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
constructor(sessionService) {
this.sessionService = sessionService;
this.AUTH_HEADER = 'Authorization';
this.PEPPERI_TOKEN_HEADER = 'PepperiSessionToken';
this.PEPPERI_CONSUMER_KEY_HEADER = 'X-Pepperi-ConsumerKey';
}
// Add authorization token if the token exist.
addAuthorizationToken(request) {
if (!request.headers.has(this.AUTH_HEADER)) {
const idpToken = this.sessionService.getIdpToken();
if (idpToken) {
request = request.clone({
headers: request.headers.set(this.AUTH_HEADER, `Bearer ${idpToken}`)
});
}
}
return request;
}
// Add pepperi consumer token if calling to papi domain.
addPepperiConsumerToken(request) {
if (!request.headers.has(this.PEPPERI_CONSUMER_KEY_HEADER)) {
const papiBaseUrl = this.sessionService.getPapiBaseUrl();
if (papiBaseUrl && request.url.match(new RegExp(papiBaseUrl, 'g'))) {
const pepperiConsumerToken = this.sessionService.getPepperiConsumerToken();
if (pepperiConsumerToken) {
request = request.clone({
headers: request.headers.set(this.PEPPERI_CONSUMER_KEY_HEADER, pepperiConsumerToken)
});
}
}
}
return request;
}
// Add web api token if calling to wapi domain.
addWebApiToken(request) {
if (!request.headers.has(this.PEPPERI_TOKEN_HEADER)) {
const wapiBaseUrl = this.sessionService.getWapiBaseUrl();
if (wapiBaseUrl && request.url.match(new RegExp(wapiBaseUrl, 'g'))) {
const webApiToken = this.sessionService.gettWapiToken();
if (webApiToken) {
request = request.clone({
headers: request.headers.set(this.PEPPERI_TOKEN_HEADER, webApiToken)
});
}
}
}
return request;
}
intercept(req, next) {
console.warn('AuthInterceptor');
// Add content type
if (!req.headers.has('Content-Type')) {
req = req.clone({
headers: req.headers.set('Content-Type', 'application/json')
});
}
req = this.addAuthorizationToken(req);
req = this.addPepperiConsumerToken(req);
req = this.addWebApiToken(req);
return next.handle(req);
// TODO: Check if we need this - this is an advance code that try to refresh the token in case of expired.
// return next.handle(req).pipe(
// catchError((error: HttpErrorResponse) => {
// if (error && error.status === 401) {
// // 401 errors are most likely going to be because we have an expired token that we need to refresh.
// if (this.refreshTokenInProgress) {
// // If refreshTokenInProgress is true, we will wait until refreshTokenSubject has a non-null value
// // which means the new token is ready and we can retry the request again
// return this.refreshTokenSubject.pipe(
// filter(result => result !== null),
// take(1),
// switchMap(() => next.handle(this.addAuthenticationToken(req)))
// );
// } else {
// this.refreshTokenInProgress = true;
// // Set the refreshTokenSubject to null so that subsequent API calls will
// // wait until the new token has been retrieved
// this.refreshTokenSubject.next(null);
// return this.refreshAccessToken().pipe(
// switchMap((success: boolean) => {
// this.refreshTokenSubject.next(success);
// return next.handle(this.addAuthenticationToken(req));
// }),
// // When the call to refreshToken completes we reset the refreshTokenInProgress to false
// // for the next time the token needs to be refreshed
// finalize(() => (this.refreshTokenInProgress = false))
// );
// }
// } else {
// return throwError(error);
// }
// })
// );
}
}
AuthInterceptor.ɵfac = function AuthInterceptor_Factory(t) { return new (t || AuthInterceptor)(i0.ɵɵinject(i1.SessionService)); };
AuthInterceptor.ɵprov = i0.ɵɵdefineInjectable({ token: AuthInterceptor, factory: AuthInterceptor.ɵfac });
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(AuthInterceptor, [{
type: Injectable
}], function () { return [{ type: i1.SessionService }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BlcHBlcmktbGliL3NyYy9jb3JlL2h0dHAvaW50ZXJjZXB0b3JzL2F1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBYTNDLE1BQU0sT0FBTyxlQUFlO0lBS3hCLDRDQUE0QztJQUM1QyxpQ0FBaUM7SUFDakMsMENBQTBDO0lBQzFDLHNGQUFzRjtJQUV0RixZQUFvQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFUMUMsZ0JBQVcsR0FBRyxlQUFlLENBQUM7UUFDOUIseUJBQW9CLEdBQUcscUJBQXFCLENBQUM7UUFDN0MsZ0NBQTJCLEdBQUcsdUJBQXVCLENBQUM7SUFPVCxDQUFDO0lBRXRELDhDQUE4QztJQUN0QyxxQkFBcUIsQ0FBQyxPQUF5QjtRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3BCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsUUFBUSxFQUFFLENBQUM7aUJBQ3ZFLENBQUMsQ0FBQzthQUNOO1NBQ0o7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsd0RBQXdEO0lBQ2hELHVCQUF1QixDQUFDLE9BQXlCO1FBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMkJB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bUI7UUFDbkIsd0NBQXdDO1FBQ3hDLFlBQVk7UUFDWixTQUFTO1FBQ1QsS0FBSztJQUNULENBQUM7OzhFQXBIUSxlQUFlO3VEQUFmLGVBQWUsV0FBZixlQUFlO2tEQUFmLGVBQWU7Y0FEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIEh0dHBFdmVudCxcclxuICAgIEh0dHBJbnRlcmNlcHRvcixcclxuICAgIEh0dHBIYW5kbGVyLFxyXG4gICAgSHR0cFJlcXVlc3QsXHJcbiAgICBIdHRwRXJyb3JSZXNwb25zZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgdGhyb3dFcnJvciwgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIGZpbmFsaXplLCB0YWtlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3Nlc3Npb24uc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgcHJpdmF0ZSBBVVRIX0hFQURFUiA9ICdBdXRob3JpemF0aW9uJztcclxuICAgIHByaXZhdGUgUEVQUEVSSV9UT0tFTl9IRUFERVIgPSAnUGVwcGVyaVNlc3Npb25Ub2tlbic7XHJcbiAgICBwcml2YXRlIFBFUFBFUklfQ09OU1VNRVJfS0VZX0hFQURFUiA9ICdYLVBlcHBlcmktQ29uc3VtZXJLZXknO1xyXG5cclxuICAgIC8vIHByaXZhdGUgU0VTU0lPTl9UT0tFTl9LRVkgPSAnYXV0aF90b2tlbic7XHJcbiAgICAvLyBwcml2YXRlIHRva2VuID0gJ3NlY3JldHRva2VuJztcclxuICAgIC8vIHByaXZhdGUgcmVmcmVzaFRva2VuSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgLy8gcHJpdmF0ZSByZWZyZXNoVG9rZW5TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZSkge31cclxuXHJcbiAgICAvLyBBZGQgYXV0aG9yaXphdGlvbiB0b2tlbiBpZiB0aGUgdG9rZW4gZXhpc3QuXHJcbiAgICBwcml2YXRlIGFkZEF1dGhvcml6YXRpb25Ub2tlbihyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlcXVlc3Q8YW55PiB7XHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuaGFzKHRoaXMuQVVUSF9IRUFERVIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkcFRva2VuID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRJZHBUb2tlbigpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlkcFRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLnNldCh0aGlzLkFVVEhfSEVBREVSLCBgQmVhcmVyICR7aWRwVG9rZW59YClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgcGVwcGVyaSBjb25zdW1lciB0b2tlbiBpZiBjYWxsaW5nIHRvIHBhcGkgZG9tYWluLlxyXG4gICAgcHJpdmF0ZSBhZGRQZXBwZXJpQ29uc3VtZXJUb2tlbihyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlcXVlc3Q8YW55PiB7XHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuaGFzKHRoaXMuUEVQUEVSSV9DT05TVU1FUl9LRVlfSEVBREVSKSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXBpQmFzZVVybCA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0UGFwaUJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYXBpQmFzZVVybCAmJiByZXF1ZXN0LnVybC5tYXRjaChuZXcgUmVnRXhwKHBhcGlCYXNlVXJsLCAnZycpKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGVwcGVyaUNvbnN1bWVyVG9rZW4gPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldFBlcHBlcmlDb25zdW1lclRva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGVwcGVyaUNvbnN1bWVyVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycy5zZXQodGhpcy5QRVBQRVJJX0NPTlNVTUVSX0tFWV9IRUFERVIsIHBlcHBlcmlDb25zdW1lclRva2VuKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgd2ViIGFwaSB0b2tlbiBpZiBjYWxsaW5nIHRvIHdhcGkgZG9tYWluLlxyXG4gICAgcHJpdmF0ZSBhZGRXZWJBcGlUb2tlbihyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlcXVlc3Q8YW55PiB7XHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuaGFzKHRoaXMuUEVQUEVSSV9UT0tFTl9IRUFERVIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhcGlCYXNlVXJsID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRXYXBpQmFzZVVybCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHdhcGlCYXNlVXJsICYmIHJlcXVlc3QudXJsLm1hdGNoKG5ldyBSZWdFeHAod2FwaUJhc2VVcmwsICdnJykpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJBcGlUb2tlbiA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0dFdhcGlUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHdlYkFwaVRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMuc2V0KHRoaXMuUEVQUEVSSV9UT0tFTl9IRUFERVIsIHdlYkFwaVRva2VuKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIH1cclxuXHJcbiAgICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0F1dGhJbnRlcmNlcHRvcicpO1xyXG5cclxuICAgICAgICAvLyBBZGQgY29udGVudCB0eXBlXHJcbiAgICAgICAgaWYgKCFyZXEuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpKSB7XHJcbiAgICAgICAgICAgIHJlcSA9IHJlcS5jbG9uZSh7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJylcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXEgPSB0aGlzLmFkZEF1dGhvcml6YXRpb25Ub2tlbihyZXEpO1xyXG5cclxuICAgICAgICByZXEgPSB0aGlzLmFkZFBlcHBlcmlDb25zdW1lclRva2VuKHJlcSk7XHJcblxyXG4gICAgICAgIHJlcSA9IHRoaXMuYWRkV2ViQXBpVG9rZW4ocmVxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIHdlIG5lZWQgdGhpcyAtIHRoaXMgaXMgYW4gYWR2YW5jZSBjb2RlIHRoYXQgdHJ5IHRvIHJlZnJlc2ggdGhlIHRva2VuIGluIGNhc2Ugb2YgZXhwaXJlZC5cclxuICAgICAgICAvLyByZXR1cm4gbmV4dC5oYW5kbGUocmVxKS5waXBlKFxyXG4gICAgICAgIC8vICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIC8vIDQwMSBlcnJvcnMgYXJlIG1vc3QgbGlrZWx5IGdvaW5nIHRvIGJlIGJlY2F1c2Ugd2UgaGF2ZSBhbiBleHBpcmVkIHRva2VuIHRoYXQgd2UgbmVlZCB0byByZWZyZXNoLlxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbkluUHJvZ3Jlc3MpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gSWYgcmVmcmVzaFRva2VuSW5Qcm9ncmVzcyBpcyB0cnVlLCB3ZSB3aWxsIHdhaXQgdW50aWwgcmVmcmVzaFRva2VuU3ViamVjdCBoYXMgYSBub24tbnVsbCB2YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyB3aGljaCBtZWFucyB0aGUgbmV3IHRva2VuIGlzIHJlYWR5IGFuZCB3ZSBjYW4gcmV0cnkgdGhlIHJlcXVlc3QgYWdhaW5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuU3ViamVjdC5waXBlKFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHJlc3VsdCA9PiByZXN1bHQgIT09IG51bGwpLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiBuZXh0LmhhbmRsZSh0aGlzLmFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxKSkpXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5JblByb2dyZXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVmcmVzaFRva2VuU3ViamVjdCB0byBudWxsIHNvIHRoYXQgc3Vic2VxdWVudCBBUEkgY2FsbHMgd2lsbFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXcgdG9rZW4gaGFzIGJlZW4gcmV0cmlldmVkXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkucGlwZShcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc3VjY2VzczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KHN1Y2Nlc3MpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZSh0aGlzLmFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxKSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNhbGwgdG8gcmVmcmVzaFRva2VuIGNvbXBsZXRlcyB3ZSByZXNldCB0aGUgcmVmcmVzaFRva2VuSW5Qcm9ncmVzcyB0byBmYWxzZVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBuZXh0IHRpbWUgdGhlIHRva2VuIG5lZWRzIHRvIGJlIHJlZnJlc2hlZFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMucmVmcmVzaFRva2VuSW5Qcm9ncmVzcyA9IGZhbHNlKSlcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfSlcclxuICAgICAgICAvLyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgcmVmcmVzaEFjY2Vzc1Rva2VuKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyAgICAgcmV0dXJuIG9mKCdzZWNyZXQgdG9rZW4nKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIGFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBSZXF1ZXN0PGFueT4ge1xyXG4gICAgLy8gICAgIC8vIElmIHdlIGRvIG5vdCBoYXZlIGEgdG9rZW4geWV0IHRoZW4gd2Ugc2hvdWxkIG5vdCBzZXQgdGhlIGhlYWRlci5cclxuICAgIC8vICAgICAvLyBIZXJlIHdlIGNvdWxkIGZpcnN0IHJldHJpZXZlIHRoZSB0b2tlbiBmcm9tIHdoZXJlIHdlIHN0b3JlIGl0LlxyXG4gICAgLy8gICAgIGlmICghdGhpcy50b2tlbikge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgLy8gSWYgeW91IGFyZSBjYWxsaW5nIGFuIG91dHNpZGUgZG9tYWluIHRoZW4gZG8gbm90IGFkZCB0aGUgdG9rZW4uXHJcbiAgICAvLyAgICAgaWYgKCFyZXF1ZXN0LnVybC5tYXRjaCgvd3d3Lm15ZG9tYWluLmNvbVxcLy8pKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAvLyAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycy5zZXQodGhpcy5BVVRIX0hFQURFUiwgYEJlYXJlciAke3RoaXMudG9rZW59YClcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxufSJdfQ==