@progress-chef/platform-http-interceptor 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { HttpEventType } from '@angular/common/http';
2
2
  import { Injectable } from '@angular/core';
3
3
  import { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';
4
- import { catchError, tap, throwError } from 'rxjs';
4
+ import { catchError, finalize, tap, throwError, Subject, switchMap } from "rxjs";
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/router";
7
7
  import * as i2 from "@progress-chef/toast-notification";
@@ -11,8 +11,48 @@ export class HttpAuthInterceptor {
11
11
  this.toastNotificationService = toastNotificationService;
12
12
  this.authTokenSet = new Set();
13
13
  this.isSessionExpired = false;
14
+ this.requestQueue = [];
14
15
  }
15
16
  intercept(request, next) {
17
+ if (!this.isTokenRefreshInProgress()) {
18
+ return this.processHttpHandle(request, next);
19
+ }
20
+ else {
21
+ this.startStorageListenerTimer();
22
+ return this.createQueueRequest(request).pipe(switchMap((req) => {
23
+ return this.processHttpHandle(req, next);
24
+ }));
25
+ }
26
+ }
27
+ isTokenRefreshInProgress() {
28
+ return LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH)?.active;
29
+ }
30
+ processQueue() {
31
+ const nextRequest = this.requestQueue.shift();
32
+ if (nextRequest) {
33
+ nextRequest.notifier.next(nextRequest.req);
34
+ }
35
+ }
36
+ createQueueRequest(request) {
37
+ const requestObj = {};
38
+ requestObj.req = request;
39
+ requestObj.notifier = new Subject();
40
+ this.requestQueue.push(requestObj);
41
+ return requestObj.notifier.asObservable();
42
+ }
43
+ startStorageListenerTimer() {
44
+ if (this.storageListenerTimer) {
45
+ clearInterval(this.storageListenerTimer);
46
+ }
47
+ this.storageListenerTimer = setInterval(() => {
48
+ if (LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH) &&
49
+ LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH).active === false) {
50
+ clearInterval(this.storageListenerTimer);
51
+ this.processQueue();
52
+ }
53
+ }, 200);
54
+ }
55
+ processHttpHandle(request, next) {
16
56
  let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);
17
57
  let authReq = request;
18
58
  if (authToken) {
@@ -88,36 +128,16 @@ export class HttpAuthInterceptor {
88
128
  LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);
89
129
  LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);
90
130
  LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);
91
- this.router.navigate(['/login']).then((navigated) => {
92
- if (navigated) {
93
- try {
94
- for (let err of error?.error?.errors) {
95
- let message = '';
96
- if (err?.message.toLowerCase() === 'invalid credentials') {
97
- message = 'Invalid username or password.';
98
- }
99
- else if (err?.message.includes('expired')) {
100
- message = 'Your session has expired. Please login again.';
101
- }
102
- this.toastNotificationService.showToastNotification({
103
- content: message || err?.message || `Unauthorized`,
104
- type: { style: 'error', icon: true },
105
- closable: true,
106
- action: {}
107
- });
108
- }
109
- }
110
- catch (e) {
111
- console.log("HttpAuthInterceptor: Exception occurred at 401", e);
112
- this.toastNotificationService.showToastNotification({
113
- content: `Something went wrong. Please try again.`,
114
- type: { style: 'error', icon: true },
115
- closable: true,
116
- action: {}
117
- });
131
+ if (this.router.url.startsWith('/login/user-login')) {
132
+ this.handleUnauthorizedError(error);
133
+ }
134
+ else {
135
+ this.router.navigate(['/login']).then((navigated) => {
136
+ if (navigated) {
137
+ this.handleUnauthorizedError(error);
118
138
  }
119
- }
120
- });
139
+ });
140
+ }
121
141
  break;
122
142
  case 402:
123
143
  if (loginType === 'saml' || loginType === 'oauth') {
@@ -231,8 +251,40 @@ export class HttpAuthInterceptor {
231
251
  break;
232
252
  }
233
253
  return throwError(() => error);
254
+ }), finalize(() => {
255
+ if (!this.isTokenRefreshInProgress()) {
256
+ this.processQueue(); // Process next request in the queue
257
+ }
234
258
  }));
235
259
  }
260
+ handleUnauthorizedError(error) {
261
+ try {
262
+ for (let err of error?.error?.errors) {
263
+ let message = '';
264
+ if (err?.message.toLowerCase() === 'invalid credentials') {
265
+ message = 'Invalid username or password.';
266
+ }
267
+ else if (err?.message.includes('expired')) {
268
+ message = 'Your session has expired. Please login again.';
269
+ }
270
+ this.toastNotificationService.showToastNotification({
271
+ content: message || err?.message || `Unauthorized`,
272
+ type: { style: 'error', icon: true },
273
+ closable: true,
274
+ action: {}
275
+ });
276
+ }
277
+ }
278
+ catch (e) {
279
+ console.log("HttpAuthInterceptor: Exception occurred at 401", e);
280
+ this.toastNotificationService.showToastNotification({
281
+ content: `Something went wrong. Please try again.`,
282
+ type: { style: 'error', icon: true },
283
+ closable: true,
284
+ action: {}
285
+ });
286
+ }
287
+ }
236
288
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, deps: [{ token: i1.Router }, { token: i2.ToastNotificationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
237
289
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, providedIn: 'root' }); }
238
290
  }
@@ -242,4 +294,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
242
294
  providedIn: 'root'
243
295
  }]
244
296
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.ToastNotificationService }]; } });
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hdXRoLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGxhdGZvcm0taHR0cC1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ3lCLGFBQWEsRUFDNUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzRixPQUFPLEVBQWMsVUFBVSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFNL0QsTUFBTSxPQUFPLG1CQUFtQjtJQUc5QixZQUNVLE1BQWMsRUFDTCx3QkFBa0Q7UUFEM0QsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNMLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFKckUsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQUlyQixDQUFDO0lBRUwsU0FBUyxDQUFDLE9BQTZCLEVBQUUsSUFBaUI7UUFDeEQsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdEIsSUFBSSxTQUFTLEVBQUU7WUFDYixPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDdEIsVUFBVSxFQUFFO29CQUNWLGFBQWEsRUFBRSxVQUFVLFNBQVMsRUFBRTtpQkFDckM7YUFDRixDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JDLElBQUksQ0FB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QU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQXJPVSxtQkFBbUI7bUhBQW5CLG1CQUFtQixjQUhsQixNQUFNOzs0RkFHUCxtQkFBbUI7a0JBSi9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UsIFN0b3JhZ2VLZXlzIH0gZnJvbSAnQHByb2dyZXNzLWNoZWYvcGxhdGZvcm0tc3RvcmFnZS1zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0Tm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy1jaGVmL3RvYXN0LW5vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCB0YXAsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5cbmV4cG9ydCBjbGFzcyBIdHRwQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgYXV0aFRva2VuU2V0ID0gbmV3IFNldCgpO1xuICBpc1Nlc3Npb25FeHBpcmVkID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdE5vdGlmaWNhdGlvblNlcnZpY2U6IFRvYXN0Tm90aWZpY2F0aW9uU2VydmljZVxuICApIHsgfVxuXG4gIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICAgIGxldCBhdXRoVG9rZW4gPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuQVVUSF9UT0tFTik7XG4gICAgbGV0IGF1dGhSZXEgPSByZXF1ZXN0O1xuICAgIGlmIChhdXRoVG9rZW4pIHtcbiAgICAgIGF1dGhSZXEgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgc2V0SGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW59YFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKCF0aGlzLmF1dGhUb2tlblNldC5oYXMoYXV0aFRva2VuKSkge1xuICAgICAgICB0aGlzLmlzU2Vzc2lvbkV4cGlyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXV0aFRva2VuU2V0LmFkZChhdXRoVG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoYXV0aFJlcSkucGlwZShcbiAgICAgIHRhcCgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UpIHtcbiAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSAyMDI6XG4gICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgY29udGVudDogZXZlbnQ/LmJvZHk/Lml0ZW0/Lm1lc3NhZ2UgfHwgYFJlcXVlc3QgdW5kZXIgcHJvY2Vzc2luZ2AsXG4gICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2luZm8nLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDIwNzpcbiAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgY29udGVudDogJ1JlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwnLFxuICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblN0eWxlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGV2ZW50LmJvZHk/Lml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBlcnIgb2YgaXRlbT8udXNlclJvbGVNYXBwaW5nKSB7IC8qIEN1cnJlbnRseSAyMDcgaXMgaGFuZGxlZCBvbmx5IGZvciBzaW5nbGUgdXNlIGNhc2UsIHNvIGl0IGlzIGhhcmRjb2RlZC5JZiB0aGVyZSBhcmUgbW9yZSB1c2UgY2FzZXMsIHRoZW4gdGhpcyBzaG91bGQgYmUgdXBkYXRlZCBhY2NvcmRpbmdseS4gICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ1VzZXIgbm90IGFsbG93ZWQgZm9yIHRoaXMgb3BlcmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblN0eWxlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UuY29udGVudCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6IG1lc3NhZ2Uubm90aWZpY2F0aW9uU3R5bGUsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiBtZXNzYWdlLmNsb3NhYmxlLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFeGNlcHRpb24gb2NjdXJyZWQgYXQgSHR0cEF1dGhJbnRlcmNlcHRvciAyMDcgbm90aWZpY2F0aW9uXCIsIGUpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBgVGhlIHJlcXVlc3QgaGFzIGJlZW4gYWNjZXB0ZWQgZm9yIHByb2Nlc3NpbmcsIGJ1dCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29tcGxldGVkLmAsXG4gICAgICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnaW5mbycsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgbG9naW5UeXBlID0gTG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKFN0b3JhZ2VLZXlzLkxPR0lOX1RZUEUpO1xuXG4gICAgICAgIHN3aXRjaCAoZXJyb3Iuc3RhdHVzKSB7XG4gICAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgICBpZiAobG9naW5UeXBlID09PSAnc2FtbCcgfHwgbG9naW5UeXBlID09PSAnb2F1dGgnKSB7XG4gICAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5VU0VSX05BTUUpO1xuICAgICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuSVNfUkVNRU1CRVJfTUUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfT1JHX0FORF9ST0xFX1NFVCwgZmFsc2UpO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfQVVUSEVOVElDQVRFRCwgZmFsc2UpO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLkFVVEhfVE9LRU4pO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLkxPR0lOX1RZUEUpO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLklERU5USVRZX1RPS0VOKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5VU0VSX09SR19BTkRfUk9MRV9UT0tFTik7XG5cbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2xvZ2luJ10pLnRoZW4oKG5hdmlnYXRlZCkgPT4ge1xuICAgICAgICAgICAgICBpZiAobmF2aWdhdGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGVyciBvZiBlcnJvcj8uZXJyb3I/LmVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyPy5tZXNzYWdlLnRvTG93ZXJDYXNlKCkgPT09ICdpbnZhbGlkIGNyZWRlbnRpYWxzJykge1xuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC4nO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycj8ubWVzc2FnZS5pbmNsdWRlcygnZXhwaXJlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdZb3VyIHNlc3Npb24gaGFzIGV4cGlyZWQuIFBsZWFzZSBsb2dpbiBhZ2Fpbi4nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogbWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgYFVuYXV0aG9yaXplZGAsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJIdHRwQXV0aEludGVyY2VwdG9yOiBFeGNlcHRpb24gb2NjdXJyZWQgYXQgNDAxXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogYFNvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDAyOlxuICAgICAgICAgICAgaWYgKGxvZ2luVHlwZSA9PT0gJ3NhbWwnIHx8IGxvZ2luVHlwZSA9PT0gJ29hdXRoJykge1xuICAgICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVVNFUl9OQU1FKTtcbiAgICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLklTX1JFTUVNQkVSX01FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5JU19VU0VSX09SR19BTkRfUk9MRV9TRVQsIGZhbHNlKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbShTdG9yYWdlS2V5cy5JU19VU0VSX0FVVEhFTlRJQ0FURUQsIGZhbHNlKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5BVVRIX1RPS0VOKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5MT0dJTl9UWVBFKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5JREVOVElUWV9UT0tFTik7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuVVNFUl9PUkdfQU5EX1JPTEVfVE9LRU4pO1xuXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9sb2dpbiddKS50aGVuKChuYXZpZ2F0ZWQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG5hdmlnYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBgTGljZW5zZSBleHBpcmVkLCBwbGVhc2UgY29udGFjdCB5b3VyIHN1cHBvcnQgcmVwcmVzZW50YXRpdmUuYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBlcnIgb2YgZXJyb3IuZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGVycj8ucmVhc29uIHx8IGBGb3JiaWRkZW4gdG8gYWNjZXNzIHRoaXMgcmVzb3VyY2UuIEFjY2VzcyBkZW5pZWQuYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSHR0cEF1dGhJbnRlcmNlcHRvcjogRXhjZXB0aW9uIG9jY3VycmVkIGF0IDQwM1wiLCBlKTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBgRm9yYmlkZGVuIHRvIGFjY2VzcyB0aGlzIHJlc291cmNlLiBBY2Nlc3MgZGVuaWVkLmAsXG4gICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQwNTpcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGVyciBvZiBlcnJvci5lcnJvci5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICAgICAgY29udGVudDogZXJyPy5yZWFzb24gfHwgYEhUVFAgbWV0aG9kIG5vdCBhbGxvd2VkLmAsXG4gICAgICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkh0dHBBdXRoSW50ZXJjZXB0b3I6IEV4Y2VwdGlvbiBvY2N1cnJlZCBhdCA0MDVcIiwgZSk7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgY29udGVudDogYEhUVFAgbWV0aG9kIG5vdCBhbGxvd2VkLmAsXG4gICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGVyciBvZiBlcnJvcj8uZXJyb3I/LmVycm9ycykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBlcnI/Lm1lc3NhZ2UgfHwgYFNvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkh0dHBBdXRoSW50ZXJjZXB0b3I6IEV4Y2VwdGlvbiBvY2N1cnJlZCBhdCA1MDBcIiwgZSk7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgY29udGVudDogYFNvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDUwMjpcbiAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGBCYWQgR2F0ZXdheS4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTAzOlxuICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgY29udGVudDogYFNlcnZpY2UgVW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4uYCxcbiAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSA1MDQ6XG4gICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICBjb250ZW50OiBgVW5hYmxlIHRvIHJlYWNoIHNlcnZlci4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpXG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hdXRoLmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGxhdGZvcm0taHR0cC1pbnRlcmNlcHRvci9zcmMvbGliL2h0dHAtYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ3lCLGFBQWEsRUFDNUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzRixPQUFPLEVBQWMsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7O0FBTzNHLE1BQU0sT0FBTyxtQkFBbUI7SUFNOUIsWUFDVSxNQUFjLEVBQ0wsd0JBQWtEO1FBRDNELFdBQU0sR0FBTixNQUFNLENBQVE7UUFDTCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBUHJFLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN6QixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsaUJBQVksR0FBb0IsRUFBRSxDQUFDO0lBTS9CLENBQUM7SUFFTCxTQUFTLENBQ1AsT0FBNkIsRUFDN0IsSUFBaUI7UUFFakIsSUFBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QzthQUFLO1lBQ0osSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUMxQyxTQUFTLENBQUMsQ0FBQyxHQUFxQixFQUFFLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUNoQyxXQUFXLENBQUMsYUFBYSxDQUMxQixFQUFFLE1BQU0sQ0FBQztJQUNaLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QyxJQUFJLFdBQVcsRUFBRTtZQUNmLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxPQUE2QjtRQUM5QyxNQUFNLFVBQVUsR0FBaUIsRUFBbUIsQ0FBQztRQUNyRCxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUN6QixVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFvQixDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLElBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzVCLGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzNDLElBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7Z0JBQ3JELG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDM0UsYUFBYSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDckI7UUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsaUJBQWlCLENBQUMsT0FBNkIsRUFBRSxJQUFnQjtRQUMvRCxJQUFJLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN0QixJQUFJLFNBQVMsRUFBRTtZQUNiLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN0QixVQUFVLEVBQUU7b0JBQ1YsYUFBYSxFQUFFLFVBQVUsU0FBUyxFQUFFO2lCQUNyQzthQUNGLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzthQUMvQjtZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDOUIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLFFBQVEsRUFBRTtnQkFDekMsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUNwQixLQUFLLEdBQUc7d0JBQ04sSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDOzRCQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLDBCQUEwQjs0QkFDakUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFOzRCQUNuQyxRQUFRLEVBQUUsSUFBSTs0QkFDZCxNQUFNLEVBQUUsRUFBRTt5QkFDWCxDQUFDLENBQUM7d0JBQ0gsTUFBTTtvQkFDUixLQUFLLEdBQUc7d0JBQ04sSUFBSSxPQUFPLEdBQUc7NEJBQ1osT0FBTyxFQUFFLHdCQUF3Qjs0QkFDakMsaUJBQWlCLEVBQUUsU0FBUzs0QkFDNUIsUUFBUSxFQUFFLEtBQUs7eUJBQ2hCLENBQUE7d0JBQ0QsSUFBSTs0QkFDRixLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dDQUNsQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxrSkFBa0o7b0NBQ3pMLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7d0NBQ3RCLE9BQU8sR0FBRzs0Q0FDUixPQUFPLEVBQUUscUNBQXFDOzRDQUM5QyxpQkFBaUIsRUFBRSxPQUFPOzRDQUMxQixRQUFRLEVBQUUsSUFBSTt5Q0FDZixDQUFBO3FDQUNGO2lDQUNGOzZCQUNGOzRCQUNELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQztnQ0FDbEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dDQUN4QixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7Z0NBQ3RELFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQ0FDMUIsTUFBTSxFQUFFLEVBQUU7NkJBQ1gsQ0FBQyxDQUFDO3lCQUNKO3dCQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsNERBQTRELEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzdFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQztnQ0FDbEQsT0FBTyxFQUFFLGlGQUFpRjtnQ0FDMUYsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO2dDQUNuQyxRQUFRLEVBQUUsSUFBSTtnQ0FDZCxNQUFNLEVBQUUsRUFBRTs2QkFDWCxDQUFDLENBQUM7eUJBQ0o7d0JBQ0QsTUFBTTtpQkFDVDthQUNGO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBd0IsRUFBRSxFQUFFO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFdEUsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNwQixLQUFLLEdBQUc7b0JBQ04sSUFBSSxTQUFTLEtBQUssTUFBTSxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7d0JBQ2pELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ3RELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7cUJBQzVEO29CQUNELG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3pFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3RFLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3ZELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3ZELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzNELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFFcEUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsRUFBRTt3QkFDbkQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNyQzt5QkFBTTt3QkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7NEJBQ2xELElBQUksU0FBUyxFQUFFO2dDQUNiLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDckM7d0JBQ0gsQ0FBQyxDQUFDLENBQUE7cUJBQ0g7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sSUFBSSxTQUFTLEtBQUssTUFBTSxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7d0JBQ2pELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ3RELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7cUJBQzVEO29CQUNELG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3pFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3RFLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3ZELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3ZELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzNELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQztvQkFFcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO3dCQUNsRCxJQUFJLFNBQVMsRUFBRTs0QkFDYixJQUFJLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUM7Z0NBQ2xELE9BQU8sRUFBRSw4REFBOEQ7Z0NBQ3ZFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtnQ0FDcEMsUUFBUSxFQUFFLElBQUk7Z0NBQ2QsTUFBTSxFQUFFLEVBQUU7NkJBQ1gsQ0FBQyxDQUFDO3lCQUNKO29CQUNILENBQUMsQ0FBQyxDQUFBO29CQUNGLE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLElBQUk7d0JBQ0YsS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTs0QkFDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDO2dDQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sSUFBSSxtREFBbUQ7Z0NBQzNFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtnQ0FDcEMsUUFBUSxFQUFFLElBQUk7Z0NBQ2QsTUFBTSxFQUFFLEVBQUU7NkJBQ1gsQ0FBQyxDQUFDO3lCQUNKO3FCQUNGO29CQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQzs0QkFDbEQsT0FBTyxFQUFFLG1EQUFtRDs0QkFDNUQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFOzRCQUNwQyxRQUFRLEVBQUUsSUFBSTs0QkFDZCxNQUFNLEVBQUUsRUFBRTt5QkFDWCxDQUFDLENBQUM7cUJBQ0o7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sSUFBSTt3QkFDRixLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFOzRCQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUM7Z0NBQ2xELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLDBCQUEwQjtnQ0FDbEQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO2dDQUNwQyxRQUFRLEVBQUUsSUFBSTtnQ0FDZCxNQUFNLEVBQUUsRUFBRTs2QkFDWCxDQUFDLENBQUM7eUJBQ0o7cUJBQ0Y7b0JBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDakUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDOzRCQUNsRCxPQUFPLEVBQUUsMEJBQTBCOzRCQUNuQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7NEJBQ3BDLFFBQVEsRUFBRSxJQUFJOzRCQUNkLE1BQU0sRUFBRSxFQUFFO3lCQUNYLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixJQUFJO3dCQUNGLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7NEJBQ3BDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQztnQ0FDbEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLElBQUkseUNBQXlDO2dDQUNsRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7Z0NBQ3BDLFFBQVEsRUFBRSxJQUFJO2dDQUNkLE1BQU0sRUFBRSxFQUFFOzZCQUNYLENBQUMsQ0FBQzt5QkFDSjtxQkFDRjtvQkFBQyxPQUFPLENBQUMsRUFBRTt3QkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNqRSxJQUFJLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUM7NEJBQ2xELE9BQU8sRUFBRSx5Q0FBeUM7NEJBQ2xELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTs0QkFDcEMsUUFBUSxFQUFFLElBQUk7NEJBQ2QsTUFBTSxFQUFFLEVBQUU7eUJBQ1gsQ0FBQyxDQUFDO3FCQUNKO29CQUNELE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQzt3QkFDbEQsT0FBTyxFQUFFLGdDQUFnQzt3QkFDekMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO3dCQUNwQyxRQUFRLEVBQUUsSUFBSTt3QkFDZCxNQUFNLEVBQUUsRUFBRTtxQkFDWCxDQUFDLENBQUM7b0JBQ0gsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDO3dCQUNsRCxPQUFPLEVBQUUsd0NBQXdDO3dCQUNqRCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7d0JBQ3BDLFFBQVEsRUFBRSxJQUFJO3dCQUNkLE1BQU0sRUFBRSxFQUFFO3FCQUNYLENBQUMsQ0FBQztvQkFDSCxNQUFNO2dCQUNSLEtBQUssQ0FBQyxDQUFDO2dCQUNQLEtBQUssR0FBRztvQkFDTixJQUFJLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUM7d0JBQ2xELE9BQU8sRUFBRSwyQ0FBMkM7d0JBQ3BELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTt3QkFDcEMsUUFBUSxFQUFFLElBQUk7d0JBQ2QsTUFBTSxFQUFFLEVBQUU7cUJBQ1gsQ0FBQyxDQUFDO29CQUNILE1BQU07YUFFVDtZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFFLG9DQUFvQzthQUMzRDtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsdUJBQXVCLENBQUMsS0FBd0I7UUFDOUMsSUFBSTtZQUNGLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7Z0JBQ3BDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxHQUFHLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLHFCQUFxQixFQUFFO29CQUN4RCxPQUFPLEdBQUcsK0JBQStCLENBQUM7aUJBQzNDO3FCQUFNLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQzNDLE9BQU8sR0FBRywrQ0FBK0MsQ0FBQztpQkFDM0Q7Z0JBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDO29CQUNsRCxPQUFPLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksY0FBYztvQkFDbEQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO29CQUNwQyxRQUFRLEVBQUUsSUFBSTtvQkFDZCxNQUFNLEVBQUUsRUFBRTtpQkFDWCxDQUFDLENBQUM7YUFDSjtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDbEQsT0FBTyxFQUFFLHlDQUF5QztnQkFDbEQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO2dCQUNwQyxRQUFRLEVBQUUsSUFBSTtnQkFDZCxNQUFNLEVBQUUsRUFBRTthQUNYLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzsrR0F2U1UsbUJBQW1CO21IQUFuQixtQkFBbUIsY0FIbEIsTUFBTTs7NEZBR1AsbUJBQW1CO2tCQUovQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlLCBTdG9yYWdlS2V5cyB9IGZyb20gJ0Bwcm9ncmVzcy1jaGVmL3BsYXRmb3JtLXN0b3JhZ2Utc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAcHJvZ3Jlc3MtY2hlZi90b2FzdC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgZmluYWxpemUsIHRhcCwgdGhyb3dFcnJvciwgU3ViamVjdCwgc3dpdGNoTWFwLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuXG5leHBvcnQgY2xhc3MgSHR0cEF1dGhJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gIGF1dGhUb2tlblNldCA9IG5ldyBTZXQoKTtcbiAgaXNTZXNzaW9uRXhwaXJlZCA9IGZhbHNlO1xuICByZXF1ZXN0UXVldWU6IFF1ZXVlZFJlcXVlc3RbXSA9IFtdO1xuICBzdG9yYWdlTGlzdGVuZXJUaW1lcjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdE5vdGlmaWNhdGlvblNlcnZpY2U6IFRvYXN0Tm90aWZpY2F0aW9uU2VydmljZVxuICApIHsgfVxuXG4gIGludGVyY2VwdChcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPixcbiAgICBuZXh0OiBIdHRwSGFuZGxlclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICAgIGlmKCF0aGlzLmlzVG9rZW5SZWZyZXNoSW5Qcm9ncmVzcygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHR0cEhhbmRsZShyZXF1ZXN0LCBuZXh0KTtcbiAgICB9ZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0U3RvcmFnZUxpc3RlbmVyVGltZXIoKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXVlUmVxdWVzdChyZXF1ZXN0KS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlcTogSHR0cFJlcXVlc3Q8YW55PikgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdHRwSGFuZGxlKHJlcSwgbmV4dCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBcbiAgaXNUb2tlblJlZnJlc2hJblByb2dyZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oXG4gICAgICBTdG9yYWdlS2V5cy5UT0tFTl9SRUZSRVNIXG4gICAgKT8uYWN0aXZlO1xuICB9XG5cbiAgcHJvY2Vzc1F1ZXVlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0UXVldWUuc2hpZnQoKTtcbiAgICBpZiAobmV4dFJlcXVlc3QpIHtcbiAgICAgIG5leHRSZXF1ZXN0Lm5vdGlmaWVyLm5leHQobmV4dFJlcXVlc3QucmVxKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVRdWV1ZVJlcXVlc3QocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHJlcXVlc3RPYmo6UXVldWVkUmVxdWVzdCA9IHt9IGFzIFF1ZXVlZFJlcXVlc3Q7XG4gICAgcmVxdWVzdE9iai5yZXEgPSByZXF1ZXN0O1xuICAgIHJlcXVlc3RPYmoubm90aWZpZXIgPSBuZXcgU3ViamVjdDxIdHRwUmVxdWVzdDxhbnk+PigpO1xuICAgIHRoaXMucmVxdWVzdFF1ZXVlLnB1c2gocmVxdWVzdE9iaik7XG4gICAgcmV0dXJuIHJlcXVlc3RPYmoubm90aWZpZXIuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgXG4gIHN0YXJ0U3RvcmFnZUxpc3RlbmVyVGltZXIoKTogdm9pZCB7XG4gICAgaWYodGhpcy5zdG9yYWdlTGlzdGVuZXJUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0b3JhZ2VMaXN0ZW5lclRpbWVyKTtcbiAgICB9XG4gICAgdGhpcy5zdG9yYWdlTGlzdGVuZXJUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmKExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5UT0tFTl9SRUZSRVNIKSAmJiBcbiAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuVE9LRU5fUkVGUkVTSCkuYWN0aXZlID09PSBmYWxzZSkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc3RvcmFnZUxpc3RlbmVyVGltZXIpO1xuICAgICAgICB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcm9jZXNzSHR0cEhhbmRsZShyZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPiwgbmV4dDpIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiB7XG4gICAgbGV0IGF1dGhUb2tlbiA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbShTdG9yYWdlS2V5cy5BVVRIX1RPS0VOKTtcbiAgICBsZXQgYXV0aFJlcSA9IHJlcXVlc3Q7XG4gICAgaWYgKGF1dGhUb2tlbikge1xuICAgICAgYXV0aFJlcSA9IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGhUb2tlbn1gXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAoIXRoaXMuYXV0aFRva2VuU2V0LmhhcyhhdXRoVG9rZW4pKSB7XG4gICAgICAgIHRoaXMuaXNTZXNzaW9uRXhwaXJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5hdXRoVG9rZW5TZXQuYWRkKGF1dGhUb2tlbik7XG4gICAgfVxuICAgIHJldHVybiBuZXh0LmhhbmRsZShhdXRoUmVxKS5waXBlKFxuICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkge1xuICAgICAgICAgIHN3aXRjaCAoZXZlbnQuc3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlIDIwMjpcbiAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBldmVudD8uYm9keT8uaXRlbT8ubWVzc2FnZSB8fCBgUmVxdWVzdCB1bmRlciBwcm9jZXNzaW5nYCxcbiAgICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnaW5mbycsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjA3OlxuICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiAnUmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCcsXG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU3R5bGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICBjbG9zYWJsZTogZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgZXZlbnQuYm9keT8uaXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGVyciBvZiBpdGVtPy51c2VyUm9sZU1hcHBpbmcpIHsgLyogQ3VycmVudGx5IDIwNyBpcyBoYW5kbGVkIG9ubHkgZm9yIHNpbmdsZSB1c2UgY2FzZSwgc28gaXQgaXMgaGFyZGNvZGVkLklmIHRoZXJlIGFyZSBtb3JlIHVzZSBjYXNlcywgdGhlbiB0aGlzIHNob3VsZCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LiAgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAnVXNlciBub3QgYWxsb3dlZCBmb3IgdGhpcyBvcGVyYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uU3R5bGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICAgICAgY29udGVudDogbWVzc2FnZS5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogbWVzc2FnZS5ub3RpZmljYXRpb25TdHlsZSwgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IG1lc3NhZ2UuY2xvc2FibGUsXG4gICAgICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBvY2N1cnJlZCBhdCBIdHRwQXV0aEludGVyY2VwdG9yIDIwNyBub3RpZmljYXRpb25cIiwgZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGBUaGUgcmVxdWVzdCBoYXMgYmVlbiBhY2NlcHRlZCBmb3IgcHJvY2Vzc2luZywgYnV0IGhhcyBiZWVuIHBhcnRpYWxseSBjb21wbGV0ZWQuYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdpbmZvJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBsb2dpblR5cGUgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW0oU3RvcmFnZUtleXMuTE9HSU5fVFlQRSk7XG5cbiAgICAgICAgc3dpdGNoIChlcnJvci5zdGF0dXMpIHtcbiAgICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgIGlmIChsb2dpblR5cGUgPT09ICdzYW1sJyB8fCBsb2dpblR5cGUgPT09ICdvYXV0aCcpIHtcbiAgICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlVTRVJfTkFNRSk7XG4gICAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5JU19SRU1FTUJFUl9NRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oU3RvcmFnZUtleXMuSVNfVVNFUl9PUkdfQU5EX1JPTEVfU0VULCBmYWxzZSk7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oU3RvcmFnZUtleXMuSVNfVVNFUl9BVVRIRU5USUNBVEVELCBmYWxzZSk7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuQVVUSF9UT0tFTik7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuTE9HSU5fVFlQRSk7XG4gICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuSURFTlRJVFlfVE9LRU4pO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLlVTRVJfT1JHX0FORF9ST0xFX1RPS0VOKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucm91dGVyLnVybC5zdGFydHNXaXRoKCcvbG9naW4vdXNlci1sb2dpbicpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlVW5hdXRob3JpemVkRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbG9naW4nXSkudGhlbigobmF2aWdhdGVkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRlZCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVVbmF1dGhvcml6ZWRFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0MDI6XG4gICAgICAgICAgICBpZiAobG9naW5UeXBlID09PSAnc2FtbCcgfHwgbG9naW5UeXBlID09PSAnb2F1dGgnKSB7XG4gICAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5VU0VSX05BTUUpO1xuICAgICAgICAgICAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oU3RvcmFnZUtleXMuSVNfUkVNRU1CRVJfTUUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfT1JHX0FORF9ST0xFX1NFVCwgZmFsc2UpO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXRJdGVtKFN0b3JhZ2VLZXlzLklTX1VTRVJfQVVUSEVOVElDQVRFRCwgZmFsc2UpO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLkFVVEhfVE9LRU4pO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLkxPR0lOX1RZUEUpO1xuICAgICAgICAgICAgTG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKFN0b3JhZ2VLZXlzLklERU5USVRZX1RPS0VOKTtcbiAgICAgICAgICAgIExvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5cy5VU0VSX09SR19BTkRfUk9MRV9UT0tFTik7XG5cbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2xvZ2luJ10pLnRoZW4oKG5hdmlnYXRlZCkgPT4ge1xuICAgICAgICAgICAgICBpZiAobmF2aWdhdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGBMaWNlbnNlIGV4cGlyZWQsIHBsZWFzZSBjb250YWN0IHlvdXIgc3VwcG9ydCByZXByZXNlbnRhdGl2ZS5gLFxuICAgICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQwMzpcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGVyciBvZiBlcnJvci5lcnJvci5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICAgICAgY29udGVudDogZXJyPy5yZWFzb24gfHwgYEZvcmJpZGRlbiB0byBhY2Nlc3MgdGhpcyByZXNvdXJjZS4gQWNjZXNzIGRlbmllZC5gLFxuICAgICAgICAgICAgICAgICAgdHlwZTogeyBzdHlsZTogJ2Vycm9yJywgaWNvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJIdHRwQXV0aEludGVyY2VwdG9yOiBFeGNlcHRpb24gb2NjdXJyZWQgYXQgNDAzXCIsIGUpO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGBGb3JiaWRkZW4gdG8gYWNjZXNzIHRoaXMgcmVzb3VyY2UuIEFjY2VzcyBkZW5pZWQuYCxcbiAgICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDA1OlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgZXJyIG9mIGVycm9yLmVycm9yLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBlcnI/LnJlYXNvbiB8fCBgSFRUUCBtZXRob2Qgbm90IGFsbG93ZWQuYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSHR0cEF1dGhJbnRlcmNlcHRvcjogRXhjZXB0aW9uIG9jY3VycmVkIGF0IDQwNVwiLCBlKTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBgSFRUUCBtZXRob2Qgbm90IGFsbG93ZWQuYCxcbiAgICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTAwOlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgZXJyIG9mIGVycm9yPy5lcnJvcj8uZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGVycj8ubWVzc2FnZSB8fCBgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4uYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSHR0cEF1dGhJbnRlcmNlcHRvcjogRXhjZXB0aW9uIG9jY3VycmVkIGF0IDUwMFwiLCBlKTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4uYCxcbiAgICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7fVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTAyOlxuICAgICAgICAgICAgdGhpcy50b2FzdE5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1RvYXN0Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgY29udGVudDogYEJhZCBHYXRld2F5LiBQbGVhc2UgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA1MDM6XG4gICAgICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgICBjb250ZW50OiBgU2VydmljZSBVbmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDUwNDpcbiAgICAgICAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGBVbmFibGUgdG8gcmVhY2ggc2VydmVyLiBQbGVhc2UgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICAgIGFjdGlvbjoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgaWYoIXRoaXMuaXNUb2tlblJlZnJlc2hJblByb2dyZXNzKCkpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NRdWV1ZSgpOyAgLy8gUHJvY2VzcyBuZXh0IHJlcXVlc3QgaW4gdGhlIHF1ZXVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGhhbmRsZVVuYXV0aG9yaXplZEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBlcnIgb2YgZXJyb3I/LmVycm9yPy5lcnJvcnMpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgICAgaWYgKGVycj8ubWVzc2FnZS50b0xvd2VyQ2FzZSgpID09PSAnaW52YWxpZCBjcmVkZW50aWFscycpIHtcbiAgICAgICAgICBtZXNzYWdlID0gJ0ludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuJztcbiAgICAgICAgfSBlbHNlIGlmIChlcnI/Lm1lc3NhZ2UuaW5jbHVkZXMoJ2V4cGlyZWQnKSkge1xuICAgICAgICAgIG1lc3NhZ2UgPSAnWW91ciBzZXNzaW9uIGhhcyBleHBpcmVkLiBQbGVhc2UgbG9naW4gYWdhaW4uJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvYXN0Tm90aWZpY2F0aW9uU2VydmljZS5zaG93VG9hc3ROb3RpZmljYXRpb24oe1xuICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IGBVbmF1dGhvcml6ZWRgLFxuICAgICAgICAgIHR5cGU6IHsgc3R5bGU6ICdlcnJvcicsIGljb246IHRydWUgfSxcbiAgICAgICAgICBjbG9zYWJsZTogdHJ1ZSxcbiAgICAgICAgICBhY3Rpb246IHt9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiSHR0cEF1dGhJbnRlcmNlcHRvcjogRXhjZXB0aW9uIG9jY3VycmVkIGF0IDQwMVwiLCBlKTtcbiAgICAgIHRoaXMudG9hc3ROb3RpZmljYXRpb25TZXJ2aWNlLnNob3dUb2FzdE5vdGlmaWNhdGlvbih7XG4gICAgICAgIGNvbnRlbnQ6IGBTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi5gLFxuICAgICAgICB0eXBlOiB7IHN0eWxlOiAnZXJyb3InLCBpY29uOiB0cnVlIH0sXG4gICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICBhY3Rpb246IHt9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFF1ZXVlZFJlcXVlc3Qge1xuICByZXE6IEh0dHBSZXF1ZXN0PGFueT47XG4gIG5vdGlmaWVyOiBTdWJqZWN0PGFueT47XG59XG4iXX0=
@@ -2,7 +2,7 @@ import { HttpEventType } from '@angular/common/http';
2
2
  import * as i0 from '@angular/core';
3
3
  import { Injectable } from '@angular/core';
4
4
  import { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';
5
- import { tap, catchError, throwError } from 'rxjs';
5
+ import { switchMap, Subject, tap, catchError, throwError, finalize } from 'rxjs';
6
6
  import * as i1 from '@angular/router';
7
7
  import * as i2 from '@progress-chef/toast-notification';
8
8
 
@@ -12,8 +12,48 @@ class HttpAuthInterceptor {
12
12
  this.toastNotificationService = toastNotificationService;
13
13
  this.authTokenSet = new Set();
14
14
  this.isSessionExpired = false;
15
+ this.requestQueue = [];
15
16
  }
16
17
  intercept(request, next) {
18
+ if (!this.isTokenRefreshInProgress()) {
19
+ return this.processHttpHandle(request, next);
20
+ }
21
+ else {
22
+ this.startStorageListenerTimer();
23
+ return this.createQueueRequest(request).pipe(switchMap((req) => {
24
+ return this.processHttpHandle(req, next);
25
+ }));
26
+ }
27
+ }
28
+ isTokenRefreshInProgress() {
29
+ return LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH)?.active;
30
+ }
31
+ processQueue() {
32
+ const nextRequest = this.requestQueue.shift();
33
+ if (nextRequest) {
34
+ nextRequest.notifier.next(nextRequest.req);
35
+ }
36
+ }
37
+ createQueueRequest(request) {
38
+ const requestObj = {};
39
+ requestObj.req = request;
40
+ requestObj.notifier = new Subject();
41
+ this.requestQueue.push(requestObj);
42
+ return requestObj.notifier.asObservable();
43
+ }
44
+ startStorageListenerTimer() {
45
+ if (this.storageListenerTimer) {
46
+ clearInterval(this.storageListenerTimer);
47
+ }
48
+ this.storageListenerTimer = setInterval(() => {
49
+ if (LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH) &&
50
+ LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH).active === false) {
51
+ clearInterval(this.storageListenerTimer);
52
+ this.processQueue();
53
+ }
54
+ }, 200);
55
+ }
56
+ processHttpHandle(request, next) {
17
57
  let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);
18
58
  let authReq = request;
19
59
  if (authToken) {
@@ -89,36 +129,16 @@ class HttpAuthInterceptor {
89
129
  LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);
90
130
  LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);
91
131
  LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);
92
- this.router.navigate(['/login']).then((navigated) => {
93
- if (navigated) {
94
- try {
95
- for (let err of error?.error?.errors) {
96
- let message = '';
97
- if (err?.message.toLowerCase() === 'invalid credentials') {
98
- message = 'Invalid username or password.';
99
- }
100
- else if (err?.message.includes('expired')) {
101
- message = 'Your session has expired. Please login again.';
102
- }
103
- this.toastNotificationService.showToastNotification({
104
- content: message || err?.message || `Unauthorized`,
105
- type: { style: 'error', icon: true },
106
- closable: true,
107
- action: {}
108
- });
109
- }
110
- }
111
- catch (e) {
112
- console.log("HttpAuthInterceptor: Exception occurred at 401", e);
113
- this.toastNotificationService.showToastNotification({
114
- content: `Something went wrong. Please try again.`,
115
- type: { style: 'error', icon: true },
116
- closable: true,
117
- action: {}
118
- });
132
+ if (this.router.url.startsWith('/login/user-login')) {
133
+ this.handleUnauthorizedError(error);
134
+ }
135
+ else {
136
+ this.router.navigate(['/login']).then((navigated) => {
137
+ if (navigated) {
138
+ this.handleUnauthorizedError(error);
119
139
  }
120
- }
121
- });
140
+ });
141
+ }
122
142
  break;
123
143
  case 402:
124
144
  if (loginType === 'saml' || loginType === 'oauth') {
@@ -232,8 +252,40 @@ class HttpAuthInterceptor {
232
252
  break;
233
253
  }
234
254
  return throwError(() => error);
255
+ }), finalize(() => {
256
+ if (!this.isTokenRefreshInProgress()) {
257
+ this.processQueue(); // Process next request in the queue
258
+ }
235
259
  }));
236
260
  }
261
+ handleUnauthorizedError(error) {
262
+ try {
263
+ for (let err of error?.error?.errors) {
264
+ let message = '';
265
+ if (err?.message.toLowerCase() === 'invalid credentials') {
266
+ message = 'Invalid username or password.';
267
+ }
268
+ else if (err?.message.includes('expired')) {
269
+ message = 'Your session has expired. Please login again.';
270
+ }
271
+ this.toastNotificationService.showToastNotification({
272
+ content: message || err?.message || `Unauthorized`,
273
+ type: { style: 'error', icon: true },
274
+ closable: true,
275
+ action: {}
276
+ });
277
+ }
278
+ }
279
+ catch (e) {
280
+ console.log("HttpAuthInterceptor: Exception occurred at 401", e);
281
+ this.toastNotificationService.showToastNotification({
282
+ content: `Something went wrong. Please try again.`,
283
+ type: { style: 'error', icon: true },
284
+ closable: true,
285
+ action: {}
286
+ });
287
+ }
288
+ }
237
289
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, deps: [{ token: i1.Router }, { token: i2.ToastNotificationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
238
290
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpAuthInterceptor, providedIn: 'root' }); }
239
291
  }
@@ -1 +1 @@
1
- {"version":3,"file":"progress-chef-platform-http-interceptor.mjs","sources":["../../../projects/platform-http-interceptor/src/lib/http-auth.interceptor.ts","../../../projects/platform-http-interceptor/src/public-api.ts","../../../projects/platform-http-interceptor/src/progress-chef-platform-http-interceptor.ts"],"sourcesContent":["import {\n HttpErrorResponse, HttpEvent, HttpEventType, HttpHandler, HttpInterceptor, HttpRequest\n} from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';\nimport { ToastNotificationService } from '@progress-chef/toast-notification';\nimport { Observable, catchError, tap, throwError } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class HttpAuthInterceptor implements HttpInterceptor {\n authTokenSet = new Set();\n isSessionExpired = false;\n constructor(\n private router: Router,\n private readonly toastNotificationService: ToastNotificationService\n ) { }\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);\n let authReq = request;\n if (authToken) {\n authReq = request.clone({\n setHeaders: {\n Authorization: `Bearer ${authToken}`\n }\n })\n if (!this.authTokenSet.has(authToken)) {\n this.isSessionExpired = false;\n }\n this.authTokenSet.add(authToken);\n }\n return next.handle(authReq).pipe(\n tap((event) => {\n if (event.type === HttpEventType.Response) {\n switch (event.status) {\n case 202:\n this.toastNotificationService.showToastNotification({\n content: event?.body?.item?.message || `Request under processing`,\n type: { style: 'info', icon: true },\n closable: true,\n action: {}\n });\n break;\n case 207:\n let message = {\n content: 'Request was successful',\n notificationStyle: 'success',\n closable: false\n }\n try {\n for (let item of event.body?.items) {\n for (let err of item?.userRoleMapping) { /* Currently 207 is handled only for single use case, so it is hardcoded.If there are more use cases, then this should be updated accordingly. */\n if (err.error !== null) {\n message = {\n content: 'User not allowed for this operation',\n notificationStyle: 'error',\n closable: true\n }\n }\n }\n }\n this.toastNotificationService.showToastNotification({\n content: message.content,\n type: { style: message.notificationStyle, icon: true },\n closable: message.closable,\n action: {}\n });\n } catch (e) {\n console.log(\"Exception occurred at HttpAuthInterceptor 207 notification\", e);\n this.toastNotificationService.showToastNotification({\n content: `The request has been accepted for processing, but has been partially completed.`,\n type: { style: 'info', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n }\n }\n }),\n catchError((error: HttpErrorResponse) => {\n const loginType = LocalStorageService.getItem(StorageKeys.LOGIN_TYPE);\n\n switch (error.status) {\n case 401:\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME);\n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n\n this.router.navigate(['/login']).then((navigated) => {\n if (navigated) {\n try {\n for (let err of error?.error?.errors) {\n let message = '';\n if (err?.message.toLowerCase() === 'invalid credentials') {\n message = 'Invalid username or password.';\n } else if (err?.message.includes('expired')) {\n message = 'Your session has expired. Please login again.';\n }\n this.toastNotificationService.showToastNotification({\n content: message || err?.message || `Unauthorized`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 401\", e);\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n }\n })\n break;\n case 402:\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME);\n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n\n this.router.navigate(['/login']).then((navigated) => {\n if (navigated) {\n this.toastNotificationService.showToastNotification({\n content: `License expired, please contact your support representative.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n })\n break;\n case 403:\n try {\n for (let err of error.error.errors) {\n this.toastNotificationService.showToastNotification({\n content: err?.reason || `Forbidden to access this resource. Access denied.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 403\", e);\n this.toastNotificationService.showToastNotification({\n content: `Forbidden to access this resource. Access denied.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n case 405:\n try {\n for (let err of error.error.errors) {\n this.toastNotificationService.showToastNotification({\n content: err?.reason || `HTTP method not allowed.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 405\", e);\n this.toastNotificationService.showToastNotification({\n content: `HTTP method not allowed.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n case 500:\n try {\n for (let err of error?.error?.errors) {\n this.toastNotificationService.showToastNotification({\n content: err?.message || `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 500\", e);\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n case 502:\n this.toastNotificationService.showToastNotification({\n content: `Bad Gateway. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n break;\n case 503:\n this.toastNotificationService.showToastNotification({\n content: `Service Unavailable. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n break;\n case 0:\n case 504:\n this.toastNotificationService.showToastNotification({\n content: `Unable to reach server. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n break;\n\n }\n return throwError(() => error)\n })\n );\n }\n}\n","/*\n * Public API Surface of platform-http-interceptor\n */\n\nexport * from './lib/http-auth.interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progress-chef-platform-http-interceptor.mjs","sources":["../../../projects/platform-http-interceptor/src/lib/http-auth.interceptor.ts","../../../projects/platform-http-interceptor/src/public-api.ts","../../../projects/platform-http-interceptor/src/progress-chef-platform-http-interceptor.ts"],"sourcesContent":["import {\n HttpErrorResponse, HttpEvent, HttpEventType, HttpHandler, HttpInterceptor, HttpRequest\n} from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { LocalStorageService, StorageKeys } from '@progress-chef/platform-storage-service';\nimport { ToastNotificationService } from '@progress-chef/toast-notification';\nimport { Observable, catchError, finalize, tap, throwError, Subject, switchMap, Subscription } from \"rxjs\";\n\n\n@Injectable({\n providedIn: 'root'\n})\n\nexport class HttpAuthInterceptor implements HttpInterceptor {\n authTokenSet = new Set();\n isSessionExpired = false;\n requestQueue: QueuedRequest[] = [];\n storageListenerTimer: any;\n\n constructor(\n private router: Router,\n private readonly toastNotificationService: ToastNotificationService\n ) { }\n\n intercept(\n request: HttpRequest<unknown>,\n next: HttpHandler\n ): Observable<HttpEvent<unknown>> {\n if(!this.isTokenRefreshInProgress()) {\n return this.processHttpHandle(request, next);\n }else {\n this.startStorageListenerTimer();\n return this.createQueueRequest(request).pipe(\n switchMap((req: HttpRequest<any>) => {\n return this.processHttpHandle(req, next);\n })\n );\n }\n }\n \n isTokenRefreshInProgress(): boolean {\n return LocalStorageService.getItem(\n StorageKeys.TOKEN_REFRESH\n )?.active;\n }\n\n processQueue(): void {\n const nextRequest = this.requestQueue.shift();\n if (nextRequest) {\n nextRequest.notifier.next(nextRequest.req);\n }\n }\n\n createQueueRequest(request: HttpRequest<unknown>): Observable<any> {\n const requestObj:QueuedRequest = {} as QueuedRequest;\n requestObj.req = request;\n requestObj.notifier = new Subject<HttpRequest<any>>();\n this.requestQueue.push(requestObj);\n return requestObj.notifier.asObservable();\n }\n \n startStorageListenerTimer(): void {\n if(this.storageListenerTimer) {\n clearInterval(this.storageListenerTimer);\n }\n this.storageListenerTimer = setInterval(() => {\n if(LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH) && \n LocalStorageService.getItem(StorageKeys.TOKEN_REFRESH).active === false) {\n clearInterval(this.storageListenerTimer);\n this.processQueue();\n }\n }, 200);\n }\n\n processHttpHandle(request: HttpRequest<unknown>, next:HttpHandler): Observable<HttpEvent<unknown>> {\n let authToken = LocalStorageService.getItem(StorageKeys.AUTH_TOKEN);\n let authReq = request;\n if (authToken) {\n authReq = request.clone({\n setHeaders: {\n Authorization: `Bearer ${authToken}`\n }\n })\n if (!this.authTokenSet.has(authToken)) {\n this.isSessionExpired = false;\n }\n this.authTokenSet.add(authToken);\n }\n return next.handle(authReq).pipe(\n tap((event) => {\n if (event.type === HttpEventType.Response) {\n switch (event.status) {\n case 202:\n this.toastNotificationService.showToastNotification({\n content: event?.body?.item?.message || `Request under processing`,\n type: { style: 'info', icon: true },\n closable: true,\n action: {}\n });\n break;\n case 207:\n let message = {\n content: 'Request was successful',\n notificationStyle: 'success',\n closable: false\n }\n try {\n for (let item of event.body?.items) {\n for (let err of item?.userRoleMapping) { /* Currently 207 is handled only for single use case, so it is hardcoded.If there are more use cases, then this should be updated accordingly. */\n if (err.error !== null) {\n message = {\n content: 'User not allowed for this operation',\n notificationStyle: 'error',\n closable: true\n }\n }\n }\n }\n this.toastNotificationService.showToastNotification({\n content: message.content,\n type: { style: message.notificationStyle, icon: true },\n closable: message.closable,\n action: {}\n });\n } catch (e) {\n console.log(\"Exception occurred at HttpAuthInterceptor 207 notification\", e);\n this.toastNotificationService.showToastNotification({\n content: `The request has been accepted for processing, but has been partially completed.`,\n type: { style: 'info', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n }\n }\n }),\n catchError((error: HttpErrorResponse) => {\n const loginType = LocalStorageService.getItem(StorageKeys.LOGIN_TYPE);\n\n switch (error.status) {\n case 401:\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME);\n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n\n if (this.router.url.startsWith('/login/user-login')) {\n this.handleUnauthorizedError(error);\n } else {\n this.router.navigate(['/login']).then((navigated) => {\n if (navigated) {\n this.handleUnauthorizedError(error);\n }\n })\n }\n break;\n case 402:\n if (loginType === 'saml' || loginType === 'oauth') {\n LocalStorageService.removeItem(StorageKeys.USER_NAME);\n LocalStorageService.removeItem(StorageKeys.IS_REMEMBER_ME);\n }\n LocalStorageService.setItem(StorageKeys.IS_USER_ORG_AND_ROLE_SET, false);\n LocalStorageService.setItem(StorageKeys.IS_USER_AUTHENTICATED, false);\n LocalStorageService.removeItem(StorageKeys.AUTH_TOKEN);\n LocalStorageService.removeItem(StorageKeys.LOGIN_TYPE);\n LocalStorageService.removeItem(StorageKeys.IDENTITY_TOKEN);\n LocalStorageService.removeItem(StorageKeys.USER_ORG_AND_ROLE_TOKEN);\n\n this.router.navigate(['/login']).then((navigated) => {\n if (navigated) {\n this.toastNotificationService.showToastNotification({\n content: `License expired, please contact your support representative.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n })\n break;\n case 403:\n try {\n for (let err of error.error.errors) {\n this.toastNotificationService.showToastNotification({\n content: err?.reason || `Forbidden to access this resource. Access denied.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 403\", e);\n this.toastNotificationService.showToastNotification({\n content: `Forbidden to access this resource. Access denied.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n case 405:\n try {\n for (let err of error.error.errors) {\n this.toastNotificationService.showToastNotification({\n content: err?.reason || `HTTP method not allowed.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 405\", e);\n this.toastNotificationService.showToastNotification({\n content: `HTTP method not allowed.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n case 500:\n try {\n for (let err of error?.error?.errors) {\n this.toastNotificationService.showToastNotification({\n content: err?.message || `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 500\", e);\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n break;\n case 502:\n this.toastNotificationService.showToastNotification({\n content: `Bad Gateway. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n break;\n case 503:\n this.toastNotificationService.showToastNotification({\n content: `Service Unavailable. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n break;\n case 0:\n case 504:\n this.toastNotificationService.showToastNotification({\n content: `Unable to reach server. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n break;\n\n }\n return throwError(() => error);\n }),\n finalize(() => {\n if(!this.isTokenRefreshInProgress()) {\n this.processQueue(); // Process next request in the queue\n }\n })\n );\n }\n\n handleUnauthorizedError(error: HttpErrorResponse) {\n try {\n for (let err of error?.error?.errors) {\n let message = '';\n if (err?.message.toLowerCase() === 'invalid credentials') {\n message = 'Invalid username or password.';\n } else if (err?.message.includes('expired')) {\n message = 'Your session has expired. Please login again.';\n }\n this.toastNotificationService.showToastNotification({\n content: message || err?.message || `Unauthorized`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n } catch (e) {\n console.log(\"HttpAuthInterceptor: Exception occurred at 401\", e);\n this.toastNotificationService.showToastNotification({\n content: `Something went wrong. Please try again.`,\n type: { style: 'error', icon: true },\n closable: true,\n action: {}\n });\n }\n }\n}\n\ninterface QueuedRequest {\n req: HttpRequest<any>;\n notifier: Subject<any>;\n}\n","/*\n * Public API Surface of platform-http-interceptor\n */\n\nexport * from './lib/http-auth.interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,15 +1,28 @@
1
- import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
1
+ import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
2
2
  import { Router } from '@angular/router';
3
3
  import { ToastNotificationService } from '@progress-chef/toast-notification';
4
- import { Observable } from 'rxjs';
4
+ import { Observable, Subject } from "rxjs";
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class HttpAuthInterceptor implements HttpInterceptor {
7
7
  private router;
8
8
  private readonly toastNotificationService;
9
9
  authTokenSet: Set<unknown>;
10
10
  isSessionExpired: boolean;
11
+ requestQueue: QueuedRequest[];
12
+ storageListenerTimer: any;
11
13
  constructor(router: Router, toastNotificationService: ToastNotificationService);
12
14
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
15
+ isTokenRefreshInProgress(): boolean;
16
+ processQueue(): void;
17
+ createQueueRequest(request: HttpRequest<unknown>): Observable<any>;
18
+ startStorageListenerTimer(): void;
19
+ processHttpHandle(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>>;
20
+ handleUnauthorizedError(error: HttpErrorResponse): void;
13
21
  static ɵfac: i0.ɵɵFactoryDeclaration<HttpAuthInterceptor, never>;
14
22
  static ɵprov: i0.ɵɵInjectableDeclaration<HttpAuthInterceptor>;
15
23
  }
24
+ interface QueuedRequest {
25
+ req: HttpRequest<any>;
26
+ notifier: Subject<any>;
27
+ }
28
+ export {};
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@progress-chef/platform-http-interceptor",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^16.2.0",
6
- "@angular/core": "^16.2.0"
6
+ "@angular/core": "^16.2.0",
7
+ "rxjs": "~7.5.0"
7
8
  },
8
9
  "dependencies": {
9
10
  "tslib": "^2.3.0",
10
11
  "@progress-chef/toast-notification": "0.0.4",
11
- "@progress-chef/platform-storage-service": "1.0.17"
12
+ "@progress-chef/platform-storage-service": "^1.0.18"
12
13
  },
13
14
  "sideEffects": false,
14
15
  "publishConfig": {