@dangl/angular-dangl-identity-client 4.0.0 → 4.0.1-beta0001
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.
- package/api-client.d.ts +3 -0
- package/dangl-angular-dangl-identity-client.d.ts +1 -0
- package/dangl-identity.module.d.ts +5 -0
- package/{esm2015/api-client.js → esm2020/api-client.mjs} +17 -11
- package/{esm2015/dangl-angular-dangl-identity-client.js → esm2020/dangl-angular-dangl-identity-client.mjs} +0 -0
- package/esm2020/dangl-identity.module.mjs +21 -0
- package/{esm2015/interceptors/dangl-identity-request-validator.js → esm2020/interceptors/dangl-identity-request-validator.mjs} +0 -0
- package/esm2020/interceptors/jwt-interceptor.service.mjs +47 -0
- package/esm2020/messengers/authentication.messenger.mjs +83 -0
- package/{esm2015/models/jwt-storage.js → esm2020/models/jwt-storage.mjs} +0 -0
- package/{esm2015/models/user-info.js → esm2020/models/user-info.mjs} +0 -0
- package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
- package/esm2020/services/authentication.service.mjs +41 -0
- package/esm2020/services/jwt-token.service.mjs +95 -0
- package/fesm2015/dangl-angular-dangl-identity-client.mjs +754 -0
- package/fesm2015/dangl-angular-dangl-identity-client.mjs.map +1 -0
- package/{fesm2015/dangl-angular-dangl-identity-client.js → fesm2020/dangl-angular-dangl-identity-client.mjs} +65 -54
- package/fesm2020/dangl-angular-dangl-identity-client.mjs.map +1 -0
- package/interceptors/jwt-interceptor.service.d.ts +3 -0
- package/messengers/authentication.messenger.d.ts +3 -0
- package/package.json +21 -9
- package/services/authentication.service.d.ts +3 -0
- package/services/jwt-token.service.d.ts +3 -0
- package/bundles/dangl-angular-dangl-identity-client.umd.js +0 -1179
- package/bundles/dangl-angular-dangl-identity-client.umd.js.map +0 -1
- package/dangl-angular-dangl-identity-client.metadata.json +0 -1
- package/esm2015/dangl-identity.module.js +0 -14
- package/esm2015/interceptors/jwt-interceptor.service.js +0 -43
- package/esm2015/messengers/authentication.messenger.js +0 -85
- package/esm2015/services/authentication.service.js +0 -45
- package/esm2015/services/jwt-token.service.js +0 -97
- package/fesm2015/dangl-angular-dangl-identity-client.js.map +0 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { Subject, of, ReplaySubject } from "rxjs";
|
|
3
|
+
import { map, tap, first } from "rxjs/operators";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../api-client";
|
|
6
|
+
export class JwtTokenService {
|
|
7
|
+
constructor(danglIdentityClient) {
|
|
8
|
+
this.danglIdentityClient = danglIdentityClient;
|
|
9
|
+
this.storage_identifier = "dangl_identity_integration_jwt_token";
|
|
10
|
+
this.isRefreshing = false;
|
|
11
|
+
this.refreshTokenSource = new Subject();
|
|
12
|
+
this.tokenStoredSource = new ReplaySubject(1);
|
|
13
|
+
this.tokenStored = this.tokenStoredSource.asObservable();
|
|
14
|
+
this.tokenRefreshStartedSource = new Subject();
|
|
15
|
+
this.tokenRefreshStarted = this.tokenRefreshStartedSource.asObservable();
|
|
16
|
+
this.tokenRefreshFinishedSource = new Subject();
|
|
17
|
+
this.tokenRefreshFinished = this.tokenRefreshFinishedSource.asObservable();
|
|
18
|
+
}
|
|
19
|
+
deleteToken() {
|
|
20
|
+
localStorage.removeItem(this.storage_identifier);
|
|
21
|
+
this.tokenStoredSource.next(null);
|
|
22
|
+
}
|
|
23
|
+
storeCustomToken(tokenToStore) {
|
|
24
|
+
localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
|
|
25
|
+
this.tokenStoredSource.next(tokenToStore);
|
|
26
|
+
}
|
|
27
|
+
storeToken(token) {
|
|
28
|
+
const tokenToStore = this.transformTokenResponse(token);
|
|
29
|
+
localStorage.setItem(this.storage_identifier, JSON.stringify(tokenToStore));
|
|
30
|
+
this.tokenStoredSource.next(tokenToStore);
|
|
31
|
+
}
|
|
32
|
+
getTokenFromStorage() {
|
|
33
|
+
const storedString = localStorage.getItem(this.storage_identifier);
|
|
34
|
+
if (storedString) {
|
|
35
|
+
const storedToken = JSON.parse(storedString);
|
|
36
|
+
return storedToken;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
refreshToken() {
|
|
41
|
+
if (this.isRefreshing) {
|
|
42
|
+
return this.refreshTokenSource.pipe(first());
|
|
43
|
+
}
|
|
44
|
+
this.isRefreshing = true;
|
|
45
|
+
this.tokenRefreshStartedSource.next();
|
|
46
|
+
const refreshToken = this.getTokenFromStorage().refreshToken;
|
|
47
|
+
if (!refreshToken) {
|
|
48
|
+
this.isRefreshing = false;
|
|
49
|
+
return of(null);
|
|
50
|
+
}
|
|
51
|
+
this.danglIdentityClient
|
|
52
|
+
.refreshToken({
|
|
53
|
+
refreshToken: refreshToken,
|
|
54
|
+
})
|
|
55
|
+
.pipe(tap((r) => this.storeToken(r)), map((r) => this.transformTokenResponse(r)))
|
|
56
|
+
.subscribe((refreshTokenResponse) => {
|
|
57
|
+
this.isRefreshing = false;
|
|
58
|
+
this.tokenRefreshFinishedSource.next(true);
|
|
59
|
+
this.refreshTokenSource.next(refreshTokenResponse);
|
|
60
|
+
}, (error) => {
|
|
61
|
+
this.isRefreshing = false;
|
|
62
|
+
this.tokenRefreshFinishedSource.next(false);
|
|
63
|
+
this.refreshTokenSource.next(null);
|
|
64
|
+
console.error("Internal error while refreshing Dangl.Identity token", error);
|
|
65
|
+
});
|
|
66
|
+
return this.refreshTokenSource.pipe(first());
|
|
67
|
+
}
|
|
68
|
+
getToken() {
|
|
69
|
+
const token = this.getTokenFromStorage();
|
|
70
|
+
if (!token) {
|
|
71
|
+
return of(null);
|
|
72
|
+
}
|
|
73
|
+
const isValidToken = token.expiresAt > new Date().getTime() / 1000;
|
|
74
|
+
if (isValidToken) {
|
|
75
|
+
return of(token);
|
|
76
|
+
}
|
|
77
|
+
return this.refreshToken();
|
|
78
|
+
}
|
|
79
|
+
transformTokenResponse(token) {
|
|
80
|
+
return {
|
|
81
|
+
accessToken: token.accessToken,
|
|
82
|
+
refreshToken: token.refreshToken,
|
|
83
|
+
expiresAt: new Date().getTime() / 1000 + token.expiresIn,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
JwtTokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtTokenService, deps: [{ token: i1.DanglIdentityClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
88
|
+
JwtTokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtTokenService, providedIn: "root" });
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: JwtTokenService, decorators: [{
|
|
90
|
+
type: Injectable,
|
|
91
|
+
args: [{
|
|
92
|
+
providedIn: "root",
|
|
93
|
+
}]
|
|
94
|
+
}], ctorParameters: function () { return [{ type: i1.DanglIdentityClient }]; } });
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXRva2VuLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWRhbmdsLWlkZW50aXR5LWNsaWVudC9zcmMvc2VydmljZXMvand0LXRva2VuLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsT0FBTyxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU03RCxNQUFNLE9BQU8sZUFBZTtJQVcxQixZQUFvQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVYzQyx1QkFBa0IsR0FBRyxzQ0FBc0MsQ0FBQztRQUNyRSxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQix1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBQy9DLHNCQUFpQixHQUFHLElBQUksYUFBYSxDQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzdELGdCQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVDLDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVELCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRVAsQ0FBQztJQUVoRSxXQUFXO1FBQ1QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsaUJBQWlCLENB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QUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxFQUFFLENBQWEsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ25FLElBQUksWUFBWSxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLHNCQUFzQixDQUFDLEtBQXVCO1FBQ3BELE9BQU87WUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUztTQUN6RCxDQUFDO0lBQ0osQ0FBQzs7NEdBakdVLGVBQWU7Z0hBQWYsZUFBZSxjQUZkLE1BQU07MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRGFuZ2xJZGVudGl0eUNsaWVudCwgVG9rZW5SZXNwb25zZUdldCB9IGZyb20gXCIuLi9hcGktY2xpZW50XCI7XHJcbmltcG9ydCB7IEp3dFN0b3JhZ2UgfSBmcm9tIFwiLi4vbW9kZWxzL2p3dC1zdG9yYWdlXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yLCB0YXAsIGZpcnN0IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uTWVzc2VuZ2VyIH0gZnJvbSBcIi4uL21lc3NlbmdlcnMvYXV0aGVudGljYXRpb24ubWVzc2VuZ2VyXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBKd3RUb2tlblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZV9pZGVudGlmaWVyID0gXCJkYW5nbF9pZGVudGl0eV9pbnRlZ3JhdGlvbl9qd3RfdG9rZW5cIjtcclxuICBwcml2YXRlIGlzUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVmcmVzaFRva2VuU291cmNlID0gbmV3IFN1YmplY3Q8Snd0U3RvcmFnZT4oKTtcclxuICBwcml2YXRlIHRva2VuU3RvcmVkU291cmNlID0gbmV3IFJlcGxheVN1YmplY3Q8Snd0U3RvcmFnZT4oMSk7XHJcbiAgdG9rZW5TdG9yZWQgPSB0aGlzLnRva2VuU3RvcmVkU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHByaXZhdGUgdG9rZW5SZWZyZXNoU3RhcnRlZFNvdXJjZSA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgdG9rZW5SZWZyZXNoU3RhcnRlZCA9IHRoaXMudG9rZW5SZWZyZXNoU3RhcnRlZFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICBwcml2YXRlIHRva2VuUmVmcmVzaEZpbmlzaGVkU291cmNlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICB0b2tlblJlZnJlc2hGaW5pc2hlZCA9IHRoaXMudG9rZW5SZWZyZXNoRmluaXNoZWRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGFuZ2xJZGVudGl0eUNsaWVudDogRGFuZ2xJZGVudGl0eUNsaWVudCkge31cclxuXHJcbiAgZGVsZXRlVG9rZW4oKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnN0b3JhZ2VfaWRlbnRpZmllcik7XHJcbiAgICB0aGlzLnRva2VuU3RvcmVkU291cmNlLm5leHQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBzdG9yZUN1c3RvbVRva2VuKHRva2VuVG9TdG9yZTogSnd0U3RvcmFnZSkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBzdG9yZVRva2VuKHRva2VuOiBUb2tlblJlc3BvbnNlR2V0KSB7XHJcbiAgICBjb25zdCB0b2tlblRvU3RvcmUgPSB0aGlzLnRyYW5zZm9ybVRva2VuUmVzcG9uc2UodG9rZW4pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIsIEpTT04uc3RyaW5naWZ5KHRva2VuVG9TdG9yZSkpO1xyXG4gICAgdGhpcy50b2tlblN0b3JlZFNvdXJjZS5uZXh0KHRva2VuVG9TdG9yZSk7XHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbkZyb21TdG9yYWdlKCk6IEp3dFN0b3JhZ2Uge1xyXG4gICAgY29uc3Qgc3RvcmVkU3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlX2lkZW50aWZpZXIpO1xyXG4gICAgaWYgKHN0b3JlZFN0cmluZykge1xyXG4gICAgICBjb25zdCBzdG9yZWRUb2tlbiA9IDxKd3RTdG9yYWdlPkpTT04ucGFyc2Uoc3RvcmVkU3RyaW5nKTtcclxuICAgICAgcmV0dXJuIHN0b3JlZFRva2VuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoVG9rZW4oKTogT2JzZXJ2YWJsZTxKd3RTdG9yYWdlPiB7XHJcbiAgICBpZiAodGhpcy5pc1JlZnJlc2hpbmcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuU291cmNlLnBpcGUoZmlyc3QoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRva2VuUmVmcmVzaFN0YXJ0ZWRTb3VyY2UubmV4dCgpO1xyXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5nZXRUb2tlbkZyb21TdG9yYWdlKCkucmVmcmVzaFRva2VuO1xyXG5cclxuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgIHRoaXMuaXNSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiBvZjxKd3RTdG9yYWdlPihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhbmdsSWRlbnRpdHlDbGllbnRcclxuICAgICAgLnJlZnJlc2hUb2tlbih7XHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgocikgPT4gdGhpcy5zdG9yZVRva2VuKHIpKSxcclxuICAgICAgICBtYXAoKHIpID0+IHRoaXMudHJhbnNmb3JtVG9rZW5SZXNwb25zZShyKSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZWZyZXNoVG9rZW5SZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc1JlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9rZW5SZWZyZXNoRmluaXNoZWRTb3VyY2UubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQocmVmcmVzaFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50b2tlblJlZnJlc2hGaW5pc2hlZFNvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU291cmNlLm5leHQobnVsbCk7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICBcIkludGVybmFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgRGFuZ2wuSWRlbnRpdHkgdG9rZW5cIixcclxuICAgICAgICAgICAgZXJyb3JcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlblNvdXJjZS5waXBlKGZpcnN0KCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9rZW4oKTogT2JzZXJ2YWJsZTxKd3RTdG9yYWdlPiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW5Gcm9tU3RvcmFnZSgpO1xyXG4gICAgaWYgKCF0b2tlbikge1xyXG4gICAgICByZXR1cm4gb2Y8Snd0U3RvcmFnZT4obnVsbCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc1ZhbGlkVG9rZW4gPSB0b2tlbi5leHBpcmVzQXQgPiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XHJcbiAgICBpZiAoaXNWYWxpZFRva2VuKSB7XHJcbiAgICAgIHJldHVybiBvZih0b2tlbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW4oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNmb3JtVG9rZW5SZXNwb25zZSh0b2tlbjogVG9rZW5SZXNwb25zZUdldCk6IEp3dFN0b3JhZ2Uge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWNjZXNzVG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxyXG4gICAgICByZWZyZXNoVG9rZW46IHRva2VuLnJlZnJlc2hUb2tlbixcclxuICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDAgKyB0b2tlbi5leHBpcmVzSW4sXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=
|