ems-web-app-cognito 1.0.20 → 1.0.25
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/esm2020/lib/cognito.classes.mjs +1 -5
- package/esm2020/lib/cognito.service.mjs +19 -7
- package/fesm2015/ems-web-app-cognito.mjs +18 -10
- package/fesm2015/ems-web-app-cognito.mjs.map +1 -1
- package/fesm2020/ems-web-app-cognito.mjs +18 -10
- package/fesm2020/ems-web-app-cognito.mjs.map +1 -1
- package/lib/cognito.service.d.ts +2 -0
- package/package.json +1 -1
|
@@ -27,21 +27,17 @@ export class EphemeralStorage {
|
|
|
27
27
|
this._cache = {};
|
|
28
28
|
}
|
|
29
29
|
getItem(key) {
|
|
30
|
-
console.log(`getting: ${key}: ${this._cache[key]}`, this._cache);
|
|
31
30
|
return this._cache[key];
|
|
32
31
|
}
|
|
33
32
|
setItem(key, value) {
|
|
34
|
-
console.log(`setting: ${key}: ${value}`);
|
|
35
33
|
this._cache[key] = value;
|
|
36
34
|
return this.getItem(key);
|
|
37
35
|
}
|
|
38
36
|
removeItem(key) {
|
|
39
37
|
delete this._cache[key];
|
|
40
|
-
console.log(`deleting: ${key}`, this._cache);
|
|
41
38
|
}
|
|
42
39
|
clear() {
|
|
43
40
|
this._cache = {};
|
|
44
|
-
console.log(`clearing`, this._cache);
|
|
45
41
|
}
|
|
46
42
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5jbGFzc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLmNsYXNzZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGNBQWM7O0FBQ1gsNkNBQThCLEdBQVksMERBQTBELENBQUM7QUFDckcscUNBQXNCLEdBQVcseURBQXlELENBQUM7QUFDM0Ysb0NBQXFCLEdBQVcsc0hBQXNILENBQUM7QUFDdkosMkJBQVksR0FBVyw4REFBOEQsQ0FBQztBQUN0RixnQ0FBaUIsR0FBVyxvREFBb0QsQ0FBQztBQUNqRixnQ0FBaUIsR0FBVyw4Q0FBOEMsQ0FBQztBQUMzRSx5QkFBVSxHQUFXLGVBQWUsQ0FBQztBQUNyQyw0QkFBYSxHQUFXLFVBQVUsQ0FBQztBQUNuQyxrQ0FBbUIsR0FBVyxpQkFBaUIsQ0FBQztBQUNoRCwrQkFBZ0IsR0FBVyxjQUFjLENBQUM7QUFDMUMsbUNBQW9CLEdBQVcsa0JBQWtCLENBQUM7QUFDbEQsc0NBQXVCLEdBQVcsc0JBQXNCLENBQUM7QUFDekQsMEJBQVcsR0FBVyxRQUFRLENBQUM7QUFDL0Isd0JBQVMsR0FBVyxNQUFNLENBQUM7QUFDM0IseUJBQVUsR0FBVyxPQUFPLENBQUM7QUFDN0Isc0NBQXVCLEdBQVcsdUJBQXVCLENBQUM7QUFDMUQsdUJBQVEsR0FBVyxvQ0FBb0MsQ0FBQztBQUN4RCw0QkFBYSxHQUFXLDhDQUE4QyxDQUFDO0FBQ3ZFLDZCQUFjLEdBQVcsdUJBQXVCLENBQUM7QUFDakQsNEJBQWEsR0FBVyxlQUFlLENBQUM7QUFDeEMsZ0NBQWlCLEdBQVcsOENBQThDLENBQUE7QUFDMUUsdUNBQXdCLEdBQVcsd0dBQXdHLENBQUM7QUFJNUosTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQUNTLFdBQU0sR0FBUSxFQUFFLENBQUM7SUFrQjFCLENBQUM7SUFoQkEsT0FBTyxDQUFDLEdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQVU7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUs7UUFDSixJQUFJLENBQUMsTUFBTSxHQUFFLEVBQUUsQ0FBQztJQUNqQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ29nbml0b1N0cmluZ3Mge1xuXHQgcHVibGljIHN0YXRpYyBvblVzZXJQYXNzd29yZENoYW5nZVN1Y2Nlc3NmdWw6IHN0cmluZyAgPSBcIlVwZGF0ZSBzdWNjZXNzZnVsLiBQbGVhc2UgbG9nIGluIHdpdGggeW91ciBuZXcgcGFzc3dvcmQuXCI7XG5cdCBwdWJsaWMgc3RhdGljIG9uVmVyaWZpY2F0aW9uQ29kZVNlbnQ6IHN0cmluZyA9IFwiRW50ZXIgeW91ciBlbWFpbCBiZWxvdyB0byBnZW5lcmF0ZSBhIHZlcmlmaWNhdGlvbiBjb2RlLlwiO1xuXHQgcHVibGljIHN0YXRpYyBvbk5ld1Bhc3N3b3JkUmVxdWlyZWQ6IHN0cmluZyA9IFwiWW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBhc3N3b3JkLiBQbGVhc2UgY2hlY2sgeW91ciBlbWFpbCBmb3IgYSB2ZXJpZmljYXRpb24gY29kZSBhbmQgdGhlbiBjb21wbGV0ZSB0aGUgZm9ybSBiZWxvdy5cIjtcblx0IHB1YmxpYyBzdGF0aWMgb25GaXJzdExvZ2luOiBzdHJpbmcgPSBcIlBsZWFzZSBjb21wbGV0ZSB0aGUgZmllbGRzIGJlbG93IHRvIGZpbmlzaCBhY2NvdW50IGNyZWF0aW9uLlwiO1xuXHQgcHVibGljIHN0YXRpYyBvblRvb01hbnlBdHRlbXB0czogc3RyaW5nID0gXCJUb28gbWFueSBhdHRlbXB0cy4gUGxlYXNlIHRyeSBhZ2FpbiBpbiAxNSBtaW51dGVzLlwiO1xuXHQgcHVibGljIHN0YXRpYyBvblBhc3N3b3JkVXBkYXRlZDogc3RyaW5nID0gXCJZb3VyIHBhc3N3b3JkIGhhcyBiZWVuIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbEVtYWlsOiBzdHJpbmcgPSBcIkVtYWlsIEFkZHJlc3NcIjtcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxQYXNzd29yZDogc3RyaW5nID0gXCJQYXNzd29yZFwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbEZvcmdvdFBhc3N3b3JkOiBzdHJpbmcgPSBcIkZvcmdvdCBQYXNzd29yZFwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbE5ld1Bhc3N3b3JkOiBzdHJpbmcgPSBcIk5ldyBQYXNzd29yZFwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbEN1cnJlbnRQYXNzd29yZDogc3RyaW5nID0gXCJDdXJyZW50IFBhc3N3b3JkXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsQ29uZmlybU5ld1Bhc3N3b3JkOiBzdHJpbmcgPSBcIkNvbmZpcm0gTmV3IFBhc3N3b3JkXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsU3VibWl0OiBzdHJpbmcgPSBcIlN1Ym1pdFwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbENvZGU6IHN0cmluZyA9IFwiQ29kZVwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbENsb3NlOiBzdHJpbmcgPSBcIkNsb3NlXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsVXNlUmVndWxhclBhc3N3b3JkOiBzdHJpbmcgPSBcIlVzZSBTdGFuZGFyZCBQYXNzd29yZFwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbE90cDogc3RyaW5nID0gXCJFbWFpbCBtZSBhIE9uZSBUaW1lIFBhc3N3b3JkIChPVFApXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsT3RwRW50ZXI6IHN0cmluZyA9IFwiRW50ZXIgdGhlIGNvZGUgdGhhdCB3YXMganVzdCBlbWFpbGVkIHRvIHlvdS5cIjtcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxNYWdpY0xpbms6IHN0cmluZyA9IFwiRW1haWwgbWUgYSBtYWdpYyBsaW5rXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsUGFzc2tleXM6IHN0cmluZyA9IFwiVXNlIGEgcGFzc2tleVwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbFBhc3NrZXlFbnRlcjogc3RyaW5nID0gXCJFbnRlciB0aGUgY29kZSB0aGF0IHdhcyBqdXN0IGVtYWlsZWQgdG8geW91LlwiXG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsUGFzc3dvcmRSZXF1aXJlbWVudDogc3RyaW5nID0gXCJNdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycyBhbmQgY29udGFpbiBhIG51bWJlciwgc3BlY2lhbCBjaGFyYWN0ZXIsIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlci5cIjtcbn1cblxuXG5leHBvcnQgY2xhc3MgRXBoZW1lcmFsU3RvcmFnZSB7XG5cdHByaXZhdGUgX2NhY2hlOiBhbnkgPSB7fTtcblxuXHRnZXRJdGVtKGtleTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5fY2FjaGVba2V5XTtcblx0fVxuXG5cdHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOnN0cmluZyB7XG5cdFx0dGhpcy5fY2FjaGVba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLmdldEl0ZW0oa2V5KTtcblx0fVxuXG5cdHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpIHtcblx0XHRkZWxldGUgdGhpcy5fY2FjaGVba2V5XTtcblx0fVxuXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuX2NhY2hlPSB7fTtcblx0fVxufSJdfQ==
|
|
@@ -20,13 +20,16 @@ export class CognitoService {
|
|
|
20
20
|
this.formSource = new BehaviorSubject(null);
|
|
21
21
|
this.form$ = this.formSource.asObservable();
|
|
22
22
|
this.user = null;
|
|
23
|
+
this.storage = new EphemeralStorage();
|
|
24
|
+
this.useLocalStorage = true;
|
|
23
25
|
}
|
|
24
|
-
initialize(UserPoolId, ClientId, useLocalStorage, idToken, accessToken, refreshToken) {
|
|
26
|
+
initialize(UserPoolId, ClientId, useLocalStorage = true, idToken, accessToken, refreshToken) {
|
|
25
27
|
//for federated users
|
|
26
28
|
const access = params("access_token") ?? accessToken ?? localStorage.getItem("ems_access_token") ?? null;
|
|
27
29
|
const id = params("id_token") ?? idToken ?? localStorage.getItem("ems_id_token") ?? null;
|
|
28
30
|
const sessionId = params("sessionId") ?? null;
|
|
29
31
|
const otp = params("otp") ?? null;
|
|
32
|
+
this.useLocalStorage = useLocalStorage;
|
|
30
33
|
if (useLocalStorage && access && id) {
|
|
31
34
|
localStorage.setItem("ems_access_token", access);
|
|
32
35
|
localStorage.setItem("ems_id_token", id);
|
|
@@ -46,16 +49,13 @@ export class CognitoService {
|
|
|
46
49
|
}
|
|
47
50
|
}
|
|
48
51
|
setCognitoUserFromToken(UserPoolId, ClientId, idToken, accessToken, refreshToken) {
|
|
49
|
-
|
|
50
|
-
const Storage = new EphemeralStorage();
|
|
51
|
-
this.pool = new CognitoUserPool({ UserPoolId, ClientId, Storage });
|
|
52
|
+
this.pool = new CognitoUserPool({ UserPoolId, ClientId, Storage: this.storage });
|
|
52
53
|
if (idToken) {
|
|
53
54
|
const decoded = jwtDecode(idToken);
|
|
54
|
-
console.log(decoded);
|
|
55
55
|
this.user = new CognitoUser({
|
|
56
56
|
Username: decoded['cognito:username'],
|
|
57
57
|
Pool: this.pool,
|
|
58
|
-
Storage
|
|
58
|
+
Storage: this.storage
|
|
59
59
|
});
|
|
60
60
|
const idTokenObj = new CognitoIdToken({ IdToken: idToken });
|
|
61
61
|
const accessTokenObj = new CognitoAccessToken({ AccessToken: accessToken });
|
|
@@ -76,6 +76,8 @@ export class CognitoService {
|
|
|
76
76
|
const request = ChallengeResponse ? CognitoRequestType.MagicLink : CognitoRequestType.Authentication;
|
|
77
77
|
const details = new AuthenticationDetails({ Username });
|
|
78
78
|
const data = { Username, Pool: this.pool };
|
|
79
|
+
if (!this.useLocalStorage)
|
|
80
|
+
data.Storage = this.storage;
|
|
79
81
|
const user = this.user = this.user ?? new CognitoUser(data);
|
|
80
82
|
this.user.setAuthenticationFlowType('CUSTOM_AUTH');
|
|
81
83
|
//@ts-ignore
|
|
@@ -103,6 +105,8 @@ export class CognitoService {
|
|
|
103
105
|
const request = ChallengeResponse ? CognitoRequestType.Passkey : CognitoRequestType.Authentication;
|
|
104
106
|
const details = new AuthenticationDetails({ Username });
|
|
105
107
|
const data = { Username, Pool: this.pool };
|
|
108
|
+
if (!this.useLocalStorage)
|
|
109
|
+
data.Storage = this.storage;
|
|
106
110
|
const user = this.user = this.user ?? new CognitoUser(data);
|
|
107
111
|
this.user.setAuthenticationFlowType('CUSTOM_AUTH');
|
|
108
112
|
return new Promise(async (resolve, reject) => {
|
|
@@ -125,6 +129,8 @@ export class CognitoService {
|
|
|
125
129
|
const request = ChallengeResponse ? CognitoRequestType.OtpChallenge : CognitoRequestType.Authentication;
|
|
126
130
|
const details = new AuthenticationDetails({ Username });
|
|
127
131
|
const data = { Username, Pool: this.pool };
|
|
132
|
+
if (!this.useLocalStorage)
|
|
133
|
+
data.Storage = this.storage;
|
|
128
134
|
const user = this.user = this.user ?? new CognitoUser(data);
|
|
129
135
|
this.user.setAuthenticationFlowType('CUSTOM_AUTH');
|
|
130
136
|
return new Promise(async (resolve, reject) => {
|
|
@@ -192,6 +198,8 @@ export class CognitoService {
|
|
|
192
198
|
authenticate(Username, Password) {
|
|
193
199
|
const details = new AuthenticationDetails({ Username, Password });
|
|
194
200
|
const data = { Username, Pool: this.pool };
|
|
201
|
+
if (!this.useLocalStorage)
|
|
202
|
+
data.Storage = this.storage;
|
|
195
203
|
const user = new CognitoUser(data);
|
|
196
204
|
return new Promise((resolve, reject) => {
|
|
197
205
|
if (!this.user)
|
|
@@ -207,6 +215,8 @@ export class CognitoService {
|
|
|
207
215
|
});
|
|
208
216
|
const Username = session.getIdToken().payload["cognito:username"];
|
|
209
217
|
const data = { Username, Pool: this.pool };
|
|
218
|
+
if (!this.useLocalStorage)
|
|
219
|
+
data.Storage = this.storage;
|
|
210
220
|
this.user = new CognitoUser(data);
|
|
211
221
|
this.userSource.next(this.user);
|
|
212
222
|
this.sessionSource.next(session);
|
|
@@ -227,6 +237,8 @@ export class CognitoService {
|
|
|
227
237
|
}
|
|
228
238
|
requestVerificationCode(Username) {
|
|
229
239
|
const data = { Username, Pool: this.pool };
|
|
240
|
+
if (!this.useLocalStorage)
|
|
241
|
+
data.Storage = this.storage;
|
|
230
242
|
const user = new CognitoUser(data);
|
|
231
243
|
return this.forgotPassword(user);
|
|
232
244
|
}
|
|
@@ -304,4 +316,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
|
|
|
304
316
|
providedIn: 'root'
|
|
305
317
|
}]
|
|
306
318
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsV0FBVyxFQUE0RCxNQUFNLHNCQUFzQixDQUFDO0FBQ3pILE9BQU8sRUFBdUIsZUFBZSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQWMsR0FBRyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTyw0QkFBNEIsQ0FBQztBQUUvSyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUt2QyxNQUFNLE9BQU8sY0FBYztJQWtCekIsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQWhCNUIsa0JBQWEsR0FBK0MsSUFBSSxlQUFlLENBQTRCLElBQUksQ0FBQyxDQUFDO1FBQ2xILGFBQVEsR0FBMEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVuRixlQUFVLEdBQXdDLElBQUksZUFBZSxDQUFxQixJQUFJLENBQUMsQ0FBQztRQUNqRyxVQUFLLEdBQW1DLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7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QU8sR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUM7UUFDbEQsSUFBSSxDQUFDLElBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFZLEVBQUUsT0FBYSxFQUFFLEVBQUU7WUFDcEQsSUFBRyxLQUFLO2dCQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUNwRztnQkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUMxRjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQXdCO1FBQ2pELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTyxPQUFPLENBQUMsU0FBYyxFQUFFO1FBQzlCLE1BQU0sT0FBTyxHQUFHO1lBQ1YsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDdkUsQ0FBQztRQUNMLE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7MkdBbFVVLGNBQWM7K0dBQWQsY0FBYyxjQUZiLE1BQU07MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIHRocm93RXJyb3IsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHRhcCwgdGFrZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0ICdjcm9zcy1mZXRjaC9wb2x5ZmlsbCc7XG5pbXBvcnQgeyBDb2duaXRvVXNlciwgQ29nbml0b1VzZXJQb29sLCBDb2duaXRvVXNlclNlc3Npb24sIENvZ25pdG9JZFRva2VuLCBDb2duaXRvQWNjZXNzVG9rZW4sIENvZ25pdG9SZWZyZXNoVG9rZW4sIEF1dGhlbnRpY2F0aW9uRGV0YWlscyB9ICBmcm9tICdhbWF6b24tY29nbml0by1pZGVudGl0eS1qcyc7XG5pbXBvcnQgeyBJQ29nbml0b1Jlc3BvbnNlLCBJQ29nbml0b1VzZXJEYXRhIH0gZnJvbSBcIi4vY29nbml0by5pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBDb2duaXRvUmVzcG9uc2VUeXBlLCBDb2duaXRvUmVxdWVzdFR5cGUsIENvZ25pdG9Gb3JtVHlwZSB9IGZyb20gXCIuL2NvZ25pdG8udHlwZXNcIjtcbmltcG9ydCB7IEVwaGVtZXJhbFN0b3JhZ2UgfSBmcm9tIFwiLi9jb2duaXRvLmNsYXNzZXNcIjtcbmltcG9ydCB7IHBhcmFtcyB9IGZyb20gXCIuL2NvZ25pdG8udXRpbHNcIjtcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvZ25pdG9TZXJ2aWNlIHtcblxuICBwcml2YXRlIHNlc3Npb25Tb3VyY2U6IEJlaGF2aW9yU3ViamVjdDxDb2duaXRvVXNlclNlc3Npb24gfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29nbml0b1VzZXJTZXNzaW9uIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyBzZXNzaW9uJDogT2JzZXJ2YWJsZTxDb2duaXRvVXNlclNlc3Npb24gfCBudWxsPiA9IHRoaXMuc2Vzc2lvblNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHVzZXJTb3VyY2U6IEJlaGF2aW9yU3ViamVjdDxDb2duaXRvVXNlciB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDb2duaXRvVXNlciB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgdXNlciQ6IE9ic2VydmFibGU8Q29nbml0b1VzZXIgfCBudWxsPiA9IHRoaXMudXNlclNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIGZvcm1Tb3VyY2U6IEJlaGF2aW9yU3ViamVjdDxDb2duaXRvRm9ybVR5cGUgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29nbml0b0Zvcm1UeXBlIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyBmb3JtJDogT2JzZXJ2YWJsZTxDb2duaXRvRm9ybVR5cGUgfCBudWxsPiA9IHRoaXMuZm9ybVNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuXG4gIHByaXZhdGUgdXNlcjogQ29nbml0b1VzZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb29sITogQ29nbml0b1VzZXJQb29sO1xuXG4gIHByaXZhdGUgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIHByaXZhdGUgaWRUb2tlbj86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcblxuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoVXNlclBvb2xJZDogc3RyaW5nLCBDbGllbnRJZDogc3RyaW5nLCB1c2VMb2NhbFN0b3JhZ2U/OiBib29sZWFuLCBpZFRva2VuPzogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZywgcmVmcmVzaFRva2VuPzogc3RyaW5nICkge1xuXG4gICAgLy9mb3IgZmVkZXJhdGVkIHVzZXJzXG4gICAgY29uc3QgYWNjZXNzID0gcGFyYW1zKFwiYWNjZXNzX3Rva2VuXCIpID8/IGFjY2Vzc1Rva2VuID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZW1zX2FjY2Vzc190b2tlblwiKSA/PyBudWxsO1xuICAgIGNvbnN0IGlkID0gcGFyYW1zKFwiaWRfdG9rZW5cIikgPz8gaWRUb2tlbiA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImVtc19pZF90b2tlblwiKSA/PyBudWxsO1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHBhcmFtcyhcInNlc3Npb25JZFwiKSA/PyBudWxsO1xuICAgIGNvbnN0IG90cCA9IHBhcmFtcyhcIm90cFwiKSA/PyBudWxsO1xuXG4gICAgaWYodXNlTG9jYWxTdG9yYWdlICYmIGFjY2VzcyAmJiBpZCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlbXNfYWNjZXNzX3Rva2VuXCIsIGFjY2Vzcyk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVtc19pZF90b2tlblwiLCBpZCk7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IFwiXCI7XG4gICAgfSBcblxuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBhY2Nlc3M7XG4gICAgdGhpcy5pZFRva2VuID0gaWQ7XG5cbiAgICAvL2ZvciBzcnAgdXNlcnNcbiAgICBpZih1c2VMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHRoaXMucG9vbCA9IG5ldyBDb2duaXRvVXNlclBvb2woeyBVc2VyUG9vbElkLCBDbGllbnRJZCB9KTtcbiAgICAgIHRoaXMudXNlciA9IHRoaXMucG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgdGhpcy51c2VyU291cmNlLm5leHQodGhpcy51c2VyKTtcbiAgICAgIHRoaXMudXNlcj8uZ2V0U2Vzc2lvbigoZTogRXJyb3IsIHNlc3Npb246IG51bGwpID0+IHRoaXMuc2Vzc2lvblNvdXJjZS5uZXh0KHNlc3Npb24pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRDb2duaXRvVXNlckZyb21Ub2tlbihVc2VyUG9vbElkLCBDbGllbnRJZCwgaWRUb2tlbiwgYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbik7XG4gICAgfVxuICAgIFxuICB9XG5cbiAgcHVibGljIHNldENvZ25pdG9Vc2VyRnJvbVRva2VuIChVc2VyUG9vbElkOiBzdHJpbmcsIENsaWVudElkOiBzdHJpbmcsIGlkVG9rZW4/OiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nLCByZWZyZXNoVG9rZW4/OiBzdHJpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwidXNpbmcgZXBoZW1lcmFsIHN0b3JhZ2VcIik7XG5cbiAgICAgIGNvbnN0IFN0b3JhZ2UgPSBuZXcgRXBoZW1lcmFsU3RvcmFnZSgpO1xuICAgICAgdGhpcy5wb29sID0gbmV3IENvZ25pdG9Vc2VyUG9vbCh7IFVzZXJQb29sSWQsIENsaWVudElkLCBTdG9yYWdlIH0pO1xuICAgICAgXG4gICAgICBpZihpZFRva2VuKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQ6IGFueSA9IGp3dERlY29kZShpZFRva2VuKTtcbiAgICAgICAgY29uc29sZS5sb2coZGVjb2RlZCk7XG4gICAgICAgIHRoaXMudXNlciA9IG5ldyBDb2duaXRvVXNlcih7XG4gICAgICAgICAgICBVc2VybmFtZTogZGVjb2RlZFsnY29nbml0bzp1c2VybmFtZSddLFxuICAgICAgICAgICAgUG9vbDogdGhpcy5wb29sLCBcbiAgICAgICAgICAgIFN0b3JhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaWRUb2tlbk9iaiA9IG5ldyBDb2duaXRvSWRUb2tlbih7IElkVG9rZW46IGlkVG9rZW4gfSk7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuT2JqID0gbmV3IENvZ25pdG9BY2Nlc3NUb2tlbih7IEFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbiEgfSk7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbk9iaiA9IG5ldyBDb2duaXRvUmVmcmVzaFRva2VuKHsgUmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4hIH0pO1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV3IENvZ25pdG9Vc2VyU2Vzc2lvbih7IElkVG9rZW46IGlkVG9rZW5PYmosIEFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbk9iaiwgUmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW5PYmogfSk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBzZXNzaW9uIHRvIHRoZSBDb2duaXRvIHVzZXJcbiAgICAgICAgdGhpcy51c2VyLnNldFNpZ25JblVzZXJTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXNlciA9IHRoaXMucG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dCh0aGlzLnVzZXIpO1xuICAgICAgdGhpcy51c2VyPy5nZXRTZXNzaW9uKChlOiBFcnJvciwgc2Vzc2lvbjogbnVsbCkgPT4gdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbikpO1xuICAgICAgcmV0dXJuIHRoaXMudXNlcjtcbiAgfTtcblxuICBwdWJsaWMgbWFnaWNMaW5rQXV0aGVudGljYXRlKFVzZXJuYW1lOiBzdHJpbmcsIENoYWxsZW5nZVJlc3BvbnNlPzogc3RyaW5nLCBTZXNzaW9uSWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ2hhbGxlbmdlUmVzcG9uc2UgPyBDb2duaXRvUmVxdWVzdFR5cGUuTWFnaWNMaW5rIDogQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uO1xuICAgIGNvbnN0IGRldGFpbHMgPSBuZXcgQXV0aGVudGljYXRpb25EZXRhaWxzKHsgVXNlcm5hbWUgfSk7XG4gICAgY29uc3QgZGF0YSA9IHsgVXNlcm5hbWUsIFBvb2w6IHRoaXMucG9vbCB9O1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIgPSB0aGlzLnVzZXIgPz8gbmV3IENvZ25pdG9Vc2VyKGRhdGEpO1xuICAgIHRoaXMudXNlci5zZXRBdXRoZW50aWNhdGlvbkZsb3dUeXBlKCdDVVNUT01fQVVUSCcpO1xuXG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYoU2Vzc2lvbklkKSB0aGlzLnVzZXIuU2Vzc2lvbiA9IFNlc3Npb25JZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyggcmVzb2x2ZTogKHJlc3VsdDogYW55KSA9PnZvaWQsIHJlamVjdDogKHJlc3VsdDogYW55KSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0ge1xuICAgICAgICBvblN1Y2Nlc3M6IChzZXNzaW9uOiBDb2duaXRvVXNlclNlc3Npb24pID0+IHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25Tb3VyY2UubmV4dChzZXNzaW9uKTtcbiAgICAgICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dCh0aGlzLnVzZXIpO1xuICAgICAgICAgIHJlc29sdmUoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLkF1dGhlbnRpY2F0ZWQsIHNlc3Npb24sIHVzZXIsIHJlcXVlc3QgfSlcbiAgICAgICAgfSxcbiAgICAgICAgb25GYWlsdXJlOiAoZXJyb3I6IGFueSk9PiByZWplY3QoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLk5vdEF1dGhvcml6ZWQsIGVycm9yLCB1c2VyLCByZXF1ZXN0LCBzZXNzaW9uOiBudWxsIH0pLFxuICAgICAgICBjdXN0b21DaGFsbGVuZ2U6IChjaGFsbGVuZ2VQYXJhbWV0ZXJzOiBhbnkpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5NYWdpY0xpbmssIHVzZXIsIHJlcXVlc3QsIGNoYWxsZW5nZVBhcmFtZXRlcnMgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGlmKENoYWxsZW5nZVJlc3BvbnNlKSB1c2VyLnNlbmRDdXN0b21DaGFsbGVuZ2VBbnN3ZXIoQ2hhbGxlbmdlUmVzcG9uc2UsIGhhbmRsZXIpO1xuICAgICAgZWxzZSB1c2VyLmluaXRpYXRlQXV0aChkZXRhaWxzLCBoYW5kbGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBwYXNza2V5QXV0aGVudGljYXRlKFVzZXJuYW1lOiBzdHJpbmcsIENoYWxsZW5nZVJlc3BvbnNlPzogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IENoYWxsZW5nZVJlc3BvbnNlID8gQ29nbml0b1JlcXVlc3RUeXBlLlBhc3NrZXkgOiBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb247XG4gICAgY29uc3QgZGV0YWlscyA9IG5ldyBBdXRoZW50aWNhdGlvbkRldGFpbHMoeyBVc2VybmFtZSB9KTtcbiAgICBjb25zdCBkYXRhID0geyBVc2VybmFtZSwgUG9vbDogdGhpcy5wb29sIH07XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlciA9IHRoaXMudXNlciA/PyBuZXcgQ29nbml0b1VzZXIoZGF0YSk7XG4gICAgdGhpcy51c2VyLnNldEF1dGhlbnRpY2F0aW9uRmxvd1R5cGUoJ0NVU1RPTV9BVVRIJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoIHJlc29sdmU6IChyZXN1bHQ6IGFueSkgPT52b2lkLCByZWplY3Q6IChyZXN1bHQ6IGFueSkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHtcbiAgICAgICAgb25TdWNjZXNzOiAoc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbik7XG4gICAgICAgICAgdGhpcy51c2VyU291cmNlLm5leHQodGhpcy51c2VyKTtcbiAgICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyLCByZXF1ZXN0IH0pXG4gICAgICAgIH0sXG4gICAgICAgIG9uRmFpbHVyZTogKGVycm9yOiBhbnkpPT4gcmVqZWN0KHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5Ob3RBdXRob3JpemVkLCBlcnJvciwgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KSxcbiAgICAgICAgY3VzdG9tQ2hhbGxlbmdlOiAoY2hhbGxlbmdlUGFyYW1ldGVyczogYW55KSA9PiByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5QYXNza2V5LCB1c2VyLCByZXF1ZXN0LCBjaGFsbGVuZ2VQYXJhbWV0ZXJzIH0pXG4gICAgICB9O1xuICAgICAgXG4gICAgICBpZihDaGFsbGVuZ2VSZXNwb25zZSkgdXNlci5zZW5kQ3VzdG9tQ2hhbGxlbmdlQW5zd2VyKENoYWxsZW5nZVJlc3BvbnNlLCBoYW5kbGVyKTtcbiAgICAgIGVsc2UgdXNlci5pbml0aWF0ZUF1dGgoZGV0YWlscywgaGFuZGxlcik7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb3RwQXV0aGVudGljYXRlKFVzZXJuYW1lOiBzdHJpbmcsIENoYWxsZW5nZVJlc3BvbnNlPzogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IENoYWxsZW5nZVJlc3BvbnNlID8gQ29nbml0b1JlcXVlc3RUeXBlLk90cENoYWxsZW5nZSA6IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbjtcbiAgICBjb25zdCBkZXRhaWxzID0gbmV3IEF1dGhlbnRpY2F0aW9uRGV0YWlscyh7IFVzZXJuYW1lIH0pO1xuICAgIGNvbnN0IGRhdGEgPSB7IFVzZXJuYW1lLCBQb29sOiB0aGlzLnBvb2wgfTtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyID0gdGhpcy51c2VyID8/IG5ldyBDb2duaXRvVXNlcihkYXRhKTtcbiAgICB0aGlzLnVzZXIuc2V0QXV0aGVudGljYXRpb25GbG93VHlwZSgnQ1VTVE9NX0FVVEgnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyggcmVzb2x2ZTogKHJlc3VsdDogYW55KSA9PnZvaWQsIHJlamVjdDogKHJlc3VsdDogYW55KSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0ge1xuICAgICAgICBvblN1Y2Nlc3M6IChzZXNzaW9uOiBDb2duaXRvVXNlclNlc3Npb24pID0+IHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25Tb3VyY2UubmV4dChzZXNzaW9uKTtcbiAgICAgICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dCh0aGlzLnVzZXIpO1xuICAgICAgICAgIHJlc29sdmUoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLkF1dGhlbnRpY2F0ZWQsIHNlc3Npb24sIHVzZXIsIHJlcXVlc3QgfSlcbiAgICAgICAgfSxcbiAgICAgICAgb25GYWlsdXJlOiAoZXJyb3I6IGFueSk9PiByZWplY3QoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLk5vdEF1dGhvcml6ZWQsIGVycm9yLCB1c2VyLCByZXF1ZXN0LCBzZXNzaW9uOiBudWxsIH0pLFxuICAgICAgICBjdXN0b21DaGFsbGVuZ2U6IChjaGFsbGVuZ2VQYXJhbWV0ZXJzOiBhbnkpID0+IHJlc29sdmUoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLk90cENoYWxsZW5nZSwgdXNlciwgcmVxdWVzdCwgY2hhbGxlbmdlUGFyYW1ldGVycyB9KVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgaWYoQ2hhbGxlbmdlUmVzcG9uc2UpIHVzZXIuc2VuZEN1c3RvbUNoYWxsZW5nZUFuc3dlcihDaGFsbGVuZ2VSZXNwb25zZSwgaGFuZGxlcik7XG4gICAgICBlbHNlIHVzZXIuaW5pdGlhdGVBdXRoKGRldGFpbHMsIGhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVzZXJJbmZvKHVybDogc3RyaW5nKTogUHJvbWlzZTxJQ29nbml0b1VzZXJEYXRhIHwgSHR0cEVycm9yUmVzcG9uc2UgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gYCR7dXJsfS9vYXV0aDIvdXNlckluZm9gXG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMuaGVhZGVycygpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQocmVxdWVzdCwgeyBoZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSApLnBpcGUoXG4gICAgICAgIG1hcCgocmVzdWx0OiBhbnkpID0+IFxuICAgICAgICAgIHsgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtYWlsOiByZXN1bHQuZW1haWwsXG4gICAgICAgICAgICB1c2VybmFtZTogcmVzdWx0LnVzZXJuYW1lLFxuICAgICAgICAgICAgc3ViOiByZXN1bHQuc3ViLFxuICAgICAgICAgICAgZmlyc3ROYW1lOiByZXN1bHQuZ2l2ZW5fbmFtZSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiByZXN1bHQuZmFtaWx5X25hbWUsXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5hY2Nlc3NUb2tlbiEsXG4gICAgICAgICAgICBpZFRva2VuOiB0aGlzLmlkVG9rZW4hXG4gICAgICAgICAgfX1cbiAgICAgICAgKVxuICAgICApLnRvUHJvbWlzZSgpO1xuXG4gICAgLy8sIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvclF1aWV0bHkpXG4gIH1cblxuICBwdWJsaWMgc2V0VXNlclNlc3Npb24oc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKSB7XG4gICAgdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbik7XG4gIH1cblxuICBwdWJsaWMgc2hvd0Zvcm0oZm9ybTogQ29nbml0b0Zvcm1UeXBlIHwgbnVsbCkge1xuICAgIHRoaXMuZm9ybVNvdXJjZS5uZXh0KGZvcm0pO1xuICB9XG5cbiAgcHVibGljIGxvZ291dCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IChyZXN1bHQ6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVzdWx0OiBhbnkpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmKHRoaXMudXNlcikge1xuICAgICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uU291cmNlLm5leHQobnVsbCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiZW1zX2lkX3Rva2VuXCIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImVtc19hY2Nlc3NfdG9rZW5cIik7XG4gICAgICAgIHRoaXMudXNlci5nbG9iYWxTaWduT3V0KHtcbiAgICAgICAgICBvblN1Y2Nlc3M6IHJlc29sdmUsXG4gICAgICAgICAgb25GYWlsdXJlOiAoKSA9PiB7XG4gICAgICAgICAgICAvL2lmIHVzZXIgaXMgZGlzYWJsZWQsIG11c3QgbWFudWFsbHkgY2xlYXIgbG9jYWwgc3RvcmFnZSAoYXBwYXJlbnRseSlcbiAgICAgICAgICAgIGZvcihsZXQgcHJvcCBpbiBsb2NhbFN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgaWYocHJvcC5tYXRjaCgvY29nbml0by9pKSkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0ocHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICB9XG5cbiAgcHVibGljIGF1dGhlbnRpY2F0ZShVc2VybmFtZTogc3RyaW5nLCBQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxJQ29nbml0b1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgZGV0YWlscyA9IG5ldyBBdXRoZW50aWNhdGlvbkRldGFpbHMoeyBVc2VybmFtZSwgUGFzc3dvcmR9KTtcbiAgICBjb25zdCBkYXRhID0geyBVc2VybmFtZSwgUG9vbDogdGhpcy5wb29sIH07XG4gICAgY29uc3QgdXNlciA9IG5ldyBDb2duaXRvVXNlcihkYXRhKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IChyZXN1bHQ6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVzdWx0OiBhbnkpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYoIXRoaXMudXNlcikgdGhpcy5hdXRoZW50aWNhdGVVc2VyKHVzZXIsIGRldGFpbHMsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIGVsc2UgdGhpcy5nZXRVc2VyU2Vzc2lvbihyZXNvbHZlLCByZWplY3QpXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRmVkZXJhdGVkU2Vzc2lvbihJZFRva2VuOiBzdHJpbmcsIEFjY2Vzc1Rva2VuOiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgQ29nbml0b1VzZXJTZXNzaW9uKHtcbiAgICAgICAgICBJZFRva2VuOiBuZXcgQ29nbml0b0lkVG9rZW4oeyBJZFRva2VuIH0pLFxuICAgICAgICAgIEFjY2Vzc1Rva2VuOiBuZXcgQ29nbml0b0FjY2Vzc1Rva2VuKHsgQWNjZXNzVG9rZW4gfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBVc2VybmFtZSA9IHNlc3Npb24uZ2V0SWRUb2tlbigpLnBheWxvYWRbXCJjb2duaXRvOnVzZXJuYW1lXCJdO1xuICAgIGNvbnN0IGRhdGEgPSB7IFVzZXJuYW1lLCBQb29sOiB0aGlzLnBvb2wgfTtcbiAgICB0aGlzLnVzZXIgPSBuZXcgQ29nbml0b1VzZXIoZGF0YSk7XG4gICAgdGhpcy51c2VyU291cmNlLm5leHQodGhpcy51c2VyKTtcbiAgICB0aGlzLnNlc3Npb25Tb3VyY2UubmV4dChzZXNzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBjb21wbGV0ZVBhc3N3b3JkVXBkYXRlKHBhc3N3b3JkOiBzdHJpbmcsIHVzZXI6IENvZ25pdG9Vc2VyLCBhdHRyaWJ1dGVzOiBhbnkpOiBQcm9taXNlPElDb2duaXRvUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ29nbml0b1JlcXVlc3RUeXBlLk5ld1VzZXJQYXNzd29yZFJlc2V0O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCwgcmVqZWN0OiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkKSA9PiB7XG4gICAgICB1c2VyLmNvbXBsZXRlTmV3UGFzc3dvcmRDaGFsbGVuZ2UocGFzc3dvcmQsIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dCh1c2VyKTtcbiAgICAgICAgICB0aGlzLnNlc3Npb25Tb3VyY2UubmV4dChzZXNzaW9uKTtcbiAgICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyLCByZXF1ZXN0OiBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb24gfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRmFpbHVyZTogKGVycm9yOiBhbnkpID0+IHJlamVjdCh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuTm90QXV0aG9yaXplZCwgZXJyb3IsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSlcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUoVXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8SUNvZ25pdG9SZXNwb25zZT4ge1xuICAgIGNvbnN0IGRhdGEgPSB7IFVzZXJuYW1lLCBQb29sOiB0aGlzLnBvb2wgfTtcbiAgICBjb25zdCB1c2VyID0gbmV3IENvZ25pdG9Vc2VyKGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmZvcmdvdFBhc3N3b3JkKHVzZXIpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UGFzc3dvcmQodXNlcjogQ29nbml0b1VzZXIsIG9sZFBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPElDb2duaXRvUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ29nbml0b1JlcXVlc3RUeXBlLlBhc3N3b3JkUmVzZXQ7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkLCByZWplY3Q6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQpID0+IHtcbiAgICAgICB1c2VyLmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCwgKGVycm9yLCByZXN1bHQpID0+IHtcbiAgICAgICAgIGlmKGVycm9yKSByZWplY3QoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLkxpbWl0RXhjZWVkZWRFeGNlcHRpb24sIHVzZXIsIHJlcXVlc3QsIGVycm9yLCBzZXNzaW9uOiBudWxsfSk7XG4gICAgICAgICBlbHNlIHJlc29sdmUoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLlN1Y2Nlc3MsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSk7XG4gICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBmb3Jnb3RQYXNzd29yZCh1c2VyOiBDb2duaXRvVXNlcik6IFByb21pc2U8SUNvZ25pdG9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBDb2duaXRvUmVxdWVzdFR5cGUuRm9yZ290UGFzc3dvcmQ7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkLCByZWplY3Q6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQpID0+IHtcbiAgICAgICB1c2VyLmZvcmdvdFBhc3N3b3JkKHtcbiAgICAgICAgIG9uU3VjY2VzczogKHJlc3BvbnNlOiBhbnkpID0+IHJlc29sdmUoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLlN1Y2Nlc3MsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSksXG4gICAgICAgICBvbkZhaWx1cmU6IChlcnJvcjogYW55KSA9PiByZWplY3QoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLkxpbWl0RXhjZWVkZWRFeGNlcHRpb24sIGVycm9yLCB1c2VyLCByZXF1ZXN0LCBzZXNzaW9uOiBudWxsIH0pXG4gICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maXJtUGFzc3dvcmQodXNlcjogQ29nbml0b1VzZXIsIGNvZGU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8SUNvZ25pdG9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBDb2duaXRvUmVxdWVzdFR5cGUuQ29uZmlybVBhc3N3b3JkO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCwgcmVqZWN0OiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgdXNlci5jb25maXJtUGFzc3dvcmQoY29kZSwgcGFzc3dvcmQsIHtcbiAgICAgICAgIG9uU3VjY2VzczogKHJlc3BvbnNlOiBhbnkpID0+IHsgcmVzb2x2ZSh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuU3VjY2VzcywgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KSB9LFxuICAgICAgICAgb25GYWlsdXJlOiAoZXJyb3I6IGFueSkgPT4gcmVqZWN0KHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5JbnZhbGlkQ29kZSwgZXJyb3IsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSlcbiAgICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRoZW50aWNhdGVVc2VyKHVzZXI6IENvZ25pdG9Vc2VyLCBkZXRhaWxzOiBBdXRoZW50aWNhdGlvbkRldGFpbHMsIHJlc29sdmU6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQsIHJlamVjdDogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCApIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uO1xuICAgIHVzZXIuYXV0aGVudGljYXRlVXNlcihkZXRhaWxzLCB7XG4gICAgICAgIG9uU3VjY2VzczogKHNlc3Npb246IENvZ25pdG9Vc2VyU2Vzc2lvbikgPT4ge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvblNvdXJjZS5uZXh0KHNlc3Npb24pO1xuICAgICAgICAgIHRoaXMudXNlclNvdXJjZS5uZXh0KHVzZXIpO1xuICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7XG4gICAgICAgICAgcmVzb2x2ZSh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuQXV0aGVudGljYXRlZCwgc2Vzc2lvbiwgdXNlciwgcmVxdWVzdCB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25GYWlsdXJlOiAoZXJyb3I6IGFueSkgPT4gcmVqZWN0KHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5Ob3RBdXRob3JpemVkLCBlcnJvciwgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KSxcbiAgICAgICAgbmV3UGFzc3dvcmRSZXF1aXJlZDogKHVzZXJBdHRyaWJ1dGVzLCByZXF1aXJlZEF0dHJpYnV0ZXMpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHt0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLlBhc3N3b3JkUmVzZXQsIHVzZXJBdHRyaWJ1dGVzLCByZXF1aXJlZEF0dHJpYnV0ZXMsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSlcbiAgICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyU2Vzc2lvbihyZXNvbHZlOiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkLCByZWplY3Q6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uO1xuICAgIHRoaXMudXNlciEuZ2V0U2Vzc2lvbigoZXJyb3I6IEVycm9yLCBzZXNzaW9uOiBudWxsKSA9PiB7XG4gICAgICBpZihlcnJvcikgcmVqZWN0KHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyOiB0aGlzLnVzZXIhLCByZXF1ZXN0LCBlcnJvciB9KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnNlc3Npb25Tb3VyY2UubmV4dChzZXNzaW9uKTtcbiAgICAgICAgcmVzb2x2ZSh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuQXV0aGVudGljYXRlZCwgc2Vzc2lvbiwgdXNlcjogdGhpcy51c2VyISwgcmVxdWVzdCB9KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvclF1aWV0bHkoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIG9mKGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgaGVhZGVycyhjdXN0b206IGFueSA9IHt9KSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHsgXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IHRoaXMuYWNjZXNzVG9rZW4gPyBgQmVhcmVyICR7dGhpcy5hY2Nlc3NUb2tlbn1gIDogXCJcIlxuICAgICAgIH07XG4gICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyhoZWFkZXJzKTtcbiAgfVxufVxuIl19
|
|
319
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsV0FBVyxFQUE0RCxNQUFNLHNCQUFzQixDQUFDO0FBQ3pILE9BQU8sRUFBdUIsZUFBZSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQWMsR0FBRyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTyw0QkFBNEIsQ0FBQztBQUUvSyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUt2QyxNQUFNLE9BQU8sY0FBYztJQW9CekIsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQWxCNUIsa0JBQWEsR0FBK0MsSUFBSSxlQUFlLENBQTRCLElBQUksQ0FBQyxDQUFDO1FBQ2xILGFBQVEsR0FBMEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVuRixlQUFVLEdBQXdDLElBQUksZUFBZSxDQUFxQixJQUFJLENBQUMsQ0FBQztRQUNqRyxVQUFLLEdBQW1DLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7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LENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUF3QjtRQUNqRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRU8sT0FBTyxDQUFDLFNBQWMsRUFBRTtRQUM5QixNQUFNLE9BQU8sR0FBRztZQUNWLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ3ZFLENBQUM7UUFDTCxPQUFPLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7OzJHQXhVVSxjQUFjOytHQUFkLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cFJlcXVlc3QsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCB0aHJvd0Vycm9yLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCB0YXAsIHRha2UgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCAnY3Jvc3MtZmV0Y2gvcG9seWZpbGwnO1xuaW1wb3J0IHsgQ29nbml0b1VzZXIsIENvZ25pdG9Vc2VyUG9vbCwgQ29nbml0b1VzZXJTZXNzaW9uLCBDb2duaXRvSWRUb2tlbiwgQ29nbml0b0FjY2Vzc1Rva2VuLCBDb2duaXRvUmVmcmVzaFRva2VuLCBBdXRoZW50aWNhdGlvbkRldGFpbHMgfSAgZnJvbSAnYW1hem9uLWNvZ25pdG8taWRlbnRpdHktanMnO1xuaW1wb3J0IHsgSUNvZ25pdG9SZXNwb25zZSwgSUNvZ25pdG9Vc2VyRGF0YSB9IGZyb20gXCIuL2NvZ25pdG8uaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQ29nbml0b1Jlc3BvbnNlVHlwZSwgQ29nbml0b1JlcXVlc3RUeXBlLCBDb2duaXRvRm9ybVR5cGUgfSBmcm9tIFwiLi9jb2duaXRvLnR5cGVzXCI7XG5pbXBvcnQgeyBFcGhlbWVyYWxTdG9yYWdlIH0gZnJvbSBcIi4vY29nbml0by5jbGFzc2VzXCI7XG5pbXBvcnQgeyBwYXJhbXMgfSBmcm9tIFwiLi9jb2duaXRvLnV0aWxzXCI7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb2duaXRvU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBzZXNzaW9uU291cmNlOiBCZWhhdmlvclN1YmplY3Q8Q29nbml0b1VzZXJTZXNzaW9uIHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvZ25pdG9Vc2VyU2Vzc2lvbiB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgc2Vzc2lvbiQ6IE9ic2VydmFibGU8Q29nbml0b1VzZXJTZXNzaW9uIHwgbnVsbD4gPSB0aGlzLnNlc3Npb25Tb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSB1c2VyU291cmNlOiBCZWhhdmlvclN1YmplY3Q8Q29nbml0b1VzZXIgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29nbml0b1VzZXIgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHVzZXIkOiBPYnNlcnZhYmxlPENvZ25pdG9Vc2VyIHwgbnVsbD4gPSB0aGlzLnVzZXJTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBmb3JtU291cmNlOiBCZWhhdmlvclN1YmplY3Q8Q29nbml0b0Zvcm1UeXBlIHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvZ25pdG9Gb3JtVHlwZSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgZm9ybSQ6IE9ic2VydmFibGU8Q29nbml0b0Zvcm1UeXBlIHwgbnVsbD4gPSB0aGlzLmZvcm1Tb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cblxuICBwcml2YXRlIHVzZXI6IENvZ25pdG9Vc2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9vbCE6IENvZ25pdG9Vc2VyUG9vbDtcblxuICBwcml2YXRlIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICBwcml2YXRlIGlkVG9rZW4/OiBzdHJpbmc7XG4gIHByaXZhdGUgc3RvcmFnZTogRXBoZW1lcmFsU3RvcmFnZSA9IG5ldyBFcGhlbWVyYWxTdG9yYWdlKCk7XG4gIHByaXZhdGUgdXNlTG9jYWxTdG9yYWdlOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcblxuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoVXNlclBvb2xJZDogc3RyaW5nLCBDbGllbnRJZDogc3RyaW5nLCB1c2VMb2NhbFN0b3JhZ2U6IGJvb2xlYW4gPSB0cnVlLCBpZFRva2VuPzogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZywgcmVmcmVzaFRva2VuPzogc3RyaW5nICkge1xuXG4gICAgLy9mb3IgZmVkZXJhdGVkIHVzZXJzXG4gICAgY29uc3QgYWNjZXNzID0gcGFyYW1zKFwiYWNjZXNzX3Rva2VuXCIpID8/IGFjY2Vzc1Rva2VuID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZW1zX2FjY2Vzc190b2tlblwiKSA/PyBudWxsO1xuICAgIGNvbnN0IGlkID0gcGFyYW1zKFwiaWRfdG9rZW5cIikgPz8gaWRUb2tlbiA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImVtc19pZF90b2tlblwiKSA/PyBudWxsO1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHBhcmFtcyhcInNlc3Npb25JZFwiKSA/PyBudWxsO1xuICAgIGNvbnN0IG90cCA9IHBhcmFtcyhcIm90cFwiKSA/PyBudWxsO1xuXG4gICAgdGhpcy51c2VMb2NhbFN0b3JhZ2UgPSB1c2VMb2NhbFN0b3JhZ2U7XG5cbiAgICBpZih1c2VMb2NhbFN0b3JhZ2UgJiYgYWNjZXNzICYmIGlkKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVtc19hY2Nlc3NfdG9rZW5cIiwgYWNjZXNzKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZW1zX2lkX3Rva2VuXCIsIGlkKTtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gXCJcIjtcbiAgICB9IFxuXG4gICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2VzcztcbiAgICB0aGlzLmlkVG9rZW4gPSBpZDtcblxuICAgIC8vZm9yIHNycCB1c2Vyc1xuICAgIGlmKHVzZUxvY2FsU3RvcmFnZSkge1xuICAgICAgdGhpcy5wb29sID0gbmV3IENvZ25pdG9Vc2VyUG9vbCh7IFVzZXJQb29sSWQsIENsaWVudElkIH0pO1xuICAgICAgdGhpcy51c2VyID0gdGhpcy5wb29sLmdldEN1cnJlbnRVc2VyKCk7XG4gICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dCh0aGlzLnVzZXIpO1xuICAgICAgdGhpcy51c2VyPy5nZXRTZXNzaW9uKChlOiBFcnJvciwgc2Vzc2lvbjogbnVsbCkgPT4gdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldENvZ25pdG9Vc2VyRnJvbVRva2VuKFVzZXJQb29sSWQsIENsaWVudElkLCBpZFRva2VuLCBhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICB9XG4gICAgXG4gIH1cblxuICBwdWJsaWMgc2V0Q29nbml0b1VzZXJGcm9tVG9rZW4gKFVzZXJQb29sSWQ6IHN0cmluZywgQ2xpZW50SWQ6IHN0cmluZywgaWRUb2tlbj86IHN0cmluZywgYWNjZXNzVG9rZW4/OiBzdHJpbmcsIHJlZnJlc2hUb2tlbj86IHN0cmluZykge1xuICAgICAgdGhpcy5wb29sID0gbmV3IENvZ25pdG9Vc2VyUG9vbCh7IFVzZXJQb29sSWQsIENsaWVudElkLCBTdG9yYWdlOiB0aGlzLnN0b3JhZ2UgfSk7XG4gICAgICBcbiAgICAgIGlmKGlkVG9rZW4pIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZDogYW55ID0gand0RGVjb2RlKGlkVG9rZW4pO1xuICAgICAgICB0aGlzLnVzZXIgPSBuZXcgQ29nbml0b1VzZXIoe1xuICAgICAgICAgICAgVXNlcm5hbWU6IGRlY29kZWRbJ2NvZ25pdG86dXNlcm5hbWUnXSxcbiAgICAgICAgICAgIFBvb2w6IHRoaXMucG9vbCwgXG4gICAgICAgICAgICBTdG9yYWdlOiB0aGlzLnN0b3JhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaWRUb2tlbk9iaiA9IG5ldyBDb2duaXRvSWRUb2tlbih7IElkVG9rZW46IGlkVG9rZW4gfSk7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuT2JqID0gbmV3IENvZ25pdG9BY2Nlc3NUb2tlbih7IEFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbiEgfSk7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbk9iaiA9IG5ldyBDb2duaXRvUmVmcmVzaFRva2VuKHsgUmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4hIH0pO1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV3IENvZ25pdG9Vc2VyU2Vzc2lvbih7IElkVG9rZW46IGlkVG9rZW5PYmosIEFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbk9iaiwgUmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW5PYmogfSk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBzZXNzaW9uIHRvIHRoZSBDb2duaXRvIHVzZXJcbiAgICAgICAgdGhpcy51c2VyLnNldFNpZ25JblVzZXJTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXNlciA9IHRoaXMucG9vbC5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dCh0aGlzLnVzZXIpO1xuICAgICAgdGhpcy51c2VyPy5nZXRTZXNzaW9uKChlOiBFcnJvciwgc2Vzc2lvbjogbnVsbCkgPT4gdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbikpO1xuICAgICAgcmV0dXJuIHRoaXMudXNlcjtcbiAgfTtcblxuICBwdWJsaWMgbWFnaWNMaW5rQXV0aGVudGljYXRlKFVzZXJuYW1lOiBzdHJpbmcsIENoYWxsZW5nZVJlc3BvbnNlPzogc3RyaW5nLCBTZXNzaW9uSWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ2hhbGxlbmdlUmVzcG9uc2UgPyBDb2duaXRvUmVxdWVzdFR5cGUuTWFnaWNMaW5rIDogQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uO1xuICAgIGNvbnN0IGRldGFpbHMgPSBuZXcgQXV0aGVudGljYXRpb25EZXRhaWxzKHsgVXNlcm5hbWUgfSk7XG4gICAgY29uc3QgZGF0YTogYW55ID0geyBVc2VybmFtZSwgUG9vbDogdGhpcy5wb29sIH07XG4gICAgaWYoIXRoaXMudXNlTG9jYWxTdG9yYWdlKSBkYXRhLlN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2U7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlciA9IHRoaXMudXNlciA/PyBuZXcgQ29nbml0b1VzZXIoZGF0YSk7XG4gICAgdGhpcy51c2VyLnNldEF1dGhlbnRpY2F0aW9uRmxvd1R5cGUoJ0NVU1RPTV9BVVRIJyk7XG5cbiAgICAvL0B0cy1pZ25vcmVcbiAgICBpZihTZXNzaW9uSWQpIHRoaXMudXNlci5TZXNzaW9uID0gU2Vzc2lvbklkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKCByZXNvbHZlOiAocmVzdWx0OiBhbnkpID0+dm9pZCwgcmVqZWN0OiAocmVzdWx0OiBhbnkpID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgICAgIG9uU3VjY2VzczogKHNlc3Npb246IENvZ25pdG9Vc2VyU2Vzc2lvbikgPT4ge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvblNvdXJjZS5uZXh0KHNlc3Npb24pO1xuICAgICAgICAgIHRoaXMudXNlclNvdXJjZS5uZXh0KHRoaXMudXNlcik7XG4gICAgICAgICAgcmVzb2x2ZSh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuQXV0aGVudGljYXRlZCwgc2Vzc2lvbiwgdXNlciwgcmVxdWVzdCB9KVxuICAgICAgICB9LFxuICAgICAgICBvbkZhaWx1cmU6IChlcnJvcjogYW55KT0+IHJlamVjdCh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuTm90QXV0aG9yaXplZCwgZXJyb3IsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSksXG4gICAgICAgIGN1c3RvbUNoYWxsZW5nZTogKGNoYWxsZW5nZVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLk1hZ2ljTGluaywgdXNlciwgcmVxdWVzdCwgY2hhbGxlbmdlUGFyYW1ldGVycyB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgaWYoQ2hhbGxlbmdlUmVzcG9uc2UpIHVzZXIuc2VuZEN1c3RvbUNoYWxsZW5nZUFuc3dlcihDaGFsbGVuZ2VSZXNwb25zZSwgaGFuZGxlcik7XG4gICAgICBlbHNlIHVzZXIuaW5pdGlhdGVBdXRoKGRldGFpbHMsIGhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHBhc3NrZXlBdXRoZW50aWNhdGUoVXNlcm5hbWU6IHN0cmluZywgQ2hhbGxlbmdlUmVzcG9uc2U/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ2hhbGxlbmdlUmVzcG9uc2UgPyBDb2duaXRvUmVxdWVzdFR5cGUuUGFzc2tleSA6IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbjtcbiAgICBjb25zdCBkZXRhaWxzID0gbmV3IEF1dGhlbnRpY2F0aW9uRGV0YWlscyh7IFVzZXJuYW1lIH0pO1xuICAgIGNvbnN0IGRhdGE6YW55ID0geyBVc2VybmFtZSwgUG9vbDogdGhpcy5wb29sIH07XG4gICAgaWYoIXRoaXMudXNlTG9jYWxTdG9yYWdlKSBkYXRhLlN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2U7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlciA9IHRoaXMudXNlciA/PyBuZXcgQ29nbml0b1VzZXIoZGF0YSk7XG4gICAgdGhpcy51c2VyLnNldEF1dGhlbnRpY2F0aW9uRmxvd1R5cGUoJ0NVU1RPTV9BVVRIJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoIHJlc29sdmU6IChyZXN1bHQ6IGFueSkgPT52b2lkLCByZWplY3Q6IChyZXN1bHQ6IGFueSkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHtcbiAgICAgICAgb25TdWNjZXNzOiAoc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbik7XG4gICAgICAgICAgdGhpcy51c2VyU291cmNlLm5leHQodGhpcy51c2VyKTtcbiAgICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyLCByZXF1ZXN0IH0pXG4gICAgICAgIH0sXG4gICAgICAgIG9uRmFpbHVyZTogKGVycm9yOiBhbnkpPT4gcmVqZWN0KHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5Ob3RBdXRob3JpemVkLCBlcnJvciwgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KSxcbiAgICAgICAgY3VzdG9tQ2hhbGxlbmdlOiAoY2hhbGxlbmdlUGFyYW1ldGVyczogYW55KSA9PiByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5QYXNza2V5LCB1c2VyLCByZXF1ZXN0LCBjaGFsbGVuZ2VQYXJhbWV0ZXJzIH0pXG4gICAgICB9O1xuICAgICAgXG4gICAgICBpZihDaGFsbGVuZ2VSZXNwb25zZSkgdXNlci5zZW5kQ3VzdG9tQ2hhbGxlbmdlQW5zd2VyKENoYWxsZW5nZVJlc3BvbnNlLCBoYW5kbGVyKTtcbiAgICAgIGVsc2UgdXNlci5pbml0aWF0ZUF1dGgoZGV0YWlscywgaGFuZGxlcik7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb3RwQXV0aGVudGljYXRlKFVzZXJuYW1lOiBzdHJpbmcsIENoYWxsZW5nZVJlc3BvbnNlPzogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IENoYWxsZW5nZVJlc3BvbnNlID8gQ29nbml0b1JlcXVlc3RUeXBlLk90cENoYWxsZW5nZSA6IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbjtcbiAgICBjb25zdCBkZXRhaWxzID0gbmV3IEF1dGhlbnRpY2F0aW9uRGV0YWlscyh7IFVzZXJuYW1lIH0pO1xuICAgIGNvbnN0IGRhdGE6YW55ID0geyBVc2VybmFtZSwgUG9vbDogdGhpcy5wb29sIH07XG4gICAgaWYoIXRoaXMudXNlTG9jYWxTdG9yYWdlKSBkYXRhLlN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2U7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlciA9IHRoaXMudXNlciA/PyBuZXcgQ29nbml0b1VzZXIoZGF0YSk7XG4gICAgdGhpcy51c2VyLnNldEF1dGhlbnRpY2F0aW9uRmxvd1R5cGUoJ0NVU1RPTV9BVVRIJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoIHJlc29sdmU6IChyZXN1bHQ6IGFueSkgPT52b2lkLCByZWplY3Q6IChyZXN1bHQ6IGFueSkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHtcbiAgICAgICAgb25TdWNjZXNzOiAoc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbik7XG4gICAgICAgICAgdGhpcy51c2VyU291cmNlLm5leHQodGhpcy51c2VyKTtcbiAgICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyLCByZXF1ZXN0IH0pXG4gICAgICAgIH0sXG4gICAgICAgIG9uRmFpbHVyZTogKGVycm9yOiBhbnkpPT4gcmVqZWN0KHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5Ob3RBdXRob3JpemVkLCBlcnJvciwgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KSxcbiAgICAgICAgY3VzdG9tQ2hhbGxlbmdlOiAoY2hhbGxlbmdlUGFyYW1ldGVyczogYW55KSA9PiByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5PdHBDaGFsbGVuZ2UsIHVzZXIsIHJlcXVlc3QsIGNoYWxsZW5nZVBhcmFtZXRlcnMgfSlcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGlmKENoYWxsZW5nZVJlc3BvbnNlKSB1c2VyLnNlbmRDdXN0b21DaGFsbGVuZ2VBbnN3ZXIoQ2hhbGxlbmdlUmVzcG9uc2UsIGhhbmRsZXIpO1xuICAgICAgZWxzZSB1c2VyLmluaXRpYXRlQXV0aChkZXRhaWxzLCBoYW5kbGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVc2VySW5mbyh1cmw6IHN0cmluZyk6IFByb21pc2U8SUNvZ25pdG9Vc2VyRGF0YSB8IEh0dHBFcnJvclJlc3BvbnNlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGAke3VybH0vb2F1dGgyL3VzZXJJbmZvYFxuICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmhlYWRlcnMoKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHJlcXVlc3QsIHsgaGVhZGVycywgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0gKS5waXBlKFxuICAgICAgICBtYXAoKHJlc3VsdDogYW55KSA9PiBcbiAgICAgICAgICB7IHJldHVybiB7XG4gICAgICAgICAgICBlbWFpbDogcmVzdWx0LmVtYWlsLFxuICAgICAgICAgICAgdXNlcm5hbWU6IHJlc3VsdC51c2VybmFtZSxcbiAgICAgICAgICAgIHN1YjogcmVzdWx0LnN1YixcbiAgICAgICAgICAgIGZpcnN0TmFtZTogcmVzdWx0LmdpdmVuX25hbWUsXG4gICAgICAgICAgICBsYXN0TmFtZTogcmVzdWx0LmZhbWlseV9uYW1lLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRoaXMuYWNjZXNzVG9rZW4hLFxuICAgICAgICAgICAgaWRUb2tlbjogdGhpcy5pZFRva2VuIVxuICAgICAgICAgIH19XG4gICAgICAgIClcbiAgICAgKS50b1Byb21pc2UoKTtcblxuICAgIC8vLCBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3JRdWlldGx5KVxuICB9XG5cbiAgcHVibGljIHNldFVzZXJTZXNzaW9uKHNlc3Npb246IENvZ25pdG9Vc2VyU2Vzc2lvbikge1xuICAgIHRoaXMuc2Vzc2lvblNvdXJjZS5uZXh0KHNlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIHNob3dGb3JtKGZvcm06IENvZ25pdG9Gb3JtVHlwZSB8IG51bGwpIHtcbiAgICB0aGlzLmZvcm1Tb3VyY2UubmV4dChmb3JtKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2dvdXQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiAocmVzdWx0OiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlc3VsdDogYW55KSA9PiB2b2lkKSA9PiB7XG4gICAgICBpZih0aGlzLnVzZXIpIHtcbiAgICAgICAgdGhpcy51c2VyU291cmNlLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvblNvdXJjZS5uZXh0KG51bGwpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImVtc19pZF90b2tlblwiKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJlbXNfYWNjZXNzX3Rva2VuXCIpO1xuICAgICAgICB0aGlzLnVzZXIuZ2xvYmFsU2lnbk91dCh7XG4gICAgICAgICAgb25TdWNjZXNzOiByZXNvbHZlLFxuICAgICAgICAgIG9uRmFpbHVyZTogKCkgPT4ge1xuICAgICAgICAgICAgLy9pZiB1c2VyIGlzIGRpc2FibGVkLCBtdXN0IG1hbnVhbGx5IGNsZWFyIGxvY2FsIHN0b3JhZ2UgKGFwcGFyZW50bHkpXG4gICAgICAgICAgICBmb3IobGV0IHByb3AgaW4gbG9jYWxTdG9yYWdlKSB7XG4gICAgICAgICAgICAgIGlmKHByb3AubWF0Y2goL2NvZ25pdG8vaSkpIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgfVxuXG4gIHB1YmxpYyBhdXRoZW50aWNhdGUoVXNlcm5hbWU6IHN0cmluZywgUGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8SUNvZ25pdG9SZXNwb25zZT4ge1xuICAgIGNvbnN0IGRldGFpbHMgPSBuZXcgQXV0aGVudGljYXRpb25EZXRhaWxzKHsgVXNlcm5hbWUsIFBhc3N3b3JkfSk7XG4gICAgY29uc3QgZGF0YTphbnkgPSB7IFVzZXJuYW1lLCBQb29sOiB0aGlzLnBvb2wgfTtcbiAgICBpZighdGhpcy51c2VMb2NhbFN0b3JhZ2UpIGRhdGEuU3RvcmFnZSA9IHRoaXMuc3RvcmFnZTtcbiAgICBjb25zdCB1c2VyID0gbmV3IENvZ25pdG9Vc2VyKGRhdGEpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogKHJlc3VsdDogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZXN1bHQ6IGFueSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZighdGhpcy51c2VyKSB0aGlzLmF1dGhlbnRpY2F0ZVVzZXIodXNlciwgZGV0YWlscywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgZWxzZSB0aGlzLmdldFVzZXJTZXNzaW9uKHJlc29sdmUsIHJlamVjdClcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVGZWRlcmF0ZWRTZXNzaW9uKElkVG9rZW46IHN0cmluZywgQWNjZXNzVG9rZW46IHN0cmluZykge1xuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBDb2duaXRvVXNlclNlc3Npb24oe1xuICAgICAgICAgIElkVG9rZW46IG5ldyBDb2duaXRvSWRUb2tlbih7IElkVG9rZW4gfSksXG4gICAgICAgICAgQWNjZXNzVG9rZW46IG5ldyBDb2duaXRvQWNjZXNzVG9rZW4oeyBBY2Nlc3NUb2tlbiB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IFVzZXJuYW1lID0gc2Vzc2lvbi5nZXRJZFRva2VuKCkucGF5bG9hZFtcImNvZ25pdG86dXNlcm5hbWVcIl07XG4gICAgY29uc3QgZGF0YTphbnkgPSB7IFVzZXJuYW1lLCBQb29sOiB0aGlzLnBvb2wgfTtcbiAgICBpZighdGhpcy51c2VMb2NhbFN0b3JhZ2UpIGRhdGEuU3RvcmFnZSA9IHRoaXMuc3RvcmFnZTtcbiAgICB0aGlzLnVzZXIgPSBuZXcgQ29nbml0b1VzZXIoZGF0YSk7XG4gICAgdGhpcy51c2VyU291cmNlLm5leHQodGhpcy51c2VyKTtcbiAgICB0aGlzLnNlc3Npb25Tb3VyY2UubmV4dChzZXNzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBjb21wbGV0ZVBhc3N3b3JkVXBkYXRlKHBhc3N3b3JkOiBzdHJpbmcsIHVzZXI6IENvZ25pdG9Vc2VyLCBhdHRyaWJ1dGVzOiBhbnkpOiBQcm9taXNlPElDb2duaXRvUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gQ29nbml0b1JlcXVlc3RUeXBlLk5ld1VzZXJQYXNzd29yZFJlc2V0O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCwgcmVqZWN0OiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkKSA9PiB7XG4gICAgICB1c2VyLmNvbXBsZXRlTmV3UGFzc3dvcmRDaGFsbGVuZ2UocGFzc3dvcmQsIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgICB0aGlzLnVzZXJTb3VyY2UubmV4dCh1c2VyKTtcbiAgICAgICAgICB0aGlzLnNlc3Npb25Tb3VyY2UubmV4dChzZXNzaW9uKTtcbiAgICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyLCByZXF1ZXN0OiBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb24gfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRmFpbHVyZTogKGVycm9yOiBhbnkpID0+IHJlamVjdCh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuTm90QXV0aG9yaXplZCwgZXJyb3IsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSlcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUoVXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8SUNvZ25pdG9SZXNwb25zZT4ge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHsgVXNlcm5hbWUsIFBvb2w6IHRoaXMucG9vbCB9O1xuICAgIGlmKCF0aGlzLnVzZUxvY2FsU3RvcmFnZSkgZGF0YS5TdG9yYWdlID0gdGhpcy5zdG9yYWdlO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgQ29nbml0b1VzZXIoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuZm9yZ290UGFzc3dvcmQodXNlcik7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRQYXNzd29yZCh1c2VyOiBDb2duaXRvVXNlciwgb2xkUGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8SUNvZ25pdG9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBDb2duaXRvUmVxdWVzdFR5cGUuUGFzc3dvcmRSZXNldDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQsIHJlamVjdDogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCkgPT4ge1xuICAgICAgIHVzZXIuY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkLCAoZXJyb3IsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgaWYoZXJyb3IpIHJlamVjdCh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuTGltaXRFeGNlZWRlZEV4Y2VwdGlvbiwgdXNlciwgcmVxdWVzdCwgZXJyb3IsIHNlc3Npb246IG51bGx9KTtcbiAgICAgICAgIGVsc2UgcmVzb2x2ZSh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuU3VjY2VzcywgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KTtcbiAgICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZvcmdvdFBhc3N3b3JkKHVzZXI6IENvZ25pdG9Vc2VyKTogUHJvbWlzZTxJQ29nbml0b1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IENvZ25pdG9SZXF1ZXN0VHlwZS5Gb3Jnb3RQYXNzd29yZDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQsIHJlamVjdDogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCkgPT4ge1xuICAgICAgIHVzZXIuZm9yZ290UGFzc3dvcmQoe1xuICAgICAgICAgb25TdWNjZXNzOiAocmVzcG9uc2U6IGFueSkgPT4gcmVzb2x2ZSh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuU3VjY2VzcywgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KSxcbiAgICAgICAgIG9uRmFpbHVyZTogKGVycm9yOiBhbnkpID0+IHJlamVjdCh7IHR5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuTGltaXRFeGNlZWRlZEV4Y2VwdGlvbiwgZXJyb3IsIHVzZXIsIHJlcXVlc3QsIHNlc3Npb246IG51bGwgfSlcbiAgICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNvbmZpcm1QYXNzd29yZCh1c2VyOiBDb2duaXRvVXNlciwgY29kZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxJQ29nbml0b1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IENvZ25pdG9SZXF1ZXN0VHlwZS5Db25maXJtUGFzc3dvcmQ7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkLCByZWplY3Q6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQpID0+IHtcbiAgICAgICB1c2VyLmNvbmZpcm1QYXNzd29yZChjb2RlLCBwYXNzd29yZCwge1xuICAgICAgICAgb25TdWNjZXNzOiAocmVzcG9uc2U6IGFueSkgPT4geyByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5TdWNjZXNzLCB1c2VyLCByZXF1ZXN0LCBzZXNzaW9uOiBudWxsIH0pIH0sXG4gICAgICAgICBvbkZhaWx1cmU6IChlcnJvcjogYW55KSA9PiByZWplY3QoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLkludmFsaWRDb2RlLCBlcnJvciwgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KVxuICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGF1dGhlbnRpY2F0ZVVzZXIodXNlcjogQ29nbml0b1VzZXIsIGRldGFpbHM6IEF1dGhlbnRpY2F0aW9uRGV0YWlscywgcmVzb2x2ZTogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCwgcmVqZWN0OiAocmVzdWx0OiBJQ29nbml0b1Jlc3BvbnNlKSA9PiB2b2lkICkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb247XG4gICAgdXNlci5hdXRoZW50aWNhdGVVc2VyKGRldGFpbHMsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uU291cmNlLm5leHQoc2Vzc2lvbik7XG4gICAgICAgICAgdGhpcy51c2VyU291cmNlLm5leHQodXNlcik7XG4gICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyLCByZXF1ZXN0IH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkZhaWx1cmU6IChlcnJvcjogYW55KSA9PiByZWplY3QoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLk5vdEF1dGhvcml6ZWQsIGVycm9yLCB1c2VyLCByZXF1ZXN0LCBzZXNzaW9uOiBudWxsIH0pLFxuICAgICAgICBuZXdQYXNzd29yZFJlcXVpcmVkOiAodXNlckF0dHJpYnV0ZXMsIHJlcXVpcmVkQXR0cmlidXRlcykgPT4ge1xuICAgICAgICAgIHJlc29sdmUoe3R5cGU6IENvZ25pdG9SZXNwb25zZVR5cGUuUGFzc3dvcmRSZXNldCwgdXNlckF0dHJpYnV0ZXMsIHJlcXVpcmVkQXR0cmlidXRlcywgdXNlciwgcmVxdWVzdCwgc2Vzc2lvbjogbnVsbCB9KVxuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJTZXNzaW9uKHJlc29sdmU6IChyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UpID0+IHZvaWQsIHJlamVjdDogKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb247XG4gICAgdGhpcy51c2VyIS5nZXRTZXNzaW9uKChlcnJvcjogRXJyb3IsIHNlc3Npb246IG51bGwpID0+IHtcbiAgICAgIGlmKGVycm9yKSByZWplY3QoeyB0eXBlOiBDb2duaXRvUmVzcG9uc2VUeXBlLkF1dGhlbnRpY2F0ZWQsIHNlc3Npb24sIHVzZXI6IHRoaXMudXNlciEsIHJlcXVlc3QsIGVycm9yIH0pO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblNvdXJjZS5uZXh0KHNlc3Npb24pO1xuICAgICAgICByZXNvbHZlKHsgdHlwZTogQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkLCBzZXNzaW9uLCB1c2VyOiB0aGlzLnVzZXIhLCByZXF1ZXN0IH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yUXVpZXRseShlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gb2YoZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBoZWFkZXJzKGN1c3RvbTogYW55ID0ge30pIHtcbiAgICBjb25zdCBoZWFkZXJzID0geyBcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogdGhpcy5hY2Nlc3NUb2tlbiA/IGBCZWFyZXIgJHt0aGlzLmFjY2Vzc1Rva2VufWAgOiBcIlwiXG4gICAgICAgfTtcbiAgICByZXR1cm4gbmV3IEh0dHBIZWFkZXJzKGhlYWRlcnMpO1xuICB9XG59XG4iXX0=
|
|
@@ -80,21 +80,17 @@ class EphemeralStorage {
|
|
|
80
80
|
this._cache = {};
|
|
81
81
|
}
|
|
82
82
|
getItem(key) {
|
|
83
|
-
console.log(`getting: ${key}: ${this._cache[key]}`, this._cache);
|
|
84
83
|
return this._cache[key];
|
|
85
84
|
}
|
|
86
85
|
setItem(key, value) {
|
|
87
|
-
console.log(`setting: ${key}: ${value}`);
|
|
88
86
|
this._cache[key] = value;
|
|
89
87
|
return this.getItem(key);
|
|
90
88
|
}
|
|
91
89
|
removeItem(key) {
|
|
92
90
|
delete this._cache[key];
|
|
93
|
-
console.log(`deleting: ${key}`, this._cache);
|
|
94
91
|
}
|
|
95
92
|
clear() {
|
|
96
93
|
this._cache = {};
|
|
97
|
-
console.log(`clearing`, this._cache);
|
|
98
94
|
}
|
|
99
95
|
}
|
|
100
96
|
|
|
@@ -142,14 +138,17 @@ class CognitoService {
|
|
|
142
138
|
this.formSource = new BehaviorSubject(null);
|
|
143
139
|
this.form$ = this.formSource.asObservable();
|
|
144
140
|
this.user = null;
|
|
141
|
+
this.storage = new EphemeralStorage();
|
|
142
|
+
this.useLocalStorage = true;
|
|
145
143
|
}
|
|
146
|
-
initialize(UserPoolId, ClientId, useLocalStorage, idToken, accessToken, refreshToken) {
|
|
144
|
+
initialize(UserPoolId, ClientId, useLocalStorage = true, idToken, accessToken, refreshToken) {
|
|
147
145
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
148
146
|
//for federated users
|
|
149
147
|
const access = (_c = (_b = (_a = params("access_token")) !== null && _a !== void 0 ? _a : accessToken) !== null && _b !== void 0 ? _b : localStorage.getItem("ems_access_token")) !== null && _c !== void 0 ? _c : null;
|
|
150
148
|
const id = (_f = (_e = (_d = params("id_token")) !== null && _d !== void 0 ? _d : idToken) !== null && _e !== void 0 ? _e : localStorage.getItem("ems_id_token")) !== null && _f !== void 0 ? _f : null;
|
|
151
149
|
const sessionId = (_g = params("sessionId")) !== null && _g !== void 0 ? _g : null;
|
|
152
150
|
const otp = (_h = params("otp")) !== null && _h !== void 0 ? _h : null;
|
|
151
|
+
this.useLocalStorage = useLocalStorage;
|
|
153
152
|
if (useLocalStorage && access && id) {
|
|
154
153
|
localStorage.setItem("ems_access_token", access);
|
|
155
154
|
localStorage.setItem("ems_id_token", id);
|
|
@@ -170,16 +169,13 @@ class CognitoService {
|
|
|
170
169
|
}
|
|
171
170
|
setCognitoUserFromToken(UserPoolId, ClientId, idToken, accessToken, refreshToken) {
|
|
172
171
|
var _a;
|
|
173
|
-
|
|
174
|
-
const Storage = new EphemeralStorage();
|
|
175
|
-
this.pool = new CognitoUserPool({ UserPoolId, ClientId, Storage });
|
|
172
|
+
this.pool = new CognitoUserPool({ UserPoolId, ClientId, Storage: this.storage });
|
|
176
173
|
if (idToken) {
|
|
177
174
|
const decoded = jwtDecode(idToken);
|
|
178
|
-
console.log(decoded);
|
|
179
175
|
this.user = new CognitoUser({
|
|
180
176
|
Username: decoded['cognito:username'],
|
|
181
177
|
Pool: this.pool,
|
|
182
|
-
Storage
|
|
178
|
+
Storage: this.storage
|
|
183
179
|
});
|
|
184
180
|
const idTokenObj = new CognitoIdToken({ IdToken: idToken });
|
|
185
181
|
const accessTokenObj = new CognitoAccessToken({ AccessToken: accessToken });
|
|
@@ -201,6 +197,8 @@ class CognitoService {
|
|
|
201
197
|
const request = ChallengeResponse ? CognitoRequestType.MagicLink : CognitoRequestType.Authentication;
|
|
202
198
|
const details = new AuthenticationDetails({ Username });
|
|
203
199
|
const data = { Username, Pool: this.pool };
|
|
200
|
+
if (!this.useLocalStorage)
|
|
201
|
+
data.Storage = this.storage;
|
|
204
202
|
const user = this.user = (_a = this.user) !== null && _a !== void 0 ? _a : new CognitoUser(data);
|
|
205
203
|
this.user.setAuthenticationFlowType('CUSTOM_AUTH');
|
|
206
204
|
//@ts-ignore
|
|
@@ -229,6 +227,8 @@ class CognitoService {
|
|
|
229
227
|
const request = ChallengeResponse ? CognitoRequestType.Passkey : CognitoRequestType.Authentication;
|
|
230
228
|
const details = new AuthenticationDetails({ Username });
|
|
231
229
|
const data = { Username, Pool: this.pool };
|
|
230
|
+
if (!this.useLocalStorage)
|
|
231
|
+
data.Storage = this.storage;
|
|
232
232
|
const user = this.user = (_a = this.user) !== null && _a !== void 0 ? _a : new CognitoUser(data);
|
|
233
233
|
this.user.setAuthenticationFlowType('CUSTOM_AUTH');
|
|
234
234
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -252,6 +252,8 @@ class CognitoService {
|
|
|
252
252
|
const request = ChallengeResponse ? CognitoRequestType.OtpChallenge : CognitoRequestType.Authentication;
|
|
253
253
|
const details = new AuthenticationDetails({ Username });
|
|
254
254
|
const data = { Username, Pool: this.pool };
|
|
255
|
+
if (!this.useLocalStorage)
|
|
256
|
+
data.Storage = this.storage;
|
|
255
257
|
const user = this.user = (_a = this.user) !== null && _a !== void 0 ? _a : new CognitoUser(data);
|
|
256
258
|
this.user.setAuthenticationFlowType('CUSTOM_AUTH');
|
|
257
259
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -319,6 +321,8 @@ class CognitoService {
|
|
|
319
321
|
authenticate(Username, Password) {
|
|
320
322
|
const details = new AuthenticationDetails({ Username, Password });
|
|
321
323
|
const data = { Username, Pool: this.pool };
|
|
324
|
+
if (!this.useLocalStorage)
|
|
325
|
+
data.Storage = this.storage;
|
|
322
326
|
const user = new CognitoUser(data);
|
|
323
327
|
return new Promise((resolve, reject) => {
|
|
324
328
|
if (!this.user)
|
|
@@ -334,6 +338,8 @@ class CognitoService {
|
|
|
334
338
|
});
|
|
335
339
|
const Username = session.getIdToken().payload["cognito:username"];
|
|
336
340
|
const data = { Username, Pool: this.pool };
|
|
341
|
+
if (!this.useLocalStorage)
|
|
342
|
+
data.Storage = this.storage;
|
|
337
343
|
this.user = new CognitoUser(data);
|
|
338
344
|
this.userSource.next(this.user);
|
|
339
345
|
this.sessionSource.next(session);
|
|
@@ -354,6 +360,8 @@ class CognitoService {
|
|
|
354
360
|
}
|
|
355
361
|
requestVerificationCode(Username) {
|
|
356
362
|
const data = { Username, Pool: this.pool };
|
|
363
|
+
if (!this.useLocalStorage)
|
|
364
|
+
data.Storage = this.storage;
|
|
357
365
|
const user = new CognitoUser(data);
|
|
358
366
|
return this.forgotPassword(user);
|
|
359
367
|
}
|