@cloudbase/auth 3.0.0 → 3.0.1
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/dist/cjs/adapter.js +19 -16
- package/dist/cjs/index.d.ts +107 -33
- package/dist/cjs/index.js +1529 -428
- package/dist/cjs/type.d.ts +242 -0
- package/dist/cjs/type.js +3 -0
- package/dist/cjs/utils.d.ts +5 -0
- package/dist/cjs/utils.js +59 -0
- package/dist/esm/adapter.js +19 -16
- package/dist/esm/index.d.ts +107 -33
- package/dist/esm/index.js +1527 -426
- package/dist/esm/type.d.ts +242 -0
- package/dist/esm/type.js +2 -0
- package/dist/esm/utils.d.ts +5 -0
- package/dist/esm/utils.js +51 -0
- package/dist/miniprogram/index.js +1 -1
- package/package.json +6 -6
- package/src/adapter.ts +13 -8
- package/src/index.ts +1606 -363
- package/src/type.ts +306 -0
- package/src/utils.ts +69 -0
- package/tsconfig.json +1 -1
package/dist/esm/index.js
CHANGED
|
@@ -54,23 +54,28 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
54
54
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
|
-
|
|
57
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
58
|
+
var t = {};
|
|
59
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
60
|
+
t[p] = s[p];
|
|
61
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
62
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
63
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
64
|
+
t[p[i]] = s[p[i]];
|
|
65
|
+
}
|
|
66
|
+
return t;
|
|
67
|
+
};
|
|
68
|
+
import { CloudbaseOAuth, AUTH_API_PREFIX, LOGIN_STATE_CHANGED_TYPE, EVENTS, AUTH_STATE_CHANGED_TYPE, OAUTH_TYPE, weAppJwtDecodeAll, AuthError, authModels, } from '@cloudbase/oauth';
|
|
58
69
|
import { useAuthAdapter } from './adapter';
|
|
59
70
|
import { printWarn, throwError, ERRORS, COMMUNITY_SITE_URL, catchErrorsDecorator, CloudbaseEventEmitter, CloudbaseCache, adapterForWxMp, useDefaultAdapter, } from './utilities';
|
|
71
|
+
import { saveToBrowserSession, getBrowserSession, removeBrowserSession, addUrlSearch } from './utils';
|
|
72
|
+
import { utils } from '@cloudbase/utilities';
|
|
73
|
+
var isBrowser = function () { return typeof window !== 'undefined' && typeof document !== 'undefined'; };
|
|
60
74
|
var COMPONENT_NAME = 'auth';
|
|
61
|
-
var
|
|
62
|
-
SIGN_OUT: 'sign_out',
|
|
63
|
-
SIGN_IN: 'sign_in',
|
|
64
|
-
CREDENTIALS_ERROR: 'credentials_error',
|
|
65
|
-
};
|
|
66
|
-
var EVENTS = {
|
|
67
|
-
LOGIN_STATE_CHANGED: 'loginStateChanged',
|
|
68
|
-
};
|
|
69
|
-
var eventBus = new CloudbaseEventEmitter();
|
|
70
|
-
var onCredentialsError = function (params) {
|
|
75
|
+
var onCredentialsError = function (eventBus) { return function (params) {
|
|
71
76
|
eventBus.fire(EVENTS.LOGIN_STATE_CHANGED, __assign(__assign({}, params), { eventType: LOGIN_STATE_CHANGED_TYPE.CREDENTIALS_ERROR }));
|
|
72
|
-
};
|
|
73
|
-
var User = (function () {
|
|
77
|
+
}; };
|
|
78
|
+
export var User = (function () {
|
|
74
79
|
function User(options) {
|
|
75
80
|
var cache = options.cache, oauthInstance = options.oauthInstance;
|
|
76
81
|
this.cache = cache;
|
|
@@ -156,7 +161,9 @@ var User = (function () {
|
|
|
156
161
|
case 0: return [4, this.oauthInstance.authApi.updateUserBasicInfo(__assign({}, params))];
|
|
157
162
|
case 1:
|
|
158
163
|
_a.sent();
|
|
159
|
-
this.
|
|
164
|
+
return [4, this.refresh()];
|
|
165
|
+
case 2:
|
|
166
|
+
_a.sent();
|
|
160
167
|
return [2];
|
|
161
168
|
}
|
|
162
169
|
});
|
|
@@ -184,6 +191,10 @@ var User = (function () {
|
|
|
184
191
|
case 0: return [4, this.oauthInstance.authApi.getUserInfo(params)];
|
|
185
192
|
case 1:
|
|
186
193
|
newUserInfo = _a.sent();
|
|
194
|
+
if (newUserInfo.code === 'INVALID_ACCESS_TOKEN') {
|
|
195
|
+
this.setLocalUserInfo({});
|
|
196
|
+
throw newUserInfo;
|
|
197
|
+
}
|
|
187
198
|
this.setLocalUserInfo(newUserInfo);
|
|
188
199
|
return [2, newUserInfo];
|
|
189
200
|
}
|
|
@@ -193,8 +204,15 @@ var User = (function () {
|
|
|
193
204
|
User.prototype.getLocalUserInfo = function (key) {
|
|
194
205
|
var userInfoKey = this.cache.keys.userInfoKey;
|
|
195
206
|
var userInfo = this.cache.getStore(userInfoKey);
|
|
207
|
+
if (!key)
|
|
208
|
+
return userInfo || {};
|
|
196
209
|
return userInfo[key];
|
|
197
210
|
};
|
|
211
|
+
User.prototype.setLocalUserInfo = function (userInfo) {
|
|
212
|
+
var userInfoKey = this.cache.keys.userInfoKey;
|
|
213
|
+
this.cache.setStore(userInfoKey, userInfo);
|
|
214
|
+
this.setUserInfo();
|
|
215
|
+
};
|
|
198
216
|
User.prototype.getLocalUserInfoAsync = function (key) {
|
|
199
217
|
return __awaiter(this, void 0, void 0, function () {
|
|
200
218
|
var userInfoKey, userInfo;
|
|
@@ -229,15 +247,11 @@ var User = (function () {
|
|
|
229
247
|
'created_from',
|
|
230
248
|
'providers',
|
|
231
249
|
'username',
|
|
250
|
+
'created_at',
|
|
232
251
|
].forEach(function (infoKey) {
|
|
233
252
|
_this[infoKey] = userInfo[infoKey];
|
|
234
253
|
});
|
|
235
254
|
};
|
|
236
|
-
User.prototype.setLocalUserInfo = function (userInfo) {
|
|
237
|
-
var userInfoKey = this.cache.keys.userInfoKey;
|
|
238
|
-
this.cache.setStore(userInfoKey, userInfo);
|
|
239
|
-
this.setUserInfo();
|
|
240
|
-
};
|
|
241
255
|
__decorate([
|
|
242
256
|
catchErrorsDecorator({
|
|
243
257
|
title: '更新用户信息失败',
|
|
@@ -334,12 +348,13 @@ var LoginState = (function () {
|
|
|
334
348
|
export { LoginState };
|
|
335
349
|
var Auth = (function () {
|
|
336
350
|
function Auth(config) {
|
|
351
|
+
this.listeners = new Map();
|
|
352
|
+
this.hasListenerSetUp = false;
|
|
337
353
|
this.config = config;
|
|
338
|
-
this.cache = config.cache;
|
|
339
354
|
this.oauthInstance = config.oauthInstance;
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
355
|
+
this.cache = config.cache;
|
|
356
|
+
this.init();
|
|
357
|
+
this.setAccessKey();
|
|
343
358
|
}
|
|
344
359
|
Auth.prototype.bindPhoneNumber = function (params) {
|
|
345
360
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -375,7 +390,7 @@ var Auth = (function () {
|
|
|
375
390
|
Object.defineProperty(Auth.prototype, "currentUser", {
|
|
376
391
|
get: function () {
|
|
377
392
|
if (this.cache.mode === 'async') {
|
|
378
|
-
printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getCurrentUser
|
|
393
|
+
printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getCurrentUser instead');
|
|
379
394
|
return;
|
|
380
395
|
}
|
|
381
396
|
var loginState = this.hasLoginState();
|
|
@@ -389,35 +404,23 @@ var Auth = (function () {
|
|
|
389
404
|
});
|
|
390
405
|
Auth.prototype.getCurrentUser = function () {
|
|
391
406
|
return __awaiter(this, void 0, void 0, function () {
|
|
392
|
-
var loginState;
|
|
407
|
+
var loginState, userInfo;
|
|
393
408
|
return __generator(this, function (_a) {
|
|
394
409
|
switch (_a.label) {
|
|
395
410
|
case 0: return [4, this.getLoginState()];
|
|
396
411
|
case 1:
|
|
397
412
|
loginState = _a.sent();
|
|
398
413
|
if (!loginState) return [3, 3];
|
|
414
|
+
userInfo = loginState.user.getLocalUserInfo();
|
|
399
415
|
return [4, loginState.user.checkLocalInfoAsync()];
|
|
400
416
|
case 2:
|
|
401
417
|
_a.sent();
|
|
402
|
-
return [2, loginState.user
|
|
418
|
+
return [2, __assign(__assign({}, loginState.user), userInfo)];
|
|
403
419
|
case 3: return [2, null];
|
|
404
420
|
}
|
|
405
421
|
});
|
|
406
422
|
});
|
|
407
423
|
};
|
|
408
|
-
Auth.prototype.signInAnonymously = function (data) {
|
|
409
|
-
if (data === void 0) { data = {}; }
|
|
410
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
411
|
-
return __generator(this, function (_a) {
|
|
412
|
-
switch (_a.label) {
|
|
413
|
-
case 0: return [4, this.oauthInstance.authApi.signInAnonymously(data)];
|
|
414
|
-
case 1:
|
|
415
|
-
_a.sent();
|
|
416
|
-
return [2, this.createLoginState()];
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
});
|
|
420
|
-
};
|
|
421
424
|
Auth.prototype.signInAnonymouslyInWx = function (_a) {
|
|
422
425
|
var _b = _a === void 0 ? {} : _a, useWxCloud = _b.useWxCloud;
|
|
423
426
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -581,96 +584,9 @@ var Auth = (function () {
|
|
|
581
584
|
});
|
|
582
585
|
});
|
|
583
586
|
};
|
|
584
|
-
Auth.prototype.signInWithOpenId = function (_a) {
|
|
585
|
-
var _b = _a === void 0 ? {} : _a, _c = _b.useWxCloud, useWxCloud = _c === void 0 ? true : _c;
|
|
586
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
587
|
-
var wxInfo, mainFunc;
|
|
588
|
-
var _this = this;
|
|
589
|
-
return __generator(this, function (_d) {
|
|
590
|
-
switch (_d.label) {
|
|
591
|
-
case 0:
|
|
592
|
-
if (!adapterForWxMp.isMatch()) {
|
|
593
|
-
throw Error('wx api undefined');
|
|
594
|
-
}
|
|
595
|
-
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
596
|
-
mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
|
|
597
|
-
var result, credentials, error_5;
|
|
598
|
-
return __generator(this, function (_a) {
|
|
599
|
-
switch (_a.label) {
|
|
600
|
-
case 0:
|
|
601
|
-
result = undefined;
|
|
602
|
-
credentials = undefined;
|
|
603
|
-
_a.label = 1;
|
|
604
|
-
case 1:
|
|
605
|
-
_a.trys.push([1, 4, , 5]);
|
|
606
|
-
return [4, this.oauthInstance.authApi.grantProviderToken({
|
|
607
|
-
provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
608
|
-
provider_code: code,
|
|
609
|
-
provider_params: {
|
|
610
|
-
provider_code_type: 'open_id',
|
|
611
|
-
appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
612
|
-
},
|
|
613
|
-
}, useWxCloud)];
|
|
614
|
-
case 2:
|
|
615
|
-
result = _a.sent();
|
|
616
|
-
if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
|
|
617
|
-
throw result;
|
|
618
|
-
}
|
|
619
|
-
return [4, this.oauthInstance.authApi.signInWithProvider({ provider_token: result.provider_token }, useWxCloud)];
|
|
620
|
-
case 3:
|
|
621
|
-
credentials = _a.sent();
|
|
622
|
-
if (credentials === null || credentials === void 0 ? void 0 : credentials.error_code) {
|
|
623
|
-
throw credentials;
|
|
624
|
-
}
|
|
625
|
-
return [3, 5];
|
|
626
|
-
case 4:
|
|
627
|
-
error_5 = _a.sent();
|
|
628
|
-
throw error_5;
|
|
629
|
-
case 5: return [4, this.oauthInstance.oauth2client.setCredentials(credentials)];
|
|
630
|
-
case 6:
|
|
631
|
-
_a.sent();
|
|
632
|
-
return [2];
|
|
633
|
-
}
|
|
634
|
-
});
|
|
635
|
-
}); };
|
|
636
|
-
return [4, new Promise(function (resolve, reject) {
|
|
637
|
-
wx.login({
|
|
638
|
-
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
|
639
|
-
var error_6;
|
|
640
|
-
return __generator(this, function (_a) {
|
|
641
|
-
switch (_a.label) {
|
|
642
|
-
case 0:
|
|
643
|
-
_a.trys.push([0, 2, , 3]);
|
|
644
|
-
return [4, mainFunc(res.code)];
|
|
645
|
-
case 1:
|
|
646
|
-
_a.sent();
|
|
647
|
-
resolve(true);
|
|
648
|
-
return [3, 3];
|
|
649
|
-
case 2:
|
|
650
|
-
error_6 = _a.sent();
|
|
651
|
-
reject(error_6);
|
|
652
|
-
return [3, 3];
|
|
653
|
-
case 3: return [2];
|
|
654
|
-
}
|
|
655
|
-
});
|
|
656
|
-
}); },
|
|
657
|
-
fail: function (res) {
|
|
658
|
-
var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
|
|
659
|
-
error.code = res === null || res === void 0 ? void 0 : res.errno;
|
|
660
|
-
reject(error);
|
|
661
|
-
},
|
|
662
|
-
});
|
|
663
|
-
})];
|
|
664
|
-
case 1:
|
|
665
|
-
_d.sent();
|
|
666
|
-
return [2, this.createLoginState()];
|
|
667
|
-
}
|
|
668
|
-
});
|
|
669
|
-
});
|
|
670
|
-
};
|
|
671
587
|
Auth.prototype.signInWithUnionId = function () {
|
|
672
588
|
return __awaiter(this, void 0, void 0, function () {
|
|
673
|
-
var
|
|
589
|
+
var error_5;
|
|
674
590
|
var _this = this;
|
|
675
591
|
return __generator(this, function (_a) {
|
|
676
592
|
switch (_a.label) {
|
|
@@ -685,7 +601,7 @@ var Auth = (function () {
|
|
|
685
601
|
var wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
686
602
|
wx.login({
|
|
687
603
|
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
|
688
|
-
var providerId, result, providerToken, signInRes,
|
|
604
|
+
var providerId, result, providerToken, signInRes, error_6;
|
|
689
605
|
return __generator(this, function (_a) {
|
|
690
606
|
switch (_a.label) {
|
|
691
607
|
case 0:
|
|
@@ -721,8 +637,8 @@ var Auth = (function () {
|
|
|
721
637
|
resolve(true);
|
|
722
638
|
return [3, 5];
|
|
723
639
|
case 4:
|
|
724
|
-
|
|
725
|
-
reject(
|
|
640
|
+
error_6 = _a.sent();
|
|
641
|
+
reject(error_6);
|
|
726
642
|
return [3, 5];
|
|
727
643
|
case 5: return [2];
|
|
728
644
|
}
|
|
@@ -739,71 +655,13 @@ var Auth = (function () {
|
|
|
739
655
|
_a.sent();
|
|
740
656
|
return [3, 4];
|
|
741
657
|
case 3:
|
|
742
|
-
|
|
743
|
-
throw
|
|
658
|
+
error_5 = _a.sent();
|
|
659
|
+
throw error_5;
|
|
744
660
|
case 4: return [2, this.createLoginState()];
|
|
745
661
|
}
|
|
746
662
|
});
|
|
747
663
|
});
|
|
748
664
|
};
|
|
749
|
-
Auth.prototype.signInWithPhoneAuth = function (_a) {
|
|
750
|
-
var _b = _a.phoneCode, phoneCode = _b === void 0 ? '' : _b;
|
|
751
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
752
|
-
var wxInfo, providerInfo, code, providerToken, signInRes, error_9;
|
|
753
|
-
return __generator(this, function (_c) {
|
|
754
|
-
switch (_c.label) {
|
|
755
|
-
case 0:
|
|
756
|
-
if (!adapterForWxMp.isMatch()) {
|
|
757
|
-
throw Error('wx api undefined');
|
|
758
|
-
}
|
|
759
|
-
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
760
|
-
providerInfo = {
|
|
761
|
-
provider_params: { provider_code_type: 'phone' },
|
|
762
|
-
provider_id: wxInfo.appId,
|
|
763
|
-
};
|
|
764
|
-
return [4, wx.login()];
|
|
765
|
-
case 1:
|
|
766
|
-
code = (_c.sent()).code;
|
|
767
|
-
providerInfo.provider_code = code;
|
|
768
|
-
_c.label = 2;
|
|
769
|
-
case 2:
|
|
770
|
-
_c.trys.push([2, 6, , 7]);
|
|
771
|
-
return [4, this.oauthInstance.authApi.grantProviderToken(providerInfo)];
|
|
772
|
-
case 3:
|
|
773
|
-
providerToken = _c.sent();
|
|
774
|
-
if (providerToken.error_code) {
|
|
775
|
-
throw providerToken;
|
|
776
|
-
}
|
|
777
|
-
return [4, this.oauthInstance.authApi.patchProviderToken({
|
|
778
|
-
provider_token: providerToken.provider_token,
|
|
779
|
-
provider_id: wxInfo.appId,
|
|
780
|
-
provider_params: {
|
|
781
|
-
code: phoneCode,
|
|
782
|
-
provider_code_type: 'phone',
|
|
783
|
-
},
|
|
784
|
-
})];
|
|
785
|
-
case 4:
|
|
786
|
-
providerToken = _c.sent();
|
|
787
|
-
if (providerToken.error_code) {
|
|
788
|
-
throw providerToken;
|
|
789
|
-
}
|
|
790
|
-
return [4, this.oauthInstance.authApi.signInWithProvider({
|
|
791
|
-
provider_token: providerToken.provider_token,
|
|
792
|
-
})];
|
|
793
|
-
case 5:
|
|
794
|
-
signInRes = _c.sent();
|
|
795
|
-
if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
|
|
796
|
-
throw signInRes;
|
|
797
|
-
}
|
|
798
|
-
return [3, 7];
|
|
799
|
-
case 6:
|
|
800
|
-
error_9 = _c.sent();
|
|
801
|
-
throw error_9;
|
|
802
|
-
case 7: return [2, this.createLoginState()];
|
|
803
|
-
}
|
|
804
|
-
});
|
|
805
|
-
});
|
|
806
|
-
};
|
|
807
665
|
Auth.prototype.signInWithSms = function (_a) {
|
|
808
666
|
var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.phoneNum, phoneNum = _d === void 0 ? '' : _d, _e = _a.bindInfo, bindInfo = _e === void 0 ? undefined : _e;
|
|
809
667
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -847,18 +705,6 @@ var Auth = (function () {
|
|
|
847
705
|
Auth.prototype.setCustomSignFunc = function (getTickFn) {
|
|
848
706
|
this.oauthInstance.authApi.setCustomSignFunc(getTickFn);
|
|
849
707
|
};
|
|
850
|
-
Auth.prototype.signInWithCustomTicket = function () {
|
|
851
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
852
|
-
return __generator(this, function (_a) {
|
|
853
|
-
switch (_a.label) {
|
|
854
|
-
case 0: return [4, this.oauthInstance.authApi.signInWithCustomTicket()];
|
|
855
|
-
case 1:
|
|
856
|
-
_a.sent();
|
|
857
|
-
return [2, this.createLoginState()];
|
|
858
|
-
}
|
|
859
|
-
});
|
|
860
|
-
});
|
|
861
|
-
};
|
|
862
708
|
Auth.prototype.signIn = function (params) {
|
|
863
709
|
return __awaiter(this, void 0, void 0, function () {
|
|
864
710
|
return __generator(this, function (_a) {
|
|
@@ -871,18 +717,6 @@ var Auth = (function () {
|
|
|
871
717
|
});
|
|
872
718
|
});
|
|
873
719
|
};
|
|
874
|
-
Auth.prototype.signUp = function (params) {
|
|
875
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
876
|
-
return __generator(this, function (_a) {
|
|
877
|
-
switch (_a.label) {
|
|
878
|
-
case 0: return [4, this.oauthInstance.authApi.signUp(params)];
|
|
879
|
-
case 1:
|
|
880
|
-
_a.sent();
|
|
881
|
-
return [2, this.createLoginState()];
|
|
882
|
-
}
|
|
883
|
-
});
|
|
884
|
-
});
|
|
885
|
-
};
|
|
886
720
|
Auth.prototype.setPassword = function (params) {
|
|
887
721
|
return __awaiter(this, void 0, void 0, function () {
|
|
888
722
|
return __generator(this, function (_a) {
|
|
@@ -907,29 +741,10 @@ var Auth = (function () {
|
|
|
907
741
|
});
|
|
908
742
|
});
|
|
909
743
|
};
|
|
910
|
-
Auth.prototype.signOut = function (params) {
|
|
911
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
912
|
-
var userInfoKey, res;
|
|
913
|
-
return __generator(this, function (_a) {
|
|
914
|
-
switch (_a.label) {
|
|
915
|
-
case 0:
|
|
916
|
-
userInfoKey = this.cache.keys.userInfoKey;
|
|
917
|
-
return [4, this.oauthInstance.authApi.signOut(params)];
|
|
918
|
-
case 1:
|
|
919
|
-
res = _a.sent();
|
|
920
|
-
return [4, this.cache.removeStoreAsync(userInfoKey)];
|
|
921
|
-
case 2:
|
|
922
|
-
_a.sent();
|
|
923
|
-
eventBus.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_OUT });
|
|
924
|
-
return [2, res];
|
|
925
|
-
}
|
|
926
|
-
});
|
|
927
|
-
});
|
|
928
|
-
};
|
|
929
744
|
Auth.prototype.hasLoginState = function () {
|
|
930
745
|
var _a;
|
|
931
746
|
if (this.cache.mode === 'async') {
|
|
932
|
-
printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getLoginState
|
|
747
|
+
printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getLoginState instead');
|
|
933
748
|
return;
|
|
934
749
|
}
|
|
935
750
|
var oauthLoginState = (_a = this.oauthInstance) === null || _a === void 0 ? void 0 : _a.authApi.hasLoginStateSync();
|
|
@@ -945,7 +760,7 @@ var Auth = (function () {
|
|
|
945
760
|
};
|
|
946
761
|
Auth.prototype.getLoginState = function () {
|
|
947
762
|
return __awaiter(this, void 0, void 0, function () {
|
|
948
|
-
var oauthLoginState,
|
|
763
|
+
var oauthLoginState, error_7, loginState;
|
|
949
764
|
return __generator(this, function (_a) {
|
|
950
765
|
switch (_a.label) {
|
|
951
766
|
case 0:
|
|
@@ -958,7 +773,7 @@ var Auth = (function () {
|
|
|
958
773
|
oauthLoginState = _a.sent();
|
|
959
774
|
return [3, 4];
|
|
960
775
|
case 3:
|
|
961
|
-
|
|
776
|
+
error_7 = _a.sent();
|
|
962
777
|
return [2, null];
|
|
963
778
|
case 4:
|
|
964
779
|
if (oauthLoginState) {
|
|
@@ -974,10 +789,10 @@ var Auth = (function () {
|
|
|
974
789
|
});
|
|
975
790
|
});
|
|
976
791
|
};
|
|
977
|
-
Auth.prototype.getUserInfo = function (
|
|
792
|
+
Auth.prototype.getUserInfo = function () {
|
|
978
793
|
return __awaiter(this, void 0, void 0, function () {
|
|
979
794
|
return __generator(this, function (_a) {
|
|
980
|
-
return [2, this.
|
|
795
|
+
return [2, this.getCurrentUser()];
|
|
981
796
|
});
|
|
982
797
|
});
|
|
983
798
|
};
|
|
@@ -1148,13 +963,14 @@ var Auth = (function () {
|
|
|
1148
963
|
});
|
|
1149
964
|
};
|
|
1150
965
|
Auth.prototype.onLoginStateChanged = function (callback) {
|
|
966
|
+
var _a;
|
|
1151
967
|
return __awaiter(this, void 0, void 0, function () {
|
|
1152
968
|
var loginState;
|
|
1153
969
|
var _this = this;
|
|
1154
|
-
return __generator(this, function (
|
|
1155
|
-
switch (
|
|
970
|
+
return __generator(this, function (_b) {
|
|
971
|
+
switch (_b.label) {
|
|
1156
972
|
case 0:
|
|
1157
|
-
eventBus.on(EVENTS.LOGIN_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
|
|
973
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.on(EVENTS.LOGIN_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
|
|
1158
974
|
var loginState, _a;
|
|
1159
975
|
var _b;
|
|
1160
976
|
return __generator(this, function (_c) {
|
|
@@ -1177,7 +993,7 @@ var Auth = (function () {
|
|
|
1177
993
|
}); });
|
|
1178
994
|
return [4, this.getLoginState()];
|
|
1179
995
|
case 1:
|
|
1180
|
-
loginState =
|
|
996
|
+
loginState = _b.sent();
|
|
1181
997
|
callback.call(this, loginState);
|
|
1182
998
|
return [2];
|
|
1183
999
|
}
|
|
@@ -1266,57 +1082,10 @@ var Auth = (function () {
|
|
|
1266
1082
|
});
|
|
1267
1083
|
});
|
|
1268
1084
|
};
|
|
1269
|
-
Auth.prototype.toDefaultLoginPage = function (params) {
|
|
1270
|
-
if (params === void 0) { params = {}; }
|
|
1271
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1272
|
-
var configVersion, redirectUri, urlObj, loginPage;
|
|
1273
|
-
return __generator(this, function (_a) {
|
|
1274
|
-
configVersion = params.config_version || 'env';
|
|
1275
|
-
if (adapterForWxMp.isMatch()) {
|
|
1276
|
-
wx.navigateTo({ url: '/packages/$wd_system/pages/login/index' });
|
|
1277
|
-
}
|
|
1278
|
-
else {
|
|
1279
|
-
redirectUri = params.redirect_uri || window.location.href;
|
|
1280
|
-
urlObj = new URL(redirectUri);
|
|
1281
|
-
loginPage = "".concat(urlObj.origin, "/__auth/?app_id=").concat(params.app_id || '', "&env_id=").concat(this.config.env, "&client_id=").concat(this.config.clientId, "&config_version=").concat(configVersion, "&redirect_uri=").concat(encodeURIComponent(redirectUri));
|
|
1282
|
-
window.location.href = loginPage;
|
|
1283
|
-
}
|
|
1284
|
-
return [2];
|
|
1285
|
-
});
|
|
1286
|
-
});
|
|
1287
|
-
};
|
|
1288
|
-
Auth.prototype.createLoginState = function (params, options) {
|
|
1289
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1290
|
-
var loginState;
|
|
1291
|
-
return __generator(this, function (_a) {
|
|
1292
|
-
switch (_a.label) {
|
|
1293
|
-
case 0:
|
|
1294
|
-
loginState = new LoginState({
|
|
1295
|
-
envId: this.config.env,
|
|
1296
|
-
cache: this.cache,
|
|
1297
|
-
oauthInstance: this.oauthInstance,
|
|
1298
|
-
});
|
|
1299
|
-
return [4, loginState.checkLocalStateAsync()];
|
|
1300
|
-
case 1:
|
|
1301
|
-
_a.sent();
|
|
1302
|
-
if (!(options === null || options === void 0 ? void 0 : options.asyncRefreshUser)) return [3, 2];
|
|
1303
|
-
loginState.user.refresh(params);
|
|
1304
|
-
return [3, 4];
|
|
1305
|
-
case 2: return [4, loginState.user.refresh(params)];
|
|
1306
|
-
case 3:
|
|
1307
|
-
_a.sent();
|
|
1308
|
-
_a.label = 4;
|
|
1309
|
-
case 4:
|
|
1310
|
-
eventBus.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_IN });
|
|
1311
|
-
return [2, loginState];
|
|
1312
|
-
}
|
|
1313
|
-
});
|
|
1314
|
-
});
|
|
1315
|
-
};
|
|
1316
1085
|
Auth.prototype.signInWithUsername = function (_a) {
|
|
1317
1086
|
var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.username, rawUsername = _d === void 0 ? '' : _d, _e = _a.bindInfo, bindInfo = _e === void 0 ? undefined : _e, _f = _a.loginType, loginType = _f === void 0 ? '' : _f;
|
|
1318
1087
|
return __awaiter(this, void 0, void 0, function () {
|
|
1319
|
-
var verifyRes, verification_token, username, signUpParam, signInRes, bindRes, signUpRes,
|
|
1088
|
+
var verifyRes, verification_token, username, signUpParam, signInRes, bindRes, signUpRes, error_8;
|
|
1320
1089
|
return __generator(this, function (_g) {
|
|
1321
1090
|
switch (_g.label) {
|
|
1322
1091
|
case 0:
|
|
@@ -1331,7 +1100,7 @@ var Auth = (function () {
|
|
|
1331
1100
|
throw verifyRes;
|
|
1332
1101
|
}
|
|
1333
1102
|
verification_token = verifyRes.verification_token;
|
|
1334
|
-
username = "+86 ".concat(rawUsername);
|
|
1103
|
+
username = /^\+\d{1,3}\s+/.test(rawUsername) ? rawUsername : "+86 ".concat(rawUsername);
|
|
1335
1104
|
signUpParam = { phone_number: username };
|
|
1336
1105
|
if (loginType === 'email') {
|
|
1337
1106
|
username = rawUsername;
|
|
@@ -1367,21 +1136,1405 @@ var Auth = (function () {
|
|
|
1367
1136
|
_g.label = 7;
|
|
1368
1137
|
case 7: return [2, this.createLoginState()];
|
|
1369
1138
|
case 8:
|
|
1370
|
-
|
|
1371
|
-
throw
|
|
1139
|
+
error_8 = _g.sent();
|
|
1140
|
+
throw error_8;
|
|
1372
1141
|
case 9: return [2];
|
|
1373
1142
|
}
|
|
1374
1143
|
});
|
|
1375
1144
|
});
|
|
1376
1145
|
};
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1146
|
+
Auth.prototype.createLoginState = function (params, options) {
|
|
1147
|
+
var _a, _b;
|
|
1148
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1149
|
+
var loginState;
|
|
1150
|
+
return __generator(this, function (_c) {
|
|
1151
|
+
switch (_c.label) {
|
|
1152
|
+
case 0:
|
|
1153
|
+
loginState = new LoginState({
|
|
1154
|
+
envId: this.config.env,
|
|
1155
|
+
cache: this.cache,
|
|
1156
|
+
oauthInstance: this.oauthInstance,
|
|
1157
|
+
});
|
|
1158
|
+
return [4, loginState.checkLocalStateAsync()];
|
|
1159
|
+
case 1:
|
|
1160
|
+
_c.sent();
|
|
1161
|
+
if (!(options === null || options === void 0 ? void 0 : options.userInfo)) return [3, 2];
|
|
1162
|
+
loginState.user.setLocalUserInfo(options.userInfo);
|
|
1163
|
+
return [3, 5];
|
|
1164
|
+
case 2:
|
|
1165
|
+
if (!(options === null || options === void 0 ? void 0 : options.asyncRefreshUser)) return [3, 3];
|
|
1166
|
+
loginState.user.refresh(params);
|
|
1167
|
+
return [3, 5];
|
|
1168
|
+
case 3: return [4, loginState.user.refresh(params)];
|
|
1169
|
+
case 4:
|
|
1170
|
+
_c.sent();
|
|
1171
|
+
_c.label = 5;
|
|
1172
|
+
case 5:
|
|
1173
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_IN });
|
|
1174
|
+
(_b = this.config.eventBus) === null || _b === void 0 ? void 0 : _b.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
|
|
1175
|
+
return [2, loginState];
|
|
1176
|
+
}
|
|
1177
|
+
});
|
|
1178
|
+
});
|
|
1179
|
+
};
|
|
1180
|
+
Auth.prototype.setAccessKey = function () {
|
|
1181
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1182
|
+
return __generator(this, function (_a) {
|
|
1183
|
+
if (this.config.accessKey) {
|
|
1184
|
+
try {
|
|
1185
|
+
this.oauthInstance.oauth2client.setAccessKeyCredentials({
|
|
1186
|
+
access_token: this.config.accessKey,
|
|
1187
|
+
token_type: 'Bearer',
|
|
1188
|
+
scope: 'accessKey',
|
|
1189
|
+
expires_at: new Date(+new Date() + +new Date()),
|
|
1190
|
+
expires_in: +new Date() + +new Date(),
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
catch (error) {
|
|
1194
|
+
console.warn('accessKey error: ', error);
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
return [2];
|
|
1198
|
+
});
|
|
1199
|
+
});
|
|
1200
|
+
};
|
|
1201
|
+
Auth.prototype.signInAnonymously = function (params) {
|
|
1202
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1203
|
+
var loginState, _a, _b, session, error_9;
|
|
1204
|
+
return __generator(this, function (_c) {
|
|
1205
|
+
switch (_c.label) {
|
|
1206
|
+
case 0:
|
|
1207
|
+
_c.trys.push([0, 4, , 5]);
|
|
1208
|
+
return [4, this.oauthInstance.authApi.signInAnonymously(params)];
|
|
1209
|
+
case 1:
|
|
1210
|
+
_c.sent();
|
|
1211
|
+
return [4, this.createLoginState()];
|
|
1212
|
+
case 2:
|
|
1213
|
+
loginState = _c.sent();
|
|
1214
|
+
return [4, this.getSession()];
|
|
1215
|
+
case 3:
|
|
1216
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1217
|
+
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
1218
|
+
case 4:
|
|
1219
|
+
error_9 = _c.sent();
|
|
1220
|
+
return [2, { data: {}, error: new AuthError(error_9) }];
|
|
1221
|
+
case 5: return [2];
|
|
1222
|
+
}
|
|
1223
|
+
});
|
|
1224
|
+
});
|
|
1225
|
+
};
|
|
1226
|
+
Auth.prototype.signUp = function (params) {
|
|
1227
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1228
|
+
var verificationInfo_1, error_10;
|
|
1229
|
+
var _this = this;
|
|
1230
|
+
return __generator(this, function (_a) {
|
|
1231
|
+
switch (_a.label) {
|
|
1232
|
+
case 0:
|
|
1233
|
+
if (!(params.phone_number || params.verification_code || params.verification_token || params.provider_token)) return [3, 2];
|
|
1234
|
+
return [4, this.oauthInstance.authApi.signUp(params)];
|
|
1235
|
+
case 1:
|
|
1236
|
+
_a.sent();
|
|
1237
|
+
return [2, this.createLoginState()];
|
|
1238
|
+
case 2:
|
|
1239
|
+
_a.trys.push([2, 4, , 5]);
|
|
1240
|
+
this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
|
|
1241
|
+
return [4, this.getVerification(params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })];
|
|
1242
|
+
case 3:
|
|
1243
|
+
verificationInfo_1 = _a.sent();
|
|
1244
|
+
return [2, {
|
|
1245
|
+
data: {
|
|
1246
|
+
verifyOtp: function (_a) {
|
|
1247
|
+
var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_1.verification_id : _b;
|
|
1248
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
1249
|
+
var verificationTokenRes, data, _c, _d, session, error_11;
|
|
1250
|
+
return __generator(this, function (_e) {
|
|
1251
|
+
switch (_e.label) {
|
|
1252
|
+
case 0:
|
|
1253
|
+
_e.trys.push([0, 8, , 9]);
|
|
1254
|
+
return [4, this.verify({
|
|
1255
|
+
verification_id: messageId || verificationInfo_1.verification_id,
|
|
1256
|
+
verification_code: token,
|
|
1257
|
+
})];
|
|
1258
|
+
case 1:
|
|
1259
|
+
verificationTokenRes = _e.sent();
|
|
1260
|
+
if (!verificationInfo_1.is_user) return [3, 3];
|
|
1261
|
+
return [4, this.signIn({
|
|
1262
|
+
username: params.email || this.formatPhone(params.phone),
|
|
1263
|
+
verification_token: verificationTokenRes.verification_token,
|
|
1264
|
+
})];
|
|
1265
|
+
case 2:
|
|
1266
|
+
_e.sent();
|
|
1267
|
+
return [3, 6];
|
|
1268
|
+
case 3:
|
|
1269
|
+
data = JSON.parse(JSON.stringify(params));
|
|
1270
|
+
delete data.email;
|
|
1271
|
+
delete data.phone;
|
|
1272
|
+
return [4, this.oauthInstance.authApi.signUp(__assign(__assign(__assign({}, data), (params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })), { verification_token: verificationTokenRes.verification_token, verification_code: token }))];
|
|
1273
|
+
case 4:
|
|
1274
|
+
_e.sent();
|
|
1275
|
+
return [4, this.createLoginState()];
|
|
1276
|
+
case 5:
|
|
1277
|
+
_e.sent();
|
|
1278
|
+
_e.label = 6;
|
|
1279
|
+
case 6: return [4, this.getSession()];
|
|
1280
|
+
case 7:
|
|
1281
|
+
_c = (_e.sent()).data, _d = _c === void 0 ? {} : _c, session = _d.session;
|
|
1282
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1283
|
+
case 8:
|
|
1284
|
+
error_11 = _e.sent();
|
|
1285
|
+
return [2, { data: {}, error: new AuthError(error_11) }];
|
|
1286
|
+
case 9: return [2];
|
|
1287
|
+
}
|
|
1288
|
+
});
|
|
1289
|
+
});
|
|
1290
|
+
},
|
|
1291
|
+
},
|
|
1292
|
+
error: null,
|
|
1293
|
+
}];
|
|
1294
|
+
case 4:
|
|
1295
|
+
error_10 = _a.sent();
|
|
1296
|
+
return [2, { data: {}, error: new AuthError(error_10) }];
|
|
1297
|
+
case 5: return [2];
|
|
1298
|
+
}
|
|
1299
|
+
});
|
|
1300
|
+
});
|
|
1301
|
+
};
|
|
1302
|
+
Auth.prototype.signOut = function (params) {
|
|
1303
|
+
var _a, _b;
|
|
1304
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1305
|
+
var userInfoKey, res, error_12;
|
|
1306
|
+
return __generator(this, function (_c) {
|
|
1307
|
+
switch (_c.label) {
|
|
1308
|
+
case 0:
|
|
1309
|
+
_c.trys.push([0, 3, , 4]);
|
|
1310
|
+
userInfoKey = this.cache.keys.userInfoKey;
|
|
1311
|
+
return [4, this.oauthInstance.authApi.signOut(params)];
|
|
1312
|
+
case 1:
|
|
1313
|
+
res = _c.sent();
|
|
1314
|
+
return [4, this.cache.removeStoreAsync(userInfoKey)];
|
|
1315
|
+
case 2:
|
|
1316
|
+
_c.sent();
|
|
1317
|
+
this.setAccessKey();
|
|
1318
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_OUT });
|
|
1319
|
+
(_b = this.config.eventBus) === null || _b === void 0 ? void 0 : _b.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_OUT });
|
|
1320
|
+
return [2, __assign(__assign({}, res), { data: {}, error: null })];
|
|
1321
|
+
case 3:
|
|
1322
|
+
error_12 = _c.sent();
|
|
1323
|
+
return [2, { data: {}, error: new AuthError(error_12) }];
|
|
1324
|
+
case 4: return [2];
|
|
1325
|
+
}
|
|
1326
|
+
});
|
|
1327
|
+
});
|
|
1328
|
+
};
|
|
1329
|
+
Auth.prototype.onAuthStateChange = function (callback) {
|
|
1330
|
+
var _this = this;
|
|
1331
|
+
if (!this.hasListenerSetUp) {
|
|
1332
|
+
this.setupListeners();
|
|
1333
|
+
this.hasListenerSetUp = true;
|
|
1334
|
+
}
|
|
1335
|
+
var id = Math.random().toString(36);
|
|
1336
|
+
if (!this.listeners.has(id)) {
|
|
1337
|
+
this.listeners.set(id, new Set());
|
|
1338
|
+
}
|
|
1339
|
+
this.listeners.get(id).add(callback);
|
|
1340
|
+
var subscription = {
|
|
1341
|
+
id: id,
|
|
1342
|
+
callback: callback,
|
|
1343
|
+
unsubscribe: function () {
|
|
1344
|
+
var callbacks = _this.listeners.get(id);
|
|
1345
|
+
if (callbacks) {
|
|
1346
|
+
callbacks.delete(callback);
|
|
1347
|
+
if (callbacks.size === 0) {
|
|
1348
|
+
_this.listeners.delete(id);
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
},
|
|
1352
|
+
};
|
|
1353
|
+
return {
|
|
1354
|
+
data: { subscription: subscription },
|
|
1355
|
+
};
|
|
1356
|
+
};
|
|
1357
|
+
Auth.prototype.signInWithPassword = function (params) {
|
|
1358
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1359
|
+
var _a, _b, session, error_13;
|
|
1360
|
+
return __generator(this, function (_c) {
|
|
1361
|
+
switch (_c.label) {
|
|
1362
|
+
case 0:
|
|
1363
|
+
_c.trys.push([0, 3, , 4]);
|
|
1364
|
+
this.validateAtLeastOne(params, [['username'], ['email'], ['phone']], 'You must provide either username, email, or phone');
|
|
1365
|
+
this.validateParams(params, {
|
|
1366
|
+
password: { required: true, message: 'Password is required' },
|
|
1367
|
+
});
|
|
1368
|
+
return [4, this.signIn(__assign({ username: params.username || params.email || this.formatPhone(params.phone), password: params.password }, (params.is_encrypt ? { isEncrypt: true, version: 'v2' } : {})))];
|
|
1369
|
+
case 1:
|
|
1370
|
+
_c.sent();
|
|
1371
|
+
return [4, this.getSession()];
|
|
1372
|
+
case 2:
|
|
1373
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1374
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1375
|
+
case 3:
|
|
1376
|
+
error_13 = _c.sent();
|
|
1377
|
+
return [2, { data: {}, error: new AuthError(error_13) }];
|
|
1378
|
+
case 4: return [2];
|
|
1379
|
+
}
|
|
1380
|
+
});
|
|
1381
|
+
});
|
|
1382
|
+
};
|
|
1383
|
+
Auth.prototype.signInWithIdToken = function (params) {
|
|
1384
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1385
|
+
var _a, _b, session, error_14;
|
|
1386
|
+
return __generator(this, function (_c) {
|
|
1387
|
+
switch (_c.label) {
|
|
1388
|
+
case 0:
|
|
1389
|
+
_c.trys.push([0, 3, , 4]);
|
|
1390
|
+
this.validateParams(params, {
|
|
1391
|
+
token: { required: true, message: 'Token is required' },
|
|
1392
|
+
});
|
|
1393
|
+
return [4, this.signInWithProvider({
|
|
1394
|
+
provider_token: params.token,
|
|
1395
|
+
})];
|
|
1396
|
+
case 1:
|
|
1397
|
+
_c.sent();
|
|
1398
|
+
return [4, this.getSession()];
|
|
1399
|
+
case 2:
|
|
1400
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1401
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1402
|
+
case 3:
|
|
1403
|
+
error_14 = _c.sent();
|
|
1404
|
+
return [2, { data: {}, error: new AuthError(error_14) }];
|
|
1405
|
+
case 4: return [2];
|
|
1406
|
+
}
|
|
1407
|
+
});
|
|
1408
|
+
});
|
|
1409
|
+
};
|
|
1410
|
+
Auth.prototype.signInWithOtp = function (params) {
|
|
1411
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1412
|
+
var verificationInfo_2, error_15;
|
|
1413
|
+
var _this = this;
|
|
1414
|
+
return __generator(this, function (_a) {
|
|
1415
|
+
switch (_a.label) {
|
|
1416
|
+
case 0:
|
|
1417
|
+
_a.trys.push([0, 2, , 3]);
|
|
1418
|
+
this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
|
|
1419
|
+
return [4, this.getVerification(params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })];
|
|
1420
|
+
case 1:
|
|
1421
|
+
verificationInfo_2 = _a.sent();
|
|
1422
|
+
return [2, {
|
|
1423
|
+
data: {
|
|
1424
|
+
user: null,
|
|
1425
|
+
session: null,
|
|
1426
|
+
verifyOtp: function (_a) {
|
|
1427
|
+
var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_2.verification_id : _b;
|
|
1428
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
1429
|
+
return __generator(this, function (_c) {
|
|
1430
|
+
return [2, this.verifyOtp({
|
|
1431
|
+
email: params.email,
|
|
1432
|
+
phone: params.phone,
|
|
1433
|
+
token: token,
|
|
1434
|
+
messageId: messageId,
|
|
1435
|
+
})];
|
|
1436
|
+
});
|
|
1437
|
+
});
|
|
1438
|
+
},
|
|
1439
|
+
},
|
|
1440
|
+
error: null,
|
|
1441
|
+
}];
|
|
1442
|
+
case 2:
|
|
1443
|
+
error_15 = _a.sent();
|
|
1444
|
+
return [2, { data: {}, error: new AuthError(error_15) }];
|
|
1445
|
+
case 3: return [2];
|
|
1446
|
+
}
|
|
1447
|
+
});
|
|
1448
|
+
});
|
|
1449
|
+
};
|
|
1450
|
+
Auth.prototype.verifyOAuth = function (params) {
|
|
1451
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1452
|
+
var data, code, state, cacheData, provider, token, res, localSearch, error_16;
|
|
1453
|
+
return __generator(this, function (_a) {
|
|
1454
|
+
switch (_a.label) {
|
|
1455
|
+
case 0:
|
|
1456
|
+
data = {};
|
|
1457
|
+
_a.label = 1;
|
|
1458
|
+
case 1:
|
|
1459
|
+
_a.trys.push([1, 7, , 8]);
|
|
1460
|
+
code = (params === null || params === void 0 ? void 0 : params.code) || utils.getQuery('code');
|
|
1461
|
+
state = (params === null || params === void 0 ? void 0 : params.state) || utils.getQuery('state');
|
|
1462
|
+
if (!code) {
|
|
1463
|
+
return [2, { data: {}, error: new AuthError({ message: 'Code is required' }) }];
|
|
1464
|
+
}
|
|
1465
|
+
if (!state) {
|
|
1466
|
+
return [2, { data: {}, error: new AuthError({ message: 'State is required' }) }];
|
|
1467
|
+
}
|
|
1468
|
+
cacheData = getBrowserSession(state);
|
|
1469
|
+
data.type = cacheData === null || cacheData === void 0 ? void 0 : cacheData.type;
|
|
1470
|
+
provider = (params === null || params === void 0 ? void 0 : params.provider) || (cacheData === null || cacheData === void 0 ? void 0 : cacheData.provider) || utils.getQuery('provider');
|
|
1471
|
+
if (!provider) {
|
|
1472
|
+
return [2, { data: data, error: new AuthError({ message: 'Provider is required' }) }];
|
|
1473
|
+
}
|
|
1474
|
+
return [4, this.grantProviderToken({
|
|
1475
|
+
provider_id: provider,
|
|
1476
|
+
provider_redirect_uri: location.origin + location.pathname,
|
|
1477
|
+
provider_code: code,
|
|
1478
|
+
})];
|
|
1479
|
+
case 2:
|
|
1480
|
+
token = (_a.sent()).provider_token;
|
|
1481
|
+
res = void 0;
|
|
1482
|
+
if (!(cacheData.type === OAUTH_TYPE.BIND_IDENTITY)) return [3, 4];
|
|
1483
|
+
return [4, this.oauthInstance.authApi.toBindIdentity({ provider_token: token, provider: provider, fireEvent: true })];
|
|
1484
|
+
case 3:
|
|
1485
|
+
res = _a.sent();
|
|
1486
|
+
return [3, 6];
|
|
1487
|
+
case 4: return [4, this.signInWithIdToken({
|
|
1488
|
+
token: token,
|
|
1489
|
+
})];
|
|
1490
|
+
case 5:
|
|
1491
|
+
res = _a.sent();
|
|
1492
|
+
res.data = __assign(__assign({}, data), res.data);
|
|
1493
|
+
_a.label = 6;
|
|
1494
|
+
case 6:
|
|
1495
|
+
localSearch = new URLSearchParams(location === null || location === void 0 ? void 0 : location.search);
|
|
1496
|
+
localSearch.delete('code');
|
|
1497
|
+
localSearch.delete('state');
|
|
1498
|
+
addUrlSearch((cacheData === null || cacheData === void 0 ? void 0 : cacheData.search) === undefined ? "?".concat(localSearch.toString()) : cacheData === null || cacheData === void 0 ? void 0 : cacheData.search, (cacheData === null || cacheData === void 0 ? void 0 : cacheData.hash) || location.hash);
|
|
1499
|
+
removeBrowserSession(state);
|
|
1500
|
+
return [2, res];
|
|
1501
|
+
case 7:
|
|
1502
|
+
error_16 = _a.sent();
|
|
1503
|
+
return [2, { data: data, error: new AuthError(error_16) }];
|
|
1504
|
+
case 8: return [2];
|
|
1505
|
+
}
|
|
1506
|
+
});
|
|
1507
|
+
});
|
|
1508
|
+
};
|
|
1509
|
+
Auth.prototype.signInWithOAuth = function (params) {
|
|
1510
|
+
var _a, _b, _c, _d, _e;
|
|
1511
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1512
|
+
var href, urlObject, provider_redirect_uri, state, uri, decodedUri, finalUri, url_1, error_17;
|
|
1513
|
+
return __generator(this, function (_f) {
|
|
1514
|
+
switch (_f.label) {
|
|
1515
|
+
case 0:
|
|
1516
|
+
_f.trys.push([0, 2, , 3]);
|
|
1517
|
+
this.validateParams(params, {
|
|
1518
|
+
provider: { required: true, message: 'Provider is required' },
|
|
1519
|
+
});
|
|
1520
|
+
href = ((_a = params.options) === null || _a === void 0 ? void 0 : _a.redirectTo) || location.href;
|
|
1521
|
+
urlObject = new URL(href);
|
|
1522
|
+
provider_redirect_uri = urlObject.origin + urlObject.pathname;
|
|
1523
|
+
state = ((_b = params.options) === null || _b === void 0 ? void 0 : _b.state) || "prd-".concat(params.provider, "-").concat(Math.random().toString(36)
|
|
1524
|
+
.slice(2));
|
|
1525
|
+
return [4, this.genProviderRedirectUri({
|
|
1526
|
+
provider_id: params.provider,
|
|
1527
|
+
provider_redirect_uri: provider_redirect_uri,
|
|
1528
|
+
state: state,
|
|
1529
|
+
})];
|
|
1530
|
+
case 1:
|
|
1531
|
+
uri = (_f.sent()).uri;
|
|
1532
|
+
decodedUri = decodeURIComponent(uri);
|
|
1533
|
+
finalUri = decodedUri;
|
|
1534
|
+
if ((_c = params.options) === null || _c === void 0 ? void 0 : _c.queryParams) {
|
|
1535
|
+
url_1 = new URL(decodedUri);
|
|
1536
|
+
Object.entries(params.options.queryParams).forEach(function (_a) {
|
|
1537
|
+
var key = _a[0], value = _a[1];
|
|
1538
|
+
url_1.searchParams.set(key, value);
|
|
1539
|
+
});
|
|
1540
|
+
finalUri = url_1.toString();
|
|
1541
|
+
}
|
|
1542
|
+
saveToBrowserSession(state, {
|
|
1543
|
+
provider: params.provider,
|
|
1544
|
+
search: urlObject.search,
|
|
1545
|
+
hash: urlObject.hash,
|
|
1546
|
+
type: ((_d = params.options) === null || _d === void 0 ? void 0 : _d.type) || OAUTH_TYPE.SIGN_IN,
|
|
1547
|
+
});
|
|
1548
|
+
if (isBrowser() && !((_e = params.options) === null || _e === void 0 ? void 0 : _e.skipBrowserRedirect)) {
|
|
1549
|
+
window.location.assign(finalUri);
|
|
1550
|
+
}
|
|
1551
|
+
return [2, { data: { url: finalUri, provider: params.provider }, error: null }];
|
|
1552
|
+
case 2:
|
|
1553
|
+
error_17 = _f.sent();
|
|
1554
|
+
return [2, { data: {}, error: new AuthError(error_17) }];
|
|
1555
|
+
case 3: return [2];
|
|
1556
|
+
}
|
|
1557
|
+
});
|
|
1558
|
+
});
|
|
1559
|
+
};
|
|
1560
|
+
Auth.prototype.getClaims = function () {
|
|
1561
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1562
|
+
var accessToken, parsedToken, error_18;
|
|
1563
|
+
return __generator(this, function (_a) {
|
|
1564
|
+
switch (_a.label) {
|
|
1565
|
+
case 0:
|
|
1566
|
+
_a.trys.push([0, 2, , 3]);
|
|
1567
|
+
return [4, this.getAccessToken()];
|
|
1568
|
+
case 1:
|
|
1569
|
+
accessToken = (_a.sent()).accessToken;
|
|
1570
|
+
parsedToken = weAppJwtDecodeAll(accessToken);
|
|
1571
|
+
return [2, { data: parsedToken, error: null }];
|
|
1572
|
+
case 2:
|
|
1573
|
+
error_18 = _a.sent();
|
|
1574
|
+
return [2, { data: {}, error: new AuthError(error_18) }];
|
|
1575
|
+
case 3: return [2];
|
|
1576
|
+
}
|
|
1577
|
+
});
|
|
1578
|
+
});
|
|
1579
|
+
};
|
|
1580
|
+
Auth.prototype.resetPasswordForEmail = function (emailOrPhone, options) {
|
|
1581
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1582
|
+
var redirectTo_1, isEmail_1, verificationParams, formattedPhone, verificationInfo_3, error_19;
|
|
1583
|
+
var _this = this;
|
|
1584
|
+
return __generator(this, function (_a) {
|
|
1585
|
+
switch (_a.label) {
|
|
1586
|
+
case 0:
|
|
1587
|
+
_a.trys.push([0, 2, , 3]);
|
|
1588
|
+
this.validateParams({ emailOrPhone: emailOrPhone }, {
|
|
1589
|
+
emailOrPhone: { required: true, message: 'Email or phone is required' },
|
|
1590
|
+
});
|
|
1591
|
+
redirectTo_1 = (options || {}).redirectTo;
|
|
1592
|
+
isEmail_1 = emailOrPhone.includes('@');
|
|
1593
|
+
verificationParams = void 0;
|
|
1594
|
+
if (isEmail_1) {
|
|
1595
|
+
verificationParams = { email: emailOrPhone };
|
|
1596
|
+
}
|
|
1597
|
+
else {
|
|
1598
|
+
formattedPhone = this.formatPhone(emailOrPhone);
|
|
1599
|
+
verificationParams = { phone_number: formattedPhone };
|
|
1600
|
+
}
|
|
1601
|
+
return [4, this.getVerification(verificationParams)];
|
|
1602
|
+
case 1:
|
|
1603
|
+
verificationInfo_3 = _a.sent();
|
|
1604
|
+
return [2, {
|
|
1605
|
+
data: {
|
|
1606
|
+
updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
|
|
1607
|
+
var verificationTokenRes, res, error_20;
|
|
1608
|
+
var _a;
|
|
1609
|
+
return __generator(this, function (_b) {
|
|
1610
|
+
switch (_b.label) {
|
|
1611
|
+
case 0:
|
|
1612
|
+
this.validateParams(attributes, {
|
|
1613
|
+
nonce: { required: true, message: 'Nonce is required' },
|
|
1614
|
+
password: { required: true, message: 'Password is required' },
|
|
1615
|
+
});
|
|
1616
|
+
_b.label = 1;
|
|
1617
|
+
case 1:
|
|
1618
|
+
_b.trys.push([1, 5, , 6]);
|
|
1619
|
+
return [4, this.verify({
|
|
1620
|
+
verification_id: verificationInfo_3.verification_id,
|
|
1621
|
+
verification_code: attributes.nonce,
|
|
1622
|
+
})];
|
|
1623
|
+
case 2:
|
|
1624
|
+
verificationTokenRes = _b.sent();
|
|
1625
|
+
return [4, this.oauthInstance.authApi.resetPassword({
|
|
1626
|
+
email: isEmail_1 ? emailOrPhone : undefined,
|
|
1627
|
+
phone_number: !isEmail_1 ? emailOrPhone : undefined,
|
|
1628
|
+
new_password: attributes.password,
|
|
1629
|
+
verification_token: verificationTokenRes.verification_token,
|
|
1630
|
+
})];
|
|
1631
|
+
case 3:
|
|
1632
|
+
_b.sent();
|
|
1633
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, {
|
|
1634
|
+
event: AUTH_STATE_CHANGED_TYPE.PASSWORD_RECOVERY,
|
|
1635
|
+
});
|
|
1636
|
+
return [4, this.signInWithPassword({
|
|
1637
|
+
email: isEmail_1 ? emailOrPhone : undefined,
|
|
1638
|
+
phone: !isEmail_1 ? emailOrPhone : undefined,
|
|
1639
|
+
password: attributes.password,
|
|
1640
|
+
})];
|
|
1641
|
+
case 4:
|
|
1642
|
+
res = _b.sent();
|
|
1643
|
+
if (redirectTo_1 && isBrowser()) {
|
|
1644
|
+
window.location.assign(redirectTo_1);
|
|
1645
|
+
}
|
|
1646
|
+
return [2, res];
|
|
1647
|
+
case 5:
|
|
1648
|
+
error_20 = _b.sent();
|
|
1649
|
+
return [2, { data: {}, error: new AuthError(error_20) }];
|
|
1650
|
+
case 6: return [2];
|
|
1651
|
+
}
|
|
1652
|
+
});
|
|
1653
|
+
}); },
|
|
1654
|
+
},
|
|
1655
|
+
error: null,
|
|
1656
|
+
}];
|
|
1657
|
+
case 2:
|
|
1658
|
+
error_19 = _a.sent();
|
|
1659
|
+
return [2, { data: {}, error: new AuthError(error_19) }];
|
|
1660
|
+
case 3: return [2];
|
|
1661
|
+
}
|
|
1662
|
+
});
|
|
1663
|
+
});
|
|
1664
|
+
};
|
|
1665
|
+
Auth.prototype.resetPasswordForOld = function (params) {
|
|
1666
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1667
|
+
var _a, _b, session, error_21;
|
|
1668
|
+
return __generator(this, function (_c) {
|
|
1669
|
+
switch (_c.label) {
|
|
1670
|
+
case 0:
|
|
1671
|
+
_c.trys.push([0, 3, , 4]);
|
|
1672
|
+
return [4, this.oauthInstance.authApi.updatePasswordByOld({
|
|
1673
|
+
old_password: params.old_password,
|
|
1674
|
+
new_password: params.new_password,
|
|
1675
|
+
})];
|
|
1676
|
+
case 1:
|
|
1677
|
+
_c.sent();
|
|
1678
|
+
return [4, this.getSession()];
|
|
1679
|
+
case 2:
|
|
1680
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1681
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1682
|
+
case 3:
|
|
1683
|
+
error_21 = _c.sent();
|
|
1684
|
+
return [2, { data: {}, error: new AuthError(error_21) }];
|
|
1685
|
+
case 4: return [2];
|
|
1686
|
+
}
|
|
1687
|
+
});
|
|
1688
|
+
});
|
|
1689
|
+
};
|
|
1690
|
+
Auth.prototype.verifyOtp = function (params) {
|
|
1691
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1692
|
+
var type, _a, _b, session, error_22;
|
|
1693
|
+
return __generator(this, function (_c) {
|
|
1694
|
+
switch (_c.label) {
|
|
1695
|
+
case 0:
|
|
1696
|
+
_c.trys.push([0, 6, , 7]);
|
|
1697
|
+
type = params.type;
|
|
1698
|
+
this.validateParams(params, {
|
|
1699
|
+
token: { required: true, message: 'Token is required' },
|
|
1700
|
+
messageId: { required: true, message: 'messageId is required' },
|
|
1701
|
+
});
|
|
1702
|
+
if (!['phone_change', 'email_change'].includes(type)) return [3, 2];
|
|
1703
|
+
return [4, this.verify({
|
|
1704
|
+
verification_id: params.messageId,
|
|
1705
|
+
verification_code: params.token,
|
|
1706
|
+
})];
|
|
1707
|
+
case 1:
|
|
1708
|
+
_c.sent();
|
|
1709
|
+
return [3, 4];
|
|
1710
|
+
case 2: return [4, this.signInWithUsername({
|
|
1711
|
+
verificationInfo: { verification_id: params.messageId, is_user: true },
|
|
1712
|
+
verificationCode: params.token,
|
|
1713
|
+
username: params.email || this.formatPhone(params.phone) || '',
|
|
1714
|
+
loginType: params.email ? 'email' : 'phone',
|
|
1715
|
+
})];
|
|
1716
|
+
case 3:
|
|
1717
|
+
_c.sent();
|
|
1718
|
+
_c.label = 4;
|
|
1719
|
+
case 4: return [4, this.getSession()];
|
|
1720
|
+
case 5:
|
|
1721
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1722
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1723
|
+
case 6:
|
|
1724
|
+
error_22 = _c.sent();
|
|
1725
|
+
return [2, { data: {}, error: new AuthError(error_22) }];
|
|
1726
|
+
case 7: return [2];
|
|
1727
|
+
}
|
|
1728
|
+
});
|
|
1729
|
+
});
|
|
1730
|
+
};
|
|
1731
|
+
Auth.prototype.getSession = function () {
|
|
1732
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1733
|
+
var credentials, _a, _b, user, error_23;
|
|
1734
|
+
return __generator(this, function (_c) {
|
|
1735
|
+
switch (_c.label) {
|
|
1736
|
+
case 0:
|
|
1737
|
+
_c.trys.push([0, 3, , 4]);
|
|
1738
|
+
return [4, this.oauthInstance.oauth2client.getCredentials()];
|
|
1739
|
+
case 1:
|
|
1740
|
+
credentials = _c.sent();
|
|
1741
|
+
if (!credentials || credentials.scope === 'accessKey') {
|
|
1742
|
+
return [2, { data: { session: null }, error: null }];
|
|
1743
|
+
}
|
|
1744
|
+
return [4, this.getUser()];
|
|
1745
|
+
case 2:
|
|
1746
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
|
|
1747
|
+
return [2, { data: { session: __assign(__assign({}, credentials), { user: user }), user: user }, error: null }];
|
|
1748
|
+
case 3:
|
|
1749
|
+
error_23 = _c.sent();
|
|
1750
|
+
return [2, { data: {}, error: new AuthError(error_23) }];
|
|
1751
|
+
case 4: return [2];
|
|
1752
|
+
}
|
|
1753
|
+
});
|
|
1754
|
+
});
|
|
1755
|
+
};
|
|
1756
|
+
Auth.prototype.refreshSession = function (refresh_token) {
|
|
1757
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1758
|
+
var credentials, newTokens, _a, _b, user, error_24;
|
|
1759
|
+
return __generator(this, function (_c) {
|
|
1760
|
+
switch (_c.label) {
|
|
1761
|
+
case 0:
|
|
1762
|
+
_c.trys.push([0, 4, , 5]);
|
|
1763
|
+
return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
|
|
1764
|
+
case 1:
|
|
1765
|
+
credentials = _c.sent();
|
|
1766
|
+
credentials.refresh_token = refresh_token || credentials.refresh_token;
|
|
1767
|
+
return [4, this.oauthInstance.oauth2client.refreshToken(credentials)];
|
|
1768
|
+
case 2:
|
|
1769
|
+
newTokens = _c.sent();
|
|
1770
|
+
return [4, this.getUser()];
|
|
1771
|
+
case 3:
|
|
1772
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
|
|
1773
|
+
return [2, { data: { user: user, session: __assign(__assign({}, newTokens), { user: user }) }, error: null }];
|
|
1774
|
+
case 4:
|
|
1775
|
+
error_24 = _c.sent();
|
|
1776
|
+
return [2, { data: {}, error: new AuthError(error_24) }];
|
|
1777
|
+
case 5: return [2];
|
|
1778
|
+
}
|
|
1779
|
+
});
|
|
1780
|
+
});
|
|
1781
|
+
};
|
|
1782
|
+
Auth.prototype.getUser = function () {
|
|
1783
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1784
|
+
var user, _a, error_25;
|
|
1785
|
+
return __generator(this, function (_b) {
|
|
1786
|
+
switch (_b.label) {
|
|
1787
|
+
case 0:
|
|
1788
|
+
_b.trys.push([0, 2, , 3]);
|
|
1789
|
+
_a = this.convertToUser;
|
|
1790
|
+
return [4, this.getUserInfo()];
|
|
1791
|
+
case 1:
|
|
1792
|
+
user = _a.apply(this, [_b.sent()]);
|
|
1793
|
+
return [2, { data: { user: user }, error: null }];
|
|
1794
|
+
case 2:
|
|
1795
|
+
error_25 = _b.sent();
|
|
1796
|
+
return [2, { data: {}, error: new AuthError(error_25) }];
|
|
1797
|
+
case 3: return [2];
|
|
1798
|
+
}
|
|
1799
|
+
});
|
|
1800
|
+
});
|
|
1801
|
+
};
|
|
1802
|
+
Auth.prototype.refreshUser = function () {
|
|
1803
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1804
|
+
var _a, _b, session, error_26;
|
|
1805
|
+
return __generator(this, function (_c) {
|
|
1806
|
+
switch (_c.label) {
|
|
1807
|
+
case 0:
|
|
1808
|
+
_c.trys.push([0, 3, , 4]);
|
|
1809
|
+
return [4, this.currentUser.refresh()];
|
|
1810
|
+
case 1:
|
|
1811
|
+
_c.sent();
|
|
1812
|
+
return [4, this.getSession()];
|
|
1813
|
+
case 2:
|
|
1814
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1815
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1816
|
+
case 3:
|
|
1817
|
+
error_26 = _c.sent();
|
|
1818
|
+
return [2, { data: {}, error: new AuthError(error_26) }];
|
|
1819
|
+
case 4: return [2];
|
|
1820
|
+
}
|
|
1821
|
+
});
|
|
1822
|
+
});
|
|
1823
|
+
};
|
|
1824
|
+
Auth.prototype.updateUser = function (params) {
|
|
1825
|
+
var _a;
|
|
1826
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1827
|
+
var hasValue, email, phone, restParams, needsEmailVerification_1, needsPhoneVerification, extraRes, verificationParams, verificationType_1, formattedPhone, verificationInfo_4, _b, user, error_27;
|
|
1828
|
+
var _this = this;
|
|
1829
|
+
return __generator(this, function (_c) {
|
|
1830
|
+
switch (_c.label) {
|
|
1831
|
+
case 0:
|
|
1832
|
+
_c.trys.push([0, 8, , 9]);
|
|
1833
|
+
hasValue = Object.keys(params).some(function (key) { return params[key] !== undefined && params[key] !== null && params[key] !== ''; });
|
|
1834
|
+
if (!hasValue) {
|
|
1835
|
+
throw new AuthError({ message: 'At least one field must be provided for update' });
|
|
1836
|
+
}
|
|
1837
|
+
email = params.email, phone = params.phone, restParams = __rest(params, ["email", "phone"]);
|
|
1838
|
+
needsEmailVerification_1 = email !== undefined;
|
|
1839
|
+
needsPhoneVerification = phone !== undefined;
|
|
1840
|
+
extraRes = {};
|
|
1841
|
+
if (!(needsEmailVerification_1 || needsPhoneVerification)) return [3, 4];
|
|
1842
|
+
verificationParams = void 0;
|
|
1843
|
+
if (needsEmailVerification_1) {
|
|
1844
|
+
verificationParams = { email: params.email };
|
|
1845
|
+
verificationType_1 = 'email_change';
|
|
1846
|
+
}
|
|
1847
|
+
else {
|
|
1848
|
+
formattedPhone = this.formatPhone(params.phone);
|
|
1849
|
+
verificationParams = { phone_number: formattedPhone };
|
|
1850
|
+
verificationType_1 = 'phone_change';
|
|
1851
|
+
}
|
|
1852
|
+
return [4, this.getVerification(verificationParams)];
|
|
1853
|
+
case 1:
|
|
1854
|
+
verificationInfo_4 = _c.sent();
|
|
1855
|
+
_b = Object.keys(restParams).length > 0;
|
|
1856
|
+
if (!_b) return [3, 3];
|
|
1857
|
+
return [4, this.updateUserBasicInfo(restParams)];
|
|
1858
|
+
case 2:
|
|
1859
|
+
_b = (_c.sent());
|
|
1860
|
+
_c.label = 3;
|
|
1861
|
+
case 3:
|
|
1862
|
+
_b;
|
|
1863
|
+
extraRes = {
|
|
1864
|
+
messageId: verificationInfo_4.verification_id,
|
|
1865
|
+
verifyOtp: function (verifyParams) { return __awaiter(_this, void 0, void 0, function () {
|
|
1866
|
+
var user_1, error_28;
|
|
1867
|
+
var _a;
|
|
1868
|
+
return __generator(this, function (_b) {
|
|
1869
|
+
switch (_b.label) {
|
|
1870
|
+
case 0:
|
|
1871
|
+
_b.trys.push([0, 11, , 12]);
|
|
1872
|
+
if (!(verifyParams.email && params.email === verifyParams.email)) return [3, 3];
|
|
1873
|
+
return [4, this.verifyOtp({
|
|
1874
|
+
type: 'email_change',
|
|
1875
|
+
email: params.email,
|
|
1876
|
+
token: verifyParams.token,
|
|
1877
|
+
messageId: verificationInfo_4.verification_id,
|
|
1878
|
+
})];
|
|
1879
|
+
case 1:
|
|
1880
|
+
_b.sent();
|
|
1881
|
+
return [4, this.updateUserBasicInfo({ email: params.email })];
|
|
1882
|
+
case 2:
|
|
1883
|
+
_b.sent();
|
|
1884
|
+
return [3, 9];
|
|
1885
|
+
case 3:
|
|
1886
|
+
if (!(verifyParams.phone && params.phone === verifyParams.phone)) return [3, 6];
|
|
1887
|
+
return [4, this.verifyOtp({
|
|
1888
|
+
type: 'phone_change',
|
|
1889
|
+
phone: params.phone,
|
|
1890
|
+
token: verifyParams.token,
|
|
1891
|
+
messageId: verificationInfo_4.verification_id,
|
|
1892
|
+
})];
|
|
1893
|
+
case 4:
|
|
1894
|
+
_b.sent();
|
|
1895
|
+
return [4, this.updateUserBasicInfo({ phone: this.formatPhone(params.phone) })];
|
|
1896
|
+
case 5:
|
|
1897
|
+
_b.sent();
|
|
1898
|
+
return [3, 9];
|
|
1899
|
+
case 6: return [4, this.verifyOtp({
|
|
1900
|
+
type: verificationType_1,
|
|
1901
|
+
email: needsEmailVerification_1 ? params.email : undefined,
|
|
1902
|
+
phone: !needsEmailVerification_1 ? params.phone : undefined,
|
|
1903
|
+
token: verifyParams.token,
|
|
1904
|
+
messageId: verificationInfo_4.verification_id,
|
|
1905
|
+
})];
|
|
1906
|
+
case 7:
|
|
1907
|
+
_b.sent();
|
|
1908
|
+
return [4, this.updateUserBasicInfo(params)];
|
|
1909
|
+
case 8:
|
|
1910
|
+
_b.sent();
|
|
1911
|
+
_b.label = 9;
|
|
1912
|
+
case 9: return [4, this.getUser()];
|
|
1913
|
+
case 10:
|
|
1914
|
+
user_1 = (_b.sent()).data.user;
|
|
1915
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
|
|
1916
|
+
return [2, { data: { user: user_1 }, error: null }];
|
|
1917
|
+
case 11:
|
|
1918
|
+
error_28 = _b.sent();
|
|
1919
|
+
return [2, { data: {}, error: new AuthError(error_28) }];
|
|
1920
|
+
case 12: return [2];
|
|
1921
|
+
}
|
|
1922
|
+
});
|
|
1923
|
+
}); },
|
|
1924
|
+
};
|
|
1925
|
+
return [3, 6];
|
|
1926
|
+
case 4: return [4, this.updateUserBasicInfo(params)];
|
|
1927
|
+
case 5:
|
|
1928
|
+
_c.sent();
|
|
1929
|
+
_c.label = 6;
|
|
1930
|
+
case 6: return [4, this.getUser()];
|
|
1931
|
+
case 7:
|
|
1932
|
+
user = (_c.sent()).data.user;
|
|
1933
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
|
|
1934
|
+
return [2, { data: __assign({ user: user }, extraRes), error: null }];
|
|
1935
|
+
case 8:
|
|
1936
|
+
error_27 = _c.sent();
|
|
1937
|
+
return [2, { data: {}, error: new AuthError(error_27) }];
|
|
1938
|
+
case 9: return [2];
|
|
1939
|
+
}
|
|
1940
|
+
});
|
|
1941
|
+
});
|
|
1942
|
+
};
|
|
1943
|
+
Auth.prototype.getUserIdentities = function () {
|
|
1944
|
+
var _a;
|
|
1945
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1946
|
+
var providers, error_29;
|
|
1947
|
+
return __generator(this, function (_b) {
|
|
1948
|
+
switch (_b.label) {
|
|
1949
|
+
case 0:
|
|
1950
|
+
_b.trys.push([0, 2, , 3]);
|
|
1951
|
+
return [4, this.oauthInstance.authApi.getProviders()];
|
|
1952
|
+
case 1:
|
|
1953
|
+
providers = _b.sent();
|
|
1954
|
+
return [2, { data: { identities: (_a = providers === null || providers === void 0 ? void 0 : providers.data) === null || _a === void 0 ? void 0 : _a.filter(function (v) { return !!v.bind; }) }, error: null }];
|
|
1955
|
+
case 2:
|
|
1956
|
+
error_29 = _b.sent();
|
|
1957
|
+
return [2, { data: {}, error: new AuthError(error_29) }];
|
|
1958
|
+
case 3: return [2];
|
|
1959
|
+
}
|
|
1960
|
+
});
|
|
1961
|
+
});
|
|
1962
|
+
};
|
|
1963
|
+
Auth.prototype.linkIdentity = function (params) {
|
|
1964
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1965
|
+
var error_30;
|
|
1966
|
+
return __generator(this, function (_a) {
|
|
1967
|
+
switch (_a.label) {
|
|
1968
|
+
case 0:
|
|
1969
|
+
_a.trys.push([0, 2, , 3]);
|
|
1970
|
+
this.validateParams(params, {
|
|
1971
|
+
provider: { required: true, message: 'Provider is required' },
|
|
1972
|
+
});
|
|
1973
|
+
return [4, this.signInWithOAuth({
|
|
1974
|
+
provider: params.provider,
|
|
1975
|
+
options: {
|
|
1976
|
+
type: OAUTH_TYPE.BIND_IDENTITY,
|
|
1977
|
+
},
|
|
1978
|
+
})];
|
|
1979
|
+
case 1:
|
|
1980
|
+
_a.sent();
|
|
1981
|
+
return [2, { data: { provider: params.provider }, error: null }];
|
|
1982
|
+
case 2:
|
|
1983
|
+
error_30 = _a.sent();
|
|
1984
|
+
return [2, { data: {}, error: new AuthError(error_30) }];
|
|
1985
|
+
case 3: return [2];
|
|
1986
|
+
}
|
|
1987
|
+
});
|
|
1988
|
+
});
|
|
1989
|
+
};
|
|
1990
|
+
Auth.prototype.unlinkIdentity = function (params) {
|
|
1991
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1992
|
+
var error_31;
|
|
1993
|
+
return __generator(this, function (_a) {
|
|
1994
|
+
switch (_a.label) {
|
|
1995
|
+
case 0:
|
|
1996
|
+
_a.trys.push([0, 2, , 3]);
|
|
1997
|
+
this.validateParams(params, {
|
|
1998
|
+
provider: { required: true, message: 'Provider is required' },
|
|
1999
|
+
});
|
|
2000
|
+
return [4, this.oauthInstance.authApi.unbindProvider({ provider_id: params.provider })];
|
|
2001
|
+
case 1:
|
|
2002
|
+
_a.sent();
|
|
2003
|
+
return [2, { data: {}, error: null }];
|
|
2004
|
+
case 2:
|
|
2005
|
+
error_31 = _a.sent();
|
|
2006
|
+
return [2, { data: {}, error: new AuthError(error_31) }];
|
|
2007
|
+
case 3: return [2];
|
|
2008
|
+
}
|
|
2009
|
+
});
|
|
2010
|
+
});
|
|
2011
|
+
};
|
|
2012
|
+
Auth.prototype.reauthenticate = function () {
|
|
2013
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2014
|
+
var user, userInfo_1, verificationInfo_5, error_32;
|
|
2015
|
+
var _this = this;
|
|
2016
|
+
return __generator(this, function (_a) {
|
|
2017
|
+
switch (_a.label) {
|
|
2018
|
+
case 0:
|
|
2019
|
+
_a.trys.push([0, 3, , 4]);
|
|
2020
|
+
return [4, this.getUser()];
|
|
2021
|
+
case 1:
|
|
2022
|
+
user = (_a.sent()).data.user;
|
|
2023
|
+
this.validateAtLeastOne(user, [['email', 'phone']], 'You must provide either an email or phone number');
|
|
2024
|
+
userInfo_1 = user.email ? { email: user.email } : { phone_number: this.formatPhone(user.phone) };
|
|
2025
|
+
return [4, this.getVerification(userInfo_1)];
|
|
2026
|
+
case 2:
|
|
2027
|
+
verificationInfo_5 = _a.sent();
|
|
2028
|
+
return [2, {
|
|
2029
|
+
data: {
|
|
2030
|
+
updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
|
|
2031
|
+
var verificationTokenRes, sudoRes, _a, _b, session, error_33;
|
|
2032
|
+
return __generator(this, function (_c) {
|
|
2033
|
+
switch (_c.label) {
|
|
2034
|
+
case 0:
|
|
2035
|
+
this.validateParams(attributes, {
|
|
2036
|
+
nonce: { required: true, message: 'Nonce is required' },
|
|
2037
|
+
});
|
|
2038
|
+
_c.label = 1;
|
|
2039
|
+
case 1:
|
|
2040
|
+
_c.trys.push([1, 9, , 10]);
|
|
2041
|
+
if (!attributes.password) return [3, 5];
|
|
2042
|
+
return [4, this.verify({
|
|
2043
|
+
verification_id: verificationInfo_5.verification_id,
|
|
2044
|
+
verification_code: attributes.nonce,
|
|
2045
|
+
})];
|
|
2046
|
+
case 2:
|
|
2047
|
+
verificationTokenRes = _c.sent();
|
|
2048
|
+
return [4, this.oauthInstance.authApi.sudo({
|
|
2049
|
+
verification_token: verificationTokenRes.verification_token,
|
|
2050
|
+
})];
|
|
2051
|
+
case 3:
|
|
2052
|
+
sudoRes = _c.sent();
|
|
2053
|
+
return [4, this.oauthInstance.authApi.setPassword({
|
|
2054
|
+
new_password: attributes.password,
|
|
2055
|
+
sudo_token: sudoRes.sudo_token,
|
|
2056
|
+
})];
|
|
2057
|
+
case 4:
|
|
2058
|
+
_c.sent();
|
|
2059
|
+
return [3, 7];
|
|
2060
|
+
case 5: return [4, this.signInWithUsername(__assign(__assign({ verificationInfo: verificationInfo_5, verificationCode: attributes.nonce }, userInfo_1), { loginType: userInfo_1.email ? 'email' : 'phone' }))];
|
|
2061
|
+
case 6:
|
|
2062
|
+
_c.sent();
|
|
2063
|
+
_c.label = 7;
|
|
2064
|
+
case 7: return [4, this.getSession()];
|
|
2065
|
+
case 8:
|
|
2066
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
2067
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
2068
|
+
case 9:
|
|
2069
|
+
error_33 = _c.sent();
|
|
2070
|
+
return [2, { data: {}, error: new AuthError(error_33) }];
|
|
2071
|
+
case 10: return [2];
|
|
2072
|
+
}
|
|
2073
|
+
});
|
|
2074
|
+
}); },
|
|
2075
|
+
},
|
|
2076
|
+
error: null,
|
|
2077
|
+
}];
|
|
2078
|
+
case 3:
|
|
2079
|
+
error_32 = _a.sent();
|
|
2080
|
+
return [2, { data: {}, error: new AuthError(error_32) }];
|
|
2081
|
+
case 4: return [2];
|
|
2082
|
+
}
|
|
2083
|
+
});
|
|
2084
|
+
});
|
|
2085
|
+
};
|
|
2086
|
+
Auth.prototype.resend = function (params) {
|
|
2087
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2088
|
+
var target, data, verificationId, error_34;
|
|
2089
|
+
return __generator(this, function (_a) {
|
|
2090
|
+
switch (_a.label) {
|
|
2091
|
+
case 0:
|
|
2092
|
+
_a.trys.push([0, 2, , 3]);
|
|
2093
|
+
this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
|
|
2094
|
+
target = params.type === 'signup' ? 'ANY' : 'USER';
|
|
2095
|
+
data = { target: target };
|
|
2096
|
+
if ('email' in params) {
|
|
2097
|
+
data.email = params.email;
|
|
2098
|
+
}
|
|
2099
|
+
if ('phone' in params) {
|
|
2100
|
+
data.phone_number = this.formatPhone(params.phone);
|
|
2101
|
+
}
|
|
2102
|
+
return [4, this.oauthInstance.authApi.getVerification(data)];
|
|
2103
|
+
case 1:
|
|
2104
|
+
verificationId = (_a.sent()).verification_id;
|
|
2105
|
+
return [2, {
|
|
2106
|
+
data: { messageId: verificationId },
|
|
2107
|
+
error: null,
|
|
2108
|
+
}];
|
|
2109
|
+
case 2:
|
|
2110
|
+
error_34 = _a.sent();
|
|
2111
|
+
return [2, {
|
|
2112
|
+
data: {},
|
|
2113
|
+
error: new AuthError(error_34),
|
|
2114
|
+
}];
|
|
2115
|
+
case 3: return [2];
|
|
2116
|
+
}
|
|
2117
|
+
});
|
|
2118
|
+
});
|
|
2119
|
+
};
|
|
2120
|
+
Auth.prototype.setSession = function (params) {
|
|
2121
|
+
var _a;
|
|
2122
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2123
|
+
var _b, _c, session, error_35;
|
|
2124
|
+
return __generator(this, function (_d) {
|
|
2125
|
+
switch (_d.label) {
|
|
2126
|
+
case 0:
|
|
2127
|
+
_d.trys.push([0, 3, , 4]);
|
|
2128
|
+
this.validateParams(params, {
|
|
2129
|
+
access_token: { required: true, message: 'Access token is required' },
|
|
2130
|
+
refresh_token: { required: true, message: 'Refresh token is required' },
|
|
2131
|
+
});
|
|
2132
|
+
return [4, this.oauthInstance.oauth2client.refreshToken(params, { throwError: true })];
|
|
2133
|
+
case 1:
|
|
2134
|
+
_d.sent();
|
|
2135
|
+
return [4, this.getSession()];
|
|
2136
|
+
case 2:
|
|
2137
|
+
_b = (_d.sent()).data, _c = _b === void 0 ? {} : _b, session = _c.session;
|
|
2138
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
|
|
2139
|
+
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
2140
|
+
case 3:
|
|
2141
|
+
error_35 = _d.sent();
|
|
2142
|
+
return [2, { data: {}, error: new AuthError(error_35) }];
|
|
2143
|
+
case 4: return [2];
|
|
2144
|
+
}
|
|
2145
|
+
});
|
|
2146
|
+
});
|
|
2147
|
+
};
|
|
2148
|
+
Auth.prototype.exchangeCodeForSession = function () {
|
|
2149
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2150
|
+
return __generator(this, function (_a) {
|
|
2151
|
+
return [2];
|
|
2152
|
+
});
|
|
2153
|
+
});
|
|
2154
|
+
};
|
|
2155
|
+
Auth.prototype.deleteUser = function (params) {
|
|
2156
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2157
|
+
var sudo_token, error_36;
|
|
2158
|
+
return __generator(this, function (_a) {
|
|
2159
|
+
switch (_a.label) {
|
|
2160
|
+
case 0:
|
|
2161
|
+
_a.trys.push([0, 3, , 4]);
|
|
2162
|
+
this.validateParams(params, {
|
|
2163
|
+
password: { required: true, message: 'Password is required' },
|
|
2164
|
+
});
|
|
2165
|
+
return [4, this.oauthInstance.authApi.sudo(params)];
|
|
2166
|
+
case 1:
|
|
2167
|
+
sudo_token = (_a.sent()).sudo_token;
|
|
2168
|
+
return [4, this.oauthInstance.authApi.deleteMe({ sudo_token: sudo_token })];
|
|
2169
|
+
case 2:
|
|
2170
|
+
_a.sent();
|
|
2171
|
+
return [2, { data: {}, error: null }];
|
|
2172
|
+
case 3:
|
|
2173
|
+
error_36 = _a.sent();
|
|
2174
|
+
return [2, { data: {}, error: new AuthError(error_36) }];
|
|
2175
|
+
case 4: return [2];
|
|
2176
|
+
}
|
|
2177
|
+
});
|
|
2178
|
+
});
|
|
2179
|
+
};
|
|
2180
|
+
Auth.prototype.toDefaultLoginPage = function (params) {
|
|
2181
|
+
if (params === void 0) { params = {}; }
|
|
2182
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2183
|
+
var configVersion, query, redirectUri, urlObj, loginPage;
|
|
2184
|
+
return __generator(this, function (_a) {
|
|
2185
|
+
try {
|
|
2186
|
+
configVersion = params.config_version || 'env';
|
|
2187
|
+
query = Object.keys(params.query || {})
|
|
2188
|
+
.map(function (key) { return "".concat(key, "=").concat(params.query[key]); })
|
|
2189
|
+
.join('&');
|
|
2190
|
+
if (adapterForWxMp.isMatch()) {
|
|
2191
|
+
wx.navigateTo({ url: "/packages/$wd_system/pages/login/index".concat(query ? "?".concat(query) : '') });
|
|
2192
|
+
}
|
|
2193
|
+
else {
|
|
2194
|
+
redirectUri = params.redirect_uri || window.location.href;
|
|
2195
|
+
urlObj = new URL(redirectUri);
|
|
2196
|
+
loginPage = "".concat(urlObj.origin, "/__auth/?app_id=").concat(params.app_id || '', "&env_id=").concat(this.config.env, "&client_id=").concat(this.config.clientId || this.config.env, "&config_version=").concat(configVersion, "&redirect_uri=").concat(encodeURIComponent(redirectUri)).concat(query ? "&".concat(query) : '');
|
|
2197
|
+
window.location.href = loginPage;
|
|
2198
|
+
}
|
|
2199
|
+
return [2, { data: {}, error: null }];
|
|
2200
|
+
}
|
|
2201
|
+
catch (error) {
|
|
2202
|
+
return [2, { data: {}, error: new AuthError(error) }];
|
|
2203
|
+
}
|
|
2204
|
+
return [2];
|
|
2205
|
+
});
|
|
2206
|
+
});
|
|
2207
|
+
};
|
|
2208
|
+
Auth.prototype.signInWithCustomTicket = function (getTickFn) {
|
|
2209
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2210
|
+
var loginState, _a, _b, session, error_37;
|
|
2211
|
+
return __generator(this, function (_c) {
|
|
2212
|
+
switch (_c.label) {
|
|
2213
|
+
case 0:
|
|
2214
|
+
if (getTickFn) {
|
|
2215
|
+
this.setCustomSignFunc(getTickFn);
|
|
2216
|
+
}
|
|
2217
|
+
_c.label = 1;
|
|
2218
|
+
case 1:
|
|
2219
|
+
_c.trys.push([1, 5, , 6]);
|
|
2220
|
+
return [4, this.oauthInstance.authApi.signInWithCustomTicket()];
|
|
2221
|
+
case 2:
|
|
2222
|
+
_c.sent();
|
|
2223
|
+
return [4, this.createLoginState()];
|
|
2224
|
+
case 3:
|
|
2225
|
+
loginState = _c.sent();
|
|
2226
|
+
return [4, this.getSession()];
|
|
2227
|
+
case 4:
|
|
2228
|
+
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
2229
|
+
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
2230
|
+
case 5:
|
|
2231
|
+
error_37 = _c.sent();
|
|
2232
|
+
return [2, { data: {}, error: new AuthError(error_37) }];
|
|
2233
|
+
case 6: return [2];
|
|
2234
|
+
}
|
|
2235
|
+
});
|
|
2236
|
+
});
|
|
2237
|
+
};
|
|
2238
|
+
Auth.prototype.signInWithOpenId = function (_a) {
|
|
2239
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.useWxCloud, useWxCloud = _c === void 0 ? true : _c;
|
|
2240
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2241
|
+
var wxInfo, mainFunc, loginState, _d, _e, session, error_38;
|
|
2242
|
+
var _this = this;
|
|
2243
|
+
return __generator(this, function (_f) {
|
|
2244
|
+
switch (_f.label) {
|
|
2245
|
+
case 0:
|
|
2246
|
+
if (!adapterForWxMp.isMatch()) {
|
|
2247
|
+
throw Error('wx api undefined');
|
|
2248
|
+
}
|
|
2249
|
+
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
2250
|
+
mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
|
|
2251
|
+
var result, credentials, error_39;
|
|
2252
|
+
return __generator(this, function (_a) {
|
|
2253
|
+
switch (_a.label) {
|
|
2254
|
+
case 0:
|
|
2255
|
+
result = undefined;
|
|
2256
|
+
credentials = undefined;
|
|
2257
|
+
_a.label = 1;
|
|
2258
|
+
case 1:
|
|
2259
|
+
_a.trys.push([1, 4, , 5]);
|
|
2260
|
+
return [4, this.oauthInstance.authApi.grantProviderToken({
|
|
2261
|
+
provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
2262
|
+
provider_code: code,
|
|
2263
|
+
provider_params: {
|
|
2264
|
+
provider_code_type: 'open_id',
|
|
2265
|
+
appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
2266
|
+
},
|
|
2267
|
+
}, useWxCloud)];
|
|
2268
|
+
case 2:
|
|
2269
|
+
result = _a.sent();
|
|
2270
|
+
if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
|
|
2271
|
+
throw result;
|
|
2272
|
+
}
|
|
2273
|
+
return [4, this.oauthInstance.authApi.signInWithProvider({ provider_token: result.provider_token }, useWxCloud)];
|
|
2274
|
+
case 3:
|
|
2275
|
+
credentials = _a.sent();
|
|
2276
|
+
if (credentials === null || credentials === void 0 ? void 0 : credentials.error_code) {
|
|
2277
|
+
throw credentials;
|
|
2278
|
+
}
|
|
2279
|
+
return [3, 5];
|
|
2280
|
+
case 4:
|
|
2281
|
+
error_39 = _a.sent();
|
|
2282
|
+
throw error_39;
|
|
2283
|
+
case 5: return [4, this.oauthInstance.oauth2client.setCredentials(credentials)];
|
|
2284
|
+
case 6:
|
|
2285
|
+
_a.sent();
|
|
2286
|
+
return [2];
|
|
2287
|
+
}
|
|
2288
|
+
});
|
|
2289
|
+
}); };
|
|
2290
|
+
_f.label = 1;
|
|
2291
|
+
case 1:
|
|
2292
|
+
_f.trys.push([1, 5, , 6]);
|
|
2293
|
+
return [4, new Promise(function (resolve, reject) {
|
|
2294
|
+
wx.login({
|
|
2295
|
+
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
|
2296
|
+
var error_40;
|
|
2297
|
+
return __generator(this, function (_a) {
|
|
2298
|
+
switch (_a.label) {
|
|
2299
|
+
case 0:
|
|
2300
|
+
_a.trys.push([0, 2, , 3]);
|
|
2301
|
+
return [4, mainFunc(res.code)];
|
|
2302
|
+
case 1:
|
|
2303
|
+
_a.sent();
|
|
2304
|
+
resolve(true);
|
|
2305
|
+
return [3, 3];
|
|
2306
|
+
case 2:
|
|
2307
|
+
error_40 = _a.sent();
|
|
2308
|
+
reject(error_40);
|
|
2309
|
+
return [3, 3];
|
|
2310
|
+
case 3: return [2];
|
|
2311
|
+
}
|
|
2312
|
+
});
|
|
2313
|
+
}); },
|
|
2314
|
+
fail: function (res) {
|
|
2315
|
+
var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
|
|
2316
|
+
error.code = res === null || res === void 0 ? void 0 : res.errno;
|
|
2317
|
+
reject(error);
|
|
2318
|
+
},
|
|
2319
|
+
});
|
|
2320
|
+
})];
|
|
2321
|
+
case 2:
|
|
2322
|
+
_f.sent();
|
|
2323
|
+
return [4, this.createLoginState()];
|
|
2324
|
+
case 3:
|
|
2325
|
+
loginState = _f.sent();
|
|
2326
|
+
return [4, this.getSession()];
|
|
2327
|
+
case 4:
|
|
2328
|
+
_d = (_f.sent()).data, _e = _d === void 0 ? {} : _d, session = _e.session;
|
|
2329
|
+
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
2330
|
+
case 5:
|
|
2331
|
+
error_38 = _f.sent();
|
|
2332
|
+
return [2, { data: {}, error: new AuthError(error_38) }];
|
|
2333
|
+
case 6: return [2];
|
|
2334
|
+
}
|
|
2335
|
+
});
|
|
2336
|
+
});
|
|
2337
|
+
};
|
|
2338
|
+
Auth.prototype.signInWithPhoneAuth = function (_a) {
|
|
2339
|
+
var _b = _a.phoneCode, phoneCode = _b === void 0 ? '' : _b;
|
|
2340
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2341
|
+
var wxInfo, providerInfo, code, providerToken, signInRes, error_41, loginState, _c, _d, session;
|
|
2342
|
+
return __generator(this, function (_e) {
|
|
2343
|
+
switch (_e.label) {
|
|
2344
|
+
case 0:
|
|
2345
|
+
if (!adapterForWxMp.isMatch()) {
|
|
2346
|
+
return [2, { data: {}, error: new AuthError({ message: 'wx api undefined' }) }];
|
|
2347
|
+
}
|
|
2348
|
+
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
2349
|
+
providerInfo = {
|
|
2350
|
+
provider_params: { provider_code_type: 'phone' },
|
|
2351
|
+
provider_id: wxInfo.appId,
|
|
2352
|
+
};
|
|
2353
|
+
return [4, wx.login()];
|
|
2354
|
+
case 1:
|
|
2355
|
+
code = (_e.sent()).code;
|
|
2356
|
+
providerInfo.provider_code = code;
|
|
2357
|
+
_e.label = 2;
|
|
2358
|
+
case 2:
|
|
2359
|
+
_e.trys.push([2, 6, , 7]);
|
|
2360
|
+
return [4, this.oauthInstance.authApi.grantProviderToken(providerInfo)];
|
|
2361
|
+
case 3:
|
|
2362
|
+
providerToken = _e.sent();
|
|
2363
|
+
if (providerToken.error_code) {
|
|
2364
|
+
throw providerToken;
|
|
2365
|
+
}
|
|
2366
|
+
return [4, this.oauthInstance.authApi.patchProviderToken({
|
|
2367
|
+
provider_token: providerToken.provider_token,
|
|
2368
|
+
provider_id: wxInfo.appId,
|
|
2369
|
+
provider_params: {
|
|
2370
|
+
code: phoneCode,
|
|
2371
|
+
provider_code_type: 'phone',
|
|
2372
|
+
},
|
|
2373
|
+
})];
|
|
2374
|
+
case 4:
|
|
2375
|
+
providerToken = _e.sent();
|
|
2376
|
+
if (providerToken.error_code) {
|
|
2377
|
+
throw providerToken;
|
|
2378
|
+
}
|
|
2379
|
+
return [4, this.oauthInstance.authApi.signInWithProvider({
|
|
2380
|
+
provider_token: providerToken.provider_token,
|
|
2381
|
+
})];
|
|
2382
|
+
case 5:
|
|
2383
|
+
signInRes = _e.sent();
|
|
2384
|
+
if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
|
|
2385
|
+
throw signInRes;
|
|
2386
|
+
}
|
|
2387
|
+
return [3, 7];
|
|
2388
|
+
case 6:
|
|
2389
|
+
error_41 = _e.sent();
|
|
2390
|
+
return [2, { data: {}, error: new AuthError(error_41) }];
|
|
2391
|
+
case 7: return [4, this.createLoginState()];
|
|
2392
|
+
case 8:
|
|
2393
|
+
loginState = _e.sent();
|
|
2394
|
+
return [4, this.getSession()];
|
|
2395
|
+
case 9:
|
|
2396
|
+
_c = (_e.sent()).data, _d = _c === void 0 ? {} : _c, session = _d.session;
|
|
2397
|
+
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
2398
|
+
}
|
|
2399
|
+
});
|
|
2400
|
+
});
|
|
2401
|
+
};
|
|
2402
|
+
Auth.prototype.formatPhone = function (phone) {
|
|
2403
|
+
if (!/\s+/.test(phone) && /^\+\d{1,3}\d+/.test(phone)) {
|
|
2404
|
+
return phone.replace(/^(\+\d{1,2})(\d+)$/, '$1 $2');
|
|
2405
|
+
}
|
|
2406
|
+
return /^\+\d{1,3}\s+/.test(phone) ? phone : "+86 ".concat(phone);
|
|
2407
|
+
};
|
|
2408
|
+
Auth.prototype.notifyListeners = function (event, session, info) {
|
|
2409
|
+
this.listeners.forEach(function (callbacks) {
|
|
2410
|
+
callbacks.forEach(function (callback) {
|
|
2411
|
+
try {
|
|
2412
|
+
callback(event, session, info);
|
|
2413
|
+
}
|
|
2414
|
+
catch (error) {
|
|
2415
|
+
console.error('Error in auth state change callback:', error);
|
|
2416
|
+
}
|
|
2417
|
+
});
|
|
2418
|
+
});
|
|
2419
|
+
return;
|
|
2420
|
+
};
|
|
2421
|
+
Auth.prototype.setupListeners = function () {
|
|
2422
|
+
var _this = this;
|
|
2423
|
+
var _a;
|
|
2424
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.on(EVENTS.AUTH_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
|
|
2425
|
+
var event, info, session;
|
|
2426
|
+
var _a, _b;
|
|
2427
|
+
return __generator(this, function (_c) {
|
|
2428
|
+
switch (_c.label) {
|
|
2429
|
+
case 0:
|
|
2430
|
+
event = (_a = params === null || params === void 0 ? void 0 : params.data) === null || _a === void 0 ? void 0 : _a.event;
|
|
2431
|
+
info = (_b = params === null || params === void 0 ? void 0 : params.data) === null || _b === void 0 ? void 0 : _b.info;
|
|
2432
|
+
return [4, this.getSession()];
|
|
2433
|
+
case 1:
|
|
2434
|
+
session = (_c.sent()).data.session;
|
|
2435
|
+
this.notifyListeners(event, session, info);
|
|
2436
|
+
return [2];
|
|
2437
|
+
}
|
|
2438
|
+
});
|
|
2439
|
+
}); });
|
|
2440
|
+
};
|
|
2441
|
+
Auth.prototype.convertToUser = function (userInfo) {
|
|
2442
|
+
var _a, _b, _c;
|
|
2443
|
+
if (!userInfo)
|
|
2444
|
+
return null;
|
|
2445
|
+
var email = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email) || '';
|
|
2446
|
+
var phone = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone_number) || '';
|
|
2447
|
+
var userId = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.sub) || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.uid) || '';
|
|
2448
|
+
return {
|
|
2449
|
+
id: userId,
|
|
2450
|
+
aud: 'authenticated',
|
|
2451
|
+
role: userInfo.groups.map(function (group) { return (typeof group === 'string' ? group : group.id); }),
|
|
2452
|
+
email: email || '',
|
|
2453
|
+
email_confirmed_at: (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email_verified) ? userInfo.created_at : userInfo.created_at,
|
|
2454
|
+
phone: phone,
|
|
2455
|
+
phone_confirmed_at: phone ? userInfo.created_at : undefined,
|
|
2456
|
+
confirmed_at: userInfo.created_at,
|
|
2457
|
+
last_sign_in_at: userInfo.last_sign_in_at,
|
|
2458
|
+
app_metadata: {
|
|
2459
|
+
provider: ((_a = userInfo.loginType) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || 'cloudbase',
|
|
2460
|
+
providers: [((_b = userInfo.loginType) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || 'cloudbase'],
|
|
2461
|
+
},
|
|
2462
|
+
user_metadata: {
|
|
2463
|
+
name: userInfo === null || userInfo === void 0 ? void 0 : userInfo.name,
|
|
2464
|
+
picture: userInfo === null || userInfo === void 0 ? void 0 : userInfo.picture,
|
|
2465
|
+
username: userInfo === null || userInfo === void 0 ? void 0 : userInfo.username,
|
|
2466
|
+
gender: userInfo === null || userInfo === void 0 ? void 0 : userInfo.gender,
|
|
2467
|
+
locale: userInfo === null || userInfo === void 0 ? void 0 : userInfo.locale,
|
|
2468
|
+
uid: userInfo.uid,
|
|
2469
|
+
nickName: userInfo.nickName,
|
|
2470
|
+
avatarUrl: userInfo.avatarUrl || userInfo.picture,
|
|
2471
|
+
location: userInfo.location,
|
|
2472
|
+
hasPassword: userInfo.hasPassword,
|
|
2473
|
+
},
|
|
2474
|
+
identities: ((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.providers) === null || _c === void 0 ? void 0 : _c.map(function (p) { return ({
|
|
2475
|
+
id: p.id || '',
|
|
2476
|
+
identity_id: p.id || '',
|
|
2477
|
+
user_id: userId,
|
|
2478
|
+
identity_data: {
|
|
2479
|
+
provider_id: p.id,
|
|
2480
|
+
provider_user_id: p.provider_user_id,
|
|
2481
|
+
name: p.name,
|
|
2482
|
+
},
|
|
2483
|
+
provider: p.id || 'cloudbase',
|
|
2484
|
+
created_at: userInfo.created_at,
|
|
2485
|
+
updated_at: userInfo.updated_at,
|
|
2486
|
+
last_sign_in_at: userInfo.last_sign_in_at,
|
|
2487
|
+
}); })) || [],
|
|
2488
|
+
created_at: userInfo.created_at,
|
|
2489
|
+
updated_at: userInfo.updated_at,
|
|
2490
|
+
is_anonymous: userInfo.name === 'anonymous',
|
|
2491
|
+
};
|
|
2492
|
+
};
|
|
2493
|
+
Auth.prototype.validateParams = function (params, rules) {
|
|
2494
|
+
for (var _i = 0, _a = Object.entries(rules); _i < _a.length; _i++) {
|
|
2495
|
+
var _b = _a[_i], key = _b[0], rule = _b[1];
|
|
2496
|
+
if (rule.required && ((params === null || params === void 0 ? void 0 : params[key]) === undefined || (params === null || params === void 0 ? void 0 : params[key]) === null || (params === null || params === void 0 ? void 0 : params[key]) === '')) {
|
|
2497
|
+
throw new AuthError({ message: rule.message });
|
|
2498
|
+
}
|
|
2499
|
+
}
|
|
2500
|
+
};
|
|
2501
|
+
Auth.prototype.validateAtLeastOne = function (params, fieldGroups, message) {
|
|
2502
|
+
var hasValue = fieldGroups.some(function (group) { return group.some(function (field) { return (params === null || params === void 0 ? void 0 : params[field]) !== undefined && (params === null || params === void 0 ? void 0 : params[field]) !== null && (params === null || params === void 0 ? void 0 : params[field]) !== ''; }); });
|
|
2503
|
+
if (!hasValue) {
|
|
2504
|
+
throw new AuthError({ message: message });
|
|
2505
|
+
}
|
|
2506
|
+
};
|
|
2507
|
+
Auth.prototype.init = function () {
|
|
2508
|
+
var _a;
|
|
2509
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
2510
|
+
var credentials, error_42;
|
|
2511
|
+
return __generator(this, function (_b) {
|
|
2512
|
+
switch (_b.label) {
|
|
2513
|
+
case 0:
|
|
2514
|
+
_b.trys.push([0, 2, , 3]);
|
|
2515
|
+
return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
|
|
2516
|
+
case 1:
|
|
2517
|
+
credentials = _b.sent();
|
|
2518
|
+
if (credentials) {
|
|
2519
|
+
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.INITIAL_SESSION });
|
|
2520
|
+
}
|
|
2521
|
+
return [3, 3];
|
|
2522
|
+
case 2:
|
|
2523
|
+
error_42 = _b.sent();
|
|
2524
|
+
return [3, 3];
|
|
2525
|
+
case 3: return [2, { error: null }];
|
|
2526
|
+
}
|
|
2527
|
+
});
|
|
2528
|
+
});
|
|
2529
|
+
};
|
|
2530
|
+
__decorate([
|
|
2531
|
+
catchErrorsDecorator({
|
|
2532
|
+
title: '绑定手机号失败',
|
|
2533
|
+
messages: [
|
|
2534
|
+
'请确认以下各项:',
|
|
2535
|
+
' 1 - 调用 auth().bindPhoneNumber() 的语法或参数是否正确',
|
|
2536
|
+
' 2 - 当前环境是否开通了短信验证码登录',
|
|
2537
|
+
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
1385
2538
|
],
|
|
1386
2539
|
}),
|
|
1387
2540
|
__metadata("design:type", Function),
|
|
@@ -1457,20 +2610,6 @@ var Auth = (function () {
|
|
|
1457
2610
|
__metadata("design:paramtypes", []),
|
|
1458
2611
|
__metadata("design:returntype", Promise)
|
|
1459
2612
|
], Auth.prototype, "getCurrentUser", null);
|
|
1460
|
-
__decorate([
|
|
1461
|
-
catchErrorsDecorator({
|
|
1462
|
-
title: '匿名登录失败',
|
|
1463
|
-
messages: [
|
|
1464
|
-
'请确认以下各项:',
|
|
1465
|
-
' 1 - 当前环境是否开启了匿名登录',
|
|
1466
|
-
' 2 - 调用 auth().signInAnonymously() 的语法或参数是否正确',
|
|
1467
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
1468
|
-
],
|
|
1469
|
-
}),
|
|
1470
|
-
__metadata("design:type", Function),
|
|
1471
|
-
__metadata("design:paramtypes", [Object]),
|
|
1472
|
-
__metadata("design:returntype", Promise)
|
|
1473
|
-
], Auth.prototype, "signInAnonymously", null);
|
|
1474
2613
|
__decorate([
|
|
1475
2614
|
catchErrorsDecorator({
|
|
1476
2615
|
title: '小程序匿名登录失败',
|
|
@@ -1499,20 +2638,6 @@ var Auth = (function () {
|
|
|
1499
2638
|
__metadata("design:paramtypes", []),
|
|
1500
2639
|
__metadata("design:returntype", Promise)
|
|
1501
2640
|
], Auth.prototype, "bindOpenId", null);
|
|
1502
|
-
__decorate([
|
|
1503
|
-
catchErrorsDecorator({
|
|
1504
|
-
title: '小程序openId静默登录失败',
|
|
1505
|
-
messages: [
|
|
1506
|
-
'请确认以下各项:',
|
|
1507
|
-
' 1 - 当前环境是否开启了小程序openId静默登录',
|
|
1508
|
-
' 2 - 调用 auth().signInWithOpenId() 的语法或参数是否正确',
|
|
1509
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
1510
|
-
],
|
|
1511
|
-
}),
|
|
1512
|
-
__metadata("design:type", Function),
|
|
1513
|
-
__metadata("design:paramtypes", [Object]),
|
|
1514
|
-
__metadata("design:returntype", Promise)
|
|
1515
|
-
], Auth.prototype, "signInWithOpenId", null);
|
|
1516
2641
|
__decorate([
|
|
1517
2642
|
catchErrorsDecorator({
|
|
1518
2643
|
title: '小程序unionId静默登录失败',
|
|
@@ -1527,20 +2652,6 @@ var Auth = (function () {
|
|
|
1527
2652
|
__metadata("design:paramtypes", []),
|
|
1528
2653
|
__metadata("design:returntype", Promise)
|
|
1529
2654
|
], Auth.prototype, "signInWithUnionId", null);
|
|
1530
|
-
__decorate([
|
|
1531
|
-
catchErrorsDecorator({
|
|
1532
|
-
title: '小程序手机号授权登录失败',
|
|
1533
|
-
messages: [
|
|
1534
|
-
'请确认以下各项:',
|
|
1535
|
-
' 1 - 当前环境是否开启了小程序手机号授权登录',
|
|
1536
|
-
' 2 - 调用 auth().signInWithPhoneAuth() 的语法或参数是否正确',
|
|
1537
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
1538
|
-
],
|
|
1539
|
-
}),
|
|
1540
|
-
__metadata("design:type", Function),
|
|
1541
|
-
__metadata("design:paramtypes", [Object]),
|
|
1542
|
-
__metadata("design:returntype", Promise)
|
|
1543
|
-
], Auth.prototype, "signInWithPhoneAuth", null);
|
|
1544
2655
|
__decorate([
|
|
1545
2656
|
catchErrorsDecorator({
|
|
1546
2657
|
title: '短信验证码登陆',
|
|
@@ -1569,36 +2680,6 @@ var Auth = (function () {
|
|
|
1569
2680
|
__metadata("design:paramtypes", [Object]),
|
|
1570
2681
|
__metadata("design:returntype", Promise)
|
|
1571
2682
|
], Auth.prototype, "signInWithEmail", null);
|
|
1572
|
-
__decorate([
|
|
1573
|
-
catchErrorsDecorator({
|
|
1574
|
-
title: '自定义登录失败',
|
|
1575
|
-
messages: [
|
|
1576
|
-
'请确认以下各项:',
|
|
1577
|
-
' 1 - 当前环境是否开启了自定义登录',
|
|
1578
|
-
' 2 - 调用 auth().signInWithCustomTicket() 的语法或参数是否正确',
|
|
1579
|
-
' 3 - ticket 是否归属于当前环境',
|
|
1580
|
-
' 4 - 创建 ticket 的自定义登录私钥是否过期',
|
|
1581
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
1582
|
-
],
|
|
1583
|
-
}),
|
|
1584
|
-
__metadata("design:type", Function),
|
|
1585
|
-
__metadata("design:paramtypes", []),
|
|
1586
|
-
__metadata("design:returntype", Promise)
|
|
1587
|
-
], Auth.prototype, "signInWithCustomTicket", null);
|
|
1588
|
-
__decorate([
|
|
1589
|
-
catchErrorsDecorator({
|
|
1590
|
-
title: '注册失败',
|
|
1591
|
-
messages: [
|
|
1592
|
-
'请确认以下各项:',
|
|
1593
|
-
' 1 - 当前环境是否开启了指定登录方式',
|
|
1594
|
-
' 2 - 调用 auth().signUp() 的语法或参数是否正确',
|
|
1595
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
1596
|
-
],
|
|
1597
|
-
}),
|
|
1598
|
-
__metadata("design:type", Function),
|
|
1599
|
-
__metadata("design:paramtypes", [Object]),
|
|
1600
|
-
__metadata("design:returntype", Promise)
|
|
1601
|
-
], Auth.prototype, "signUp", null);
|
|
1602
2683
|
__decorate([
|
|
1603
2684
|
catchErrorsDecorator({
|
|
1604
2685
|
title: '获取用户是否被占用失败',
|
|
@@ -1612,20 +2693,6 @@ var Auth = (function () {
|
|
|
1612
2693
|
__metadata("design:paramtypes", [String]),
|
|
1613
2694
|
__metadata("design:returntype", Promise)
|
|
1614
2695
|
], Auth.prototype, "isUsernameRegistered", null);
|
|
1615
|
-
__decorate([
|
|
1616
|
-
catchErrorsDecorator({
|
|
1617
|
-
title: '用户登出失败',
|
|
1618
|
-
messages: [
|
|
1619
|
-
'请确认以下各项:',
|
|
1620
|
-
' 1 - 调用 auth().signOut() 的语法或参数是否正确',
|
|
1621
|
-
' 2 - 当前用户是否为匿名登录(匿名登录不支持signOut)',
|
|
1622
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
1623
|
-
],
|
|
1624
|
-
}),
|
|
1625
|
-
__metadata("design:type", Function),
|
|
1626
|
-
__metadata("design:paramtypes", [Object]),
|
|
1627
|
-
__metadata("design:returntype", Promise)
|
|
1628
|
-
], Auth.prototype, "signOut", null);
|
|
1629
2696
|
__decorate([
|
|
1630
2697
|
catchErrorsDecorator({
|
|
1631
2698
|
title: '获取本地登录态失败',
|
|
@@ -1650,7 +2717,7 @@ var Auth = (function () {
|
|
|
1650
2717
|
],
|
|
1651
2718
|
}),
|
|
1652
2719
|
__metadata("design:type", Function),
|
|
1653
|
-
__metadata("design:paramtypes", [
|
|
2720
|
+
__metadata("design:paramtypes", []),
|
|
1654
2721
|
__metadata("design:returntype", Promise)
|
|
1655
2722
|
], Auth.prototype, "getUserInfo", null);
|
|
1656
2723
|
__decorate([
|
|
@@ -1697,8 +2764,9 @@ var Auth = (function () {
|
|
|
1697
2764
|
return Auth;
|
|
1698
2765
|
}());
|
|
1699
2766
|
export function generateAuthInstance(config, options) {
|
|
1700
|
-
var
|
|
1701
|
-
var
|
|
2767
|
+
var _this = this;
|
|
2768
|
+
var _a = config.region, region = _a === void 0 ? 'ap-shanghai' : _a, i18n = config.i18n, accessKey = config.accessKey, useWxCloud = config.useWxCloud;
|
|
2769
|
+
var platform = (options === null || options === void 0 ? void 0 : options.platform) || useDefaultAdapter.bind(options)();
|
|
1702
2770
|
var runtime = platform.runtime, adapter = platform.adapter;
|
|
1703
2771
|
var _b = options || {}, env = _b.env, clientId = _b.clientId, debug = _b.debug, cache = _b.cache, cloudbase = _b.app;
|
|
1704
2772
|
var apiOrigin = (options || {}).apiOrigin;
|
|
@@ -1709,47 +2777,80 @@ export function generateAuthInstance(config, options) {
|
|
|
1709
2777
|
env: env,
|
|
1710
2778
|
clientId: clientId,
|
|
1711
2779
|
i18n: i18n,
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
2780
|
+
accessKey: accessKey,
|
|
2781
|
+
useWxCloud: useWxCloud,
|
|
2782
|
+
eventBus: new CloudbaseEventEmitter(),
|
|
2783
|
+
};
|
|
2784
|
+
var oauthInstance = new CloudbaseOAuth(useAuthAdapter(__assign(__assign({}, commonOpts), { apiOrigin: apiOrigin, apiPath: (config === null || config === void 0 ? void 0 : config.apiPath) || AUTH_API_PREFIX, storage: config === null || config === void 0 ? void 0 : config.storage, baseRequest: config === null || config === void 0 ? void 0 : config.baseRequest, request: config === null || config === void 0 ? void 0 : config.request, anonymousSignInFunc: config === null || config === void 0 ? void 0 : config.anonymousSignInFunc, captchaOptions: config === null || config === void 0 ? void 0 : config.captchaOptions, wxCloud: config === null || config === void 0 ? void 0 : config.wxCloud, adapter: adapter, onCredentialsError: onCredentialsError(commonOpts.eventBus), headers: __assign({ 'X-SDK-Version': "@cloudbase/js-sdk/".concat(config.sdkVersion) }, (config.headers || {})), detectSessionInUrl: config.detectSessionInUrl, debug: debug })));
|
|
2785
|
+
var authInstance = new Auth(__assign(__assign({}, commonOpts), { region: region, persistence: config.persistence, debug: debug, cache: cache || new CloudbaseCache({
|
|
2786
|
+
persistence: config.persistence,
|
|
2787
|
+
keys: { userInfoKey: "user_info_".concat(env) },
|
|
2788
|
+
platformInfo: platform,
|
|
2789
|
+
}), runtime: runtime || 'web', _fromApp: cloudbase, oauthInstance: oauthInstance }));
|
|
2790
|
+
oauthInstance.initializeSession(function (data, error) { return __awaiter(_this, void 0, void 0, function () {
|
|
2791
|
+
return __generator(this, function (_a) {
|
|
2792
|
+
if (!data)
|
|
2793
|
+
return [2];
|
|
2794
|
+
if (data.type === OAUTH_TYPE.SIGN_IN) {
|
|
2795
|
+
if (error) {
|
|
2796
|
+
commonOpts.eventBus.fire(EVENTS.AUTH_STATE_CHANGED, {
|
|
2797
|
+
event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN,
|
|
2798
|
+
info: __assign(__assign({}, data), { error: error }),
|
|
2799
|
+
});
|
|
2800
|
+
}
|
|
2801
|
+
else if (data.user) {
|
|
2802
|
+
authInstance.createLoginState({}, { userInfo: data.user });
|
|
2803
|
+
}
|
|
2804
|
+
}
|
|
2805
|
+
else if (data.type === OAUTH_TYPE.BIND_IDENTITY) {
|
|
2806
|
+
commonOpts.eventBus.fire(EVENTS.AUTH_STATE_CHANGED, {
|
|
2807
|
+
event: AUTH_STATE_CHANGED_TYPE.BIND_IDENTITY,
|
|
2808
|
+
info: __assign(__assign({}, data), { error: error }),
|
|
2809
|
+
});
|
|
2810
|
+
}
|
|
2811
|
+
return [2];
|
|
2812
|
+
});
|
|
2813
|
+
}); });
|
|
1721
2814
|
return { authInstance: authInstance, oauthInstance: oauthInstance };
|
|
1722
2815
|
}
|
|
2816
|
+
var NAMESPACE = 'auth';
|
|
1723
2817
|
var component = {
|
|
1724
2818
|
name: COMPONENT_NAME,
|
|
1725
|
-
namespace:
|
|
2819
|
+
namespace: NAMESPACE,
|
|
1726
2820
|
entity: function (config) {
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
2821
|
+
var auth = function (config) {
|
|
2822
|
+
var _a;
|
|
2823
|
+
if (this.authInstance && !config) {
|
|
2824
|
+
return this.authInstance;
|
|
2825
|
+
}
|
|
2826
|
+
config = config || {
|
|
2827
|
+
region: '',
|
|
2828
|
+
persistence: 'local',
|
|
2829
|
+
apiPath: AUTH_API_PREFIX,
|
|
2830
|
+
};
|
|
2831
|
+
var adapter = this.platform.adapter;
|
|
2832
|
+
var newPersistence = config.persistence || adapter.primaryStorage;
|
|
2833
|
+
if (newPersistence && newPersistence !== this.config.persistence) {
|
|
2834
|
+
this.updateConfig({ persistence: newPersistence });
|
|
2835
|
+
}
|
|
2836
|
+
var _b = generateAuthInstance(__assign(__assign({ wxCloud: this.config.wxCloud, storage: this.config.storage }, config), { persistence: this.config.persistence, i18n: this.config.i18n, accessKey: this.config.accessKey, useWxCloud: this.config.useWxCloud, sdkVersion: this.version, detectSessionInUrl: (_a = this.config.auth) === null || _a === void 0 ? void 0 : _a.detectSessionInUrl }), {
|
|
2837
|
+
env: this.config.env,
|
|
2838
|
+
clientId: this.config.clientId,
|
|
2839
|
+
apiOrigin: this.request.getBaseEndPoint(this.config.endPointMode || 'CLOUD_API'),
|
|
2840
|
+
platform: this.platform,
|
|
2841
|
+
cache: this.cache,
|
|
2842
|
+
app: this,
|
|
2843
|
+
debug: this.config.debug,
|
|
2844
|
+
}), authInstance = _b.authInstance, oauthInstance = _b.oauthInstance;
|
|
2845
|
+
this.oauthInstance = oauthInstance;
|
|
2846
|
+
this.authInstance = authInstance;
|
|
1734
2847
|
return this.authInstance;
|
|
1735
|
-
}
|
|
1736
|
-
var
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
var _a = generateAuthInstance(__assign(__assign({ wxCloud: this.config.wxCloud, storage: this.config.storage }, config), { persistence: this.config.persistence, i18n: this.config.i18n, publishable_key: this.config.publishable_key }), {
|
|
1742
|
-
env: this.config.env,
|
|
1743
|
-
clientId: this.config.clientId,
|
|
1744
|
-
apiOrigin: this.request.getBaseEndPoint(),
|
|
1745
|
-
platform: this.platform,
|
|
1746
|
-
cache: this.cache,
|
|
1747
|
-
app: this,
|
|
1748
|
-
debug: this.config.debug,
|
|
1749
|
-
}), authInstance = _a.authInstance, oauthInstance = _a.oauthInstance;
|
|
1750
|
-
this.oauthInstance = oauthInstance;
|
|
1751
|
-
this.authInstance = authInstance;
|
|
1752
|
-
return this.authInstance;
|
|
2848
|
+
};
|
|
2849
|
+
var authProto = auth.call(this, config);
|
|
2850
|
+
Object.assign(auth, authProto);
|
|
2851
|
+
Object.setPrototypeOf(auth, Object.getPrototypeOf(authProto));
|
|
2852
|
+
this[NAMESPACE] = auth;
|
|
2853
|
+
return auth;
|
|
1753
2854
|
},
|
|
1754
2855
|
};
|
|
1755
2856
|
try {
|
|
@@ -1765,4 +2866,4 @@ export function registerAuth(app) {
|
|
|
1765
2866
|
console.warn(e);
|
|
1766
2867
|
}
|
|
1767
2868
|
}
|
|
1768
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDMUMsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsaUJBQWlCLEdBQ2xCLE1BQU0sYUFBYSxDQUFBO0FBS3BCLElBQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQTtBQUU3QixJQUFNLHdCQUF3QixHQUFHO0lBQy9CLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLGlCQUFpQixFQUFFLG1CQUFtQjtDQUN2QyxDQUFBO0FBRUQsSUFBTSxNQUFNLEdBQUc7SUFFYixtQkFBbUIsRUFBRSxtQkFBbUI7Q0FDekMsQ0FBQTtBQWtCRCxJQUFNLFFBQVEsR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUE7QUFFNUMsSUFBTSxrQkFBa0IsR0FBRyxVQUFDLE1BQU07SUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLHdCQUFPLE1BQU0sS0FBRSxTQUFTLEVBQUUsd0JBQXdCLENBQUMsaUJBQWlCLElBQUcsQ0FBQTtBQUNqSCxDQUFDLENBQUE7QUFPRDtJQXVCRSxjQUFZLE9BQXFCO1FBQ3ZCLElBQUEsS0FBSyxHQUFvQixPQUFPLE1BQTNCLEVBQUUsYUFBYSxHQUFLLE9BQU8sY0FBWixDQUFZO1FBQ3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNwQixDQUFDO0lBSVksNkJBQWMsR0FBM0I7OztnQkFDRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQVcsQ0FBQTtnQkFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFXLENBQUE7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBVyxDQUFBO2dCQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQVcsQ0FBQTtnQkFDckQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQVksQ0FBQTtnQkFDdkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFXLENBQUE7Z0JBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBVyxDQUFBO2dCQUMzRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQVcsQ0FBQTtnQkFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFXLENBQUE7Z0JBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBVyxDQUFBO2dCQUMzRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQVcsQ0FBQTtnQkFDdkQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFXLENBQUE7Z0JBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBVyxDQUFBO2dCQUNsRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQVEsQ0FBQTs7OztLQUMzRDtJQUlZLGtDQUFtQixHQUFoQzs7Ozs7O3dCQUNFLEtBQUEsSUFBSSxDQUFBO3dCQUFPLFdBQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFBOzt3QkFBbEQsR0FBSyxHQUFHLEdBQUcsU0FBdUMsQ0FBQTt3QkFDbEQsS0FBQSxJQUFJLENBQUE7d0JBQVUsV0FBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLEVBQUE7O3dCQUF4RCxHQUFLLE1BQU0sR0FBRyxTQUEwQyxDQUFBO3dCQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQVcsQ0FBQTt3QkFDekQsS0FBQSxJQUFJLENBQUE7d0JBQVMsV0FBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUE7O3dCQUF0RCxHQUFLLEtBQUssR0FBRyxTQUF5QyxDQUFBO3dCQUN0RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBWSxDQUFBO3dCQUN2RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQVcsQ0FBQTt3QkFDbEUsS0FBQSxJQUFJLENBQUE7d0JBQVksV0FBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLEVBQUE7O3dCQUE1RCxHQUFLLFFBQVEsR0FBRyxTQUE0QyxDQUFBO3dCQUM1RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQVcsQ0FBQTt3QkFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFXLENBQUE7d0JBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBVyxDQUFBO3dCQUMzRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQVcsQ0FBQTt3QkFDdkQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFXLENBQUE7d0JBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBVyxDQUFBO3dCQUNsRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQVEsQ0FBQTs7Ozs7S0FDM0Q7SUFlWSxxQkFBTSxHQUFOLFVBQU8sUUFBZ0M7Ozs7OzRCQUU5QixXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGNBQWMsY0FBTSxRQUFRLEVBQUcsRUFBQTs7d0JBQTlFLFdBQVcsR0FBRyxTQUFnRTt3QkFFcEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFBOzs7OztLQUNuQztJQUVZLGtDQUFtQixHQUFoQyxVQUFpQyxNQUE2Qzs7Ozs0QkFDNUUsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsY0FBTSxNQUFNLEVBQUcsRUFBQTs7d0JBQW5FLFNBQW1FLENBQUE7d0JBQ25FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTs7Ozs7S0FDckQ7SUFnQk0sNkJBQWMsR0FBZCxVQUFlLFdBQW1CLEVBQUUsV0FBbUI7UUFDNUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxZQUFZLEVBQUUsV0FBVztZQUN6QixZQUFZLEVBQUUsV0FBVztTQUMxQixDQUFDLENBQUE7SUFDSixDQUFDO0lBZU0sNkJBQWMsR0FBZCxVQUFlLFFBQWdCO1FBQ3BDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ2hDLFVBQVUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLDJCQUEyQixDQUFDLENBQUE7U0FDL0Q7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDakIsUUFBUSxVQUFBO1NBQ1QsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQWFZLHNCQUFPLEdBQVAsVUFBUSxNQUEwQzs7Ozs7NEJBQ3pDLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFBOzt3QkFBbEUsV0FBVyxHQUFHLFNBQW9EO3dCQUN4RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7d0JBQ2xDLFdBQU8sV0FBVyxFQUFBOzs7O0tBQ25CO0lBRU8sK0JBQWdCLEdBQXhCLFVBQXlCLEdBQVc7UUFDMUIsSUFBQSxXQUFXLEdBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQXBCLENBQW9CO1FBQ3ZDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2pELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3RCLENBQUM7SUFFYSxvQ0FBcUIsR0FBbkMsVUFBb0MsR0FBVzs7Ozs7O3dCQUNyQyxXQUFXLEdBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQXBCLENBQW9CO3dCQUN0QixXQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFBOzt3QkFBdEQsUUFBUSxHQUFHLFNBQTJDO3dCQUM1RCxXQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBQTs7OztLQUNyQjtJQUVPLDBCQUFXLEdBQW5CO1FBQUEsaUJBcUJDO1FBcEJTLElBQUEsV0FBVyxHQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFwQixDQUFvQjtRQUN2QyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FDaEQ7UUFBQTtZQUNDLEtBQUs7WUFDTCxPQUFPO1lBQ1AsTUFBTTtZQUNOLFFBQVE7WUFDUixTQUFTO1lBQ1QsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxXQUFXO1lBQ1gsVUFBVTtZQUNWLFFBQVE7WUFDUixLQUFLO1lBQ0wsY0FBYztZQUNkLFdBQVc7WUFDWCxVQUFVO1NBQ1gsQ0FBQyxPQUFPLENBQUMsVUFBQyxPQUFPO1lBQ2hCLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRU8sK0JBQWdCLEdBQXhCLFVBQXlCLFFBQWE7UUFDNUIsSUFBQSxXQUFXLEdBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQXBCLENBQW9CO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMxQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQWhIWTtRQVRaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLG1DQUFtQztnQkFDbkMsb0JBQW9CO2dCQUNwQixzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O3NDQU1EO0lBcUJNO1FBVE4sb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDViwyQ0FBMkM7Z0JBQzNDLG9CQUFvQjtnQkFDcEIsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7Ozs4Q0FNRDtJQWVNO1FBVE4sb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YsMkNBQTJDO2dCQUMzQyx3QkFBd0I7Z0JBQ3hCLHNLQUE2QixrQkFBa0IsQ0FBRTthQUNsRDtTQUNGLENBQUM7Ozs7OENBU0Q7SUFhWTtRQVJaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxZQUFZO1lBQ25CLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLG9DQUFvQztnQkFDcEMsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7Ozt1Q0FLRDtJQTBDSCxXQUFDO0NBQUEsQUFuTUQsSUFtTUM7QUFJRDtJQU9FLG9CQUFZLE9BQTJCO1FBQzdCLElBQUEsS0FBSyxHQUEyQixPQUFPLE1BQWxDLEVBQUUsS0FBSyxHQUFvQixPQUFPLE1BQTNCLEVBQUUsYUFBYSxHQUFLLE9BQU8sY0FBWixDQUFZO1FBQy9DLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixVQUFVLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFBO1NBQzFEO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7UUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFFbEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztZQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsYUFBYSxlQUFBO1NBQ2QsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVNLG9DQUFlLEdBQXRCOztRQUNFLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBQSxJQUFJLENBQUMsYUFBYSwwQ0FBRSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQzVCLENBQUM7SUFFWSx5Q0FBb0IsR0FBakM7Ozs7OzRCQUNFLFdBQU0sQ0FBQSxNQUFBLElBQUksQ0FBQyxhQUFhLDBDQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQSxFQUFBOzt3QkFBakQsU0FBaUQsQ0FBQTt3QkFDakQsV0FBTSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUE7O3dCQUFyQyxTQUFxQyxDQUFBOzs7OztLQUN0QztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQTlCRCxJQThCQzs7QUFFRDtJQU1FLGNBQVksTUFBd0c7UUFDbEgsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQTtRQUV6QyxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7U0FDeEI7SUFDSCxDQUFDO0lBZ0JZLDhCQUFlLEdBQWYsVUFBZ0IsTUFBbUM7OztnQkFDOUQsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUE7OztLQUN0RDtJQWVZLDZCQUFjLEdBQWQsVUFBZSxNQUF3Qzs7O2dCQUNsRSxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBQTs7O0tBQ3pEO0lBaUJNLHdCQUFTLEdBQVQsVUFBVSxNQUFtQztRQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBaUJZLHFCQUFNLEdBQU4sVUFBTyxNQUFnQzs7O2dCQUNsRCxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQTs7O0tBQ2pEO0lBaUJZLDhCQUFlLEdBQWYsVUFDWCxNQUF5QyxFQUN6QyxPQUFrQzs7O2dCQUVsQyxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUE7OztLQUNuRTtJQUtELHNCQUFJLDZCQUFXO2FBQWY7WUFDRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFFL0IsU0FBUyxDQUNQLE1BQU0sQ0FBQyxpQkFBaUIsRUFDeEIsZ0ZBQWdGLENBQ2pGLENBQUE7Z0JBQ0QsT0FBTTthQUNQO1lBRUQsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1lBRXZDLElBQUksVUFBVSxFQUFFO2dCQUNkLE9BQU8sVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUE7YUFDL0I7WUFDRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7OztPQUFBO0lBYVksNkJBQWMsR0FBZDs7Ozs7NEJBQ1EsV0FBTSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUE7O3dCQUF2QyxVQUFVLEdBQUcsU0FBMEI7NkJBQ3pDLFVBQVUsRUFBVixjQUFVO3dCQUNaLFdBQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFBOzt3QkFBM0MsU0FBMkMsQ0FBQTt3QkFDM0MsV0FBTyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksRUFBQTs0QkFFaEMsV0FBTyxJQUFJLEVBQUE7Ozs7S0FDWjtJQWdCWSxnQ0FBaUIsR0FBakIsVUFBa0IsSUFFekI7UUFGeUIscUJBQUEsRUFBQSxTQUV6Qjs7Ozs0QkFDSixXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFBOzt3QkFBeEQsU0FBd0QsQ0FBQTt3QkFDeEQsV0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQTs7OztLQUMvQjtJQWdCWSxvQ0FBcUIsR0FBckIsVUFBc0IsRUFJN0I7WUFKNkIscUJBSS9CLEVBQUUsS0FBQSxFQUhKLFVBQVUsZ0JBQUE7Ozs7Ozs7d0JBSVYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRTs0QkFDN0IsTUFBTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTt5QkFDaEM7d0JBQ0ssTUFBTSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQTt3QkFFNUMsUUFBUSxHQUFHLFVBQU8sSUFBSTs7Ozs7d0NBQ3RCLE1BQU0sR0FBMkMsU0FBUyxDQUFBO3dDQUMxRCxXQUFXLEdBQTRCLFNBQVMsQ0FBQTs7Ozt3Q0FHekMsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FDMUQ7Z0RBQ0UsV0FBVyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLO2dEQUMxQixhQUFhLEVBQUUsSUFBSTtnREFDbkIsZUFBZSxFQUFFO29EQUNmLGtCQUFrQixFQUFFLFNBQVM7b0RBQzdCLEtBQUssRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSztpREFDckI7NkNBQ0YsRUFDRCxVQUFVLENBQ1gsRUFBQTs7d0NBVkQsTUFBTSxHQUFHLFNBVVIsQ0FBQTt3Q0FFRCxJQUFJLENBQUMsTUFBYyxhQUFkLE1BQU0sdUJBQU4sTUFBTSxDQUFVLFVBQVUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7NENBQ3pELE1BQU0sTUFBTSxDQUFBO3lDQUNiO3dDQUVhLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQzlELEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFDekMsVUFBVSxDQUNYLEVBQUE7O3dDQUhELFdBQVcsR0FBRyxTQUdiLENBQUE7d0NBRUQsSUFBSyxXQUFtQixhQUFuQixXQUFXLHVCQUFYLFdBQVcsQ0FBVSxVQUFVLEVBQUU7NENBQ3BDLE1BQU0sV0FBVyxDQUFBO3lDQUNsQjs7Ozt3Q0FFRCxNQUFNLE9BQUssQ0FBQTs7Ozs2QkFFZCxDQUFBO3dCQUVELFdBQU0sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtnQ0FDaEMsRUFBRSxDQUFDLEtBQUssQ0FBQztvQ0FDUCxPQUFPLEVBQUUsVUFBTyxHQUFxQjs7Ozs7O29EQUVqQyxXQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUE7O29EQUF4QixTQUF3QixDQUFBO29EQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Ozs7b0RBRWIsTUFBTSxDQUFDLE9BQUssQ0FBQyxDQUFBOzs7Ozt5Q0FFaEI7b0NBQ0QsSUFBSSxFQUFFLFVBQUMsR0FBUTt3Q0FDYixJQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsTUFBTSxDQUFDLENBQ25DO3dDQUFDLEtBQWEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLEtBQUssQ0FBQTt3Q0FDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO29DQUNmLENBQUM7aUNBQ0YsQ0FBQyxDQUFBOzRCQUNKLENBQUMsQ0FBQyxFQUFBOzt3QkFoQkYsU0FnQkUsQ0FBQTt3QkFFRixXQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFBOzs7O0tBQ3BFO0lBZ0JZLHlCQUFVLEdBQVY7Ozs7Ozs7d0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRTs0QkFDN0IsTUFBTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTt5QkFDaEM7d0JBQ0ssTUFBTSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQTt3QkFFNUMsUUFBUSxHQUFHLFVBQU8sSUFBSTs7Ozs7d0NBQ3RCLE1BQU0sR0FBMkMsU0FBUyxDQUFBOzs7O3dDQUduRCxXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO2dEQUMzRCxXQUFXLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUs7Z0RBQzFCLGFBQWEsRUFBRSxJQUFJO2dEQUNuQixlQUFlLEVBQUU7b0RBQ2Ysa0JBQWtCLEVBQUUsU0FBUztvREFDN0IsS0FBSyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLO2lEQUNyQjs2Q0FDRixDQUFDLEVBQUE7O3dDQVBGLE1BQU0sR0FBRyxTQU9QLENBQUE7d0NBRUYsSUFBSSxDQUFDLE1BQWMsYUFBZCxNQUFNLHVCQUFOLE1BQU0sQ0FBVSxVQUFVLEtBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFOzRDQUN6RCxNQUFNLE1BQU0sQ0FBQTt5Q0FDYjt3Q0FFRCxXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFBOzt3Q0FBNUYsU0FBNEYsQ0FBQTs7Ozt3Q0FFNUYsTUFBTSxPQUFLLENBQUE7Ozs7NkJBRWQsQ0FBQTt3QkFFRCxXQUFNLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07Z0NBQ2hDLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0NBQ1AsT0FBTyxFQUFFLFVBQU8sR0FBcUI7Ozs7OztvREFFakMsV0FBTSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFBOztvREFBeEIsU0FBd0IsQ0FBQTtvREFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBOzs7O29EQUViLE1BQU0sQ0FBQyxPQUFLLENBQUMsQ0FBQTs7Ozs7eUNBRWhCO29DQUNELElBQUksRUFBRSxVQUFDLEdBQVE7d0NBQ2IsSUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLE1BQU0sQ0FBQyxDQUNuQzt3Q0FBQyxLQUFhLENBQUMsSUFBSSxHQUFHLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxLQUFLLENBQUE7d0NBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQ0FDZixDQUFDO2lDQUNGLENBQUMsQ0FBQTs0QkFDSixDQUFDLENBQUMsRUFBQTs7d0JBaEJGLFNBZ0JFLENBQUE7d0JBRUYsV0FBTTs7OztLQUNQO0lBZ0JZLCtCQUFnQixHQUFoQixVQUFpQixFQUEwQjtZQUExQixxQkFBd0IsRUFBRSxLQUFBLEVBQXhCLGtCQUFpQixFQUFqQixVQUFVLG1CQUFHLElBQUksS0FBQTs7Ozs7Ozt3QkFDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRTs0QkFDN0IsTUFBTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTt5QkFDaEM7d0JBQ0ssTUFBTSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQTt3QkFFNUMsUUFBUSxHQUFHLFVBQU8sSUFBSTs7Ozs7d0NBQ3RCLE1BQU0sR0FBMkMsU0FBUyxDQUFBO3dDQUMxRCxXQUFXLEdBQTRCLFNBQVMsQ0FBQTs7Ozt3Q0FHekMsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FDMUQ7Z0RBQ0UsV0FBVyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLO2dEQUMxQixhQUFhLEVBQUUsSUFBSTtnREFDbkIsZUFBZSxFQUFFO29EQUNmLGtCQUFrQixFQUFFLFNBQVM7b0RBQzdCLEtBQUssRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSztpREFDckI7NkNBQ0YsRUFDRCxVQUFVLENBQ1gsRUFBQTs7d0NBVkQsTUFBTSxHQUFHLFNBVVIsQ0FBQTt3Q0FFRCxJQUFJLENBQUMsTUFBYyxhQUFkLE1BQU0sdUJBQU4sTUFBTSxDQUFVLFVBQVUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7NENBQ3pELE1BQU0sTUFBTSxDQUFBO3lDQUNiO3dDQUVhLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQy9ELEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFDekMsVUFBVSxDQUNYLEVBQUE7O3dDQUhELFdBQVcsR0FBRyxTQUdiLENBQUE7d0NBRUQsSUFBSyxXQUFtQixhQUFuQixXQUFXLHVCQUFYLFdBQVcsQ0FBVSxVQUFVLEVBQUU7NENBQ3BDLE1BQU0sV0FBVyxDQUFBO3lDQUNsQjs7Ozt3Q0FFRCxNQUFNLE9BQUssQ0FBQTs0Q0FFYixXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUEwQixDQUFDLEVBQUE7O3dDQUFoRixTQUFnRixDQUFBOzs7OzZCQUNqRixDQUFBO3dCQUVELFdBQU0sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtnQ0FDaEMsRUFBRSxDQUFDLEtBQUssQ0FBQztvQ0FDUCxPQUFPLEVBQUUsVUFBTyxHQUFxQjs7Ozs7O29EQUVqQyxXQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUE7O29EQUF4QixTQUF3QixDQUFBO29EQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Ozs7b0RBRWIsTUFBTSxDQUFDLE9BQUssQ0FBQyxDQUFBOzs7Ozt5Q0FFaEI7b0NBQ0QsSUFBSSxFQUFFLFVBQUMsR0FBUTt3Q0FDYixJQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsTUFBTSxDQUFDLENBQ25DO3dDQUFDLEtBQWEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLEtBQUssQ0FBQTt3Q0FDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO29DQUNmLENBQUM7aUNBQ0YsQ0FBQyxDQUFBOzRCQUNKLENBQUMsQ0FBQyxFQUFBOzt3QkFoQkYsU0FnQkUsQ0FBQTt3QkFFRixXQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFBOzs7O0tBQy9CO0lBZ0JZLGdDQUFpQixHQUFqQjs7Ozs7Ozt3QkFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFOzRCQUM3QixNQUFNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO3lCQUNoQzs7Ozt3QkFFQyxXQUFNLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07Z0NBQ2hDLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQTtnQ0FDbEQsRUFBRSxDQUFDLEtBQUssQ0FBQztvQ0FDUCxPQUFPLEVBQUUsVUFBTyxHQUFxQjs7Ozs7b0RBQzdCLFVBQVUsR0FBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFBOzs7O29EQUVmLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7NERBQ2pFLGFBQWEsRUFBRSxHQUFHLENBQUMsSUFBSTs0REFDdkIsV0FBVyxFQUFFLFVBQVU7NERBQ3ZCLGVBQWUsRUFBRTtnRUFDZixrQkFBa0IsRUFBRSxVQUFVO2dFQUM5QixLQUFLLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUs7NkRBQ3JCO3lEQUNGLENBQUMsRUFBQTs7b0RBUEksTUFBTSxHQUFHLFNBT2I7b0RBRXNCLGFBQWEsR0FBSyxNQUFNLGVBQVgsQ0FBVztvREFFaEQsSUFBSSxDQUFDLGFBQWEsRUFBRTt3REFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO3dEQUNkLFdBQU07cURBQ1A7b0RBRWlCLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7NERBQ3BFLFdBQVcsRUFBRSxVQUFVOzREQUN2QixjQUFjLEVBQUUsYUFBYTt5REFDOUIsQ0FBQyxFQUFBOztvREFISSxTQUFTLEdBQUcsU0FHaEI7b0RBRUYsSUFBSyxTQUFpQixhQUFqQixTQUFTLHVCQUFULFNBQVMsQ0FBVSxVQUFVLEVBQUU7d0RBQ2xDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTt3REFDakIsV0FBTTtxREFDUDtvREFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Ozs7b0RBRWIsTUFBTSxDQUFDLE9BQUssQ0FBQyxDQUFBOzs7Ozt5Q0FFaEI7b0NBQ0QsSUFBSSxFQUFFLFVBQUMsR0FBUTt3Q0FDYixJQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsTUFBTSxDQUFDLENBQ25DO3dDQUFDLEtBQWEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLEtBQUssQ0FBQTt3Q0FDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO29DQUNmLENBQUM7aUNBQ0YsQ0FBQyxDQUFBOzRCQUNKLENBQUMsQ0FBQyxFQUFBOzt3QkExQ0YsU0EwQ0UsQ0FBQTs7Ozt3QkFFRixNQUFNLE9BQUssQ0FBQTs0QkFHYixXQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFBOzs7O0tBQy9CO0lBZ0JZLGtDQUFtQixHQUFuQixVQUFvQixFQUFrQjtZQUFoQixpQkFBYyxFQUFkLFNBQVMsbUJBQUcsRUFBRSxLQUFBOzs7Ozs7d0JBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUU7NEJBQzdCLE1BQU0sS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7eUJBQ2hDO3dCQUNLLE1BQU0sR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUE7d0JBQzVDLFlBQVksR0FBRzs0QkFDbkIsZUFBZSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFOzRCQUNoRCxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUs7eUJBQzFCLENBQUE7d0JBRWdCLFdBQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFBOzt3QkFBekIsSUFBSSxHQUFLLENBQUEsU0FBZ0IsQ0FBQSxLQUFyQjt3QkFDVixZQUFvQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7Ozs7d0JBR3JCLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLEVBQUE7O3dCQUFqRixhQUFhLEdBQUcsU0FBaUU7d0JBQ3JGLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRTs0QkFDNUIsTUFBTSxhQUFhLENBQUE7eUJBQ3BCO3dCQUVlLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7Z0NBQ2xFLGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYztnQ0FDNUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dDQUN6QixlQUFlLEVBQUU7b0NBQ2YsSUFBSSxFQUFFLFNBQVM7b0NBQ2Ysa0JBQWtCLEVBQUUsT0FBTztpQ0FDNUI7NkJBQ0YsQ0FBQyxFQUFBOzt3QkFQRixhQUFhLEdBQUcsU0FPZCxDQUFBO3dCQUNGLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRTs0QkFDNUIsTUFBTSxhQUFhLENBQUE7eUJBQ3BCO3dCQUVpQixXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO2dDQUNwRSxjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWM7NkJBQzdDLENBQUMsRUFBQTs7d0JBRkksU0FBUyxHQUFHLFNBRWhCO3dCQUVGLElBQUssU0FBaUIsYUFBakIsU0FBUyx1QkFBVCxTQUFTLENBQVUsVUFBVSxFQUFFOzRCQUNsQyxNQUFNLFNBQVMsQ0FBQTt5QkFDaEI7Ozs7d0JBRUQsTUFBTSxPQUFLLENBQUE7NEJBR2IsV0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQTs7OztLQUMvQjtJQWdCWSw0QkFBYSxHQUFiLFVBQWMsRUFLMUI7WUFKQyx3QkFBMEQsRUFBMUQsZ0JBQWdCLG1CQUFHLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUEsRUFDMUQsd0JBQXFCLEVBQXJCLGdCQUFnQixtQkFBRyxFQUFFLEtBQUEsRUFDckIsZ0JBQWEsRUFBYixRQUFRLG1CQUFHLEVBQUUsS0FBQSxFQUNiLGdCQUFvQixFQUFwQixRQUFRLG1CQUFHLFNBQVMsS0FBQTs7O2dCQUVwQixJQUFJO29CQUNGLFdBQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDOzRCQUM3QixnQkFBZ0Isa0JBQUE7NEJBQ2hCLGdCQUFnQixrQkFBQTs0QkFDaEIsUUFBUSxVQUFBOzRCQUNSLFFBQVEsRUFBRSxRQUFROzRCQUNsQixTQUFTLEVBQUUsS0FBSzt5QkFDakIsQ0FBQyxFQUFBO2lCQUNIO2dCQUFDLE9BQU8sS0FBSyxFQUFFO29CQUNkLE1BQU0sS0FBSyxDQUFBO2lCQUNaOzs7O0tBQ0Y7SUFnQlksOEJBQWUsR0FBZixVQUFnQixFQUs1QjtZQUpDLHdCQUEwRCxFQUExRCxnQkFBZ0IsbUJBQUcsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBQSxFQUMxRCx3QkFBcUIsRUFBckIsZ0JBQWdCLG1CQUFHLEVBQUUsS0FBQSxFQUNyQixnQkFBb0IsRUFBcEIsUUFBUSxtQkFBRyxTQUFTLEtBQUEsRUFDcEIsYUFBVSxFQUFWLEtBQUssbUJBQUcsRUFBRSxLQUFBOzs7Z0JBRVYsSUFBSTtvQkFDRixXQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs0QkFDN0IsZ0JBQWdCLGtCQUFBOzRCQUNoQixnQkFBZ0Isa0JBQUE7NEJBQ2hCLFFBQVEsVUFBQTs0QkFDUixRQUFRLEVBQUUsS0FBSzs0QkFDZixTQUFTLEVBQUUsT0FBTzt5QkFDbkIsQ0FBQyxFQUFBO2lCQUNIO2dCQUFDLE9BQU8sS0FBSyxFQUFFO29CQUNkLE1BQU0sS0FBSyxDQUFBO2lCQUNaOzs7O0tBQ0Y7SUFPTSxnQ0FBaUIsR0FBeEIsVUFBeUIsU0FBMkM7UUFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDekQsQ0FBQztJQWtCWSxxQ0FBc0IsR0FBdEI7Ozs7NEJBQ1gsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxFQUFBOzt3QkFBekQsU0FBeUQsQ0FBQTt3QkFDekQsV0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQTs7OztLQUMvQjtJQVFZLHFCQUFNLEdBQW5CLFVBQW9CLE1BQWdDOzs7OzRCQUNsRCxXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQTs7d0JBQS9DLFNBQStDLENBQUE7d0JBQy9DLFdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7O0tBQ3JDO0lBaUJZLHFCQUFNLEdBQU4sVUFBTyxNQUFnQzs7Ozs0QkFDbEQsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUE7O3dCQUEvQyxTQUErQyxDQUFBO3dCQUMvQyxXQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFBOzs7O0tBQy9CO0lBUVksMEJBQVcsR0FBeEIsVUFBeUIsTUFBcUM7OztnQkFDNUQsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUE7OztLQUN0RDtJQWNZLG1DQUFvQixHQUFwQixVQUFxQixRQUFnQjs7Ozs7O3dCQUNoRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTs0QkFDaEMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsMkJBQTJCLENBQUMsQ0FBQTt5QkFDL0Q7d0JBRWlCLFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxRQUFRLFVBQUEsRUFBRSxDQUFDLEVBQUE7O3dCQUF6RSxLQUFLLEdBQUssQ0FBQSxTQUErRCxDQUFBLE1BQXBFO3dCQUNiLFdBQU8sS0FBSyxFQUFBOzs7O0tBQ2I7SUFjWSxzQkFBTyxHQUFQLFVBQVEsTUFBa0M7Ozs7Ozt3QkFDN0MsV0FBVyxHQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFwQixDQUFvQjt3QkFDM0IsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUE7O3dCQUF0RCxHQUFHLEdBQUcsU0FBZ0Q7d0JBQzVELFdBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBQTs7d0JBQTlDLFNBQThDLENBQUE7d0JBQzlDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7d0JBQzNGLFdBQU8sR0FBRyxFQUFBOzs7O0tBQ1g7SUFLTSw0QkFBYSxHQUFwQjs7UUFDRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtZQUUvQixTQUFTLENBQ1AsTUFBTSxDQUFDLGlCQUFpQixFQUN4QiwrRUFBK0UsQ0FDaEYsQ0FBQTtZQUNELE9BQU07U0FDUDtRQUVELElBQU0sZUFBZSxHQUFHLE1BQUEsSUFBSSxDQUFDLGFBQWEsMENBQUUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDdkUsSUFBSSxlQUFlLEVBQUU7WUFDbkIsSUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUM7Z0JBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7Z0JBQ3RCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO2FBQ2xDLENBQUMsQ0FBQTtZQUNGLE9BQU8sVUFBVSxDQUFBO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBY1ksNEJBQWEsR0FBYjs7Ozs7O3dCQUNQLGVBQWUsR0FBRyxJQUFJLENBQUE7Ozs7d0JBR04sV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBQTs7d0JBQWxFLGVBQWUsR0FBRyxTQUFnRCxDQUFBOzs7O3dCQUVsRSxXQUFPLElBQUksRUFBQTs7d0JBR2IsSUFBSSxlQUFlLEVBQUU7NEJBQ2IsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDO2dDQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO2dDQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0NBQ2pCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTs2QkFDbEMsQ0FBQyxDQUFBOzRCQUNGLFdBQU8sVUFBVSxFQUFBO3lCQUNsQjt3QkFFRCxXQUFPLElBQUksRUFBQTs7OztLQUNaO0lBV1ksMEJBQVcsR0FBWCxVQUFZLE1BQTZCOzs7Z0JBQ3BELFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7S0FDdEQ7SUFXWSw4QkFBZSxHQUFmOzs7Z0JBQ1gsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBQTs7O0tBQ3BEO0lBRVksa0NBQW1CLEdBQWhDLFVBQWlDLE1BQTZDOzs7Ozs0QkFDekQsV0FBTSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUE7O3dCQUF2QyxVQUFVLEdBQUcsU0FBMEI7NkJBQ3pDLFVBQVUsRUFBVixjQUFVO3dCQUNaLFdBQU8sVUFBVSxDQUFDLElBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBQTs7d0JBQTNELFNBQTJELENBQUE7OzRCQUU3RCxXQUFNOzs7O0tBQ1A7SUFNTSw0QkFBYSxHQUFwQjtRQUNFLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtRQUMzQyxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFpQlksK0JBQWdCLEdBQWhCLFVBQWlCLE1BQTBDOzs7Z0JBQ3RFLFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUE7OztLQUMzRDtJQVFZLHdCQUFTLEdBQXRCLFVBQXVCLFFBQTRDOzs7Z0JBQ2pFLFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUE7OztLQUM3RDtJQUVZLDZCQUFjLEdBQTNCOzs7Ozs0QkFDOEIsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsRUFBQTs7d0JBQTVFLG1CQUFtQixHQUFHLFNBQXNEO3dCQUNsRixXQUFPO2dDQUNMLFdBQVcsRUFBRSxtQkFBbUI7Z0NBQ2hDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7NkJBQ3JCLEVBQUE7Ozs7S0FDRjtJQUVZLGlDQUFrQixHQUEvQixVQUFnQyxNQUE0Qzs7O2dCQUMxRSxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7S0FDN0Q7SUFFWSxpQ0FBa0IsR0FBL0IsVUFBZ0MsTUFBNEM7OztnQkFDMUUsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBQTs7O0tBQzdEO0lBRVksaUNBQWtCLEdBQS9CLFVBQWdDLE1BQTRDOzs7OzRCQUMxRSxXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzt3QkFBM0QsU0FBMkQsQ0FBQTt3QkFDM0QsV0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUE7Ozs7S0FDckM7SUFFWSwrQkFBZ0IsR0FBN0IsVUFBOEIsTUFBZ0I7UUFBaEIsdUJBQUEsRUFBQSxXQUFnQjs7Ozs0QkFDNUMsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBQTs7d0JBQXpELFNBQXlELENBQUE7d0JBQ3pELFdBQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7O0tBQ3JDO0lBRVkseUJBQVUsR0FBdkIsVUFBd0IsTUFBb0M7Ozs7NEJBQzFELFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFBOzt3QkFBbkQsU0FBbUQsQ0FBQTt3QkFDbkQsV0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQTs7OztLQUMvQjtJQUVZLHFDQUFzQixHQUFuQyxVQUFvQyxNQUFnRDs7O2dCQUNsRixXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7S0FDakU7SUFFWSw0QkFBYSxHQUExQixVQUEyQixNQUF1Qzs7O2dCQUNoRSxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBQTs7O0tBQ3hEO0lBRVksOEJBQWUsR0FBNUIsVUFBNkIsTUFBeUM7OztnQkFDcEUsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUE7OztLQUMxRDtJQUVZLG1CQUFJLEdBQWpCLFVBQWtCLE1BQThCOzs7Z0JBQzlDLFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7S0FDL0M7SUFFWSx1QkFBUSxHQUFyQixVQUFzQixNQUFrQzs7O2dCQUN0RCxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBQTs7O0tBQ25EO0lBRVksMkJBQVksR0FBekI7OztnQkFDRSxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFBOzs7S0FDakQ7SUFFWSx5QkFBVSxHQUF2Qjs7O2dCQUNFLFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUE7OztLQUMvQztJQUVZLDBCQUFXLEdBQXhCOzs7Z0JBQ0UsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBQTs7O0tBQ2hEO0lBRVksa0NBQW1CLEdBQWhDLFVBQWlDLFFBQWtCOzs7Ozs7O3dCQUNqRCxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxVQUFPLE1BQU07Ozs7Ozs2Q0FFaEMsQ0FBQSxDQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksMENBQUUsU0FBUyxNQUFLLHdCQUF3QixDQUFDLGlCQUFpQixDQUFBLEVBQXRFLGNBQXNFO3dDQUFHLFdBQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFBOzt3Q0FBMUIsS0FBQSxTQUEwQixDQUFBOzs7d0NBQUcsS0FBQSxFQUFFLENBQUE7Ozt3Q0FBckgsVUFBVSxLQUEyRzt3Q0FDM0gsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLHdCQUFPLE1BQU0sR0FBSyxVQUFVLEVBQUcsQ0FBQTs7Ozs2QkFDbEQsQ0FBQyxDQUFBO3dCQUVpQixXQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBQTs7d0JBQXZDLFVBQVUsR0FBRyxTQUEwQjt3QkFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7Ozs7O0tBQ2hDO0lBT1ksZ0NBQWlCLEdBQTlCLFVBQStCLE1BQTRCOzs7Z0JBQ3pELFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUE7OztLQUM1RDtJQU1ZLDZCQUFjLEdBQTNCOzs7Z0JBQ0UsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBQTs7O0tBQ25EO0lBSVksNkJBQWMsR0FBM0IsVUFBNEIsV0FBd0I7Ozs7NEJBQ2xELFdBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFBOzt3QkFBakUsU0FBaUUsQ0FBQTs7Ozs7S0FDbEU7SUFVWSxpQ0FBa0IsR0FBbEI7OztnQkFDWCxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUE7OztLQUN2RDtJQUVZLGdDQUFpQixHQUE5QixVQUErQixNQUFnRDs7O2dCQUM3RSxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7S0FDNUQ7SUFFWSxnQ0FBaUIsR0FBOUIsVUFBK0IsTUFBc0M7OztnQkFDbkUsV0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBQTs7O0tBQzVEO0lBRVksbUNBQW9CLEdBQWpDLFVBQWtDLE1BQThDOzs7Z0JBQzlFLFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUE7OztLQUM3RDtJQUVZLHlDQUEwQixHQUF2QyxVQUF3QyxNQUFvRDs7O2dCQUMxRixXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7S0FDckU7SUFFWSw2QkFBYyxHQUEzQixVQUE0QixNQUE2Qzs7O2dCQUN2RSxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBQTs7O0tBQ3pEO0lBRVkseUNBQTBCLEdBQXZDLFVBQXdDLE1BQW9EOzs7Z0JBQzFGLFdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLEVBQUE7OztLQUNyRTtJQUVZLGlDQUFrQixHQUEvQixVQUFnQyxNQUFxQzs7O2dCQUNuRSxXQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFBOzs7S0FDN0Q7SUFPWSxpQ0FBa0IsR0FBL0IsVUFBZ0MsTUFBMEM7UUFBMUMsdUJBQUEsRUFBQSxXQUEwQzs7OztnQkFDbEUsYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFBO2dCQUVwRCxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDNUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSx3Q0FBd0MsRUFBRSxDQUFDLENBQUE7aUJBQ2pFO3FCQUFNO29CQUNDLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFBO29CQUN6RCxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBQzdCLFNBQVMsR0FBRyxVQUFHLE1BQU0sQ0FBQyxNQUFNLDZCQUFtQixNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUscUJBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLHdCQUNoRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsNkJBQ0gsYUFBYSwyQkFBaUIsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUUsQ0FBQTtvQkFDbEYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFBO2lCQUNqQzs7OztLQUNGO0lBRWEsK0JBQWdCLEdBQTlCLFVBQ0UsTUFBMEMsRUFDMUMsT0FBd0M7Ozs7Ozt3QkFFbEMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDOzRCQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHOzRCQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7NEJBQ2pCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTt5QkFDbEMsQ0FBQyxDQUFBO3dCQUVGLFdBQU0sVUFBVSxDQUFDLG9CQUFvQixFQUFFLEVBQUE7O3dCQUF2QyxTQUF1QyxDQUFBOzZCQUNuQyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxnQkFBZ0IsQ0FBQSxFQUF6QixjQUF5Qjt3QkFDM0IsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7OzRCQUUvQixXQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFBOzt3QkFBckMsU0FBcUMsQ0FBQTs7O3dCQUV2QyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO3dCQUMxRixXQUFPLFVBQVUsRUFBQTs7OztLQUNsQjtJQUthLGlDQUFrQixHQUFoQyxVQUFpQyxFQU1oQztZQUxDLHdCQUEwRCxFQUExRCxnQkFBZ0IsbUJBQUcsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBQSxFQUMxRCx3QkFBcUIsRUFBckIsZ0JBQWdCLG1CQUFHLEVBQUUsS0FBQSxFQUNyQixnQkFBMEIsRUFBaEIsV0FBVyxtQkFBRyxFQUFFLEtBQUEsRUFDMUIsZ0JBQW9CLEVBQXBCLFFBQVEsbUJBQUcsU0FBUyxLQUFBLEVBQ3BCLGlCQUFjLEVBQWQsU0FBUyxtQkFBRyxFQUFFLEtBQUE7Ozs7Ozs7d0JBSU0sV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0NBQ3hELGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxlQUFlO2dDQUNqRCxpQkFBaUIsRUFBRSxnQkFBZ0I7NkJBQ3BDLENBQUMsRUFBQTs7d0JBSEksU0FBUyxHQUFHLFNBR2hCO3dCQUVGLElBQUssU0FBaUIsYUFBakIsU0FBUyx1QkFBVCxTQUFTLENBQVUsVUFBVSxFQUFFOzRCQUNsQyxNQUFNLFNBQVMsQ0FBQTt5QkFDaEI7d0JBRU8sa0JBQWtCLEdBQUssU0FBUyxtQkFBZCxDQUFjO3dCQUdwQyxRQUFRLEdBQUcsY0FBTyxXQUFXLENBQUUsQ0FBQTt3QkFDL0IsV0FBVyxHQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFBO3dCQUdqRCxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7NEJBQ3pCLFFBQVEsR0FBRyxXQUFXLENBQUE7NEJBQ3RCLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQTt5QkFDbEM7NkJBR0csZ0JBQWdCLENBQUMsT0FBTyxFQUF4QixjQUF3Qjt3QkFFUixXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQ0FDeEQsUUFBUSxVQUFBO2dDQUNSLGtCQUFrQixvQkFBQTs2QkFDbkIsQ0FBQyxFQUFBOzt3QkFISSxTQUFTLEdBQUcsU0FHaEI7d0JBRUYsSUFBSyxTQUFpQixhQUFqQixTQUFTLHVCQUFULFNBQVMsQ0FBVSxVQUFVLEVBQUU7NEJBQ2xDLE1BQU0sU0FBUyxDQUFBO3lCQUNoQjs2QkFFRyxRQUFRLEVBQVIsY0FBUTt3QkFDTSxXQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO2dDQUNoRSxjQUFjLEVBQUcsUUFBZ0IsYUFBaEIsUUFBUSx1QkFBUixRQUFRLENBQVUsYUFBYTs2QkFDakQsQ0FBQyxFQUFBOzt3QkFGSSxPQUFPLEdBQUcsU0FFZDt3QkFFRixJQUFLLE9BQWUsYUFBZixPQUFPLHVCQUFQLE9BQU8sQ0FBVSxVQUFVLEVBQUU7NEJBQ2hDLE1BQU0sT0FBTyxDQUFBO3lCQUNkOzs7NEJBSWUsV0FBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLHVCQUNwRCxXQUFXLEtBQ2Qsa0JBQWtCLG9CQUFBLEVBQ2xCLGNBQWMsRUFBRyxRQUFnQixhQUFoQixRQUFRLHVCQUFSLFFBQVEsQ0FBVSxVQUFVLElBQzdDLEVBQUE7O3dCQUpJLFNBQVMsR0FBRyxTQUloQjt3QkFFRixJQUFLLFNBQWlCLGFBQWpCLFNBQVMsdUJBQVQsU0FBUyxDQUFVLFVBQVUsRUFBRTs0QkFDbEMsTUFBTSxTQUFTLENBQUE7eUJBQ2hCOzs0QkFHSCxXQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFBOzs7d0JBRTlCLE1BQU0sUUFBSyxDQUFBOzs7OztLQUVkO0lBdGhDWTtRQVRaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLDhDQUE4QztnQkFDOUMsd0JBQXdCO2dCQUN4QixzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7OytDQUdEO0lBZVk7UUFUWixvQkFBb0IsQ0FBQztZQUNwQixLQUFLLEVBQUUsVUFBVTtZQUNqQixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDViw2Q0FBNkM7Z0JBQzdDLHdCQUF3QjtnQkFDeEIsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7Ozs4Q0FHRDtJQWlCTTtRQVROLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLHdDQUF3QztnQkFDeEMsdUJBQXVCO2dCQUN2QixzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O3lDQUdEO0lBaUJZO1FBVFosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YscUNBQXFDO2dCQUNyQywyQkFBMkI7Z0JBQzNCLHNLQUE2QixrQkFBa0IsQ0FBRTthQUNsRDtTQUNGLENBQUM7Ozs7c0NBR0Q7SUFpQlk7UUFUWixvQkFBb0IsQ0FBQztZQUNwQixLQUFLLEVBQUUsU0FBUztZQUNoQixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDViw4Q0FBOEM7Z0JBQzlDLDJCQUEyQjtnQkFDM0Isc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7OzsrQ0FNRDtJQWtDWTtRQVJaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLDZDQUE2QztnQkFDN0Msc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7Ozs4Q0FRRDtJQWdCWTtRQVRaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxRQUFRO1lBQ2YsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YscUJBQXFCO2dCQUNyQixnREFBZ0Q7Z0JBQ2hELHNLQUE2QixrQkFBa0IsQ0FBRTthQUNsRDtTQUNGLENBQUM7Ozs7aURBTUQ7SUFnQlk7UUFUWixvQkFBb0IsQ0FBQztZQUNwQixLQUFLLEVBQUUsV0FBVztZQUNsQixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDVixxQkFBcUI7Z0JBQ3JCLG9EQUFvRDtnQkFDcEQsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7OztxREFnRUQ7SUFnQlk7UUFUWixvQkFBb0IsQ0FBQztZQUNwQixLQUFLLEVBQUUsZUFBZTtZQUN0QixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDViw4QkFBOEI7Z0JBQzlCLHlDQUF5QztnQkFDekMsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7OzswQ0FpREQ7SUFnQlk7UUFUWixvQkFBb0IsQ0FBQztZQUNwQixLQUFLLEVBQUUsaUJBQWlCO1lBQ3hCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLDhCQUE4QjtnQkFDOUIsK0NBQStDO2dCQUMvQyxzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O2dEQTZERDtJQWdCWTtRQVRaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YsK0JBQStCO2dCQUMvQixnREFBZ0Q7Z0JBQ2hELHNLQUE2QixrQkFBa0IsQ0FBRTthQUNsRDtTQUNGLENBQUM7Ozs7aURBc0REO0lBZ0JZO1FBVFosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLGNBQWM7WUFDckIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YsMkJBQTJCO2dCQUMzQixrREFBa0Q7Z0JBQ2xELHNLQUE2QixrQkFBa0IsQ0FBRTthQUNsRDtTQUNGLENBQUM7Ozs7bURBNENEO0lBZ0JZO1FBVFosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YsMkJBQTJCO2dCQUMzQiw0Q0FBNEM7Z0JBQzVDLHNLQUE2QixrQkFBa0IsQ0FBRTthQUNsRDtTQUNGLENBQUM7Ozs7NkNBa0JEO0lBZ0JZO1FBVFosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YscUJBQXFCO2dCQUNyQiw4Q0FBOEM7Z0JBQzlDLHNLQUE2QixrQkFBa0IsQ0FBRTthQUNsRDtTQUNGLENBQUM7Ozs7K0NBa0JEO0lBMkJZO1FBWFosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1Ysc0JBQXNCO2dCQUN0QixxREFBcUQ7Z0JBQ3JELHdCQUF3QjtnQkFDeEIsOEJBQThCO2dCQUM5QixzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O3NEQUlEO0lBNEJZO1FBVFosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLE1BQU07WUFDYixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDVix1QkFBdUI7Z0JBQ3ZCLHFDQUFxQztnQkFDckMsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7OztzQ0FJRDtJQXdCWTtRQVJaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLG1EQUFtRDtnQkFDbkQsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7OztvREFRRDtJQWNZO1FBVFosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDVixzQ0FBc0M7Z0JBQ3RDLG1DQUFtQztnQkFDbkMsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7Ozt1Q0FPRDtJQXVDWTtRQVJaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLDRDQUE0QztnQkFDNUMsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7Ozs2Q0FvQkQ7SUFXWTtRQVRaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLGFBQWE7Z0JBQ2IsMENBQTBDO2dCQUMxQyxzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7OzJDQUdEO0lBV1k7UUFUWixvQkFBb0IsQ0FBQztZQUNwQixLQUFLLEVBQUUsY0FBYztZQUNyQixRQUFRLEVBQUU7Z0JBQ1IsVUFBVTtnQkFDVixhQUFhO2dCQUNiLDhDQUE4QztnQkFDOUMsc0tBQTZCLGtCQUFrQixDQUFFO2FBQ2xEO1NBQ0YsQ0FBQzs7OzsrQ0FHRDtJQWtDWTtRQVRaLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLCtDQUErQztnQkFDL0MscUJBQXFCO2dCQUNyQixzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O2dEQUdEO0lBcUhZO1FBUlosb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YsaURBQWlEO2dCQUNqRCxzS0FBNkIsa0JBQWtCLENBQUU7YUFDbEQ7U0FDRixDQUFDOzs7O2tEQUdEO0lBOElILFdBQUM7Q0FBQSxBQXJqQ0QsSUFxakNDO0FBSUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUF3QixFQUN4QixPQVFDO0lBRU8sSUFBQSxLQUFrRCxNQUFNLE9BQWxDLEVBQXRCLE1BQU0sbUJBQUcsYUFBYSxLQUFBLEVBQUUsSUFBSSxHQUFzQixNQUFNLEtBQTVCLEVBQUUsZUFBZSxHQUFLLE1BQU0sZ0JBQVgsQ0FBVztJQUNoRSxJQUFNLFFBQVEsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxRQUFRLEtBQUssaUJBQWlCLEVBQTZCLENBQUE7SUFDN0UsSUFBQSxPQUFPLEdBQWMsUUFBUSxRQUF0QixFQUFFLE9BQU8sR0FBSyxRQUFRLFFBQWIsQ0FBYTtJQUUvQixJQUFBLEtBQWtELE9BQU8sSUFBSSxFQUFFLEVBQTdELEdBQUcsU0FBQSxFQUFFLFFBQVEsY0FBQSxFQUFFLEtBQUssV0FBQSxFQUFFLEtBQUssV0FBQSxFQUFPLFNBQVMsU0FBa0IsQ0FBQTtJQUMvRCxJQUFBLFNBQVMsR0FBSyxDQUFBLE9BQU8sSUFBSSxFQUFFLENBQUEsVUFBbEIsQ0FBa0I7SUFDakMsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNkLFNBQVMsR0FBRyxrQkFBVyxHQUFHLGNBQUksTUFBTSxpQ0FBOEIsQ0FBQTtLQUNuRTtJQUVELElBQU0sVUFBVSxHQUFHO1FBQ2pCLEdBQUcsS0FBQTtRQUNILFFBQVEsVUFBQTtRQUNSLElBQUksTUFBQTtRQUNKLGVBQWUsaUJBQUE7S0FDaEIsQ0FBQTtJQUVELElBQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUFDLGNBQWMsdUJBQ2xELFVBQVUsS0FDYixTQUFTLFdBQUEsRUFDVCxPQUFPLEVBQUUsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsT0FBTyxLQUFJLGVBQWUsRUFFM0MsT0FBTyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLEVBQ3hCLFdBQVcsRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVyxFQUNoQyxPQUFPLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE9BQU8sRUFDeEIsbUJBQW1CLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLG1CQUFtQixFQUNoRCxjQUFjLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGNBQWMsRUFDdEMsT0FBTyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLEVBQ3hCLE9BQU8sU0FBQSxFQUNQLGtCQUFrQixvQkFBQSxFQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLElBQzdCLENBQUUsQ0FBQTtJQUVKLElBQU0sWUFBWSxHQUFHLElBQUksSUFBSSx1QkFDeEIsVUFBVSxLQUNiLE1BQU0sUUFBQSxFQUNOLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUMvQixLQUFLLE9BQUEsRUFDTCxLQUFLLEVBQ0gsS0FBSztlQUNGLElBQUksY0FBYyxDQUFDO2dCQUNwQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxvQkFBYSxHQUFHLENBQUUsRUFBRTtnQkFDekMsWUFBWSxFQUFFLFFBQVE7YUFDdkIsQ0FBQyxFQUNKLE9BQU8sRUFBRSxPQUFPLElBQUksS0FBSyxFQUN6QixRQUFRLEVBQUUsU0FBUyxFQUNuQixhQUFhLGVBQUEsSUFDYixDQUFBO0lBRUYsT0FBTyxFQUFFLFlBQVksY0FBQSxFQUFFLGFBQWEsZUFBQSxFQUFFLENBQUE7QUFDeEMsQ0FBQztBQUVELElBQU0sU0FBUyxHQUF3QjtJQUNyQyxJQUFJLEVBQUUsY0FBYztJQUNwQixTQUFTLEVBQUUsTUFBTTtJQUNqQixNQUFNLFlBQUMsTUFJTjtRQUpNLHVCQUFBLEVBQUE7WUFDTCxNQUFNLEVBQUUsRUFBRTtZQUNWLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLE9BQU8sRUFBRSxlQUFlO1NBQ3pCO1FBQ0MsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsMERBQTBELENBQUMsQ0FBQTtZQUMvRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUE7U0FDekI7UUFDTyxJQUFBLE9BQU8sR0FBSyxJQUFJLENBQUMsUUFBUSxRQUFsQixDQUFrQjtRQUVqQyxJQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUE7UUFDbkUsSUFBSSxjQUFjLElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ2hFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQTtTQUNuRDtRQUVLLElBQUEsS0FBa0Msb0JBQW9CLHFCQUV4RCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFDekIsTUFBTSxLQUNULFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUN0QixlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEtBRTlDO1lBQ0UsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRztZQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRTtZQUN6QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEdBQUcsRUFBRSxJQUFJO1lBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztTQUN6QixDQUNGLEVBbEJPLFlBQVksa0JBQUEsRUFBRSxhQUFhLG1CQWtCbEMsQ0FBQTtRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO1FBRWhDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUMxQixDQUFDO0NBQ0YsQ0FBQTtBQUVELElBQUk7SUFHRixTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7Q0FDdkM7QUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFO0FBRWQsT0FBTyxFQUFZLElBQUksRUFBRSxDQUFBO0FBSXpCLE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBMEM7SUFDckUsSUFBSTtRQUNGLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtLQUNqQztJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElDbG91ZGJhc2UsIElDbG91ZGJhc2VDb25maWcsIElDbG91ZGJhc2VQbGF0Zm9ybUluZm8gfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlQ2FjaGUgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NhY2hlJ1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlUmVxdWVzdCB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvcmVxdWVzdCdcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZUF1dGhDb25maWcsIElVc2VyLCBJVXNlckluZm8sIElMb2dpblN0YXRlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9hdXRoJ1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlQ29tcG9uZW50IH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jb21wb25lbnQnXG5pbXBvcnQgdHlwZSB7IEdyYW50UHJvdmlkZXJUb2tlblJlc3BvbnNlLCBQcm92aWRlclN1YlR5cGUgfSBmcm9tICdAY2xvdWRiYXNlL29hdXRoL2Rpc3QvY2pzL2F1dGgvbW9kZWxzJ1xuaW1wb3J0IHR5cGUgeyBhdXRoTW9kZWxzLCBBdXRoT3B0aW9ucywgQ3JlZGVudGlhbHMgfSBmcm9tICdAY2xvdWRiYXNlL29hdXRoJ1xuaW1wb3J0IHsgQ2xvdWRiYXNlT0F1dGgsIEFVVEhfQVBJX1BSRUZJWCB9IGZyb20gJ0BjbG91ZGJhc2Uvb2F1dGgnXG5pbXBvcnQgeyB1c2VBdXRoQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCB7XG4gIHByaW50V2FybixcbiAgdGhyb3dFcnJvcixcbiAgRVJST1JTLFxuICBDT01NVU5JVFlfU0lURV9VUkwsXG4gIGNhdGNoRXJyb3JzRGVjb3JhdG9yLFxuICBDbG91ZGJhc2VFdmVudEVtaXR0ZXIsXG4gIENsb3VkYmFzZUNhY2hlLFxuICBhZGFwdGVyRm9yV3hNcCxcbiAgdXNlRGVmYXVsdEFkYXB0ZXIsXG59IGZyb20gJy4vdXRpbGl0aWVzJ1xuXG5kZWNsYXJlIGNvbnN0IGNsb3VkYmFzZTogSUNsb3VkYmFzZVxuZGVjbGFyZSBjb25zdCB3eDogYW55XG5cbmNvbnN0IENPTVBPTkVOVF9OQU1FID0gJ2F1dGgnXG5cbmNvbnN0IExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRSA9IHtcbiAgU0lHTl9PVVQ6ICdzaWduX291dCcsXG4gIFNJR05fSU46ICdzaWduX2luJyxcbiAgQ1JFREVOVElBTFNfRVJST1I6ICdjcmVkZW50aWFsc19lcnJvcicsXG59XG5cbmNvbnN0IEVWRU5UUyA9IHtcbiAgLy8g55m75b2V5oCB5pS55Y+Y5ZCO6Kem5Y+RXG4gIExPR0lOX1NUQVRFX0NIQU5HRUQ6ICdsb2dpblN0YXRlQ2hhbmdlZCcsXG59XG5cbmludGVyZmFjZSBVc2VySW5mbyB7XG4gIHVpZD86IHN0cmluZ1xuICBnZW5kZXI/OiBzdHJpbmdcbiAgcGljdHVyZT86IHN0cmluZ1xuICBlbWFpbD86IHN0cmluZ1xuICBlbWFpbF92ZXJpZmllZD86IGJvb2xlYW5cbiAgcGhvbmVfbnVtYmVyPzogc3RyaW5nXG4gIHVzZXJuYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgYmlydGhkYXRlPzogc3RyaW5nXG4gIHpvbmVpbmZvPzogc3RyaW5nXG4gIGxvY2FsZT86IHN0cmluZ1xuICBzdWI/OiBzdHJpbmdcbiAgY3JlYXRlZF9mcm9tPzogc3RyaW5nXG59XG5cbmNvbnN0IGV2ZW50QnVzID0gbmV3IENsb3VkYmFzZUV2ZW50RW1pdHRlcigpXG5cbmNvbnN0IG9uQ3JlZGVudGlhbHNFcnJvciA9IChwYXJhbXMpID0+IHtcbiAgZXZlbnRCdXMuZmlyZShFVkVOVFMuTE9HSU5fU1RBVEVfQ0hBTkdFRCwgeyAuLi5wYXJhbXMsIGV2ZW50VHlwZTogTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLkNSRURFTlRJQUxTX0VSUk9SIH0pXG59XG5cbmludGVyZmFjZSBJVXNlck9wdGlvbnMge1xuICBjYWNoZTogSUNsb3VkYmFzZUNhY2hlXG4gIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoXG59XG5cbmNsYXNzIFVzZXIgaW1wbGVtZW50cyBJVXNlciB7XG4gIHB1YmxpYyB1aWQ/OiBzdHJpbmdcbiAgcHVibGljIGdlbmRlcj86IHN0cmluZ1xuICBwdWJsaWMgcGljdHVyZT86IHN0cmluZ1xuICBwdWJsaWMgZW1haWw/OiBzdHJpbmdcbiAgcHVibGljIGVtYWlsVmVyaWZpZWQ/OiBib29sZWFuXG4gIHB1YmxpYyBwaG9uZU51bWJlcj86IHN0cmluZ1xuICBwdWJsaWMgdXNlcm5hbWU/OiBzdHJpbmdcbiAgcHVibGljIG5hbWU/OiBzdHJpbmdcbiAgcHVibGljIHByb3ZpZGVycz86IHtcbiAgICBpZD86IHN0cmluZ1xuICAgIHByb3ZpZGVyVXNlcklkPzogc3RyaW5nXG4gICAgbmFtZT86IHN0cmluZ1xuICB9W11cbiAgcHVibGljIGJpcnRoZGF0ZT86IHN0cmluZ1xuICBwdWJsaWMgem9uZWluZm8/OiBzdHJpbmdcbiAgcHVibGljIGxvY2FsZT86IHN0cmluZ1xuICBwdWJsaWMgc3ViPzogc3RyaW5nXG4gIHB1YmxpYyBjcmVhdGVkRnJvbT86IHN0cmluZ1xuXG4gIHByaXZhdGUgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuICBwcml2YXRlIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoIC8vIENsb3VkYmFzZU9BdXRoIOexu+Wei1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyT3B0aW9ucykge1xuICAgIGNvbnN0IHsgY2FjaGUsIG9hdXRoSW5zdGFuY2UgfSA9IG9wdGlvbnNcbiAgICB0aGlzLmNhY2hlID0gY2FjaGVcbiAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBvYXV0aEluc3RhbmNlXG5cbiAgICB0aGlzLnNldFVzZXJJbmZvKClcbiAgfVxuICAvKipcbiAgICog6I635Y+W5pys5Zyw55So5oi35L+h5oGvLeWQjOatpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoZWNrTG9jYWxJbmZvKCkge1xuICAgIHRoaXMudWlkID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCd1aWQnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmdlbmRlciA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZ2VuZGVyJykgYXMgc3RyaW5nXG4gICAgdGhpcy5waWN0dXJlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdwaWN0dXJlJykgYXMgc3RyaW5nXG4gICAgdGhpcy5lbWFpbCA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZW1haWwnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2VtYWlsX3ZlcmlmaWVkJykgYXMgYm9vbGVhblxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Bob25lX251bWJlcicpIGFzIHN0cmluZ1xuICAgIHRoaXMudXNlcm5hbWUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3VzZXJuYW1lJykgYXMgc3RyaW5nXG4gICAgdGhpcy5uYW1lID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCduYW1lJykgYXMgc3RyaW5nXG4gICAgdGhpcy5iaXJ0aGRhdGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2JpcnRoZGF0ZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuem9uZWluZm8gPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3pvbmVpbmZvJykgYXMgc3RyaW5nXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2xvY2FsZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuc3ViID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdzdWInKSBhcyBzdHJpbmdcbiAgICB0aGlzLmNyZWF0ZWRGcm9tID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdjcmVhdGVkX2Zyb20nKSBhcyBzdHJpbmdcbiAgICB0aGlzLnByb3ZpZGVycyA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygncHJvdmlkZXJzJykgYXMgYW55XG4gIH1cbiAgLyoqXG4gICAqIOiOt+WPluacrOWcsOeUqOaIt+S/oeaBry3lvILmraVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0xvY2FsSW5mb0FzeW5jKCkge1xuICAgIHRoaXMudWlkID0gYXdhaXQgdGhpcy5nZXRMb2NhbFVzZXJJbmZvQXN5bmMoJ3VpZCcpXG4gICAgdGhpcy5nZW5kZXIgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygnZ2VuZGVyJylcbiAgICB0aGlzLnBpY3R1cmUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3BpY3R1cmUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmVtYWlsID0gYXdhaXQgdGhpcy5nZXRMb2NhbFVzZXJJbmZvQXN5bmMoJ2VtYWlsJylcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2VtYWlsX3ZlcmlmaWVkJykgYXMgYm9vbGVhblxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Bob25lX251bWJlcicpIGFzIHN0cmluZ1xuICAgIHRoaXMudXNlcm5hbWUgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygndXNlcm5hbWUnKVxuICAgIHRoaXMubmFtZSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnbmFtZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuYmlydGhkYXRlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdiaXJ0aGRhdGUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLnpvbmVpbmZvID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCd6b25laW5mbycpIGFzIHN0cmluZ1xuICAgIHRoaXMubG9jYWxlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdsb2NhbGUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLnN1YiA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnc3ViJykgYXMgc3RyaW5nXG4gICAgdGhpcy5jcmVhdGVkRnJvbSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnY3JlYXRlZF9mcm9tJykgYXMgc3RyaW5nXG4gICAgdGhpcy5wcm92aWRlcnMgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Byb3ZpZGVycycpIGFzIGFueVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOeUqOaIt+S/oeaBr1xuICAgKiBAcGFyYW0gdXNlckluZm9cbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfmm7TmlrDnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggVXNlci51cGRhdGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOeUqOaIt+S/oeaBr+S4reaYr+WQpuWMheWQq+mdnuazleWAvCcsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHVzZXJJbmZvOiBhdXRoTW9kZWxzLlVzZXJQcm9maWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gY29uc3QgeyBuYW1lLCBnZW5kZXIsIGF2YXRhclVybCwgcHJvdmluY2UsIGNvdW50cnksIGNpdHkgfSA9IHVzZXJJbmZvXG4gICAgY29uc3QgbmV3VXNlckluZm8gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRVc2VyUHJvZmlsZSh7IC4uLnVzZXJJbmZvIH0pXG5cbiAgICB0aGlzLnNldExvY2FsVXNlckluZm8obmV3VXNlckluZm8pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS51cGRhdGVVc2VyQmFzaWNJbmZvKHsgLi4ucGFyYW1zIH0pXG4gICAgdGhpcy5zZXRMb2NhbFVzZXJJbmZvKHsgdXNlcm5hbWU6IHBhcmFtcy51c2VybmFtZSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOWvhueggVxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmRcbiAgICogQHBhcmFtIG9sZFBhc3N3b3JkXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5pu05paw5a+G56CB5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIFVzZXIudXBkYXRlUGFzc3dvcmQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMyAtIOaWsOWvhueggeS4reaYr+WQpuWMheWQq+mdnuazleWtl+espicsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgdXBkYXRlUGFzc3dvcmQobmV3UGFzc3dvcmQ6IHN0cmluZywgb2xkUGFzc3dvcmQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS51cGRhdGVQYXNzd29yZEJ5T2xkKHtcbiAgICAgIG9sZF9wYXNzd29yZDogb2xkUGFzc3dvcmQsXG4gICAgICBuZXdfcGFzc3dvcmQ6IG5ld1Bhc3N3b3JkLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICog5pu05paw55So5oi35ZCNXG4gICAqIEBwYXJhbSB1c2VybmFtZVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+abtOaWsOeUqOaIt+WQjeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBVc2VyLnVwZGF0ZVVzZXJuYW1lKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobnlKjmiLflkI3lr4bnoIHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIHVwZGF0ZVVzZXJuYW1lKHVzZXJuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd1c2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51cGRhdGUoe1xuICAgICAgdXNlcm5hbWUsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiDliLfmlrDmnKzlnLDnlKjmiLfkv6Hmga/jgILlvZPnlKjmiLflnKjlhbbku5blrqLmiLfnq6/mm7TmlrDnlKjmiLfkv6Hmga/kuYvlkI7vvIzlj6/ku6XosIPnlKjmraTmjqXlj6PlkIzmraXmm7TmlrDkuYvlkI7nmoTkv6Hmga/jgIJcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfliLfmlrDmnKzlnLDnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggVXNlci5yZWZyZXNoKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoKHBhcmFtcz86IHsgdmVyc2lvbj86IHN0cmluZzsgcXVlcnk/OiBhbnkgfSk6IFByb21pc2U8SVVzZXJJbmZvPiB7XG4gICAgY29uc3QgbmV3VXNlckluZm8gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRVc2VySW5mbyhwYXJhbXMpXG4gICAgdGhpcy5zZXRMb2NhbFVzZXJJbmZvKG5ld1VzZXJJbmZvKVxuICAgIHJldHVybiBuZXdVc2VySW5mb1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbFVzZXJJbmZvKGtleTogc3RyaW5nKTogc3RyaW5nIHwgYm9vbGVhbiB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSB0aGlzLmNhY2hlLmdldFN0b3JlKHVzZXJJbmZvS2V5KVxuICAgIHJldHVybiB1c2VySW5mb1trZXldXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldExvY2FsVXNlckluZm9Bc3luYyhrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCB0aGlzLmNhY2hlLmdldFN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgcmV0dXJuIHVzZXJJbmZvW2tleV1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlckluZm8oKSB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSB0aGlzLmNhY2hlLmdldFN0b3JlKHVzZXJJbmZvS2V5KVxuICAgIDtbXG4gICAgICAndWlkJyxcbiAgICAgICdlbWFpbCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnZ2VuZGVyJyxcbiAgICAgICdwaWN0dXJlJyxcbiAgICAgICdlbWFpbF92ZXJpZmllZCcsXG4gICAgICAncGhvbmVfbnVtYmVyJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ3pvbmVpbmZvJyxcbiAgICAgICdsb2NhbGUnLFxuICAgICAgJ3N1YicsXG4gICAgICAnY3JlYXRlZF9mcm9tJyxcbiAgICAgICdwcm92aWRlcnMnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICBdLmZvckVhY2goKGluZm9LZXkpID0+IHtcbiAgICAgIHRoaXNbaW5mb0tleV0gPSB1c2VySW5mb1tpbmZvS2V5XVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldExvY2FsVXNlckluZm8odXNlckluZm86IGFueSkge1xuICAgIGNvbnN0IHsgdXNlckluZm9LZXkgfSA9IHRoaXMuY2FjaGUua2V5c1xuICAgIHRoaXMuY2FjaGUuc2V0U3RvcmUodXNlckluZm9LZXksIHVzZXJJbmZvKVxuICAgIHRoaXMuc2V0VXNlckluZm8oKVxuICB9XG59XG5pbnRlcmZhY2UgSUxvZ2luU3RhdGVPcHRpb25zIGV4dGVuZHMgSVVzZXJPcHRpb25zIHtcbiAgZW52SWQ6IHN0cmluZ1xufVxuZXhwb3J0IGNsYXNzIExvZ2luU3RhdGUgaW1wbGVtZW50cyBJTG9naW5TdGF0ZSB7XG4gIHB1YmxpYyB1c2VyOiBVc2VyXG4gIHB1YmxpYyBvYXV0aExvZ2luU3RhdGU6IGFueVxuXG4gIHByaXZhdGUgb2F1dGhJbnN0YW5jZTogQ2xvdWRiYXNlT0F1dGhcbiAgcHJpdmF0ZSBjYWNoZTogSUNsb3VkYmFzZUNhY2hlXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUxvZ2luU3RhdGVPcHRpb25zKSB7XG4gICAgY29uc3QgeyBlbnZJZCwgY2FjaGUsIG9hdXRoSW5zdGFuY2UgfSA9IG9wdGlvbnNcbiAgICBpZiAoIWVudklkKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ2VudklkIGlzIG5vdCBkZWZpbmVkJylcbiAgICB9XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlXG4gICAgdGhpcy5vYXV0aEluc3RhbmNlID0gb2F1dGhJbnN0YW5jZVxuXG4gICAgdGhpcy51c2VyID0gbmV3IFVzZXIoe1xuICAgICAgY2FjaGU6IHRoaXMuY2FjaGUsXG4gICAgICBvYXV0aEluc3RhbmNlLFxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgY2hlY2tMb2NhbFN0YXRlKCkge1xuICAgIHRoaXMub2F1dGhMb2dpblN0YXRlID0gdGhpcy5vYXV0aEluc3RhbmNlPy5hdXRoQXBpLmhhc0xvZ2luU3RhdGVTeW5jKClcbiAgICB0aGlzLnVzZXIuY2hlY2tMb2NhbEluZm8oKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoZWNrTG9jYWxTdGF0ZUFzeW5jKCkge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZT8uYXV0aEFwaS5nZXRMb2dpblN0YXRlKClcbiAgICBhd2FpdCB0aGlzLnVzZXIuY2hlY2tMb2NhbEluZm9Bc3luYygpXG4gIH1cbn1cblxuY2xhc3MgQXV0aCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBJQ2xvdWRiYXNlQXV0aENvbmZpZ1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlOiBJQ2xvdWRiYXNlQ2FjaGVcblxuICBwcml2YXRlIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBJQ2xvdWRiYXNlQXV0aENvbmZpZyAmIHsgY2FjaGU6IElDbG91ZGJhc2VDYWNoZTsgcmVxdWVzdD86IElDbG91ZGJhc2VSZXF1ZXN0OyBydW50aW1lPzogc3RyaW5nIH0sKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICB0aGlzLmNhY2hlID0gY29uZmlnLmNhY2hlXG4gICAgdGhpcy5vYXV0aEluc3RhbmNlID0gY29uZmlnLm9hdXRoSW5zdGFuY2VcblxuICAgIGlmIChjb25maWcucHVibGlzaGFibGVfa2V5KSB7XG4gICAgICB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnu5HlrprmiYvmnLrlj7dcbiAgICogQHBhcmFtIHBob25lTnVtYmVyXG4gICAqIEBwYXJhbSBwaG9uZUNvZGVcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnu5HlrprmiYvmnLrlj7flpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmJpbmRQaG9uZU51bWJlcigpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG55+t5L+h6aqM6K+B56CB55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBiaW5kUGhvbmVOdW1iZXIocGFyYW1zOiBhdXRoTW9kZWxzLkJpbmRQaG9uZVJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZWRpdENvbnRhY3QocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIOino+e7keS4ieaWuee7keWumlxuICAgKiBAcGFyYW0gbG9naW5UeXBlXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6Kej6Zmk5LiJ5pa557uR5a6a5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS51bmJpbmRQcm92aWRlcigpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN6LSm5oi35piv5ZCm5bey57uP5LiO5q2k55m75b2V5pa55byP6Kej57uRJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyB1bmJpbmRQcm92aWRlcihwYXJhbXM6IGF1dGhNb2RlbHMuVW5iaW5kUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVuYmluZFByb3ZpZGVyKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDpgq7nrrHlnLDlnYBcbiAgICogQHBhcmFtIGVtYWlsXG4gICAqIEBwYXJhbSBzdWRvX3Rva2VuXG4gICAqIEBwYXJhbSB2ZXJpZmljYXRpb25fdG9rZW5cbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnu5Hlrprpgq7nrrHlnLDlnYDlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmJpbmRFbWFpbCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG6YKu566x5a+G56CB55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBiaW5kRW1haWwocGFyYW1zOiBhdXRoTW9kZWxzLkJpbmRFbWFpbFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZWRpdENvbnRhY3QocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIHZlcmlmeVxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuVmVyaWZ5UmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuVmVyaWZ5UmVzcG9uc2U+fVxuICAgKiBAbWVtYmVyb2YgVXNlclxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+mqjOivgeeggemqjOivgeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkudmVyaWZ5KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobmiYvmnLrpqozor4HnoIEv6YKu566x55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkocGFyYW1zOiBhdXRoTW9kZWxzLlZlcmlmeVJlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuVmVyaWZ5UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudmVyaWZ5KHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpqozor4HnoIFcbiAgICogQHBhcmFtIHthdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlc3BvbnNlPn1cbiAgICogQG1lbWJlcm9mIFVzZXJcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bpqozor4HnoIHlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmdldFZlcmlmaWNhdGlvbigpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG5omL5py66aqM6K+B56CBL+mCrueuseeZu+W9lScsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0VmVyaWZpY2F0aW9uKFxuICAgIHBhcmFtczogYXV0aE1vZGVscy5HZXRWZXJpZmljYXRpb25SZXF1ZXN0LFxuICAgIG9wdGlvbnM/OiB7IHdpdGhDYXB0Y2hhOiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8YXV0aE1vZGVscy5HZXRWZXJpZmljYXRpb25SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRWZXJpZmljYXRpb24ocGFyYW1zLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeZu+W9leeahOeUqOaIt+S/oeaBry3lkIzmraVcbiAgICovXG4gIGdldCBjdXJyZW50VXNlcigpIHtcbiAgICBpZiAodGhpcy5jYWNoZS5tb2RlID09PSAnYXN5bmMnKSB7XG4gICAgICAvLyBhc3luYyBzdG9yYWdl55qE5bmz5Y+w6LCD55So5q2kQVBJ5o+Q56S6XG4gICAgICBwcmludFdhcm4oXG4gICAgICAgIEVSUk9SUy5JTlZBTElEX09QRVJBVElPTixcbiAgICAgICAgJ2N1cnJlbnQgcGxhdGZvcm1cXCdzIHN0b3JhZ2UgaXMgYXN5bmNocm9ub3VzLCBwbGVhc2UgdXNlIGdldEN1cnJlbnRVc2VyIGluc3RlZWQnLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IHRoaXMuaGFzTG9naW5TdGF0ZSgpXG5cbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgcmV0dXJuIGxvZ2luU3RhdGUudXNlciB8fCBudWxsXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55m75b2V55qE55So5oi35L+h5oGvLeW8guatpVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlueUqOaIt+S/oeaBr+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuZ2V0Q3VycmVudFVzZXIoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKCkge1xuICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmdldExvZ2luU3RhdGUoKVxuICAgIGlmIChsb2dpblN0YXRlKSB7XG4gICAgICBhd2FpdCBsb2dpblN0YXRlLnVzZXIuY2hlY2tMb2NhbEluZm9Bc3luYygpXG4gICAgICByZXR1cm4gbG9naW5TdGF0ZS51c2VyIHx8IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiDljL/lkI3nmbvlvZVcbiAgICogQHJldHVybnMge1Byb21pc2U8TG9naW5TdGF0ZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5Yy/5ZCN55m75b2V5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5b2T5YmN546v5aKD5piv5ZCm5byA5ZCv5LqG5Yy/5ZCN55m75b2VJyxcbiAgICAgICcgIDIgLSDosIPnlKggYXV0aCgpLnNpZ25JbkFub255bW91c2x5KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBzaWduSW5Bbm9ueW1vdXNseShkYXRhOiB7XG4gICAgcHJvdmlkZXJfdG9rZW4/OiBzdHJpbmdcbiAgfSA9IHt9LCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbkFub255bW91c2x5KGRhdGEpXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICog5Yy/5ZCN55m75b2VXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+Wwj+eoi+W6j+WMv+WQjeeZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWMv+WQjeeZu+W9lScsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5Bbm9ueW1vdXNseUluV3goKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbkFub255bW91c2x5SW5XeCh7XG4gICAgdXNlV3hDbG91ZCxcbiAgfToge1xuICAgIHVzZVd4Q2xvdWQ/OiBib29sZWFuXG4gIH0gPSB7fSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gICAgfVxuICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG5cbiAgICBjb25zdCBtYWluRnVuYyA9IGFzeW5jIChjb2RlKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBHcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlOiBjb2RlLFxuICAgICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ29wZW5faWQnLFxuICAgICAgICAgICAgICBhcHBpZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbkFub255bW91c2x5KFxuICAgICAgICAgIHsgcHJvdmlkZXJfdG9rZW46IHJlc3VsdC5wcm92aWRlcl90b2tlbiB9LFxuICAgICAgICAgIHVzZVd4Q2xvdWQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoKGNyZWRlbnRpYWxzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICB0aHJvdyBjcmVkZW50aWFsc1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgc3VjY2VzczogYXN5bmMgKHJlczogeyBjb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtYWluRnVuYyhyZXMuY29kZSlcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzPy5lcnJNc2cpXG4gICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSh1bmRlZmluZWQsIHsgYXN5bmNSZWZyZXNoVXNlcjogdHJ1ZSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+e7keWumk9wZW5JRFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICflsI/nqIvluo/nu5HlrppPcGVuSUTlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuoblsI/nqIvluo9vcGVuSWTpnZnpu5jnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuYmluZE9wZW5JZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgYmluZE9wZW5JZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHtcbiAgICAgICAgICBwcm92aWRlcl9pZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICBwcm92aWRlcl9jb2RlOiBjb2RlLFxuICAgICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgICAgcHJvdmlkZXJfY29kZV90eXBlOiAnb3Blbl9pZCcsXG4gICAgICAgICAgICBhcHBpZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgocmVzdWx0IGFzIGFueSk/LmVycm9yX2NvZGUgfHwgIXJlc3VsdC5wcm92aWRlcl90b2tlbikge1xuICAgICAgICAgIHRocm93IHJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuYmluZFdpdGhQcm92aWRlcih7IHByb3ZpZGVyX3Rva2VuOiByZXN1bHQucHJvdmlkZXJfdG9rZW4gfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3gubG9naW4oe1xuICAgICAgICBzdWNjZXNzOiBhc3luYyAocmVzOiB7IGNvZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1haW5GdW5jKHJlcy5jb2RlKVxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmYWlsOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihyZXM/LmVyck1zZylcbiAgICAgICAgICA7KGVycm9yIGFzIGFueSkuY29kZSA9IHJlcz8uZXJybm9cbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qKlxuICAgKiDlsI/nqIvluo9vcGVuSWTpnZnpu5jnmbvlvZVcbiAgICogQHJldHVybnMge1Byb21pc2U8TG9naW5TdGF0ZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5bCP56iL5bqPb3Blbklk6Z2Z6buY55m75b2V5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5b2T5YmN546v5aKD5piv5ZCm5byA5ZCv5LqG5bCP56iL5bqPb3Blbklk6Z2Z6buY55m75b2VJyxcbiAgICAgICcgIDIgLSDosIPnlKggYXV0aCgpLnNpZ25JbldpdGhPcGVuSWQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhPcGVuSWQoeyB1c2VXeENsb3VkID0gdHJ1ZSB9ID0ge30pOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSxcbiAgICAgICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgICAgICBwcm92aWRlcl9jb2RlX3R5cGU6ICdvcGVuX2lkJyxcbiAgICAgICAgICAgICAgYXBwaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlV3hDbG91ZCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICgocmVzdWx0IGFzIGFueSk/LmVycm9yX2NvZGUgfHwgIXJlc3VsdC5wcm92aWRlcl90b2tlbikge1xuICAgICAgICAgIHRocm93IHJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoUHJvdmlkZXIoXG4gICAgICAgICAgeyBwcm92aWRlcl90b2tlbjogcmVzdWx0LnByb3ZpZGVyX3Rva2VuIH0sXG4gICAgICAgICAgdXNlV3hDbG91ZCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICgoY3JlZGVudGlhbHMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgIHRocm93IGNyZWRlbnRpYWxzXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzIGFzIENyZWRlbnRpYWxzKVxuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgc3VjY2VzczogYXN5bmMgKHJlczogeyBjb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtYWluRnVuYyhyZXMuY29kZSlcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzPy5lcnJNc2cpXG4gICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqPdW5pb25JZOmdmem7mOeZu+W9lVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICflsI/nqIvluo91bmlvbklk6Z2Z6buY55m75b2V5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5b2T5YmN546v5aKD5piv5ZCm5byA5ZCv5LqG5bCP56iL5bqPdW5pb25JZOmdmem7mOeZu+W9lScsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoVW5pb25JZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFVuaW9uSWQoKTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgaWYgKCFhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgIHRocm93IEVycm9yKCd3eCBhcGkgdW5kZWZpbmVkJylcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd3hJbmZvID0gd3guZ2V0QWNjb3VudEluZm9TeW5jKCkubWluaVByb2dyYW1cbiAgICAgICAgd3gubG9naW4oe1xuICAgICAgICAgIHN1Y2Nlc3M6IGFzeW5jIChyZXM6IHsgY29kZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVySWQgPSB3eEluZm8/LmFwcElkXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGU6IHJlcy5jb2RlLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyX2lkOiBwcm92aWRlcklkLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJfY29kZV90eXBlOiAndW5pb25faWQnLFxuICAgICAgICAgICAgICAgICAgYXBwaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBjb25zdCB7IHByb3ZpZGVyX3Rva2VuOiBwcm92aWRlclRva2VuIH0gPSByZXN1bHRcblxuICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICByZWplY3QocmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9pZDogcHJvdmlkZXJJZCxcbiAgICAgICAgICAgICAgICBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbixcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHNpZ25JblJlcylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWlsOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlcz8uZXJyTXNnKVxuICAgICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqP5omL5py65Y+35o6I5p2D55m75b2VXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+Wwj+eoi+W6j+aJi+acuuWPt+aOiOadg+eZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWwj+eoi+W6j+aJi+acuuWPt+aOiOadg+eZu+W9lScsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoUGhvbmVBdXRoKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoUGhvbmVBdXRoKHsgcGhvbmVDb2RlID0gJycgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gICAgfVxuICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG4gICAgY29uc3QgcHJvdmlkZXJJbmZvID0ge1xuICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7IHByb3ZpZGVyX2NvZGVfdHlwZTogJ3Bob25lJyB9LFxuICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHd4LmxvZ2luKClcbiAgICA7KHByb3ZpZGVySW5mbyBhcyBhbnkpLnByb3ZpZGVyX2NvZGUgPSBjb2RlXG5cbiAgICB0cnkge1xuICAgICAgbGV0IHByb3ZpZGVyVG9rZW4gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4ocHJvdmlkZXJJbmZvKVxuICAgICAgaWYgKHByb3ZpZGVyVG9rZW4uZXJyb3JfY29kZSkge1xuICAgICAgICB0aHJvdyBwcm92aWRlclRva2VuXG4gICAgICB9XG5cbiAgICAgIHByb3ZpZGVyVG9rZW4gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5wYXRjaFByb3ZpZGVyVG9rZW4oe1xuICAgICAgICBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbi5wcm92aWRlcl90b2tlbixcbiAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgY29kZTogcGhvbmVDb2RlLFxuICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ3Bob25lJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICBpZiAocHJvdmlkZXJUb2tlbi5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHByb3ZpZGVyVG9rZW5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHtcbiAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4ucHJvdmlkZXJfdG9rZW4sXG4gICAgICB9KVxuXG4gICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHNpZ25JblJlc1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+efreS/oemqjOivgeeggeeZu+mZhlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuoblsI/nqIvluo/nn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluV2l0aFNtcygpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFNtcyh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgcGhvbmVOdW0gPSAnJyxcbiAgICBiaW5kSW5mbyA9IHVuZGVmaW5lZCxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IHBob25lTnVtLFxuICAgICAgICBsb2dpblR5cGU6ICdzbXMnLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YKu566x6aqM6K+B56CB55m76ZmGXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+mCrueusemqjOivgeeggeeZu+mZhicsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6humCrueuseeZu+mZhicsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoRW1haWwoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhFbWFpbCh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgYmluZEluZm8gPSB1bmRlZmluZWQsXG4gICAgZW1haWwgPSAnJyxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IGVtYWlsLFxuICAgICAgICBsb2dpblR5cGU6ICdlbWFpbCcsXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ojrflj5boh6rlrprkuYnnmbvlvZUgdGlja2V0IOWHveaVsFxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZufSBnZXRUaWNrRm5cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBzZXRDdXN0b21TaWduRnVuYyhnZXRUaWNrRm46IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2V0Q3VzdG9tU2lnbkZ1bmMoZ2V0VGlja0ZuKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iHquWumuS5ieeZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huiHquWumuS5ieeZu+W9lScsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDMgLSB0aWNrZXQg5piv5ZCm5b2S5bGe5LqO5b2T5YmN546v5aKDJyxcbiAgICAgICcgIDQgLSDliJvlu7ogdGlja2V0IOeahOiHquWumuS5ieeZu+W9leengemSpeaYr+WQpui/h+acnycsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KClcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuU2lnbkluUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25JbihwYXJhbXM6IGF1dGhNb2RlbHMuU2lnbkluUmVxdWVzdCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbihwYXJhbXMpXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZShwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHthdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfms6jlhozlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuobmjIflrprnmbvlvZXmlrnlvI8nLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnblVwKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBzaWduVXAocGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3QpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduVXAocGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWvhueggVxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuU2V0UGFzc3dvcmRSZXF1ZXN0fSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0UGFzc3dvcmQocGFyYW1zOiBhdXRoTW9kZWxzLlNldFBhc3N3b3JkUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRQYXNzd29yZChwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog5qOA5rWL55So5oi35ZCN5piv5ZCm5bey57uP5Y2g55SoXG4gICAqIEBwYXJhbSB1c2VybmFtZVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlueUqOaIt+aYr+WQpuiiq+WNoOeUqOWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuaXNVc2VybmFtZVJlZ2lzdGVyZWQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGlzVXNlcm5hbWVSZWdpc3RlcmVkKHVzZXJuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd1c2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICBjb25zdCB7IGV4aXN0IH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5jaGVja0lmVXNlckV4aXN0KHsgdXNlcm5hbWUgfSlcbiAgICByZXR1cm4gZXhpc3RcbiAgfVxuXG4gIC8qKlxuICAgKiDnmbvlh7pcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnlKjmiLfnmbvlh7rlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLnNpZ25PdXQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeeUqOaIt+aYr+WQpuS4uuWMv+WQjeeZu+W9le+8iOWMv+WQjeeZu+W9leS4jeaUr+aMgXNpZ25PdXTvvIknLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25PdXQocGFyYW1zPzogYXV0aE1vZGVscy5TaWdub3V0UmVxdWVzdCk6IFByb21pc2U8dm9pZCB8IGF1dGhNb2RlbHMuU2lnbm91dFJlcG9uc2U+IHtcbiAgICBjb25zdCB7IHVzZXJJbmZvS2V5IH0gPSB0aGlzLmNhY2hlLmtleXNcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduT3V0KHBhcmFtcylcbiAgICBhd2FpdCB0aGlzLmNhY2hlLnJlbW92ZVN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgZXZlbnRCdXMuZmlyZShFVkVOVFMuTE9HSU5fU1RBVEVfQ0hBTkdFRCwgeyBldmVudFR5cGU6IExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdOX09VVCB9KVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmnKzlnLDnmbvlvZXmgIEt5ZCM5q2lXG4gICAqL1xuICBwdWJsaWMgaGFzTG9naW5TdGF0ZSgpOiBMb2dpblN0YXRlIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuY2FjaGUubW9kZSA9PT0gJ2FzeW5jJykge1xuICAgICAgLy8gYXN5bmMgc3RvcmFnZeeahOW5s+WPsOiwg+eUqOatpEFQSeaPkOekulxuICAgICAgcHJpbnRXYXJuKFxuICAgICAgICBFUlJPUlMuSU5WQUxJRF9PUEVSQVRJT04sXG4gICAgICAgICdjdXJyZW50IHBsYXRmb3JtXFwncyBzdG9yYWdlIGlzIGFzeW5jaHJvbm91cywgcGxlYXNlIHVzZSBnZXRMb2dpblN0YXRlIGluc3RlZWQnLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgb2F1dGhMb2dpblN0YXRlID0gdGhpcy5vYXV0aEluc3RhbmNlPy5hdXRoQXBpLmhhc0xvZ2luU3RhdGVTeW5jKClcbiAgICBpZiAob2F1dGhMb2dpblN0YXRlKSB7XG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gbmV3IExvZ2luU3RhdGUoe1xuICAgICAgICBlbnZJZDogdGhpcy5jb25maWcuZW52LFxuICAgICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgICAgb2F1dGhJbnN0YW5jZTogdGhpcy5vYXV0aEluc3RhbmNlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiBsb2dpblN0YXRlXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5pys5Zyw55m75b2V5oCBLeW8guatpVxuICAgKiDmraRBUEnkuLrlhbzlrrnlvILmraVzdG9yYWdl55qE5bmz5Y+wXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W5pys5Zyw55m75b2V5oCB5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS5nZXRMb2dpblN0YXRlKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRMb2dpblN0YXRlKCkge1xuICAgIGxldCBvYXV0aExvZ2luU3RhdGUgPSBudWxsXG5cbiAgICB0cnkge1xuICAgICAgb2F1dGhMb2dpblN0YXRlID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0TG9naW5TdGF0ZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKG9hdXRoTG9naW5TdGF0ZSkge1xuICAgICAgY29uc3QgbG9naW5TdGF0ZSA9IG5ldyBMb2dpblN0YXRlKHtcbiAgICAgICAgZW52SWQ6IHRoaXMuY29uZmlnLmVudixcbiAgICAgICAgY2FjaGU6IHRoaXMuY2FjaGUsXG4gICAgICAgIG9hdXRoSW5zdGFuY2U6IHRoaXMub2F1dGhJbnN0YW5jZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4gbG9naW5TdGF0ZVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W55So5oi35L+h5oGv5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5piv5ZCm5bey55m75b2VJyxcbiAgICAgICcgIDIgLSDosIPnlKggYXV0aCgpLmdldFVzZXJJbmZvKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRVc2VySW5mbyhwYXJhbXM/OiB7IHZlcnNpb24/OiBzdHJpbmcgfSk6IFByb21pc2U8SVVzZXJJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFVzZXJJbmZvKHBhcmFtcylcbiAgfVxuXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5blvq7mkK3mj5Lku7bnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDmmK/lkKblt7LnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuZ2V0V2VkYVVzZXJJbmZvKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRXZWRhVXNlckluZm8oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0V2VkYVVzZXJJbmZvKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtczogYXV0aE1vZGVscy5Nb2RpZnlVc2VyQmFzaWNJbmZvUmVxdWVzdCkge1xuICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmdldExvZ2luU3RhdGUoKVxuICAgIGlmIChsb2dpblN0YXRlKSB7XG4gICAgICBhd2FpdCAobG9naW5TdGF0ZS51c2VyIGFzIFVzZXIpLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRBdXRoSGVhZGVyIOWFvOWuueWkhOeQhlxuICAgKiDov5Tlm57nqbrlr7nosaFcbiAgICovXG4gIHB1YmxpYyBnZXRBdXRoSGVhZGVyKCk6IHt9IHtcbiAgICBjb25zb2xlLmVycm9yKCdBdXRoLmdldEF1dGhIZWFkZXIgQVBJIOW3suW6n+W8gycpXG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICog5Li65bey5pyJ6LSm5oi357uR56ys5LiJ5pa56LSm5oi3XG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5CaW5kV2l0aFByb3ZpZGVyUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+e7keWumuesrOS4ieaWueeZu+W9leaWueW8j+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuYmluZFdpdGhQcm92aWRlcigpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5q2k6LSm5oi35piv5ZCm5bey57uP57uR5a6a5q2k56ys5LiJ5pa5JyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBiaW5kV2l0aFByb3ZpZGVyKHBhcmFtczogYXV0aE1vZGVscy5CaW5kV2l0aFByb3ZpZGVyUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5iaW5kV2l0aFByb3ZpZGVyKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDmn6Xor6LnlKjmiLdcbiAgICogQHBhcmFtIHthdXRoTW9kZWxzLlF1ZXJ5VXNlclByb2ZpbGVSZXF1ZXN0fSBhcHBlbmRlZF9wYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8YXV0aE1vZGVscy5Vc2VyUHJvZmlsZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcXVlcnlVc2VyKHF1ZXJ5T2JqOiBhdXRoTW9kZWxzLlF1ZXJ5VXNlclByb2ZpbGVSZXF1ZXN0KTogUHJvbWlzZTxhdXRoTW9kZWxzLlF1ZXJ5VXNlclByb2ZpbGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5xdWVyeVVzZXJQcm9maWxlKHF1ZXJ5T2JqKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFjY2Vzc1Rva2VuKCkge1xuICAgIGNvbnN0IG9hdXRoQWNjZXNzVG9rZW5SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LmdldEFjY2Vzc1Rva2VuKClcbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzVG9rZW46IG9hdXRoQWNjZXNzVG9rZW5SZXMsXG4gICAgICBlbnY6IHRoaXMuY29uZmlnLmVudixcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ3JhbnRQcm92aWRlclRva2VuKHBhcmFtczogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4ocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHBhdGNoUHJvdmlkZXJUb2tlbihwYXJhbXM6IGF1dGhNb2RlbHMuUGF0Y2hQcm92aWRlclRva2VuUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuUGF0Y2hQcm92aWRlclRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucGF0Y2hQcm92aWRlclRva2VuKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoUHJvdmlkZXIocGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25JbldpdGhQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoUHJvdmlkZXIocGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhXZWNoYXQocGFyYW1zOiBhbnkgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhXZWNoYXQocGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdyYW50VG9rZW4ocGFyYW1zOiBhdXRoTW9kZWxzLkdyYW50VG9rZW5SZXF1ZXN0KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRUb2tlbihwYXJhbXMpXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2VuUHJvdmlkZXJSZWRpcmVjdFVyaShwYXJhbXM6IGF1dGhNb2RlbHMuR2VuUHJvdmlkZXJSZWRpcmVjdFVyaVJlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZW5Qcm92aWRlclJlZGlyZWN0VXJpKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXNldFBhc3N3b3JkKHBhcmFtczogYXV0aE1vZGVscy5SZXNldFBhc3N3b3JkUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5yZXNldFBhc3N3b3JkKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXZpY2VBdXRob3JpemUocGFyYW1zOiBhdXRoTW9kZWxzLkRldmljZUF1dGhvcml6ZVJlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuRGV2aWNlQXV0aG9yaXplUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGV2aWNlQXV0aG9yaXplKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdWRvKHBhcmFtczogYXV0aE1vZGVscy5TdWRvUmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5TdWRvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc3VkbyhwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlTWUocGFyYW1zOiBhdXRoTW9kZWxzLldpdGhTdWRvUmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5Vc2VyUHJvZmlsZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5kZWxldGVNZShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UHJvdmlkZXJzKCk6IFByb21pc2U8YXV0aE1vZGVscy5Qcm92aWRlcnNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRQcm92aWRlcnMoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luU2NvcGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkubG9naW5TY29wZSgpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9naW5Hcm91cHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5sb2dpbkdyb3VwcygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgb25Mb2dpblN0YXRlQ2hhbmdlZChjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICBldmVudEJ1cy5vbihFVkVOVFMuTE9HSU5fU1RBVEVfQ0hBTkdFRCwgYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgICAgLy8gZ2V0TG9naW5TdGF0ZeS8mumHjeWkjeinpuWPkWdldENyZWRlbnRpYWxz77yM5a+86Ie05q275b6q546v77yM5omA5LulZ2V0Q3JlZGVudGlhbHPlh7rplJnkuI3lho3lh7rlj5FnZXRMb2dpblN0YXRlXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gcGFyYW1zPy5kYXRhPy5ldmVudFR5cGUgIT09IExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRS5DUkVERU5USUFMU19FUlJPUiA/IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpIDoge31cbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgeyAuLi5wYXJhbXMsIC4uLmxvZ2luU3RhdGUgfSlcbiAgICB9KVxuICAgIC8vIOeri+WIu+aJp+ihjOS4gOasoeWbnuiwg1xuICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmdldExvZ2luU3RhdGUoKVxuICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbG9naW5TdGF0ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiDlvLrliLbliLfmlrB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaFRva2VuRm9yY2UocGFyYW1zOiB7IHZlcnNpb24/OiBzdHJpbmcgfSk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVmcmVzaFRva2VuRm9yY2UocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlui6q+S7veS/oeaBr1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0Q3JlZGVudGlhbHMoKVxuICB9XG4gIC8qKlxuICAgKiDlhpnlhaXouqvku73kv6Hmga9cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRDcmVkZW50aWFscyhjcmVkZW50aWFsczogQ3JlZGVudGlhbHMpIHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKVxuICB9XG5cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlui6q+S7vea6kOexu+WeiycsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuZ2V0UHJvdmlkZXJTdWJUeXBlKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRQcm92aWRlclN1YlR5cGUoKTogUHJvbWlzZTxQcm92aWRlclN1YlR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJTdWJUeXBlKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDYXB0Y2hhRGF0YShwYXJhbXM6IHsgc3RhdGU6IHN0cmluZzsgcmVkaXJlY3RfdXJpPzogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuY3JlYXRlQ2FwdGNoYURhdGEocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHZlcmlmeUNhcHRjaGFEYXRhKHBhcmFtczogeyB0b2tlbjogc3RyaW5nOyBrZXk6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnZlcmlmeUNhcHRjaGFEYXRhKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRNaW5pUHJvZ3JhbVFyQ29kZShwYXJhbXM6IGF1dGhNb2RlbHMuR2V0TWluaVByb2dyYW1RckNvZGVSZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5HZXRNaW5pUHJvZ3JhbVFyQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldE1pbmlQcm9ncmFtQ29kZShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWluaVByb2dyYW1RckNvZGVTdGF0dXMocGFyYW1zOiBhdXRoTW9kZWxzLkdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0TWluaVByb2dyYW1RckNvZGVTdGF0dXNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRNaW5pUHJvZ3JhbVFyQ29kZVN0YXR1cyhwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbW9kaWZ5UGFzc3dvcmQocGFyYW1zOiBhdXRoTW9kZWxzLk1vZGlmeVVzZXJCYXNpY0luZm9SZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLm1vZGlmeVBhc3N3b3JkKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBtb2RpZnlQYXNzd29yZFdpdGhvdXRMb2dpbihwYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5UGFzc3dvcmRXaXRob3V0TG9naW5SZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLm1vZGlmeVBhc3N3b3JkV2l0aG91dExvZ2luKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRVc2VyQmVoYXZpb3JMb2cocGFyYW1zOiBhdXRoTW9kZWxzLkdldFVzZXJCZWhhdmlvckxvZyk6IFByb21pc2U8YXV0aE1vZGVscy5HZXRVc2VyQmVoYXZpb3JMb2dSZXM+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0VXNlckJlaGF2aW9yTG9nKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDot7Povazns7vnu5/pu5jorqTnmbvlvZXpobVcbiAgICogQHJldHVybnMge1Byb21pc2U8YXV0aE1vZGVscy5Ub0RlZmF1bHRMb2dpblBhZ2U+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRvRGVmYXVsdExvZ2luUGFnZShwYXJhbXM6IGF1dGhNb2RlbHMuVG9EZWZhdWx0TG9naW5QYWdlID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWdWZXJzaW9uID0gcGFyYW1zLmNvbmZpZ192ZXJzaW9uIHx8ICdlbnYnXG5cbiAgICBpZiAoYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB3eC5uYXZpZ2F0ZVRvKHsgdXJsOiAnL3BhY2thZ2VzLyR3ZF9zeXN0ZW0vcGFnZXMvbG9naW4vaW5kZXgnIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gcGFyYW1zLnJlZGlyZWN0X3VyaSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTChyZWRpcmVjdFVyaSlcbiAgICAgIGNvbnN0IGxvZ2luUGFnZSA9IGAke3VybE9iai5vcmlnaW59L19fYXV0aC8/YXBwX2lkPSR7cGFyYW1zLmFwcF9pZCB8fCAnJ30mZW52X2lkPSR7dGhpcy5jb25maWcuZW52fSZjbGllbnRfaWQ9JHtcbiAgICAgICAgdGhpcy5jb25maWcuY2xpZW50SWRcbiAgICAgIH0mY29uZmlnX3ZlcnNpb249JHtjb25maWdWZXJzaW9ufSZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RVcmkpfWBcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbG9naW5QYWdlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVMb2dpblN0YXRlKFxuICAgIHBhcmFtcz86IHsgdmVyc2lvbj86IHN0cmluZzsgcXVlcnk/OiBhbnkgfSxcbiAgICBvcHRpb25zPzogeyBhc3luY1JlZnJlc2hVc2VyPzogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBjb25zdCBsb2dpblN0YXRlID0gbmV3IExvZ2luU3RhdGUoe1xuICAgICAgZW52SWQ6IHRoaXMuY29uZmlnLmVudixcbiAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgb2F1dGhJbnN0YW5jZTogdGhpcy5vYXV0aEluc3RhbmNlLFxuICAgIH0pXG5cbiAgICBhd2FpdCBsb2dpblN0YXRlLmNoZWNrTG9jYWxTdGF0ZUFzeW5jKClcbiAgICBpZiAob3B0aW9ucz8uYXN5bmNSZWZyZXNoVXNlcikge1xuICAgICAgbG9naW5TdGF0ZS51c2VyLnJlZnJlc2gocGFyYW1zKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBsb2dpblN0YXRlLnVzZXIucmVmcmVzaChwYXJhbXMpXG4gICAgfVxuICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkxPR0lOX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnRUeXBlOiBMT0dJTl9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTl9JTiB9KVxuICAgIHJldHVybiBsb2dpblN0YXRlXG4gIH1cblxuICAvKipcbiAgICogc21zL2VtYWlsIOmqjOivgeeggeeZu+W9lS/ms6jlhozvvIzpgLvovpHkuIDoh7TmlLbmlZtcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnbkluV2l0aFVzZXJuYW1lKHtcbiAgICB2ZXJpZmljYXRpb25JbmZvID0geyB2ZXJpZmljYXRpb25faWQ6ICcnLCBpc191c2VyOiBmYWxzZSB9LFxuICAgIHZlcmlmaWNhdGlvbkNvZGUgPSAnJyxcbiAgICB1c2VybmFtZTogcmF3VXNlcm5hbWUgPSAnJyxcbiAgICBiaW5kSW5mbyA9IHVuZGVmaW5lZCxcbiAgICBsb2dpblR5cGUgPSAnJyxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiDpqozor4Hpqozor4HnoIFcbiAgICAgIGNvbnN0IHZlcmlmeVJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnZlcmlmeSh7XG4gICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgfSlcblxuICAgICAgaWYgKCh2ZXJpZnlSZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICB0aHJvdyB2ZXJpZnlSZXNcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB2ZXJpZmljYXRpb25fdG9rZW4gfSA9IHZlcmlmeVJlc1xuXG4gICAgICAvLyDmiYvmnLrnmbvlvZXlj4LmlbBcbiAgICAgIGxldCB1c2VybmFtZSA9IGArODYgJHtyYXdVc2VybmFtZX1gXG4gICAgICBsZXQgc2lnblVwUGFyYW06IGFueSA9IHsgcGhvbmVfbnVtYmVyOiB1c2VybmFtZSB9XG5cbiAgICAgIC8vIOmCrueuseeZu+W9leWPguaVsFxuICAgICAgaWYgKGxvZ2luVHlwZSA9PT0gJ2VtYWlsJykge1xuICAgICAgICB1c2VybmFtZSA9IHJhd1VzZXJuYW1lXG4gICAgICAgIHNpZ25VcFBhcmFtID0geyBlbWFpbDogdXNlcm5hbWUgfVxuICAgICAgfVxuXG4gICAgICAvLyAyLiDmoLnmja7mmK/lkKblt7Lnu4/mmK/nlKjmiLfvvIzliIbliKvotbDnmbvlvZXmiJbms6jlhozpgLvovpFcbiAgICAgIGlmICh2ZXJpZmljYXRpb25JbmZvLmlzX3VzZXIpIHtcbiAgICAgICAgLy8g56eB5pyJ5YyW546v5aKD5oiW6ICF6Ieq5a6a5LmJ5bqU55So6LWwdjHniYjmnKznmoTogIHpgLvovpFcbiAgICAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluKHtcbiAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKChzaWduSW5SZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgIHRocm93IHNpZ25JblJlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJpbmRJbmZvKSB7XG4gICAgICAgICAgY29uc3QgYmluZFJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmJpbmRXaXRoUHJvdmlkZXIoe1xuICAgICAgICAgICAgcHJvdmlkZXJfdG9rZW46IChiaW5kSW5mbyBhcyBhbnkpPy5wcm92aWRlclRva2VuLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoKGJpbmRSZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgICAgdGhyb3cgYmluZFJlc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g6Ieq5a6a5LmJ5bqU55So6LWwc2lnblVw6YC76L6RXG4gICAgICAgIGNvbnN0IHNpZ25VcFJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25VcCh7XG4gICAgICAgICAgLi4uc2lnblVwUGFyYW0sXG4gICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgIHByb3ZpZGVyX3Rva2VuOiAoYmluZEluZm8gYXMgYW55KT8ucHJvdmlkZXJJZCxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoKHNpZ25VcFJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgdGhyb3cgc2lnblVwUmVzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5cbnR5cGUgVEluaXRBdXRoT3B0aW9ucyA9IFBpY2s8SUNsb3VkYmFzZUF1dGhDb25maWcsICdyZWdpb24nIHwgJ3BlcnNpc3RlbmNlJyB8ICdpMThuJyB8ICdwdWJsaXNoYWJsZV9rZXknPiAmIFBhcnRpYWw8QXV0aE9wdGlvbnM+XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUF1dGhJbnN0YW5jZShcbiAgY29uZmlnOiBUSW5pdEF1dGhPcHRpb25zLFxuICBvcHRpb25zPzoge1xuICAgIGNsaWVudElkOiBJQ2xvdWRiYXNlQ29uZmlnWydjbGllbnRJZCddXG4gICAgZW52OiBJQ2xvdWRiYXNlQ29uZmlnWydlbnYnXVxuICAgIGFwaU9yaWdpbjogc3RyaW5nXG4gICAgY2FjaGU/OiBJQ2xvdWRiYXNlQ2FjaGVcbiAgICBwbGF0Zm9ybT86IElDbG91ZGJhc2VbJ3BsYXRmb3JtJ11cbiAgICBhcHA/OiBJQ2xvdWRiYXNlXG4gICAgZGVidWc/OiBJQ2xvdWRiYXNlQXV0aENvbmZpZ1snZGVidWcnXVxuICB9LFxuKSB7XG4gIGNvbnN0IHsgcmVnaW9uID0gJ2FwLXNoYW5naGFpJywgaTE4biwgcHVibGlzaGFibGVfa2V5IH0gPSBjb25maWdcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRpb25zPy5wbGF0Zm9ybSB8fCAodXNlRGVmYXVsdEFkYXB0ZXIoKSBhcyBJQ2xvdWRiYXNlUGxhdGZvcm1JbmZvKVxuICBjb25zdCB7IHJ1bnRpbWUsIGFkYXB0ZXIgfSA9IHBsYXRmb3JtXG5cbiAgY29uc3QgeyBlbnYsIGNsaWVudElkLCBkZWJ1ZywgY2FjaGUsIGFwcDogY2xvdWRiYXNlIH0gPSBvcHRpb25zIHx8IHt9XG4gIGxldCB7IGFwaU9yaWdpbiB9ID0gb3B0aW9ucyB8fCB7fVxuICBpZiAoIWFwaU9yaWdpbikge1xuICAgIGFwaU9yaWdpbiA9IGBodHRwczovLyR7ZW52fS4ke3JlZ2lvbn0udGNiLWFwaS50ZW5jZW50Y2xvdWRhcGkuY29tYFxuICB9XG5cbiAgY29uc3QgY29tbW9uT3B0cyA9IHtcbiAgICBlbnYsXG4gICAgY2xpZW50SWQsXG4gICAgaTE4bixcbiAgICBwdWJsaXNoYWJsZV9rZXksXG4gIH1cblxuICBjb25zdCBvYXV0aEluc3RhbmNlID0gbmV3IENsb3VkYmFzZU9BdXRoKHVzZUF1dGhBZGFwdGVyKHtcbiAgICAuLi5jb21tb25PcHRzLFxuICAgIGFwaU9yaWdpbixcbiAgICBhcGlQYXRoOiBjb25maWc/LmFwaVBhdGggfHwgQVVUSF9BUElfUFJFRklYLFxuICAgIC8vIEB0b2RvIOS7peS4i+acgOWlvei1sGFkYXB0b3LlpITnkIbvvIznm67liY1vYXV0aOaooeWdl+ayoeaMiWFkYXB0b3LmjqXlj6Porr7orqFcbiAgICBzdG9yYWdlOiBjb25maWc/LnN0b3JhZ2UsXG4gICAgYmFzZVJlcXVlc3Q6IGNvbmZpZz8uYmFzZVJlcXVlc3QsXG4gICAgcmVxdWVzdDogY29uZmlnPy5yZXF1ZXN0LFxuICAgIGFub255bW91c1NpZ25JbkZ1bmM6IGNvbmZpZz8uYW5vbnltb3VzU2lnbkluRnVuYyxcbiAgICBjYXB0Y2hhT3B0aW9uczogY29uZmlnPy5jYXB0Y2hhT3B0aW9ucyxcbiAgICB3eENsb3VkOiBjb25maWc/Lnd4Q2xvdWQsXG4gICAgYWRhcHRlcixcbiAgICBvbkNyZWRlbnRpYWxzRXJyb3IsXG4gICAgaGVhZGVyczogY29uZmlnLmhlYWRlcnMgfHwge30sXG4gIH0pLClcblxuICBjb25zdCBhdXRoSW5zdGFuY2UgPSBuZXcgQXV0aCh7XG4gICAgLi4uY29tbW9uT3B0cyxcbiAgICByZWdpb24sXG4gICAgcGVyc2lzdGVuY2U6IGNvbmZpZy5wZXJzaXN0ZW5jZSxcbiAgICBkZWJ1ZyxcbiAgICBjYWNoZTpcbiAgICAgIGNhY2hlXG4gICAgICB8fCBuZXcgQ2xvdWRiYXNlQ2FjaGUoe1xuICAgICAgICBwZXJzaXN0ZW5jZTogY29uZmlnLnBlcnNpc3RlbmNlLFxuICAgICAgICBrZXlzOiB7IHVzZXJJbmZvS2V5OiBgdXNlcl9pbmZvXyR7ZW52fWAgfSxcbiAgICAgICAgcGxhdGZvcm1JbmZvOiBwbGF0Zm9ybSxcbiAgICAgIH0pLFxuICAgIHJ1bnRpbWU6IHJ1bnRpbWUgfHwgJ3dlYicsXG4gICAgX2Zyb21BcHA6IGNsb3VkYmFzZSxcbiAgICBvYXV0aEluc3RhbmNlLFxuICB9KVxuXG4gIHJldHVybiB7IGF1dGhJbnN0YW5jZSwgb2F1dGhJbnN0YW5jZSB9XG59XG5cbmNvbnN0IGNvbXBvbmVudDogSUNsb3VkYmFzZUNvbXBvbmVudCA9IHtcbiAgbmFtZTogQ09NUE9ORU5UX05BTUUsXG4gIG5hbWVzcGFjZTogJ2F1dGgnLFxuICBlbnRpdHkoY29uZmlnOiBUSW5pdEF1dGhPcHRpb25zID0ge1xuICAgIHJlZ2lvbjogJycsXG4gICAgcGVyc2lzdGVuY2U6ICdsb2NhbCcsXG4gICAgYXBpUGF0aDogQVVUSF9BUElfUFJFRklYLFxuICB9LCkge1xuICAgIGlmICh0aGlzLmF1dGhJbnN0YW5jZSkge1xuICAgICAgcHJpbnRXYXJuKEVSUk9SUy5JTlZBTElEX09QRVJBVElPTiwgJ2V2ZXJ5IGNsb3VkYmFzZSBpbnN0YW5jZSBzaG91bGQgaGFzIG9ubHkgb25lIGF1dGggb2JqZWN0JylcbiAgICAgIHJldHVybiB0aGlzLmF1dGhJbnN0YW5jZVxuICAgIH1cbiAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMucGxhdGZvcm1cbiAgICAvLyDlpoLkuI3mmI7noa7mjIflrppwZXJzaXN0ZW5jZeWImeS8mOWFiOWPluWQhOW5s+WPsGFkYXB0ZXLpppbpgInvvIzlhbbmrKFsb2NhbFN0b3JhZ2VcbiAgICBjb25zdCBuZXdQZXJzaXN0ZW5jZSA9IGNvbmZpZy5wZXJzaXN0ZW5jZSB8fCBhZGFwdGVyLnByaW1hcnlTdG9yYWdlXG4gICAgaWYgKG5ld1BlcnNpc3RlbmNlICYmIG5ld1BlcnNpc3RlbmNlICE9PSB0aGlzLmNvbmZpZy5wZXJzaXN0ZW5jZSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWcoeyBwZXJzaXN0ZW5jZTogbmV3UGVyc2lzdGVuY2UgfSlcbiAgICB9XG5cbiAgICBjb25zdCB7IGF1dGhJbnN0YW5jZSwgb2F1dGhJbnN0YW5jZSB9ID0gZ2VuZXJhdGVBdXRoSW5zdGFuY2UoXG4gICAgICB7XG4gICAgICAgIHd4Q2xvdWQ6IHRoaXMuY29uZmlnLnd4Q2xvdWQsXG4gICAgICAgIHN0b3JhZ2U6IHRoaXMuY29uZmlnLnN0b3JhZ2UsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgcGVyc2lzdGVuY2U6IHRoaXMuY29uZmlnLnBlcnNpc3RlbmNlLFxuICAgICAgICBpMThuOiB0aGlzLmNvbmZpZy5pMThuLFxuICAgICAgICBwdWJsaXNoYWJsZV9rZXk6IHRoaXMuY29uZmlnLnB1Ymxpc2hhYmxlX2tleSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVudjogdGhpcy5jb25maWcuZW52LFxuICAgICAgICBjbGllbnRJZDogdGhpcy5jb25maWcuY2xpZW50SWQsXG4gICAgICAgIGFwaU9yaWdpbjogdGhpcy5yZXF1ZXN0LmdldEJhc2VFbmRQb2ludCgpLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgY2FjaGU6IHRoaXMuY2FjaGUsXG4gICAgICAgIGFwcDogdGhpcyxcbiAgICAgICAgZGVidWc6IHRoaXMuY29uZmlnLmRlYnVnLFxuICAgICAgfSxcbiAgICApXG5cbiAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBvYXV0aEluc3RhbmNlXG5cbiAgICB0aGlzLmF1dGhJbnN0YW5jZSA9IGF1dGhJbnN0YW5jZVxuXG4gICAgcmV0dXJuIHRoaXMuYXV0aEluc3RhbmNlXG4gIH0sXG59XG5cbnRyeSB7XG4gIC8vIOWwneivleiHquWKqOazqOWGjOiHs+WFqOWxgOWPmOmHj2Nsb3VkYmFzZVxuICAvLyDmraTooYzkuLrlj6rlnKjmtY/op4jlmajnjq/looPkuIvmnInmlYhcbiAgY2xvdWRiYXNlLnJlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudClcbn0gY2F0Y2ggKGUpIHt9XG5cbmV4cG9ydCB7IFVzZXJJbmZvLCBBdXRoIH1cbi8qKlxuICogQGFwaSDmiYvliqjms6jlhozoh7NjbG91ZGJhc2UgYXBwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckF1dGgoYXBwOiBQaWNrPElDbG91ZGJhc2UsICdyZWdpc3RlckNvbXBvbmVudCc+KSB7XG4gIHRyeSB7XG4gICAgYXBwLnJlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybihlKVxuICB9XG59XG4iXX0=
|
|
2869
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixNQUFNLEVBQ04sdUJBQXVCLEVBQ3ZCLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsR0FDWCxNQUFNLGtCQUFrQixDQUFBO0FBQ3pCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDMUMsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsaUJBQWlCLEdBQ2xCLE1BQU0sYUFBYSxDQUFBO0FBQ3BCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDckcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBaUM1QyxJQUFNLFNBQVMsR0FBRyxjQUFNLE9BQUEsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBaEUsQ0FBZ0UsQ0FBQTtBQW1DeEYsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFBO0FBa0I3QixJQUFNLGtCQUFrQixHQUFHLFVBQUEsUUFBUSxJQUFJLE9BQUEsVUFBQyxNQUFNO0lBQzVDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQix3QkFBTyxNQUFNLEtBQUUsU0FBUyxFQUFFLHdCQUF3QixDQUFDLGlCQUFpQixJQUFHLENBQUE7QUFDakgsQ0FBQyxFQUZzQyxDQUV0QyxDQUFB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UUFDRixHQUFHLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7S0FDakM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlLCBJQ2xvdWRiYXNlQ29uZmlnLCBJQ2xvdWRiYXNlUGxhdGZvcm1JbmZvIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcydcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZUNhY2hlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jYWNoZSdcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZVJlcXVlc3QgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlcXVlc3QnXG5pbXBvcnQgdHlwZSB7IElDbG91ZGJhc2VBdXRoQ29uZmlnLCBJVXNlciwgSUxvZ2luU3RhdGUgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2F1dGgnXG5pbXBvcnQgdHlwZSB7IElDbG91ZGJhc2VDb21wb25lbnQgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NvbXBvbmVudCdcbmltcG9ydCB0eXBlIHsgQXV0aE9wdGlvbnMsIENyZWRlbnRpYWxzIH0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB7XG4gIENsb3VkYmFzZU9BdXRoLFxuICBBVVRIX0FQSV9QUkVGSVgsXG4gIExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRSxcbiAgRVZFTlRTLFxuICBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRSxcbiAgT0FVVEhfVFlQRSxcbiAgd2VBcHBKd3REZWNvZGVBbGwsXG4gIEF1dGhFcnJvcixcbiAgYXV0aE1vZGVscyxcbn0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB7IHVzZUF1dGhBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJ1xuaW1wb3J0IHtcbiAgcHJpbnRXYXJuLFxuICB0aHJvd0Vycm9yLFxuICBFUlJPUlMsXG4gIENPTU1VTklUWV9TSVRFX1VSTCxcbiAgY2F0Y2hFcnJvcnNEZWNvcmF0b3IsXG4gIENsb3VkYmFzZUV2ZW50RW1pdHRlcixcbiAgQ2xvdWRiYXNlQ2FjaGUsXG4gIGFkYXB0ZXJGb3JXeE1wLFxuICB1c2VEZWZhdWx0QWRhcHRlcixcbn0gZnJvbSAnLi91dGlsaXRpZXMnXG5pbXBvcnQgeyBzYXZlVG9Ccm93c2VyU2Vzc2lvbiwgZ2V0QnJvd3NlclNlc3Npb24sIHJlbW92ZUJyb3dzZXJTZXNzaW9uLCBhZGRVcmxTZWFyY2ggfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7XG4gIENvbW1vblJlcyxcbiAgRGVsZXRlTWVSZXEsXG4gIEdldENsYWltc1JlcyxcbiAgR2V0VXNlcklkZW50aXRpZXNSZXMsXG4gIEdldFVzZXJSZXMsXG4gIExpbmtJZGVudGl0eVJlcSxcbiAgTGlua0lkZW50aXR5UmVzLFxuICBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrLFxuICBSZWF1dGhlbnRpY2F0ZVJlcyxcbiAgUmVzZW5kUmVxLFxuICBSZXNlbmRSZXMsXG4gIFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcyxcbiAgUmVzZXRQYXNzd29yZEZvck9sZFJlcSxcbiAgU2V0U2Vzc2lvblJlcSxcbiAgU2lnbkluQW5vbnltb3VzbHlSZXEsXG4gIFNpZ25Jbk9BdXRoUmVzLFxuICBTaWduSW5SZXMsXG4gIFNpZ25JbldpdGhJZFRva2VuUmVxLFxuICBTaWduSW5XaXRoT0F1dGhSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXMsXG4gIFNpZ25JbldpdGhQYXNzd29yZFJlcSxcbiAgU2lnblVwUmVzLFxuICBVbmxpbmtJZGVudGl0eVJlcSxcbiAgVXBkYXRlVXNlckF0dHJpYnV0ZXMsXG4gIFVwZGF0ZVVzZXJSZXEsXG4gIFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzLFxuICBWZXJpZnlPQXV0aFJlcSxcbiAgVmVyaWZ5T3RwUmVxLFxufSBmcm9tICcuL3R5cGUnXG5cbmNvbnN0IGlzQnJvd3NlciA9ICgpID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcblxuZXhwb3J0IHR5cGUge1xuICBTaWduSW5SZXMsXG4gIEdldFVzZXJSZXMsXG4gIENvbW1vblJlcyxcbiAgU2lnbkluV2l0aE90cFJlcyxcbiAgU2lnbkluT0F1dGhSZXMsXG4gIEdldENsYWltc1JlcyxcbiAgUmVzZXRQYXNzd29yZEZvckVtYWlsUmVzLFxuICBHZXRVc2VySWRlbnRpdGllc1JlcyxcbiAgTGlua0lkZW50aXR5UmVzLFxuICBSZWF1dGhlbnRpY2F0ZVJlcyxcbiAgUmVzZW5kUmVzLFxuICBVcGRhdGVVc2VyV2l0aFZlcmlmaWNhdGlvblJlcyxcbiAgT25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjayxcbiAgU2lnbkluV2l0aFBhc3N3b3JkUmVxLFxuICBTaWduSW5XaXRoSWRUb2tlblJlcSxcbiAgU2lnbkluV2l0aE9BdXRoUmVxLFxuICBWZXJpZnlPQXV0aFJlcSxcbiAgVmVyaWZ5T3RwUmVxLFxuICBMaW5rSWRlbnRpdHlSZXEsXG4gIFVubGlua0lkZW50aXR5UmVxLFxuICBVcGRhdGVVc2VyUmVxLFxuICBTaWduSW5XaXRoT3RwUmVxLFxuICBSZXNldFBhc3N3b3JkRm9yT2xkUmVxLFxuICBSZXNlbmRSZXEsXG4gIFNldFNlc3Npb25SZXEsXG4gIERlbGV0ZU1lUmVxLFxuICBTaWduVXBSZXMsXG59IGZyb20gJy4vdHlwZSdcblxuZGVjbGFyZSBjb25zdCBjbG91ZGJhc2U6IElDbG91ZGJhc2VcbmRlY2xhcmUgY29uc3Qgd3g6IGFueVxuXG5jb25zdCBDT01QT05FTlRfTkFNRSA9ICdhdXRoJ1xuXG5pbnRlcmZhY2UgVXNlckluZm8ge1xuICB1aWQ/OiBzdHJpbmdcbiAgZ2VuZGVyPzogc3RyaW5nXG4gIHBpY3R1cmU/OiBzdHJpbmdcbiAgZW1haWw/OiBzdHJpbmdcbiAgZW1haWxfdmVyaWZpZWQ/OiBib29sZWFuXG4gIHBob25lX251bWJlcj86IHN0cmluZ1xuICB1c2VybmFtZT86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIGJpcnRoZGF0ZT86IHN0cmluZ1xuICB6b25laW5mbz86IHN0cmluZ1xuICBsb2NhbGU/OiBzdHJpbmdcbiAgc3ViPzogc3RyaW5nXG4gIGNyZWF0ZWRfZnJvbT86IHN0cmluZ1xufVxuXG5jb25zdCBvbkNyZWRlbnRpYWxzRXJyb3IgPSBldmVudEJ1cyA9PiAocGFyYW1zKSA9PiB7XG4gIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkxPR0lOX1NUQVRFX0NIQU5HRUQsIHsgLi4ucGFyYW1zLCBldmVudFR5cGU6IExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRS5DUkVERU5USUFMU19FUlJPUiB9KVxufVxuXG5pbnRlcmZhY2UgSVVzZXJPcHRpb25zIHtcbiAgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuICBvYXV0aEluc3RhbmNlOiBDbG91ZGJhc2VPQXV0aFxufVxuXG5leHBvcnQgY2xhc3MgVXNlciBpbXBsZW1lbnRzIElVc2VyIHtcbiAgcHVibGljIHVpZD86IHN0cmluZ1xuICBwdWJsaWMgZ2VuZGVyPzogc3RyaW5nXG4gIHB1YmxpYyBwaWN0dXJlPzogc3RyaW5nXG4gIHB1YmxpYyBlbWFpbD86IHN0cmluZ1xuICBwdWJsaWMgZW1haWxWZXJpZmllZD86IGJvb2xlYW5cbiAgcHVibGljIHBob25lTnVtYmVyPzogc3RyaW5nXG4gIHB1YmxpYyB1c2VybmFtZT86IHN0cmluZyAvLyDnlKjmiLflkI3np7DvvIzplb/luqYgNS0yNCDkvY3vvIzmlK/mjIHlrZfnrKbkuK3oi7HmlofjgIHmlbDlrZfjgIHnibnmrorlrZfnrKbvvIjku4XmlK/mjIFfLe+8ie+8jOS4jeaUr+aMgeS4reaWh1xuICBwdWJsaWMgbmFtZT86IHN0cmluZ1xuICBwdWJsaWMgcHJvdmlkZXJzPzoge1xuICAgIGlkPzogc3RyaW5nXG4gICAgcHJvdmlkZXJVc2VySWQ/OiBzdHJpbmdcbiAgICBuYW1lPzogc3RyaW5nXG4gIH1bXVxuICBwdWJsaWMgYmlydGhkYXRlPzogc3RyaW5nXG4gIHB1YmxpYyB6b25laW5mbz86IHN0cmluZ1xuICBwdWJsaWMgbG9jYWxlPzogc3RyaW5nXG4gIHB1YmxpYyBzdWI/OiBzdHJpbmdcbiAgcHVibGljIGNyZWF0ZWRGcm9tPzogc3RyaW5nXG5cbiAgcHJpdmF0ZSBjYWNoZTogSUNsb3VkYmFzZUNhY2hlXG4gIHByaXZhdGUgb2F1dGhJbnN0YW5jZTogQ2xvdWRiYXNlT0F1dGggLy8gQ2xvdWRiYXNlT0F1dGgg57G75Z6LXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVVzZXJPcHRpb25zKSB7XG4gICAgY29uc3QgeyBjYWNoZSwgb2F1dGhJbnN0YW5jZSB9ID0gb3B0aW9uc1xuICAgIHRoaXMuY2FjaGUgPSBjYWNoZVxuICAgIHRoaXMub2F1dGhJbnN0YW5jZSA9IG9hdXRoSW5zdGFuY2VcblxuICAgIHRoaXMuc2V0VXNlckluZm8oKVxuICB9XG4gIC8qKlxuICAgKiDojrflj5bmnKzlnLDnlKjmiLfkv6Hmga8t5ZCM5q2lXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hlY2tMb2NhbEluZm8oKSB7XG4gICAgdGhpcy51aWQgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3VpZCcpIGFzIHN0cmluZ1xuICAgIHRoaXMuZ2VuZGVyID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdnZW5kZXInKSBhcyBzdHJpbmdcbiAgICB0aGlzLnBpY3R1cmUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3BpY3R1cmUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmVtYWlsID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdlbWFpbCcpIGFzIHN0cmluZ1xuICAgIHRoaXMuZW1haWxWZXJpZmllZCA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZW1haWxfdmVyaWZpZWQnKSBhcyBib29sZWFuXG4gICAgdGhpcy5waG9uZU51bWJlciA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygncGhvbmVfbnVtYmVyJykgYXMgc3RyaW5nXG4gICAgdGhpcy51c2VybmFtZSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygndXNlcm5hbWUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ25hbWUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmJpcnRoZGF0ZSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnYmlydGhkYXRlJykgYXMgc3RyaW5nXG4gICAgdGhpcy56b25laW5mbyA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnem9uZWluZm8nKSBhcyBzdHJpbmdcbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnbG9jYWxlJykgYXMgc3RyaW5nXG4gICAgdGhpcy5zdWIgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3N1YicpIGFzIHN0cmluZ1xuICAgIHRoaXMuY3JlYXRlZEZyb20gPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2NyZWF0ZWRfZnJvbScpIGFzIHN0cmluZ1xuICAgIHRoaXMucHJvdmlkZXJzID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdwcm92aWRlcnMnKSBhcyBhbnlcbiAgfVxuICAvKipcbiAgICog6I635Y+W5pys5Zyw55So5oi35L+h5oGvLeW8guatpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoZWNrTG9jYWxJbmZvQXN5bmMoKSB7XG4gICAgdGhpcy51aWQgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygndWlkJylcbiAgICB0aGlzLmdlbmRlciA9IGF3YWl0IHRoaXMuZ2V0TG9jYWxVc2VySW5mb0FzeW5jKCdnZW5kZXInKVxuICAgIHRoaXMucGljdHVyZSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygncGljdHVyZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuZW1haWwgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygnZW1haWwnKVxuICAgIHRoaXMuZW1haWxWZXJpZmllZCA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZW1haWxfdmVyaWZpZWQnKSBhcyBib29sZWFuXG4gICAgdGhpcy5waG9uZU51bWJlciA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygncGhvbmVfbnVtYmVyJykgYXMgc3RyaW5nXG4gICAgdGhpcy51c2VybmFtZSA9IGF3YWl0IHRoaXMuZ2V0TG9jYWxVc2VySW5mb0FzeW5jKCd1c2VybmFtZScpXG4gICAgdGhpcy5uYW1lID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCduYW1lJykgYXMgc3RyaW5nXG4gICAgdGhpcy5iaXJ0aGRhdGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2JpcnRoZGF0ZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuem9uZWluZm8gPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3pvbmVpbmZvJykgYXMgc3RyaW5nXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2xvY2FsZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuc3ViID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdzdWInKSBhcyBzdHJpbmdcbiAgICB0aGlzLmNyZWF0ZWRGcm9tID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdjcmVhdGVkX2Zyb20nKSBhcyBzdHJpbmdcbiAgICB0aGlzLnByb3ZpZGVycyA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygncHJvdmlkZXJzJykgYXMgYW55XG4gIH1cblxuICAvKipcbiAgICog5pu05paw55So5oi35L+h5oGvXG4gICAqIEBwYXJhbSB1c2VySW5mb1xuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+abtOaWsOeUqOaIt+S/oeaBr+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBVc2VyLnVwZGF0ZSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g55So5oi35L+h5oGv5Lit5piv5ZCm5YyF5ZCr6Z2e5rOV5YC8JyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyB1cGRhdGUodXNlckluZm86IGF1dGhNb2RlbHMuVXNlclByb2ZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBjb25zdCB7IG5hbWUsIGdlbmRlciwgYXZhdGFyVXJsLCBwcm92aW5jZSwgY291bnRyeSwgY2l0eSB9ID0gdXNlckluZm9cbiAgICBjb25zdCBuZXdVc2VySW5mbyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNldFVzZXJQcm9maWxlKHsgLi4udXNlckluZm8gfSlcblxuICAgIHRoaXMuc2V0TG9jYWxVc2VySW5mbyhuZXdVc2VySW5mbylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtczogYXV0aE1vZGVscy5Nb2RpZnlVc2VyQmFzaWNJbmZvUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVwZGF0ZVVzZXJCYXNpY0luZm8oeyAuLi5wYXJhbXMgfSlcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOWvhueggVxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmRcbiAgICogQHBhcmFtIG9sZFBhc3N3b3JkXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5pu05paw5a+G56CB5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIFVzZXIudXBkYXRlUGFzc3dvcmQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMyAtIOaWsOWvhueggeS4reaYr+WQpuWMheWQq+mdnuazleWtl+espicsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgdXBkYXRlUGFzc3dvcmQobmV3UGFzc3dvcmQ6IHN0cmluZywgb2xkUGFzc3dvcmQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS51cGRhdGVQYXNzd29yZEJ5T2xkKHtcbiAgICAgIG9sZF9wYXNzd29yZDogb2xkUGFzc3dvcmQsXG4gICAgICBuZXdfcGFzc3dvcmQ6IG5ld1Bhc3N3b3JkLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICog5pu05paw55So5oi35ZCNXG4gICAqIEBwYXJhbSB1c2VybmFtZVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+abtOaWsOeUqOaIt+WQjeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBVc2VyLnVwZGF0ZVVzZXJuYW1lKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobnlKjmiLflkI3lr4bnoIHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIHVwZGF0ZVVzZXJuYW1lKHVzZXJuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICd1c2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51cGRhdGUoe1xuICAgICAgdXNlcm5hbWUsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiDliLfmlrDmnKzlnLDnlKjmiLfkv6Hmga/jgILlvZPnlKjmiLflnKjlhbbku5blrqLmiLfnq6/mm7TmlrDnlKjmiLfkv6Hmga/kuYvlkI7vvIzlj6/ku6XosIPnlKjmraTmjqXlj6PlkIzmraXmm7TmlrDkuYvlkI7nmoTkv6Hmga/jgIJcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfliLfmlrDmnKzlnLDnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggVXNlci5yZWZyZXNoKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoKHBhcmFtcz86IHsgdmVyc2lvbj86IHN0cmluZzsgcXVlcnk/OiBhbnkgfSk6IFByb21pc2U8YXV0aE1vZGVscy5Vc2VySW5mbz4ge1xuICAgIGNvbnN0IG5ld1VzZXJJbmZvID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0VXNlckluZm8ocGFyYW1zKVxuICAgIGlmICgobmV3VXNlckluZm8gYXMgYW55KS5jb2RlID09PSAnSU5WQUxJRF9BQ0NFU1NfVE9LRU4nKSB7XG4gICAgICB0aGlzLnNldExvY2FsVXNlckluZm8oe30pXG4gICAgICB0aHJvdyBuZXdVc2VySW5mb1xuICAgIH1cbiAgICB0aGlzLnNldExvY2FsVXNlckluZm8obmV3VXNlckluZm8pXG4gICAgcmV0dXJuIG5ld1VzZXJJbmZvXG4gIH1cblxuICBwdWJsaWMgZ2V0TG9jYWxVc2VySW5mbyhrZXk/OiBzdHJpbmcpOiBzdHJpbmcgfCBib29sZWFuIHwgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSB0aGlzLmNhY2hlLmdldFN0b3JlKHVzZXJJbmZvS2V5KVxuXG4gICAgaWYgKCFrZXkpIHJldHVybiB1c2VySW5mbyB8fCB7fVxuXG4gICAgcmV0dXJuIHVzZXJJbmZvW2tleV1cbiAgfVxuXG4gIHB1YmxpYyBzZXRMb2NhbFVzZXJJbmZvKHVzZXJJbmZvOiBhbnkpIHtcbiAgICBjb25zdCB7IHVzZXJJbmZvS2V5IH0gPSB0aGlzLmNhY2hlLmtleXNcbiAgICB0aGlzLmNhY2hlLnNldFN0b3JlKHVzZXJJbmZvS2V5LCB1c2VySW5mbylcbiAgICB0aGlzLnNldFVzZXJJbmZvKClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0TG9jYWxVc2VySW5mb0FzeW5jKGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHVzZXJJbmZvS2V5IH0gPSB0aGlzLmNhY2hlLmtleXNcbiAgICBjb25zdCB1c2VySW5mbyA9IGF3YWl0IHRoaXMuY2FjaGUuZ2V0U3RvcmVBc3luYyh1c2VySW5mb0tleSlcbiAgICByZXR1cm4gdXNlckluZm9ba2V5XVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRVc2VySW5mbygpIHtcbiAgICBjb25zdCB7IHVzZXJJbmZvS2V5IH0gPSB0aGlzLmNhY2hlLmtleXNcbiAgICBjb25zdCB1c2VySW5mbyA9IHRoaXMuY2FjaGUuZ2V0U3RvcmUodXNlckluZm9LZXkpXG4gICAgO1tcbiAgICAgICd1aWQnLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICduYW1lJyxcbiAgICAgICdnZW5kZXInLFxuICAgICAgJ3BpY3R1cmUnLFxuICAgICAgJ2VtYWlsX3ZlcmlmaWVkJyxcbiAgICAgICdwaG9uZV9udW1iZXInLFxuICAgICAgJ2JpcnRoZGF0ZScsXG4gICAgICAnem9uZWluZm8nLFxuICAgICAgJ2xvY2FsZScsXG4gICAgICAnc3ViJyxcbiAgICAgICdjcmVhdGVkX2Zyb20nLFxuICAgICAgJ3Byb3ZpZGVycycsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgJ2NyZWF0ZWRfYXQnLFxuICAgIF0uZm9yRWFjaCgoaW5mb0tleSkgPT4ge1xuICAgICAgdGhpc1tpbmZvS2V5XSA9IHVzZXJJbmZvW2luZm9LZXldXG4gICAgfSlcbiAgfVxufVxuaW50ZXJmYWNlIElMb2dpblN0YXRlT3B0aW9ucyBleHRlbmRzIElVc2VyT3B0aW9ucyB7XG4gIGVudklkOiBzdHJpbmdcbn1cbmV4cG9ydCBjbGFzcyBMb2dpblN0YXRlIGltcGxlbWVudHMgSUxvZ2luU3RhdGUge1xuICBwdWJsaWMgdXNlcjogVXNlclxuICBwdWJsaWMgb2F1dGhMb2dpblN0YXRlOiBhbnlcblxuICBwcml2YXRlIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoXG4gIHByaXZhdGUgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElMb2dpblN0YXRlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgZW52SWQsIGNhY2hlLCBvYXV0aEluc3RhbmNlIH0gPSBvcHRpb25zXG4gICAgaWYgKCFlbnZJZCkge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICdlbnZJZCBpcyBub3QgZGVmaW5lZCcpXG4gICAgfVxuICAgIHRoaXMuY2FjaGUgPSBjYWNoZVxuICAgIHRoaXMub2F1dGhJbnN0YW5jZSA9IG9hdXRoSW5zdGFuY2VcblxuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKHtcbiAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgb2F1dGhJbnN0YW5jZSxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGNoZWNrTG9jYWxTdGF0ZSgpIHtcbiAgICB0aGlzLm9hdXRoTG9naW5TdGF0ZSA9IHRoaXMub2F1dGhJbnN0YW5jZT8uYXV0aEFwaS5oYXNMb2dpblN0YXRlU3luYygpXG4gICAgdGhpcy51c2VyLmNoZWNrTG9jYWxJbmZvKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjaGVja0xvY2FsU3RhdGVBc3luYygpIHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2U/LmF1dGhBcGkuZ2V0TG9naW5TdGF0ZSgpXG4gICAgYXdhaXQgdGhpcy51c2VyLmNoZWNrTG9jYWxJbmZvQXN5bmMoKVxuICB9XG59XG5cbmNsYXNzIEF1dGgge1xuICByZWFkb25seSBjb25maWc6IElDbG91ZGJhc2VBdXRoQ29uZmlnXG4gIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoXG4gIHJlYWRvbmx5IGNhY2hlOiBJQ2xvdWRiYXNlQ2FjaGVcbiAgcHJpdmF0ZSBsaXN0ZW5lcnM6IE1hcDxzdHJpbmcsIFNldDxPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrPj4gPSBuZXcgTWFwKClcbiAgcHJpdmF0ZSBoYXNMaXN0ZW5lclNldFVwID0gZmFsc2VcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IElDbG91ZGJhc2VBdXRoQ29uZmlnICYge1xuICAgIGNhY2hlOiBJQ2xvdWRiYXNlQ2FjaGVcbiAgICByZXF1ZXN0PzogSUNsb3VkYmFzZVJlcXVlc3RcbiAgICBydW50aW1lPzogc3RyaW5nXG4gIH0sKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBjb25maWcub2F1dGhJbnN0YW5jZVxuICAgIHRoaXMuY2FjaGUgPSBjb25maWcuY2FjaGVcbiAgICB0aGlzLmluaXQoKVxuICAgIHRoaXMuc2V0QWNjZXNzS2V5KClcbiAgfVxuXG4gIC8qKlxuICAgKiDnu5HlrprmiYvmnLrlj7dcbiAgICogQHBhcmFtIHBob25lTnVtYmVyXG4gICAqIEBwYXJhbSBwaG9uZUNvZGVcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnu5HlrprmiYvmnLrlj7flpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmJpbmRQaG9uZU51bWJlcigpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG55+t5L+h6aqM6K+B56CB55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBiaW5kUGhvbmVOdW1iZXIocGFyYW1zOiBhdXRoTW9kZWxzLkJpbmRQaG9uZVJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZWRpdENvbnRhY3QocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIOino+e7keS4ieaWuee7keWumlxuICAgKiBAcGFyYW0gbG9naW5UeXBlXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6Kej6Zmk5LiJ5pa557uR5a6a5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS51bmJpbmRQcm92aWRlcigpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN6LSm5oi35piv5ZCm5bey57uP5LiO5q2k55m75b2V5pa55byP6Kej57uRJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyB1bmJpbmRQcm92aWRlcihwYXJhbXM6IGF1dGhNb2RlbHMuVW5iaW5kUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVuYmluZFByb3ZpZGVyKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDpgq7nrrHlnLDlnYBcbiAgICogQHBhcmFtIGVtYWlsXG4gICAqIEBwYXJhbSBzdWRvX3Rva2VuXG4gICAqIEBwYXJhbSB2ZXJpZmljYXRpb25fdG9rZW5cbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnu5Hlrprpgq7nrrHlnLDlnYDlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmJpbmRFbWFpbCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG6YKu566x5a+G56CB55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBiaW5kRW1haWwocGFyYW1zOiBhdXRoTW9kZWxzLkJpbmRFbWFpbFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZWRpdENvbnRhY3QocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIHZlcmlmeVxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuVmVyaWZ5UmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuVmVyaWZ5UmVzcG9uc2U+fVxuICAgKiBAbWVtYmVyb2YgVXNlclxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+mqjOivgeeggemqjOivgeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkudmVyaWZ5KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobmiYvmnLrpqozor4HnoIEv6YKu566x55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkocGFyYW1zOiBhdXRoTW9kZWxzLlZlcmlmeVJlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuVmVyaWZ5UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudmVyaWZ5KHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpqozor4HnoIFcbiAgICogQHBhcmFtIHthdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlc3BvbnNlPn1cbiAgICogQG1lbWJlcm9mIFVzZXJcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bpqozor4HnoIHlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmdldFZlcmlmaWNhdGlvbigpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG5omL5py66aqM6K+B56CBL+mCrueuseeZu+W9lScsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0VmVyaWZpY2F0aW9uKFxuICAgIHBhcmFtczogYXV0aE1vZGVscy5HZXRWZXJpZmljYXRpb25SZXF1ZXN0LFxuICAgIG9wdGlvbnM/OiB7IHdpdGhDYXB0Y2hhOiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8YXV0aE1vZGVscy5HZXRWZXJpZmljYXRpb25SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRWZXJpZmljYXRpb24ocGFyYW1zLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeZu+W9leeahOeUqOaIt+S/oeaBry3lkIzmraVcbiAgICovXG4gIGdldCBjdXJyZW50VXNlcigpIHtcbiAgICBpZiAodGhpcy5jYWNoZS5tb2RlID09PSAnYXN5bmMnKSB7XG4gICAgICAvLyBhc3luYyBzdG9yYWdl55qE5bmz5Y+w6LCD55So5q2kQVBJ5o+Q56S6XG4gICAgICBwcmludFdhcm4oXG4gICAgICAgIEVSUk9SUy5JTlZBTElEX09QRVJBVElPTixcbiAgICAgICAgJ2N1cnJlbnQgcGxhdGZvcm1cXCdzIHN0b3JhZ2UgaXMgYXN5bmNocm9ub3VzLCBwbGVhc2UgdXNlIGdldEN1cnJlbnRVc2VyIGluc3RlYWQnLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IHRoaXMuaGFzTG9naW5TdGF0ZSgpXG5cbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgcmV0dXJuIGxvZ2luU3RhdGUudXNlciB8fCBudWxsXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55m75b2V55qE55So5oi35L+h5oGvLeW8guatpVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlueUqOaIt+S/oeaBr+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuZ2V0Q3VycmVudFVzZXIoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKCk6IFByb21pc2U8KGF1dGhNb2RlbHMuVXNlckluZm8gJiBQYXJ0aWFsPFVzZXI+KSB8IG51bGw+IHtcbiAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5nZXRMb2dpblN0YXRlKClcbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgY29uc3QgdXNlckluZm8gPSBsb2dpblN0YXRlLnVzZXIuZ2V0TG9jYWxVc2VySW5mbygpIGFzIGF1dGhNb2RlbHMuVXNlckluZm9cbiAgICAgIGF3YWl0IGxvZ2luU3RhdGUudXNlci5jaGVja0xvY2FsSW5mb0FzeW5jKClcbiAgICAgIHJldHVybiB7IC4uLmxvZ2luU3RhdGUudXNlciwgLi4udXNlckluZm8gfSBhcyB1bmtub3duIGFzIGF1dGhNb2RlbHMuVXNlckluZm8gJiBQYXJ0aWFsPFVzZXI+XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyAvKipcbiAgLy8gICog5Yy/5ZCN55m75b2VXG4gIC8vICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAvLyAgKiBAbWVtYmVyb2YgQXV0aFxuICAvLyAgKi9cbiAgLy8gQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgLy8gICB0aXRsZTogJ+WMv+WQjeeZu+W9leWksei0pScsXG4gIC8vICAgbWVzc2FnZXM6IFtcbiAgLy8gICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAvLyAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWMv+WQjeeZu+W9lScsXG4gIC8vICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5Bbm9ueW1vdXNseSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gIC8vICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgLy8gICBdLFxuICAvLyB9KVxuICAvLyBwdWJsaWMgYXN5bmMgc2lnbkluQW5vbnltb3VzbHkoZGF0YToge1xuICAvLyAgIHByb3ZpZGVyX3Rva2VuPzogc3RyaW5nXG4gIC8vIH0gPSB7fSwpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgLy8gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluQW5vbnltb3VzbHkoZGF0YSlcbiAgLy8gcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIC8vIH1cblxuICAvKipcbiAgICog5Yy/5ZCN55m75b2VXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+Wwj+eoi+W6j+WMv+WQjeeZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWMv+WQjeeZu+W9lScsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5Bbm9ueW1vdXNseUluV3goKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbkFub255bW91c2x5SW5XeCh7XG4gICAgdXNlV3hDbG91ZCxcbiAgfToge1xuICAgIHVzZVd4Q2xvdWQ/OiBib29sZWFuXG4gIH0gPSB7fSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gICAgfVxuICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG5cbiAgICBjb25zdCBtYWluRnVuYyA9IGFzeW5jIChjb2RlKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBhdXRoTW9kZWxzLkdyYW50UHJvdmlkZXJUb2tlblJlc3BvbnNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICAgICBsZXQgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50UHJvdmlkZXJUb2tlbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlcl9pZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIHByb3ZpZGVyX2NvZGU6IGNvZGUsXG4gICAgICAgICAgICBwcm92aWRlcl9wYXJhbXM6IHtcbiAgICAgICAgICAgICAgcHJvdmlkZXJfY29kZV90eXBlOiAnb3Blbl9pZCcsXG4gICAgICAgICAgICAgIGFwcGlkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZVd4Q2xvdWQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoKHJlc3VsdCBhcyBhbnkpPy5lcnJvcl9jb2RlIHx8ICFyZXN1bHQucHJvdmlkZXJfdG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluQW5vbnltb3VzbHkoXG4gICAgICAgICAgeyBwcm92aWRlcl90b2tlbjogcmVzdWx0LnByb3ZpZGVyX3Rva2VuIH0sXG4gICAgICAgICAgdXNlV3hDbG91ZCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICgoY3JlZGVudGlhbHMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgIHRocm93IGNyZWRlbnRpYWxzXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3gubG9naW4oe1xuICAgICAgICBzdWNjZXNzOiBhc3luYyAocmVzOiB7IGNvZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1haW5GdW5jKHJlcy5jb2RlKVxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmYWlsOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihyZXM/LmVyck1zZylcbiAgICAgICAgICA7KGVycm9yIGFzIGFueSkuY29kZSA9IHJlcz8uZXJybm9cbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKHVuZGVmaW5lZCwgeyBhc3luY1JlZnJlc2hVc2VyOiB0cnVlIH0pXG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqP57uR5a6aT3BlbklEXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+Wwj+eoi+W6j+e7keWumk9wZW5JROWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWwj+eoi+W6j29wZW5JZOmdmem7mOeZu+W9lScsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5iaW5kT3BlbklkKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBiaW5kT3BlbklkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gICAgfVxuICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG5cbiAgICBjb25zdCBtYWluRnVuYyA9IGFzeW5jIChjb2RlKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBhdXRoTW9kZWxzLkdyYW50UHJvdmlkZXJUb2tlblJlc3BvbnNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50UHJvdmlkZXJUb2tlbih7XG4gICAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSxcbiAgICAgICAgICBwcm92aWRlcl9wYXJhbXM6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ29wZW5faWQnLFxuICAgICAgICAgICAgYXBwaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoKHJlc3VsdCBhcyBhbnkpPy5lcnJvcl9jb2RlIHx8ICFyZXN1bHQucHJvdmlkZXJfdG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmJpbmRXaXRoUHJvdmlkZXIoeyBwcm92aWRlcl90b2tlbjogcmVzdWx0LnByb3ZpZGVyX3Rva2VuIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgc3VjY2VzczogYXN5bmMgKHJlczogeyBjb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtYWluRnVuYyhyZXMuY29kZSlcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzPy5lcnJNc2cpXG4gICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqPdW5pb25JZOmdmem7mOeZu+W9lVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICflsI/nqIvluo91bmlvbklk6Z2Z6buY55m75b2V5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5b2T5YmN546v5aKD5piv5ZCm5byA5ZCv5LqG5bCP56iL5bqPdW5pb25JZOmdmem7mOeZu+W9lScsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoVW5pb25JZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFVuaW9uSWQoKTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgaWYgKCFhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgIHRocm93IEVycm9yKCd3eCBhcGkgdW5kZWZpbmVkJylcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd3hJbmZvID0gd3guZ2V0QWNjb3VudEluZm9TeW5jKCkubWluaVByb2dyYW1cbiAgICAgICAgd3gubG9naW4oe1xuICAgICAgICAgIHN1Y2Nlc3M6IGFzeW5jIChyZXM6IHsgY29kZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVySWQgPSB3eEluZm8/LmFwcElkXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGU6IHJlcy5jb2RlLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyX2lkOiBwcm92aWRlcklkLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJfY29kZV90eXBlOiAndW5pb25faWQnLFxuICAgICAgICAgICAgICAgICAgYXBwaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBjb25zdCB7IHByb3ZpZGVyX3Rva2VuOiBwcm92aWRlclRva2VuIH0gPSByZXN1bHRcblxuICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICByZWplY3QocmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9pZDogcHJvdmlkZXJJZCxcbiAgICAgICAgICAgICAgICBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbixcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHNpZ25JblJlcylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWlsOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlcz8uZXJyTXNnKVxuICAgICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqP5omL5py65Y+35o6I5p2D55m75b2V77yM55uu5YmN5Y+q5pSv5oyB5YWo5omY566h5omL5py65Y+35o6I5p2D55m75b2VXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgLy8gQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgLy8gICB0aXRsZTogJ+Wwj+eoi+W6j+aJi+acuuWPt+aOiOadg+eZu+W9leWksei0pScsXG4gIC8vICAgbWVzc2FnZXM6IFtcbiAgLy8gICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAvLyAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWwj+eoi+W6j+aJi+acuuWPt+aOiOadg+eZu+W9lScsXG4gIC8vICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoUGhvbmVBdXRoKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgLy8gICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAvLyAgIF0sXG4gIC8vIH0pXG4gIC8vIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoUGhvbmVBdXRoKHsgcGhvbmVDb2RlID0gJycgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAvLyAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gIC8vICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG4gIC8vICAgY29uc3QgcHJvdmlkZXJJbmZvID0ge1xuICAvLyAgICAgcHJvdmlkZXJfcGFyYW1zOiB7IHByb3ZpZGVyX2NvZGVfdHlwZTogJ3Bob25lJyB9LFxuICAvLyAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgLy8gICB9XG5cbiAgLy8gICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHd4LmxvZ2luKClcbiAgLy8gICA7KHByb3ZpZGVySW5mbyBhcyBhbnkpLnByb3ZpZGVyX2NvZGUgPSBjb2RlXG5cbiAgLy8gICB0cnkge1xuICAvLyAgICAgbGV0IHByb3ZpZGVyVG9rZW4gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4ocHJvdmlkZXJJbmZvKVxuICAvLyAgICAgaWYgKHByb3ZpZGVyVG9rZW4uZXJyb3JfY29kZSkge1xuICAvLyAgICAgICB0aHJvdyBwcm92aWRlclRva2VuXG4gIC8vICAgICB9XG5cbiAgLy8gICAgIHByb3ZpZGVyVG9rZW4gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5wYXRjaFByb3ZpZGVyVG9rZW4oe1xuICAvLyAgICAgICBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbi5wcm92aWRlcl90b2tlbixcbiAgLy8gICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgLy8gICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gIC8vICAgICAgICAgY29kZTogcGhvbmVDb2RlLFxuICAvLyAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ3Bob25lJyxcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgIH0pXG4gIC8vICAgICBpZiAocHJvdmlkZXJUb2tlbi5lcnJvcl9jb2RlKSB7XG4gIC8vICAgICAgIHRocm93IHByb3ZpZGVyVG9rZW5cbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHtcbiAgLy8gICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4ucHJvdmlkZXJfdG9rZW4sXG4gIC8vICAgICB9KVxuXG4gIC8vICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gIC8vICAgICAgIHRocm93IHNpZ25JblJlc1xuICAvLyAgICAgfVxuICAvLyAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gIC8vICAgICB0aHJvdyBlcnJvclxuICAvLyAgIH1cblxuICAvLyAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICAvLyB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+efreS/oemqjOivgeeggeeZu+mZhlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuoblsI/nqIvluo/nn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluV2l0aFNtcygpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFNtcyh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgcGhvbmVOdW0gPSAnJyxcbiAgICBiaW5kSW5mbyA9IHVuZGVmaW5lZCxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IHBob25lTnVtLFxuICAgICAgICBsb2dpblR5cGU6ICdzbXMnLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YKu566x6aqM6K+B56CB55m76ZmGXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+mCrueusemqjOivgeeggeeZu+mZhicsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6humCrueuseeZu+mZhicsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoRW1haWwoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhFbWFpbCh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgYmluZEluZm8gPSB1bmRlZmluZWQsXG4gICAgZW1haWwgPSAnJyxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IGVtYWlsLFxuICAgICAgICBsb2dpblR5cGU6ICdlbWFpbCcsXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ojrflj5boh6rlrprkuYnnmbvlvZUgdGlja2V0IOWHveaVsFxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZufSBnZXRUaWNrRm5cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBzZXRDdXN0b21TaWduRnVuYyhnZXRUaWNrRm46IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2V0Q3VzdG9tU2lnbkZ1bmMoZ2V0VGlja0ZuKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgLy8gQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgLy8gICB0aXRsZTogJ+iHquWumuS5ieeZu+W9leWksei0pScsXG4gIC8vICAgbWVzc2FnZXM6IFtcbiAgLy8gICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAvLyAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huiHquWumuS5ieeZu+W9lScsXG4gIC8vICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgLy8gICAgICcgIDMgLSB0aWNrZXQg5piv5ZCm5b2S5bGe5LqO5b2T5YmN546v5aKDJyxcbiAgLy8gICAgICcgIDQgLSDliJvlu7ogdGlja2V0IOeahOiHquWumuS5ieeZu+W9leengemSpeaYr+WQpui/h+acnycsXG4gIC8vICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgLy8gICBdLFxuICAvLyB9KVxuICAvLyBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgLy8gICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KClcbiAgLy8gICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgLy8gfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuU2lnbkluUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25JbihwYXJhbXM6IGF1dGhNb2RlbHMuU2lnbkluUmVxdWVzdCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbihwYXJhbXMpXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZShwYXJhbXMpXG4gIH1cblxuICAvLyAvKipcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIHthdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3R9IHBhcmFtc1xuICAvLyAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgLy8gICogQG1lbWJlcm9mIEF1dGhcbiAgLy8gICovXG4gIC8vIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gIC8vICAgdGl0bGU6ICfms6jlhozlpLHotKUnLFxuICAvLyAgIG1lc3NhZ2VzOiBbXG4gIC8vICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgLy8gICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuobmjIflrprnmbvlvZXmlrnlvI8nLFxuICAvLyAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnblVwKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgLy8gICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAvLyAgIF0sXG4gIC8vIH0pXG4gIC8vIHB1YmxpYyBhc3luYyBzaWduVXAocGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAvLyAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25VcChwYXJhbXMpXG4gIC8vICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIC8vIH1cblxuICAvKipcbiAgICog6K6+572u5a+G56CBXG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5TZXRQYXNzd29yZFJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRQYXNzd29yZChwYXJhbXM6IGF1dGhNb2RlbHMuU2V0UGFzc3dvcmRSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNldFBhc3N3b3JkKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDmo4DmtYvnlKjmiLflkI3mmK/lkKblt7Lnu4/ljaDnlKhcbiAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W55So5oi35piv5ZCm6KKr5Y2g55So5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS5pc1VzZXJuYW1lUmVnaXN0ZXJlZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgaXNVc2VybmFtZVJlZ2lzdGVyZWQodXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3VzZXJuYW1lIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgZXhpc3QgfSA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmNoZWNrSWZVc2VyRXhpc3QoeyB1c2VybmFtZSB9KVxuICAgIHJldHVybiBleGlzdFxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluacrOWcsOeZu+W9leaAgS3lkIzmraVcbiAgICovXG4gIHB1YmxpYyBoYXNMb2dpblN0YXRlKCk6IExvZ2luU3RhdGUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5jYWNoZS5tb2RlID09PSAnYXN5bmMnKSB7XG4gICAgICAvLyBhc3luYyBzdG9yYWdl55qE5bmz5Y+w6LCD55So5q2kQVBJ5o+Q56S6XG4gICAgICBwcmludFdhcm4oXG4gICAgICAgIEVSUk9SUy5JTlZBTElEX09QRVJBVElPTixcbiAgICAgICAgJ2N1cnJlbnQgcGxhdGZvcm1cXCdzIHN0b3JhZ2UgaXMgYXN5bmNocm9ub3VzLCBwbGVhc2UgdXNlIGdldExvZ2luU3RhdGUgaW5zdGVhZCcsXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvYXV0aExvZ2luU3RhdGUgPSB0aGlzLm9hdXRoSW5zdGFuY2U/LmF1dGhBcGkuaGFzTG9naW5TdGF0ZVN5bmMoKVxuICAgIGlmIChvYXV0aExvZ2luU3RhdGUpIHtcbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBuZXcgTG9naW5TdGF0ZSh7XG4gICAgICAgIGVudklkOiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgICBvYXV0aEluc3RhbmNlOiB0aGlzLm9hdXRoSW5zdGFuY2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGxvZ2luU3RhdGVcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmnKzlnLDnmbvlvZXmgIEt5byC5q2lXG4gICAqIOatpEFQSeS4uuWFvOWuueW8guatpXN0b3JhZ2XnmoTlubPlj7BcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bmnKzlnLDnmbvlvZXmgIHlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmdldExvZ2luU3RhdGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldExvZ2luU3RhdGUoKSB7XG4gICAgbGV0IG9hdXRoTG9naW5TdGF0ZSA9IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBvYXV0aExvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRMb2dpblN0YXRlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAob2F1dGhMb2dpblN0YXRlKSB7XG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gbmV3IExvZ2luU3RhdGUoe1xuICAgICAgICBlbnZJZDogdGhpcy5jb25maWcuZW52LFxuICAgICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgICAgb2F1dGhJbnN0YW5jZTogdGhpcy5vYXV0aEluc3RhbmNlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiBsb2dpblN0YXRlXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDmmK/lkKblt7LnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuZ2V0VXNlckluZm8oKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldFVzZXJJbmZvKCk6IFByb21pc2U8KGF1dGhNb2RlbHMuVXNlckluZm8gJiBQYXJ0aWFsPFVzZXI+KSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50VXNlcigpXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W5b6u5pCt5o+S5Lu255So5oi35L+h5oGv5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5piv5ZCm5bey55m75b2VJyxcbiAgICAgICcgIDIgLSDosIPnlKggYXV0aCgpLmdldFdlZGFVc2VySW5mbygpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0V2VkYVVzZXJJbmZvKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFdlZGFVc2VySW5mbygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpIHtcbiAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5nZXRMb2dpblN0YXRlKClcbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgYXdhaXQgKGxvZ2luU3RhdGUudXNlciBhcyBVc2VyKS51cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtcylcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKipcbiAgICogZ2V0QXV0aEhlYWRlciDlhbzlrrnlpITnkIZcbiAgICog6L+U5Zue56m65a+56LGhXG4gICAqL1xuICBwdWJsaWMgZ2V0QXV0aEhlYWRlcigpOiB7fSB7XG4gICAgY29uc29sZS5lcnJvcignQXV0aC5nZXRBdXRoSGVhZGVyIEFQSSDlt7Llup/lvIMnKVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIOS4uuW3suaciei0puaIt+e7keesrOS4ieaWuei0puaIt1xuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuQmluZFdpdGhQcm92aWRlclJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnu5HlrprnrKzkuInmlrnnmbvlvZXmlrnlvI/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmJpbmRXaXRoUHJvdmlkZXIoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOatpOi0puaIt+aYr+WQpuW3sue7j+e7keWumuatpOesrOS4ieaWuScsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgYmluZFdpdGhQcm92aWRlcihwYXJhbXM6IGF1dGhNb2RlbHMuQmluZFdpdGhQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuYmluZFdpdGhQcm92aWRlcihwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog5p+l6K+i55So5oi3XG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVxdWVzdH0gYXBwZW5kZWRfcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuVXNlclByb2ZpbGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlcihxdWVyeU9iajogYXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucXVlcnlVc2VyUHJvZmlsZShxdWVyeU9iailcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBY2Nlc3NUb2tlbigpIHtcbiAgICBjb25zdCBvYXV0aEFjY2Vzc1Rva2VuUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5nZXRBY2Nlc3NUb2tlbigpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBvYXV0aEFjY2Vzc1Rva2VuUmVzLFxuICAgICAgZW52OiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdyYW50UHJvdmlkZXJUb2tlbihwYXJhbXM6IGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwYXRjaFByb3ZpZGVyVG9rZW4ocGFyYW1zOiBhdXRoTW9kZWxzLlBhdGNoUHJvdmlkZXJUb2tlblJlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLlBhdGNoUHJvdmlkZXJUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnBhdGNoUHJvdmlkZXJUb2tlbihwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFByb3ZpZGVyKHBhcmFtczogYXV0aE1vZGVscy5TaWduSW5XaXRoUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHBhcmFtcylcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoV2VjaGF0KHBhcmFtczogYW55ID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoV2VjaGF0KHBhcmFtcylcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBncmFudFRva2VuKHBhcmFtczogYXV0aE1vZGVscy5HcmFudFRva2VuUmVxdWVzdCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50VG9rZW4ocGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlblByb3ZpZGVyUmVkaXJlY3RVcmkocGFyYW1zOiBhdXRoTW9kZWxzLkdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5HZW5Qcm92aWRlclJlZGlyZWN0VXJpUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2VuUHJvdmlkZXJSZWRpcmVjdFVyaShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzZXRQYXNzd29yZChwYXJhbXM6IGF1dGhNb2RlbHMuUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZChwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGV2aWNlQXV0aG9yaXplKHBhcmFtczogYXV0aE1vZGVscy5EZXZpY2VBdXRob3JpemVSZXF1ZXN0KTogUHJvbWlzZTxhdXRoTW9kZWxzLkRldmljZUF1dGhvcml6ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmRldmljZUF1dGhvcml6ZShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3VkbyhwYXJhbXM6IGF1dGhNb2RlbHMuU3Vkb1JlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuU3Vkb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnN1ZG8ocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZU1lKHBhcmFtczogYXV0aE1vZGVscy5XaXRoU3Vkb1JlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuVXNlclByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGVsZXRlTWUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFByb3ZpZGVycygpOiBQcm9taXNlPGF1dGhNb2RlbHMuUHJvdmlkZXJzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJzKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2dpblNjb3BlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmxvZ2luU2NvcGUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luR3JvdXBzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkubG9naW5Hcm91cHMoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG9uTG9naW5TdGF0ZUNoYW5nZWQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jb25maWcuZXZlbnRCdXM/Lm9uKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICAvLyBnZXRMb2dpblN0YXRl5Lya6YeN5aSN6Kem5Y+RZ2V0Q3JlZGVudGlhbHPvvIzlr7zoh7Tmrbvlvqrnjq/vvIzmiYDku6VnZXRDcmVkZW50aWFsc+WHuumUmeS4jeWGjeWHuuWPkWdldExvZ2luU3RhdGVcbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBwYXJhbXM/LmRhdGE/LmV2ZW50VHlwZSAhPT0gTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLkNSRURFTlRJQUxTX0VSUk9SID8gYXdhaXQgdGhpcy5nZXRMb2dpblN0YXRlKCkgOiB7fVxuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCB7IC4uLnBhcmFtcywgLi4ubG9naW5TdGF0ZSB9KVxuICAgIH0pXG4gICAgLy8g56uL5Yi75omn6KGM5LiA5qyh5Zue6LCDXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpXG4gICAgY2FsbGJhY2suY2FsbCh0aGlzLCBsb2dpblN0YXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIOW8uuWItuWIt+aWsHRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoVG9rZW5Gb3JjZShwYXJhbXM6IHsgdmVyc2lvbj86IHN0cmluZyB9KTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5yZWZyZXNoVG9rZW5Gb3JjZShwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6Lqr5Lu95L+h5oGvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3JlZGVudGlhbHMoKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRDcmVkZW50aWFscygpXG4gIH1cbiAgLyoqXG4gICAqIOWGmeWFpei6q+S7veS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscykge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMpXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W6Lqr5Lu95rqQ57G75Z6LJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS5nZXRQcm92aWRlclN1YlR5cGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldFByb3ZpZGVyU3ViVHlwZSgpOiBQcm9taXNlPGF1dGhNb2RlbHMuUHJvdmlkZXJTdWJUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFByb3ZpZGVyU3ViVHlwZSgpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2FwdGNoYURhdGEocGFyYW1zOiB7IHN0YXRlOiBzdHJpbmc7IHJlZGlyZWN0X3VyaT86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmNyZWF0ZUNhcHRjaGFEYXRhKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlDYXB0Y2hhRGF0YShwYXJhbXM6IHsgdG9rZW46IHN0cmluZzsga2V5OiBzdHJpbmcgfSkge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS52ZXJpZnlDYXB0Y2hhRGF0YShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWluaVByb2dyYW1RckNvZGUocGFyYW1zOiBhdXRoTW9kZWxzLkdldE1pbmlQcm9ncmFtUXJDb2RlUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0TWluaVByb2dyYW1RckNvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRNaW5pUHJvZ3JhbUNvZGUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzKHBhcmFtczogYXV0aE1vZGVscy5HZXRNaW5pUHJvZ3JhbVFyQ29kZVN0YXR1c1JlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0TWluaVByb2dyYW1RckNvZGVTdGF0dXMocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG1vZGlmeVBhc3N3b3JkKHBhcmFtczogYXV0aE1vZGVscy5Nb2RpZnlVc2VyQmFzaWNJbmZvUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5tb2RpZnlQYXNzd29yZChwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbW9kaWZ5UGFzc3dvcmRXaXRob3V0TG9naW4ocGFyYW1zOiBhdXRoTW9kZWxzLk1vZGlmeVBhc3N3b3JkV2l0aG91dExvZ2luUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5tb2RpZnlQYXNzd29yZFdpdGhvdXRMb2dpbihwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlckJlaGF2aW9yTG9nKHBhcmFtczogYXV0aE1vZGVscy5HZXRVc2VyQmVoYXZpb3JMb2cpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0VXNlckJlaGF2aW9yTG9nUmVzPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFVzZXJCZWhhdmlvckxvZyhwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICogc21zL2VtYWlsIOmqjOivgeeggeeZu+W9lS/ms6jlhozvvIzpgLvovpHkuIDoh7TmlLbmlZtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgIHZlcmlmaWNhdGlvbkluZm8gPSB7IHZlcmlmaWNhdGlvbl9pZDogJycsIGlzX3VzZXI6IGZhbHNlIH0sXG4gICAgdmVyaWZpY2F0aW9uQ29kZSA9ICcnLFxuICAgIHVzZXJuYW1lOiByYXdVc2VybmFtZSA9ICcnLFxuICAgIGJpbmRJbmZvID0gdW5kZWZpbmVkLFxuICAgIGxvZ2luVHlwZSA9ICcnLFxuICB9OiB7XG4gICAgdmVyaWZpY2F0aW9uSW5mbz86IGF1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVzcG9uc2VcbiAgICB2ZXJpZmljYXRpb25Db2RlPzogc3RyaW5nXG4gICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICBiaW5kSW5mbz86IGFueVxuICAgIGxvZ2luVHlwZT86IHN0cmluZ1xuICB9KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIOmqjOivgemqjOivgeeggVxuICAgICAgY29uc3QgdmVyaWZ5UmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudmVyaWZ5KHtcbiAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICB9KVxuXG4gICAgICBpZiAoKHZlcmlmeVJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHZlcmlmeVJlc1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbl90b2tlbiB9ID0gdmVyaWZ5UmVzXG5cbiAgICAgIC8vIOaJi+acuueZu+W9leWPguaVsFxuICAgICAgbGV0IHVzZXJuYW1lID0gL15cXCtcXGR7MSwzfVxccysvLnRlc3QocmF3VXNlcm5hbWUpID8gcmF3VXNlcm5hbWUgOiBgKzg2ICR7cmF3VXNlcm5hbWV9YFxuICAgICAgbGV0IHNpZ25VcFBhcmFtOiBhbnkgPSB7IHBob25lX251bWJlcjogdXNlcm5hbWUgfVxuXG4gICAgICAvLyDpgq7nrrHnmbvlvZXlj4LmlbBcbiAgICAgIGlmIChsb2dpblR5cGUgPT09ICdlbWFpbCcpIHtcbiAgICAgICAgdXNlcm5hbWUgPSByYXdVc2VybmFtZVxuICAgICAgICBzaWduVXBQYXJhbSA9IHsgZW1haWw6IHVzZXJuYW1lIH1cbiAgICAgIH1cblxuICAgICAgLy8gMi4g5qC55o2u5piv5ZCm5bey57uP5piv55So5oi377yM5YiG5Yir6LWw55m75b2V5oiW5rOo5YaM6YC76L6RXG4gICAgICBpZiAodmVyaWZpY2F0aW9uSW5mby5pc191c2VyKSB7XG4gICAgICAgIC8vIOengeacieWMlueOr+Wig+aIluiAheiHquWumuS5ieW6lOeUqOi1sHYx54mI5pys55qE6ICB6YC76L6RXG4gICAgICAgIGNvbnN0IHNpZ25JblJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25Jbih7XG4gICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgoc2lnbkluUmVzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICB0aHJvdyBzaWduSW5SZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaW5kSW5mbykge1xuICAgICAgICAgIGNvbnN0IGJpbmRSZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5iaW5kV2l0aFByb3ZpZGVyKHtcbiAgICAgICAgICAgIHByb3ZpZGVyX3Rva2VuOiAoYmluZEluZm8gYXMgYW55KT8ucHJvdmlkZXJUb2tlbixcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKChiaW5kUmVzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICAgIHRocm93IGJpbmRSZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOiHquWumuS5ieW6lOeUqOi1sHNpZ25VcOmAu+i+kVxuICAgICAgICBjb25zdCBzaWduVXBSZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduVXAoe1xuICAgICAgICAgIC4uLnNpZ25VcFBhcmFtLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICBwcm92aWRlcl90b2tlbjogKGJpbmRJbmZvIGFzIGFueSk/LnByb3ZpZGVySWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKChzaWduVXBSZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgIHRocm93IHNpZ25VcFJlc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUxvZ2luU3RhdGUoXG4gICAgcGFyYW1zPzogeyB2ZXJzaW9uPzogc3RyaW5nOyBxdWVyeT86IGFueSB9LFxuICAgIG9wdGlvbnM/OiB7IGFzeW5jUmVmcmVzaFVzZXI/OiBib29sZWFuOyB1c2VySW5mbz86IGFueSB9LFxuICApOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBjb25zdCBsb2dpblN0YXRlID0gbmV3IExvZ2luU3RhdGUoe1xuICAgICAgZW52SWQ6IHRoaXMuY29uZmlnLmVudixcbiAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgb2F1dGhJbnN0YW5jZTogdGhpcy5vYXV0aEluc3RhbmNlLFxuICAgIH0pXG5cbiAgICBhd2FpdCBsb2dpblN0YXRlLmNoZWNrTG9jYWxTdGF0ZUFzeW5jKClcblxuICAgIGlmIChvcHRpb25zPy51c2VySW5mbykge1xuICAgICAgbG9naW5TdGF0ZS51c2VyLnNldExvY2FsVXNlckluZm8ob3B0aW9ucy51c2VySW5mbylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnM/LmFzeW5jUmVmcmVzaFVzZXIpIHtcbiAgICAgICAgbG9naW5TdGF0ZS51c2VyLnJlZnJlc2gocGFyYW1zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgbG9naW5TdGF0ZS51c2VyLnJlZnJlc2gocGFyYW1zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCB7IGV2ZW50VHlwZTogTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05fSU4gfSlcblxuICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9JTiB9KVxuICAgIHJldHVybiBsb2dpblN0YXRlXG4gIH1cblxuICBhc3luYyBzZXRBY2Nlc3NLZXkoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmFjY2Vzc0tleSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5zZXRBY2Nlc3NLZXlDcmVkZW50aWFscyh7XG4gICAgICAgICAgYWNjZXNzX3Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NLZXksXG4gICAgICAgICAgdG9rZW5fdHlwZTogJ0JlYXJlcicsXG4gICAgICAgICAgc2NvcGU6ICdhY2Nlc3NLZXknLFxuICAgICAgICAgIGV4cGlyZXNfYXQ6IG5ldyBEYXRlKCtuZXcgRGF0ZSgpICsgK25ldyBEYXRlKCkpLFxuICAgICAgICAgIGV4cGlyZXNfaW46ICtuZXcgRGF0ZSgpICsgK25ldyBEYXRlKCksXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ2FjY2Vzc0tleSBlcnJvcjogJywgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PSBuZXcgYXV0aCBhcGkgbWV0aG9kcyBtZXJnZWQgYmVsb3cgPT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmluYW5vbnltb3VzbHlcbiAgICogU2lnbiBpbiBhIHVzZXIgYW5vbnltb3VzbHkuXG4gICAqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IGF1dGguc2lnbkluQW5vbnltb3VzbHkoKTtcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyAgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5Bbm9ueW1vdXNseShwYXJhbXM6IFNpZ25JbkFub255bW91c2x5UmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluQW5vbnltb3VzbHkocGFyYW1zKVxuICAgICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgLy8gbG9naW5TdGF0Zei/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgICByZXR1cm4geyAuLi4obG9naW5TdGF0ZSBhcyBhbnkpLCBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbnVwXG4gICAqIFNpZ24gdXAgYSBuZXcgdXNlciB3aXRoIGVtYWlsIG9yIHBob25lIHVzaW5nIGEgb25lLXRpbWUgcGFzc3dvcmQgKE9UUCkuIElmIHRoZSBhY2NvdW50IG5vdCBleGlzdCwgYSBuZXcgYWNjb3VudCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduVXBSZXM+XG4gICAqL1xuICBhc3luYyBzaWduVXAocGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3QgJiB7IHBob25lPzogc3RyaW5nIH0pOiBQcm9taXNlPFNpZ25VcFJlcz4ge1xuICAgIGlmIChwYXJhbXMucGhvbmVfbnVtYmVyIHx8IHBhcmFtcy52ZXJpZmljYXRpb25fY29kZSB8fCBwYXJhbXMudmVyaWZpY2F0aW9uX3Rva2VuIHx8IHBhcmFtcy5wcm92aWRlcl90b2tlbikge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnblVwKHBhcmFtcylcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKSBhcyBhbnlcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWls5oiWcGhvbmXlv4XloavlhbbkuIBcbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHBhcmFtcywgW1snZW1haWwnXSwgWydwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0sKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLy8g56ys5LqM5q2l77ya562J5b6F55So5oi36L6T5YWl6aqM6K+B56CB77yI6YCa6L+HIFByb21pc2Ug5YyF6KOF55So5oi36L6T5YWl5LqL5Lu277yJXG4gICAgICAgICAgdmVyaWZ5T3RwOiBhc3luYyAoeyB0b2tlbiwgbWVzc2FnZUlkID0gdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQgfSk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyDnrKzkuInmraXvvJrlvoXnlKjmiLfovpPlhaXlrozpqozor4HnoIHkuYvlkI7vvIzpqozor4Hnn63kv6Hpqozor4HnoIFcbiAgICAgICAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uVG9rZW5SZXMgPSBhd2FpdCB0aGlzLnZlcmlmeSh7XG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiBtZXNzYWdlSWQgfHwgdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHRva2VuLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIC8vIOesrOWbm+atpe+8muazqOWGjOW5tueZu+W9leaIluebtOaOpeeZu+W9lVxuICAgICAgICAgICAgICAvLyDlpoLmnpznlKjmiLflt7Lnu4/lrZjlnKjvvIznm7TmjqXnmbvlvZVcbiAgICAgICAgICAgICAgaWYgKHZlcmlmaWNhdGlvbkluZm8uaXNfdXNlcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2lnbkluKHtcbiAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOiBwYXJhbXMuZW1haWwgfHwgdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpznlKjmiLfkuI3lrZjlnKjvvIzms6jlhoznlKjmiLdcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJhbXMpKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLmVtYWlsXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEucGhvbmVcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25VcCh7XG4gICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgLi4uKHBhcmFtcy5lbWFpbCA/IHsgZW1haWw6IHBhcmFtcy5lbWFpbCB9IDogeyBwaG9uZV9udW1iZXI6IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSB9KSxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogdmVyaWZpY2F0aW9uVG9rZW5SZXMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHRva2VuLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWdub3V0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF1dGguc2lnbk91dCgpO1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduT3V0KHBhcmFtcz86IGF1dGhNb2RlbHMuU2lnbm91dFJlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLlNpZ25vdXRSZXNwb25zZSAmIHsgZGF0YTogT2JqZWN0OyBlcnJvcjogQXV0aEVycm9yIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduT3V0KHBhcmFtcylcbiAgICAgIGF3YWl0IHRoaXMuY2FjaGUucmVtb3ZlU3RvcmVBc3luYyh1c2VySW5mb0tleSlcbiAgICAgIHRoaXMuc2V0QWNjZXNzS2V5KClcblxuICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkxPR0lOX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnRUeXBlOiBMT0dJTl9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTl9PVVQgfSlcblxuICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTkVEX09VVCB9KVxuXG4gICAgICAvLyByZXPov5Tlm57mmK/kuLrkuoblhbzlrrl2MueJiOacrFxuICAgICAgcmV0dXJuIHsgLi4ucmVzLCBkYXRhOiB7fSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLW9uYXV0aHN0YXRlY2hhbmdlXG4gICAqIFJlY2VpdmUgYSBub3RpZmljYXRpb24gZXZlcnkgdGltZSBhbiBhdXRoIGV2ZW50IGhhcHBlbnMuXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyBQcm9taXNlPHsgZGF0YTogeyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB9LCBlcnJvcjogRXJyb3IgfCBudWxsIH0+XG4gICAqL1xuICBvbkF1dGhTdGF0ZUNoYW5nZShjYWxsYmFjazogT25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5oYXNMaXN0ZW5lclNldFVwKSB7XG4gICAgICB0aGlzLnNldHVwTGlzdGVuZXJzKClcbiAgICAgIHRoaXMuaGFzTGlzdGVuZXJTZXRVcCA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpXG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnNldChpZCwgbmV3IFNldCgpKVxuICAgIH1cblxuICAgIHRoaXMubGlzdGVuZXJzLmdldChpZCkhLmFkZChjYWxsYmFjaylcblxuICAgIC8vIOi/lOWbniBTdWJzY3JpcHRpb24g5a+56LGhXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgaWQsXG4gICAgICBjYWxsYmFjayxcbiAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMubGlzdGVuZXJzLmdldChpZClcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG4gICAgICAgICAgaWYgKGNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoaWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiB7IHN1YnNjcmlwdGlvbiB9LFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aHBhc3N3b3JkXG4gICAqIExvZyBpbiBhbiBleGlzdGluZyB1c2VyIHdpdGggYW4gZW1haWwgYW5kIHBhc3N3b3JkIG9yIHBob25lIGFuZCBwYXNzd29yZCBvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoUGFzc3dvcmQocGFyYW1zOiBTaWduSW5XaXRoUGFzc3dvcmRSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJp1c2VybmFtZS9lbWFpbC9waG9uZeS4iemAieS4gO+8jHBhc3N3b3Jk5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbWyd1c2VybmFtZSddLCBbJ2VtYWlsJ10sIFsncGhvbmUnXV0sXG4gICAgICAgICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciB1c2VybmFtZSwgZW1haWwsIG9yIHBob25lJyxcbiAgICAgIClcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25Jbih7XG4gICAgICAgIHVzZXJuYW1lOiBwYXJhbXMudXNlcm5hbWUgfHwgcGFyYW1zLmVtYWlsIHx8IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzd29yZCxcbiAgICAgICAgLi4uKHBhcmFtcy5pc19lbmNyeXB0ID8geyBpc0VuY3J5cHQ6IHRydWUsIHZlcnNpb246ICd2MicgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRoaWR0b2tlblxuICAgKiDnrKzkuInmlrnlubPlj7DnmbvlvZXjgILlpoLmnpznlKjmiLfkuI3lrZjlnKjvvIzkvJrmoLnmja7kupHlvIDlj5HlubPlj7At55m75b2V5pa55byP5Lit5a+55bqU6Lqr5Lu95rqQ55qE55m75b2V5qih5byP6YWN572u77yM5Yik5pat5piv5ZCm6Ieq5Yqo5rOo5YaMXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoSWRUb2tlbihwYXJhbXM6IFNpZ25JbldpdGhJZFRva2VuUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yadG9rZW7lv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHRva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnVG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhQcm92aWRlcih7XG4gICAgICAgIHByb3ZpZGVyX3Rva2VuOiBwYXJhbXMudG9rZW4sXG4gICAgICB9KVxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aG90cFxuICAgKiBMb2cgaW4gYSB1c2VyIHVzaW5nIGEgb25lLXRpbWUgcGFzc3dvcmQgKE9UUCkuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5XaXRoT3RwUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aE90cChwYXJhbXM6IFNpZ25JbldpdGhPdHBSZXEpOiBQcm9taXNlPFNpZ25JbldpdGhPdHBSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbihwYXJhbXMuZW1haWwgPyB7IGVtYWlsOiBwYXJhbXMuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfSwpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICAgIHNlc3Npb246IG51bGwsXG4gICAgICAgICAgLy8g56ys5LqM5q2l77ya562J5b6F55So5oi36L6T5YWl6aqM6K+B56CB77yI6YCa6L+HIFByb21pc2Ug5YyF6KOF55So5oi36L6T5YWl5LqL5Lu277yJXG4gICAgICAgICAgdmVyaWZ5T3RwOiBhc3luYyAoeyB0b2tlbiwgbWVzc2FnZUlkID0gdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQgfSk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgICAgICAgICAgcGhvbmU6IHBhcmFtcy5waG9uZSxcbiAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjOesrOS4ieaWueW5s+WPsOaOiOadg+eZu+W9leWbnuiwg1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5T0F1dGgocGFyYW1zPzogVmVyaWZ5T0F1dGhSZXEpOiBQcm9taXNlPFNpZ25JblJlcyB8IExpbmtJZGVudGl0eVJlcz4ge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWbnuiwg+iHsyBwcm92aWRlcl9yZWRpcmVjdF91cmkg5Zyw5Z2A77yIdXJsIHF1ZXJ55Lit5pC65bimIOaOiOadg2NvZGXvvIxzdGF0ZeetieWPguaVsO+8ie+8jOatpOaXtuajgOafpSBzdGF0ZSDmmK/lkKbnrKblkIjpooTmnJ/vvIjlpoIg6Ieq5bex6K6+572u55qEIHd4X29wZW4pXG4gICAgICBjb25zdCBjb2RlID0gcGFyYW1zPy5jb2RlIHx8IHV0aWxzLmdldFF1ZXJ5KCdjb2RlJylcbiAgICAgIGNvbnN0IHN0YXRlID0gcGFyYW1zPy5zdGF0ZSB8fCB1dGlscy5nZXRRdWVyeSgnc3RhdGUnKVxuXG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpjb2Rl5ZKMc3RhdGXlv4XloatcbiAgICAgIGlmICghY29kZSkge1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnQ29kZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdTdGF0ZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZURhdGEgPSBnZXRCcm93c2VyU2Vzc2lvbihzdGF0ZSlcbiAgICAgIGRhdGEudHlwZSA9IGNhY2hlRGF0YT8udHlwZVxuXG4gICAgICBjb25zdCBwcm92aWRlciA9IHBhcmFtcz8ucHJvdmlkZXIgfHwgY2FjaGVEYXRhPy5wcm92aWRlciB8fCB1dGlscy5nZXRRdWVyeSgncHJvdmlkZXInKVxuXG4gICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9KSB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXRl56ym5ZCI6aKE5pyf77yM5YiZ6I635Y+W6K+l5LiJ5pa55bmz5Y+wdG9rZW5cbiAgICAgIGNvbnN0IHsgcHJvdmlkZXJfdG9rZW46IHRva2VuIH0gPSBhd2FpdCB0aGlzLmdyYW50UHJvdmlkZXJUb2tlbih7XG4gICAgICAgIHByb3ZpZGVyX2lkOiBwcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpOiBsb2NhdGlvbi5vcmlnaW4gKyBsb2NhdGlvbi5wYXRobmFtZSwgLy8g5oyH5a6a5LiJ5pa55bmz5Y+w6Lez5Zue55qEIHVybCDlnLDlnYBcbiAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSwgLy8g56ys5LiJ5pa55bmz5Y+w6Lez6L2s5Zue6aG16Z2i5pe277yMdXJsIHBhcmFtIOS4reaQuuW4pueahCBjb2RlIOWPguaVsFxuICAgICAgfSlcblxuICAgICAgbGV0IHJlczogU2lnbkluUmVzIHwgTGlua0lkZW50aXR5UmVzXG5cbiAgICAgIGlmIChjYWNoZURhdGEudHlwZSA9PT0gT0FVVEhfVFlQRS5CSU5EX0lERU5USVRZKSB7XG4gICAgICAgIHJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnRvQmluZElkZW50aXR5KHsgcHJvdmlkZXJfdG9rZW46IHRva2VuLCBwcm92aWRlciwgZmlyZUV2ZW50OiB0cnVlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDpgJrov4cgcHJvdmlkZXJfdG9rZW4g5LuF55m75b2V5oiW55m75b2V5bm25rOo5YaM77yI5LiO5LqR5byA5Y+R5bmz5Y+wLeeZu+W9leaWueW8jy3ouqvku73mupDnmbvlvZXmqKHlvI/phY3nva7mnInlhbPvvIlcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5zaWduSW5XaXRoSWRUb2tlbih7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5kYXRhID0geyAuLi5kYXRhLCAuLi5yZXMuZGF0YSB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2FsU2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbj8uc2VhcmNoKVxuICAgICAgbG9jYWxTZWFyY2guZGVsZXRlKCdjb2RlJylcbiAgICAgIGxvY2FsU2VhcmNoLmRlbGV0ZSgnc3RhdGUnKVxuICAgICAgYWRkVXJsU2VhcmNoKFxuICAgICAgICBjYWNoZURhdGE/LnNlYXJjaCA9PT0gdW5kZWZpbmVkID8gYD8ke2xvY2FsU2VhcmNoLnRvU3RyaW5nKCl9YCA6IGNhY2hlRGF0YT8uc2VhcmNoLFxuICAgICAgICBjYWNoZURhdGE/Lmhhc2ggfHwgbG9jYXRpb24uaGFzaCxcbiAgICAgIClcbiAgICAgIHJlbW92ZUJyb3dzZXJTZXNzaW9uKHN0YXRlKVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRob2F1dGhcbiAgICog55Sf5oiQ56ys5LiJ5pa55bmz5Y+w5o6I5p2DIFVyaSDvvIjlpoLlvq7kv6Hkuoznu7TnoIHmiavnoIHmjojmnYPnvZHpobXvvIlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25Jbk9BdXRoUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aE9BdXRoKHBhcmFtczogU2lnbkluV2l0aE9BdXRoUmVxKTogUHJvbWlzZTxTaWduSW5PQXV0aFJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGhyZWYgPSBwYXJhbXMub3B0aW9ucz8ucmVkaXJlY3RUbyB8fCBsb2NhdGlvbi5ocmVmXG5cbiAgICAgIGNvbnN0IHVybE9iamVjdCA9IG5ldyBVUkwoaHJlZilcblxuICAgICAgY29uc3QgcHJvdmlkZXJfcmVkaXJlY3RfdXJpID0gdXJsT2JqZWN0Lm9yaWdpbiArIHVybE9iamVjdC5wYXRobmFtZVxuXG4gICAgICBjb25zdCBzdGF0ZSA9IHBhcmFtcy5vcHRpb25zPy5zdGF0ZSB8fCBgcHJkLSR7cGFyYW1zLnByb3ZpZGVyfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpXG4gICAgICAgIC5zbGljZSgyKX1gXG5cbiAgICAgIGNvbnN0IHsgdXJpIH0gPSBhd2FpdCB0aGlzLmdlblByb3ZpZGVyUmVkaXJlY3RVcmkoe1xuICAgICAgICBwcm92aWRlcl9pZDogcGFyYW1zLnByb3ZpZGVyLFxuICAgICAgICBwcm92aWRlcl9yZWRpcmVjdF91cmksXG4gICAgICAgIHN0YXRlLFxuICAgICAgfSlcblxuICAgICAgLy8g5a+5IFVSTCDov5vooYzop6PnoIFcbiAgICAgIGNvbnN0IGRlY29kZWRVcmkgPSBkZWNvZGVVUklDb21wb25lbnQodXJpKVxuXG4gICAgICAvLyDlkIjlubbpop3lpJbnmoTmn6Xor6Llj4LmlbBcbiAgICAgIGxldCBmaW5hbFVyaSA9IGRlY29kZWRVcmlcblxuICAgICAgaWYgKHBhcmFtcy5vcHRpb25zPy5xdWVyeVBhcmFtcykge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRlY29kZWRVcmkpXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcy5vcHRpb25zLnF1ZXJ5UGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBmaW5hbFVyaSA9IHVybC50b1N0cmluZygpXG4gICAgICB9XG5cbiAgICAgIHNhdmVUb0Jyb3dzZXJTZXNzaW9uKHN0YXRlLCB7XG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIsXG4gICAgICAgIHNlYXJjaDogdXJsT2JqZWN0LnNlYXJjaCxcbiAgICAgICAgaGFzaDogdXJsT2JqZWN0Lmhhc2gsXG4gICAgICAgIHR5cGU6IHBhcmFtcy5vcHRpb25zPy50eXBlIHx8IE9BVVRIX1RZUEUuU0lHTl9JTixcbiAgICAgIH0pXG5cbiAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiAhcGFyYW1zLm9wdGlvbnM/LnNraXBCcm93c2VyUmVkaXJlY3QpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihmaW5hbFVyaSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1cmw6IGZpbmFsVXJpLCBwcm92aWRlcjogcGFyYW1zLnByb3ZpZGVyIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWdldGNsYWltc1xuICBhc3luYyBnZXRDbGFpbXMoKTogUHJvbWlzZTxHZXRDbGFpbXNSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhY2Nlc3NUb2tlbiB9ID0gYXdhaXQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpXG4gICAgICBjb25zdCBwYXJzZWRUb2tlbiA9IHdlQXBwSnd0RGVjb2RlQWxsKGFjY2Vzc1Rva2VuKVxuICAgICAgcmV0dXJuIHsgZGF0YTogcGFyc2VkVG9rZW4sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZXNldHBhc3N3b3JkZm9yZW1haWxcbiAgICog6YCa6L+HIGVtYWlsIOaIluaJi+acuuWPt+mHjee9ruWvhueggVxuICAgKiBAcGFyYW0gZW1haWxPclBob25lIOmCrueuseaIluaJi+acuuWPt1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcz5cbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JFbWFpbChcbiAgICBlbWFpbE9yUGhvbmU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyByZWRpcmVjdFRvPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZEZvckVtYWlsUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWlsT3JQaG9uZeW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgeyBlbWFpbE9yUGhvbmUgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVtYWlsT3JQaG9uZTogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ0VtYWlsIG9yIHBob25lIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHJlZGlyZWN0VG8gfSA9IG9wdGlvbnMgfHwge31cblxuICAgICAgLy8g5Yik5pat5piv6YKu566x6L+Y5piv5omL5py65Y+3XG4gICAgICBjb25zdCBpc0VtYWlsID0gZW1haWxPclBob25lLmluY2x1ZGVzKCdAJylcbiAgICAgIGxldCB2ZXJpZmljYXRpb25QYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZyB9XG5cbiAgICAgIGlmIChpc0VtYWlsKSB7XG4gICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgZW1haWw6IGVtYWlsT3JQaG9uZSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkUGhvbmUgPSB0aGlzLmZvcm1hdFBob25lKGVtYWlsT3JQaG9uZSlcbiAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBwaG9uZV9udW1iZXI6IGZvcm1hdHRlZFBob25lIH1cbiAgICAgIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25QYXJhbXMpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB1cGRhdGVVc2VyOiBhc3luYyAoYXR0cmlidXRlczogVXBkYXRlVXNlckF0dHJpYnV0ZXMpOiBQcm9taXNlPFNpZ25JblJlcz4gPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnTm9uY2UgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g56ys5LiJ5q2l77ya5b6F55So5oi36L6T5YWl5a6M6aqM6K+B56CB5LmL5ZCO77yM6aqM6K+B6aqM6K+B56CBXG4gICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IGF0dHJpYnV0ZXMubm9uY2UsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmVfbnVtYmVyOiAhaXNFbWFpbCA/IGVtYWlsT3JQaG9uZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5QQVNTV09SRF9SRUNPVkVSWSxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNpZ25JbldpdGhQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmU6ICFpc0VtYWlsID8gZW1haWxPclBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBhdHRyaWJ1dGVzLnBhc3N3b3JkLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGlmIChyZWRpcmVjdFRvICYmIGlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZWRpcmVjdFRvKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4fml6flr4bnoIHph43nva7lr4bnoIFcbiAgICogQHBhcmFtIG5ld19wYXNzd29yZFxuICAgKiBAcGFyYW0gb2xkX3Bhc3N3b3JkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyByZXNldFBhc3N3b3JkRm9yT2xkKHBhcmFtczogUmVzZXRQYXNzd29yZEZvck9sZFJlcSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS51cGRhdGVQYXNzd29yZEJ5T2xkKHtcbiAgICAgICAgb2xkX3Bhc3N3b3JkOiBwYXJhbXMub2xkX3Bhc3N3b3JkLFxuICAgICAgICBuZXdfcGFzc3dvcmQ6IHBhcmFtcy5uZXdfcGFzc3dvcmQsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC12ZXJpZnlvdHBcbiAgICogTG9nIGluIGEgdXNlciBnaXZlbiBhIFVzZXIgc3VwcGxpZWQgT1RQIGFuZCB2ZXJpZmljYXRpb25JZCByZWNlaXZlZCB0aHJvdWdoIG1vYmlsZSBvciBlbWFpbC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHZlcmlmeU90cChwYXJhbXM6IFZlcmlmeU90cFJlcSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdHlwZSB9ID0gcGFyYW1zXG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJp0b2tlbuWSjHZlcmlmaWNhdGlvbkluZm/lv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHRva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnVG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgIG1lc3NhZ2VJZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ21lc3NhZ2VJZCBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChbJ3Bob25lX2NoYW5nZScsICdlbWFpbF9jaGFuZ2UnXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeSh7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiBwYXJhbXMubWVzc2FnZUlkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBwYXJhbXMudG9rZW4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhVc2VybmFtZSh7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uSW5mbzogeyB2ZXJpZmljYXRpb25faWQ6IHBhcmFtcy5tZXNzYWdlSWQsIGlzX3VzZXI6IHRydWUgfSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25Db2RlOiBwYXJhbXMudG9rZW4sXG4gICAgICAgICAgdXNlcm5hbWU6IHBhcmFtcy5lbWFpbCB8fCB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfHwgJycsXG4gICAgICAgICAgbG9naW5UeXBlOiBwYXJhbXMuZW1haWwgPyAnZW1haWwnIDogJ3Bob25lJyxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0U2Vzc2lvblxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uLCByZWZyZXNoaW5nIGl0IGlmIG5lY2Vzc2FyeS5cbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBnZXRTZXNzaW9uKCk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQuZ2V0Q3JlZGVudGlhbHMoKVxuXG4gICAgICBpZiAoIWNyZWRlbnRpYWxzIHx8IGNyZWRlbnRpYWxzLnNjb3BlID09PSAnYWNjZXNzS2V5Jykge1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb246IG51bGwgfSwgZXJyb3I6IG51bGwgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgdXNlciB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0VXNlcigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbjogeyAuLi5jcmVkZW50aWFscywgdXNlciB9LCB1c2VyIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZWZyZXNoc2Vzc2lvblxuICAgKiDml6Dorrrov4fmnJ/nirbmgIHlpoLkvZXvvIzpg73ov5Tlm57kuIDkuKrmlrDnmoTkvJror51cbiAgICogQHBhcmFtIHJlZnJlc2hfdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyByZWZyZXNoU2Vzc2lvbihyZWZyZXNoX3Rva2VuPzogc3RyaW5nKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW4gPSByZWZyZXNoX3Rva2VuIHx8IGNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW5cbiAgICAgIGNvbnN0IG5ld1Rva2VucyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQucmVmcmVzaFRva2VuKGNyZWRlbnRpYWxzKVxuICAgICAgY29uc3QgeyBkYXRhOiB7IHVzZXIgfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXIsIHNlc3Npb246IHsgLi4ubmV3VG9rZW5zLCB1c2VyIH0gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWdldHVzZXJcbiAgICog5aaC5p6c5a2Y5Zyo546w5pyJ5Lya6K+d77yM5YiZ6I635Y+W5b2T5YmN55So5oi36K+m57uG5L+h5oGvXG4gICAqIEByZXR1cm5zIFByb21pc2U8R2V0VXNlclJlcz5cbiAgICovXG4gIGFzeW5jIGdldFVzZXIoKTogUHJvbWlzZTxHZXRVc2VyUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNvbnZlcnRUb1VzZXIoYXdhaXQgdGhpcy5nZXRVc2VySW5mbygpKVxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWIt+aWsOeUqOaIt+S/oeaBr1xuICAgKiBAcmV0dXJucyBQcm9taXNlPENvbW1vblJlcz5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2hVc2VyKCk6IFByb21pc2U8Q29tbW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY3VycmVudFVzZXIucmVmcmVzaCgpXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC11cGRhdGV1c2VyXG4gICAqIOabtOaWsOeUqOaIt+S/oeaBr1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8R2V0VXNlclJlcyB8IFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzPlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVXNlcihwYXJhbXM6IFVwZGF0ZVVzZXJSZXEpOiBQcm9taXNlPEdldFVzZXJSZXMgfCBVcGRhdGVVc2VyV2l0aFZlcmlmaWNhdGlvblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJroh7PlsJHmnInkuIDkuKrmm7TmlrDlrZfmrrXooqvmj5DkvptcbiAgICAgIGNvbnN0IGhhc1ZhbHVlID0gT2JqZWN0LmtleXMocGFyYW1zKS5zb21lKGtleSA9PiBwYXJhbXNba2V5XSAhPT0gdW5kZWZpbmVkICYmIHBhcmFtc1trZXldICE9PSBudWxsICYmIHBhcmFtc1trZXldICE9PSAnJywpXG4gICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnQXQgbGVhc3Qgb25lIGZpZWxkIG11c3QgYmUgcHJvdmlkZWQgZm9yIHVwZGF0ZScgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBlbWFpbCwgcGhvbmUsIC4uLnJlc3RQYXJhbXMgfSA9IHBhcmFtc1xuXG4gICAgICAvLyDmo4Dmn6XmmK/lkKbpnIDopoHmm7TmlrAgZW1haWwg5oiWIHBob25lXG4gICAgICBjb25zdCBuZWVkc0VtYWlsVmVyaWZpY2F0aW9uID0gZW1haWwgIT09IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbmVlZHNQaG9uZVZlcmlmaWNhdGlvbiA9IHBob25lICE9PSB1bmRlZmluZWRcblxuICAgICAgbGV0IGV4dHJhUmVzID0ge31cblxuICAgICAgaWYgKG5lZWRzRW1haWxWZXJpZmljYXRpb24gfHwgbmVlZHNQaG9uZVZlcmlmaWNhdGlvbikge1xuICAgICAgICAvLyDpnIDopoHlj5HpgIHpqozor4HnoIFcbiAgICAgICAgbGV0IHZlcmlmaWNhdGlvblBhcmFtczogeyBlbWFpbD86IHN0cmluZzsgcGhvbmVfbnVtYmVyPzogc3RyaW5nIH1cbiAgICAgICAgbGV0IHZlcmlmaWNhdGlvblR5cGU6ICdlbWFpbF9jaGFuZ2UnIHwgJ3Bob25lX2NoYW5nZSdcblxuICAgICAgICBpZiAobmVlZHNFbWFpbFZlcmlmaWNhdGlvbikge1xuICAgICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgZW1haWw6IHBhcmFtcy5lbWFpbCB9XG4gICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZSA9ICdlbWFpbF9jaGFuZ2UnXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5q2j6KeE5YyW5omL5py65Y+3XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVkUGhvbmUgPSB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSlcbiAgICAgICAgICB2ZXJpZmljYXRpb25QYXJhbXMgPSB7IHBob25lX251bWJlcjogZm9ybWF0dGVkUGhvbmUgfVxuICAgICAgICAgIHZlcmlmaWNhdGlvblR5cGUgPSAncGhvbmVfY2hhbmdlJ1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5Y+R6YCB6aqM6K+B56CBXG4gICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25QYXJhbXMpXG5cbiAgICAgICAgT2JqZWN0LmtleXMocmVzdFBhcmFtcykubGVuZ3RoID4gMCAmJiAoYXdhaXQgdGhpcy51cGRhdGVVc2VyQmFzaWNJbmZvKHJlc3RQYXJhbXMpKVxuXG4gICAgICAgIGV4dHJhUmVzID0ge1xuICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgdmVyaWZ5T3RwOiBhc3luYyAodmVyaWZ5UGFyYW1zOiB7IGVtYWlsPzogc3RyaW5nOyBwaG9uZT86IHN0cmluZzsgdG9rZW46IHN0cmluZyB9KTogUHJvbWlzZTxHZXRVc2VyUmVzPiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAodmVyaWZ5UGFyYW1zLmVtYWlsICYmIHBhcmFtcy5lbWFpbCA9PT0gdmVyaWZ5UGFyYW1zLmVtYWlsKSB7XG4gICAgICAgICAgICAgICAgLy8g6aqM6K+B56CB6aqM6K+BXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2VtYWlsX2NoYW5nZScsXG4gICAgICAgICAgICAgICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgICAgICAgICAgICAgICAgdG9rZW46IHZlcmlmeVBhcmFtcy50b2tlbixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8oeyBlbWFpbDogcGFyYW1zLmVtYWlsIH0pXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyaWZ5UGFyYW1zLnBob25lICYmIHBhcmFtcy5waG9uZSA9PT0gdmVyaWZ5UGFyYW1zLnBob25lKSB7XG4gICAgICAgICAgICAgICAgLy8g6aqM6K+B56CB6aqM6K+BXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Bob25lX2NoYW5nZScsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogcGFyYW1zLnBob25lLFxuICAgICAgICAgICAgICAgICAgdG9rZW46IHZlcmlmeVBhcmFtcy50b2tlbixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8oeyBwaG9uZTogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0pXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogdmVyaWZpY2F0aW9uVHlwZSxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiBuZWVkc0VtYWlsVmVyaWZpY2F0aW9uID8gcGFyYW1zLmVtYWlsIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgcGhvbmU6ICFuZWVkc0VtYWlsVmVyaWZpY2F0aW9uID8gcGFyYW1zLnBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgdG9rZW46IHZlcmlmeVBhcmFtcy50b2tlbixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAvLyDpqozor4HmiJDlip/lkI7mm7TmlrDnlKjmiLfkv6Hmga9cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlciB9LFxuICAgICAgICAgICAgICB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKClcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVVNFUl9VUERBVEVEIH0pXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4jemcgOimgemqjOivge+8jOebtOaOpeabtOaWsFxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVVNFUl9VUERBVEVEIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciwgLi4uZXh0cmFSZXMgfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWdldHVzZXJpZGVudGl0aWVzXG4gICAqIOiOt+WPluaJgOaciei6q+S7vea6kFxuICAgKiBAcmV0dXJucyBQcm9taXNlPEdldFVzZXJJZGVudGl0aWVzUmVzPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcklkZW50aXRpZXMoKTogUHJvbWlzZTxHZXRVc2VySWRlbnRpdGllc1Jlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRQcm92aWRlcnMoKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IGlkZW50aXRpZXM6IHByb3ZpZGVycz8uZGF0YT8uZmlsdGVyKHYgPT4gISF2LmJpbmQpIGFzIHVua25vd24gYXMgR2V0VXNlcklkZW50aXRpZXNSZXNbJ2RhdGEnXVsnaWRlbnRpdGllcyddIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1saW5raWRlbnRpdHlcbiAgICog57uR5a6a6Lqr5Lu95rqQ5Yiw5b2T5YmN55So5oi3XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxMaW5rSWRlbnRpdHlSZXM+XG4gICAqL1xuICBhc3luYyBsaW5rSWRlbnRpdHkocGFyYW1zOiBMaW5rSWRlbnRpdHlSZXEpOiBQcm9taXNlPExpbmtJZGVudGl0eVJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuc2lnbkluV2l0aE9BdXRoKHtcbiAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHR5cGU6IE9BVVRIX1RZUEUuQklORF9JREVOVElUWSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtdW5saW5raWRlbnRpdHlcbiAgICog6Kej57uR6Lqr5Lu95rqQXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxDb21tb25SZXM+XG4gICAqL1xuICBhc3luYyB1bmxpbmtJZGVudGl0eShwYXJhbXM6IFVubGlua0lkZW50aXR5UmVxKTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yacHJvdmlkZXLlv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHByb3ZpZGVyOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUHJvdmlkZXIgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS51bmJpbmRQcm92aWRlcih7IHByb3ZpZGVyX2lkOiBwYXJhbXMucHJvdmlkZXIgfSlcblxuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZWF1dGhlbnRpY2F0aW9uXG4gICAqIOmHjeaWsOiupOivgVxuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlYXV0aGVudGljYXRlUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVhdXRoZW50aWNhdGUoKTogUHJvbWlzZTxSZWF1dGhlbnRpY2F0ZVJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGE6IHsgdXNlciB9LFxuICAgICAgfSA9IGF3YWl0IHRoaXMuZ2V0VXNlcigpXG5cbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHVzZXIsIFtbJ2VtYWlsJywgJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gdXNlci5lbWFpbCA/IHsgZW1haWw6IHVzZXIuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHVzZXIucGhvbmUpIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih1c2VySW5mbylcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIC8vIOesrOS6jOatpe+8muetieW+heeUqOaIt+i+k+WFpemqjOivgeegge+8iOmAmui/hyBQcm9taXNlIOWMheijheeUqOaIt+i+k+WFpeS6i+S7tu+8iVxuICAgICAgICAgIHVwZGF0ZVVzZXI6IGFzeW5jIChhdHRyaWJ1dGVzOiBVcGRhdGVVc2VyQXR0cmlidXRlcyk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdOb25jZSBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgemqjOivgeeggVxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBhdHRyaWJ1dGVzLm5vbmNlLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvLyDnrKzlm5vmraXvvJrojrflj5Ygc3Vkb190b2tlblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1ZG9SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHtcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogdmVyaWZpY2F0aW9uVG9rZW5SZXMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICBzdWRvX3Rva2VuOiBzdWRvUmVzLnN1ZG9fdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhVc2VybmFtZSh7XG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogYXR0cmlidXRlcy5ub25jZSxcbiAgICAgICAgICAgICAgICAgIC4uLnVzZXJJbmZvLFxuICAgICAgICAgICAgICAgICAgbG9naW5UeXBlOiB1c2VySW5mby5lbWFpbCA/ICdlbWFpbCcgOiAncGhvbmUnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVzZW5kXG4gICAqIOmHjeaWsOWPkemAgemqjOivgeeggVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8UmVzZW5kUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVzZW5kKHBhcmFtczogUmVzZW5kUmVxKTogUHJvbWlzZTxSZXNlbmRSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnR5cGUgPT09ICdzaWdudXAnID8gJ0FOWScgOiAnVVNFUidcbiAgICAgIGNvbnN0IGRhdGE6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZzsgdGFyZ2V0OiAnVVNFUicgfCAnQU5ZJyB9ID0geyB0YXJnZXQgfVxuICAgICAgaWYgKCdlbWFpbCcgaW4gcGFyYW1zKSB7XG4gICAgICAgIGRhdGEuZW1haWwgPSBwYXJhbXMuZW1haWxcbiAgICAgIH1cblxuICAgICAgaWYgKCdwaG9uZScgaW4gcGFyYW1zKSB7XG4gICAgICAgIGRhdGEucGhvbmVfbnVtYmVyID0gdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpXG4gICAgICB9XG5cbiAgICAgIC8vIOmHjeaWsOWPkemAgemqjOivgeeggVxuICAgICAgY29uc3QgeyB2ZXJpZmljYXRpb25faWQ6IHZlcmlmaWNhdGlvbklkIH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRWZXJpZmljYXRpb24oZGF0YSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBtZXNzYWdlSWQ6IHZlcmlmaWNhdGlvbklkIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHt9LFxuICAgICAgICBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zZXRzZXNzaW9uXG4gICAqIOS9v+eUqGFjY2Vzc190b2tlbuWSjHJlZnJlc2hfdG9rZW7mnaXorr7nva7kvJror51cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNldFNlc3Npb24ocGFyYW1zOiBTZXRTZXNzaW9uUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgYWNjZXNzX3Rva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnQWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICByZWZyZXNoX3Rva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUmVmcmVzaCB0b2tlbiBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQucmVmcmVzaFRva2VuKHBhcmFtcywgeyB0aHJvd0Vycm9yOiB0cnVlIH0pXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTkVEX0lOIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWV4Y2hhbmdlY29kZWZvcnNlc3Npb25cbiAgYXN5bmMgZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbigpIHtcbiAgICAvL1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW9k+WJjeeUqOaIt1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBkZWxldGVVc2VyKHBhcmFtczogRGVsZXRlTWVSZXEpOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwYXNzd29yZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgY29uc3QgeyBzdWRvX3Rva2VuIH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHBhcmFtcylcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGVsZXRlTWUoeyBzdWRvX3Rva2VuIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDot7Povazns7vnu5/pu5jorqTnmbvlvZXpobVcbiAgICogQHJldHVybnMge1Byb21pc2U8YXV0aE1vZGVscy5Ub0RlZmF1bHRMb2dpblBhZ2U+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgYXN5bmMgdG9EZWZhdWx0TG9naW5QYWdlKHBhcmFtczogYXV0aE1vZGVscy5Ub0RlZmF1bHRMb2dpblBhZ2UgPSB7fSk6IFByb21pc2U8Q29tbW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1ZlcnNpb24gPSBwYXJhbXMuY29uZmlnX3ZlcnNpb24gfHwgJ2VudidcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmtleXMocGFyYW1zLnF1ZXJ5IHx8IHt9KVxuICAgICAgICAubWFwKGtleSA9PiBgJHtrZXl9PSR7cGFyYW1zLnF1ZXJ5W2tleV19YClcbiAgICAgICAgLmpvaW4oJyYnKVxuXG4gICAgICBpZiAoYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICAgIHd4Lm5hdmlnYXRlVG8oeyB1cmw6IGAvcGFja2FnZXMvJHdkX3N5c3RlbS9wYWdlcy9sb2dpbi9pbmRleCR7cXVlcnkgPyBgPyR7cXVlcnl9YCA6ICcnfWAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gcGFyYW1zLnJlZGlyZWN0X3VyaSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHJlZGlyZWN0VXJpKVxuICAgICAgICBjb25zdCBsb2dpblBhZ2UgPSBgJHt1cmxPYmoub3JpZ2lufS9fX2F1dGgvP2FwcF9pZD0ke3BhcmFtcy5hcHBfaWQgfHwgJyd9JmVudl9pZD0ke3RoaXMuY29uZmlnLmVudn0mY2xpZW50X2lkPSR7XG4gICAgICAgICAgdGhpcy5jb25maWcuY2xpZW50SWQgfHwgdGhpcy5jb25maWcuZW52XG4gICAgICAgIH0mY29uZmlnX3ZlcnNpb249JHtjb25maWdWZXJzaW9ufSZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RVcmkpfSR7cXVlcnkgPyBgJiR7cXVlcnl9YCA6ICcnfWBcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBsb2dpblBhZ2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDoh6rlrprkuYnnmbvlvZVcbiAgICogQHBhcmFtIGdldFRpY2tGbiAoKSA9PiBQcm9taXNlPHN0cmluZz4sIOiOt+WPluiHquWumuS5ieeZu+W9lSB0aWNrZXQg55qE5Ye95pWwXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoQ3VzdG9tVGlja2V0KGdldFRpY2tGbj86IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoZ2V0VGlja0ZuKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbVNpZ25GdW5jKGdldFRpY2tGbilcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j29wZW5JZOmdmem7mOeZu+W9lVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aE9wZW5JZCh7IHVzZVd4Q2xvdWQgPSB0cnVlIH0gPSB7fSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgaWYgKCFhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgIHRocm93IEVycm9yKCd3eCBhcGkgdW5kZWZpbmVkJylcbiAgICB9XG4gICAgY29uc3Qgd3hJbmZvID0gd3guZ2V0QWNjb3VudEluZm9TeW5jKCkubWluaVByb2dyYW1cblxuICAgIGNvbnN0IG1haW5GdW5jID0gYXN5bmMgKGNvZGUpID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSxcbiAgICAgICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgICAgICBwcm92aWRlcl9jb2RlX3R5cGU6ICdvcGVuX2lkJyxcbiAgICAgICAgICAgICAgYXBwaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlV3hDbG91ZCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICgocmVzdWx0IGFzIGFueSk/LmVycm9yX2NvZGUgfHwgIXJlc3VsdC5wcm92aWRlcl90b2tlbikge1xuICAgICAgICAgIHRocm93IHJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoUHJvdmlkZXIoXG4gICAgICAgICAgeyBwcm92aWRlcl90b2tlbjogcmVzdWx0LnByb3ZpZGVyX3Rva2VuIH0sXG4gICAgICAgICAgdXNlV3hDbG91ZCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICgoY3JlZGVudGlhbHMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgIHRocm93IGNyZWRlbnRpYWxzXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzIGFzIENyZWRlbnRpYWxzKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgICBzdWNjZXNzOiBhc3luYyAocmVzOiB7IGNvZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBtYWluRnVuYyhyZXMuY29kZSlcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihyZXM/LmVyck1zZylcbiAgICAgICAgICAgIDsoZXJyb3IgYXMgYW55KS5jb2RlID0gcmVzPy5lcnJub1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+aJi+acuuWPt+aOiOadg+eZu+W9le+8jOebruWJjeWPquaUr+aMgeWFqOaJmOeuoeaJi+acuuWPt+aOiOadg+eZu+W9lVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aFBob25lQXV0aCh7IHBob25lQ29kZSA9ICcnIH0pOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnd3ggYXBpIHVuZGVmaW5lZCcgfSkgfVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuICAgIGNvbnN0IHByb3ZpZGVySW5mbyA9IHtcbiAgICAgIHByb3ZpZGVyX3BhcmFtczogeyBwcm92aWRlcl9jb2RlX3R5cGU6ICdwaG9uZScgfSxcbiAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8uYXBwSWQsXG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB3eC5sb2dpbigpXG4gICAgOyhwcm92aWRlckluZm8gYXMgYW55KS5wcm92aWRlcl9jb2RlID0gY29kZVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBwcm92aWRlclRva2VuID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHByb3ZpZGVySW5mbylcbiAgICAgIGlmIChwcm92aWRlclRva2VuLmVycm9yX2NvZGUpIHtcbiAgICAgICAgdGhyb3cgcHJvdmlkZXJUb2tlblxuICAgICAgfVxuXG4gICAgICBwcm92aWRlclRva2VuID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucGF0Y2hQcm92aWRlclRva2VuKHtcbiAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4ucHJvdmlkZXJfdG9rZW4sXG4gICAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8uYXBwSWQsXG4gICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgIGNvZGU6IHBob25lQ29kZSxcbiAgICAgICAgICBwcm92aWRlcl9jb2RlX3R5cGU6ICdwaG9uZScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgaWYgKHByb3ZpZGVyVG9rZW4uZXJyb3JfY29kZSkge1xuICAgICAgICB0aHJvdyBwcm92aWRlclRva2VuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpZ25JblJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhQcm92aWRlcih7XG4gICAgICAgIHByb3ZpZGVyX3Rva2VuOiBwcm92aWRlclRva2VuLnByb3ZpZGVyX3Rva2VuLFxuICAgICAgfSlcblxuICAgICAgaWYgKChzaWduSW5SZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICB0aHJvdyBzaWduSW5SZXNcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG5cbiAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICByZXR1cm4geyAuLi4obG9naW5TdGF0ZSBhcyBhbnkpLCBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFBob25lKHBob25lOiBzdHJpbmcpIHtcbiAgICBpZiAoIS9cXHMrLy50ZXN0KHBob25lKSAmJiAvXlxcK1xcZHsxLDN9XFxkKy8udGVzdChwaG9uZSkpIHtcbiAgICAgIHJldHVybiBwaG9uZS5yZXBsYWNlKC9eKFxcK1xcZHsxLDJ9KShcXGQrKSQvLCAnJDEgJDInKVxuICAgIH1cbiAgICByZXR1cm4gL15cXCtcXGR7MSwzfVxccysvLnRlc3QocGhvbmUpID8gcGhvbmUgOiBgKzg2ICR7cGhvbmV9YFxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pOiBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrIHtcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChjYWxsYmFja3MpID0+IHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBzZXNzaW9uLCBpbmZvKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGF1dGggc3RhdGUgY2hhbmdlIGNhbGxiYWNrOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuXG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5vbihFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHBhcmFtcz8uZGF0YT8uZXZlbnRcbiAgICAgIGNvbnN0IGluZm8gPSBwYXJhbXM/LmRhdGE/LmluZm9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogeyBzZXNzaW9uIH0sXG4gICAgICB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVXNlcih1c2VySW5mbzogYXV0aE1vZGVscy5Vc2VySW5mbyAmIFBhcnRpYWw8VXNlcj4pIHtcbiAgICBpZiAoIXVzZXJJbmZvKSByZXR1cm4gbnVsbFxuXG4gICAgLy8g5LyY5YWI5L2/55SoIHVzZXJJbmZvIOS4reeahOaVsOaNru+8iFYzIEFQSe+8iVxuICAgIGNvbnN0IGVtYWlsID0gdXNlckluZm8/LmVtYWlsIHx8ICcnXG4gICAgY29uc3QgcGhvbmUgPSB1c2VySW5mbz8ucGhvbmVfbnVtYmVyIHx8ICcnXG4gICAgY29uc3QgdXNlcklkID0gdXNlckluZm8/LnN1YiB8fCB1c2VySW5mbz8udWlkIHx8ICcnXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgIGF1ZDogJ2F1dGhlbnRpY2F0ZWQnLFxuICAgICAgcm9sZTogdXNlckluZm8uZ3JvdXBzLm1hcChncm91cCA9PiAodHlwZW9mIGdyb3VwID09PSAnc3RyaW5nJyA/IGdyb3VwIDogZ3JvdXAuaWQpKSxcbiAgICAgIGVtYWlsOiBlbWFpbCB8fCAnJyxcbiAgICAgIGVtYWlsX2NvbmZpcm1lZF9hdDogdXNlckluZm8/LmVtYWlsX3ZlcmlmaWVkID8gdXNlckluZm8uY3JlYXRlZF9hdCA6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICBwaG9uZSxcbiAgICAgIHBob25lX2NvbmZpcm1lZF9hdDogcGhvbmUgPyB1c2VySW5mby5jcmVhdGVkX2F0IDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlybWVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgbGFzdF9zaWduX2luX2F0OiAodXNlckluZm8gYXMgYW55KS5sYXN0X3NpZ25faW5fYXQsXG4gICAgICBhcHBfbWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6IHVzZXJJbmZvLmxvZ2luVHlwZT8udG9Mb3dlckNhc2UoKSB8fCAnY2xvdWRiYXNlJyxcbiAgICAgICAgcHJvdmlkZXJzOiBbdXNlckluZm8ubG9naW5UeXBlPy50b0xvd2VyQ2FzZSgpIHx8ICdjbG91ZGJhc2UnXSxcbiAgICAgIH0sXG4gICAgICB1c2VyX21ldGFkYXRhOiB7XG4gICAgICAgIC8vIFYzIEFQSSDnlKjmiLfkv6Hmga9cbiAgICAgICAgbmFtZTogdXNlckluZm8/Lm5hbWUsXG4gICAgICAgIHBpY3R1cmU6IHVzZXJJbmZvPy5waWN0dXJlLFxuICAgICAgICB1c2VybmFtZTogdXNlckluZm8/LnVzZXJuYW1lLCAvLyDnlKjmiLflkI3np7DvvIzplb/luqYgNS0yNCDkvY3vvIzmlK/mjIHlrZfnrKbkuK3oi7HmlofjgIHmlbDlrZfjgIHnibnmrorlrZfnrKbvvIjku4XmlK/mjIFfLe+8ie+8jOS4jeaUr+aMgeS4reaWh1xuICAgICAgICBnZW5kZXI6IHVzZXJJbmZvPy5nZW5kZXIsXG4gICAgICAgIGxvY2FsZTogdXNlckluZm8/LmxvY2FsZSxcbiAgICAgICAgLy8gVjIgQVBJIOWFvOWuue+8iOS9v+eUqCBhbnkg6YG/5YWN57G75Z6L6ZSZ6K+v77yJXG4gICAgICAgIHVpZDogdXNlckluZm8udWlkLFxuICAgICAgICBuaWNrTmFtZTogdXNlckluZm8ubmlja05hbWUsXG4gICAgICAgIGF2YXRhclVybDogdXNlckluZm8uYXZhdGFyVXJsIHx8IHVzZXJJbmZvLnBpY3R1cmUsXG4gICAgICAgIGxvY2F0aW9uOiB1c2VySW5mby5sb2NhdGlvbixcbiAgICAgICAgaGFzUGFzc3dvcmQ6IHVzZXJJbmZvLmhhc1Bhc3N3b3JkLFxuICAgICAgfSxcbiAgICAgIGlkZW50aXRpZXM6XG4gICAgICAgIHVzZXJJbmZvPy5wcm92aWRlcnM/Lm1hcChwID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgaWRlbnRpdHlfaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgdXNlcl9pZDogdXNlcklkLFxuICAgICAgICAgIGlkZW50aXR5X2RhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2lkOiBwLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXJfdXNlcl9pZDogcC5wcm92aWRlcl91c2VyX2lkLFxuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvdmlkZXI6IHAuaWQgfHwgJ2Nsb3VkYmFzZScsXG4gICAgICAgICAgY3JlYXRlZF9hdDogdXNlckluZm8uY3JlYXRlZF9hdCxcbiAgICAgICAgICB1cGRhdGVkX2F0OiB1c2VySW5mby51cGRhdGVkX2F0LFxuICAgICAgICAgIGxhc3Rfc2lnbl9pbl9hdDogKHVzZXJJbmZvIGFzIGFueSkubGFzdF9zaWduX2luX2F0LFxuICAgICAgICB9KSkgfHwgW10sXG4gICAgICBjcmVhdGVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgdXBkYXRlZF9hdDogdXNlckluZm8udXBkYXRlZF9hdCxcbiAgICAgIGlzX2Fub255bW91czogdXNlckluZm8ubmFtZSA9PT0gJ2Fub255bW91cycsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPguaVsOagoemqjOi+heWKqeaWueazlVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IGFueSwgcnVsZXM6IHsgW2tleTogc3RyaW5nXTogeyByZXF1aXJlZD86IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9IH0pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJ1bGVdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bGVzKSkge1xuICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgKHBhcmFtcz8uW2tleV0gPT09IHVuZGVmaW5lZCB8fCBwYXJhbXM/LltrZXldID09PSBudWxsIHx8IHBhcmFtcz8uW2tleV0gPT09ICcnKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogcnVsZS5tZXNzYWdlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjOW/heWhq+WPguaVsOe7hO+8iOiHs+WwkeacieS4gOS4quWPguaVsOW/hemhu+acieWAvO+8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zOiBhbnksIGZpZWxkR3JvdXBzOiBzdHJpbmdbXVtdLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IGZpZWxkR3JvdXBzLnNvbWUoZ3JvdXAgPT4gZ3JvdXAuc29tZShmaWVsZCA9PiBwYXJhbXM/LltmaWVsZF0gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXM/LltmaWVsZF0gIT09IG51bGwgJiYgcGFyYW1zPy5bZmllbGRdICE9PSAnJyksKVxuXG4gICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2UgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx7IGVycm9yOiBFcnJvciB8IG51bGwgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgICAgaWYgKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLklOSVRJQUxfU0VTU0lPTiB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzIHdoZW4gY2hlY2tpbmcgZm9yIGV4aXN0aW5nIGNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZXJyb3I6IG51bGwgfVxuICB9XG59XG5cbnR5cGUgVEluaXRBdXRoT3B0aW9ucyA9IFBpY2s8SUNsb3VkYmFzZUF1dGhDb25maWcsICdyZWdpb24nIHwgJ3BlcnNpc3RlbmNlJyB8ICdpMThuJyB8ICdhY2Nlc3NLZXknIHwgJ3VzZVd4Q2xvdWQnPiAmXG5QYXJ0aWFsPEF1dGhPcHRpb25zPiAmIHtcbiAgZGV0ZWN0U2Vzc2lvbkluVXJsPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBdXRoSW5zdGFuY2UoXG4gIGNvbmZpZzogVEluaXRBdXRoT3B0aW9ucyAmIHsgc2RrVmVyc2lvbj86IHN0cmluZyB9LFxuICBvcHRpb25zPzoge1xuICAgIGNsaWVudElkOiBJQ2xvdWRiYXNlQ29uZmlnWydjbGllbnRJZCddXG4gICAgZW52OiBJQ2xvdWRiYXNlQ29uZmlnWydlbnYnXVxuICAgIGFwaU9yaWdpbjogc3RyaW5nXG4gICAgY2FjaGU/OiBJQ2xvdWRiYXNlQ2FjaGVcbiAgICBwbGF0Zm9ybT86IElDbG91ZGJhc2VbJ3BsYXRmb3JtJ11cbiAgICBhcHA/OiBJQ2xvdWRiYXNlXG4gICAgZGVidWc/OiBJQ2xvdWRiYXNlQXV0aENvbmZpZ1snZGVidWcnXVxuICAgIGRldGVjdFNlc3Npb25JblVybD86IElDbG91ZGJhc2VBdXRoQ29uZmlnWydkZXRlY3RTZXNzaW9uSW5VcmwnXVxuICB9LFxuKSB7XG4gIGNvbnN0IHsgcmVnaW9uID0gJ2FwLXNoYW5naGFpJywgaTE4biwgYWNjZXNzS2V5LCB1c2VXeENsb3VkIH0gPSBjb25maWdcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRpb25zPy5wbGF0Zm9ybSB8fCAodXNlRGVmYXVsdEFkYXB0ZXIuYmluZChvcHRpb25zKSgpIGFzIElDbG91ZGJhc2VQbGF0Zm9ybUluZm8pXG4gIGNvbnN0IHsgcnVudGltZSwgYWRhcHRlciB9ID0gcGxhdGZvcm1cblxuICBjb25zdCB7IGVudiwgY2xpZW50SWQsIGRlYnVnLCBjYWNoZSwgYXBwOiBjbG91ZGJhc2UgfSA9IG9wdGlvbnMgfHwge31cbiAgbGV0IHsgYXBpT3JpZ2luIH0gPSBvcHRpb25zIHx8IHt9XG4gIGlmICghYXBpT3JpZ2luKSB7XG4gICAgYXBpT3JpZ2luID0gYGh0dHBzOi8vJHtlbnZ9LiR7cmVnaW9ufS50Y2ItYXBpLnRlbmNlbnRjbG91ZGFwaS5jb21gXG4gIH1cblxuICBjb25zdCBjb21tb25PcHRzID0ge1xuICAgIGVudixcbiAgICBjbGllbnRJZCxcbiAgICBpMThuLFxuICAgIGFjY2Vzc0tleSxcbiAgICB1c2VXeENsb3VkLFxuICAgIGV2ZW50QnVzOiBuZXcgQ2xvdWRiYXNlRXZlbnRFbWl0dGVyKCksXG4gIH1cblxuICBjb25zdCBvYXV0aEluc3RhbmNlID0gbmV3IENsb3VkYmFzZU9BdXRoKHVzZUF1dGhBZGFwdGVyKHtcbiAgICAuLi5jb21tb25PcHRzLFxuICAgIGFwaU9yaWdpbixcbiAgICBhcGlQYXRoOiBjb25maWc/LmFwaVBhdGggfHwgQVVUSF9BUElfUFJFRklYLFxuICAgIC8vIEB0b2RvIOS7peS4i+acgOWlvei1sGFkYXB0b3LlpITnkIbvvIznm67liY1vYXV0aOaooeWdl+ayoeaMiWFkYXB0b3LmjqXlj6Porr7orqFcbiAgICBzdG9yYWdlOiBjb25maWc/LnN0b3JhZ2UsXG4gICAgYmFzZVJlcXVlc3Q6IGNvbmZpZz8uYmFzZVJlcXVlc3QsXG4gICAgcmVxdWVzdDogY29uZmlnPy5yZXF1ZXN0LFxuICAgIGFub255bW91c1NpZ25JbkZ1bmM6IGNvbmZpZz8uYW5vbnltb3VzU2lnbkluRnVuYyxcbiAgICBjYXB0Y2hhT3B0aW9uczogY29uZmlnPy5jYXB0Y2hhT3B0aW9ucyxcbiAgICB3eENsb3VkOiBjb25maWc/Lnd4Q2xvdWQsXG4gICAgYWRhcHRlcixcbiAgICBvbkNyZWRlbnRpYWxzRXJyb3I6IG9uQ3JlZGVudGlhbHNFcnJvcihjb21tb25PcHRzLmV2ZW50QnVzKSxcbiAgICBoZWFkZXJzOiB7ICdYLVNESy1WZXJzaW9uJzogYEBjbG91ZGJhc2UvanMtc2RrLyR7Y29uZmlnLnNka1ZlcnNpb259YCwgLi4uKGNvbmZpZy5oZWFkZXJzIHx8IHt9KSB9LFxuICAgIGRldGVjdFNlc3Npb25JblVybDogY29uZmlnLmRldGVjdFNlc3Npb25JblVybCxcbiAgICBkZWJ1ZyxcbiAgfSksKVxuXG4gIGNvbnN0IGF1dGhJbnN0YW5jZSA9IG5ldyBBdXRoKHtcbiAgICAuLi5jb21tb25PcHRzLFxuICAgIHJlZ2lvbixcbiAgICBwZXJzaXN0ZW5jZTogY29uZmlnLnBlcnNpc3RlbmNlLFxuICAgIGRlYnVnLFxuICAgIGNhY2hlOlxuICAgICAgY2FjaGUgfHwgbmV3IENsb3VkYmFzZUNhY2hlKHtcbiAgICAgICAgcGVyc2lzdGVuY2U6IGNvbmZpZy5wZXJzaXN0ZW5jZSxcbiAgICAgICAga2V5czogeyB1c2VySW5mb0tleTogYHVzZXJfaW5mb18ke2Vudn1gIH0sXG4gICAgICAgIHBsYXRmb3JtSW5mbzogcGxhdGZvcm0sXG4gICAgICB9KSxcbiAgICBydW50aW1lOiBydW50aW1lIHx8ICd3ZWInLFxuICAgIF9mcm9tQXBwOiBjbG91ZGJhc2UsXG4gICAgb2F1dGhJbnN0YW5jZSxcbiAgfSlcblxuICAvLyBJbml0aWFsaXplIHNlc3Npb24gd2l0aCB1c2VyIGluZm8gY2FsbGJhY2tcbiAgLy8gVGhpcyBoYW5kbGVzIE9BdXRoIGNhbGxiYWNrIFVSTCBkZXRlY3Rpb24gYW5kIGNyZWF0ZXMgbG9naW4gc3RhdGUgYXRvbWljYWxseVxuICBvYXV0aEluc3RhbmNlLmluaXRpYWxpemVTZXNzaW9uKGFzeW5jIChkYXRhLCBlcnJvcikgPT4ge1xuICAgIGlmICghZGF0YSkgcmV0dXJuXG5cbiAgICBpZiAoZGF0YS50eXBlID09PSBPQVVUSF9UWVBFLlNJR05fSU4pIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb21tb25PcHRzLmV2ZW50QnVzLmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwge1xuICAgICAgICAgIGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdORURfSU4sXG4gICAgICAgICAgaW5mbzogeyAuLi5kYXRhLCBlcnJvciB9LFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChkYXRhLnVzZXIpIHtcbiAgICAgICAgLy8g5L2/55So5bey6I635Y+W55qEIHVzZXIg5L+h5oGv5Yib5bu6IExvZ2luU3RhdGXvvIzlpI3nlKggY3JlYXRlTG9naW5TdGF0ZSDpgLvovpFcbiAgICAgICAgLy8g5L2G6Lez6L+HIHJlZnJlc2goKSDpgb/lhY3lho3mrKHor7fmsYIgQVBJIOWvvOiHtOatu+mUgVxuICAgICAgICBhdXRoSW5zdGFuY2UuY3JlYXRlTG9naW5TdGF0ZSh7fSwgeyB1c2VySW5mbzogZGF0YS51c2VyIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IE9BVVRIX1RZUEUuQklORF9JREVOVElUWSkge1xuICAgICAgY29tbW9uT3B0cy5ldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHtcbiAgICAgICAgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLkJJTkRfSURFTlRJVFksXG4gICAgICAgIGluZm86IHsgLi4uZGF0YSwgZXJyb3IgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB7IGF1dGhJbnN0YW5jZSwgb2F1dGhJbnN0YW5jZSB9XG59XG5cbmNvbnN0IE5BTUVTUEFDRSA9ICdhdXRoJ1xuXG5jb25zdCBjb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IENPTVBPTkVOVF9OQU1FLFxuICBuYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgZW50aXR5KGNvbmZpZz86IFRJbml0QXV0aE9wdGlvbnMpIHtcbiAgICBjb25zdCBhdXRoID0gZnVuY3Rpb24gKGNvbmZpZz86IFRJbml0QXV0aE9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmF1dGhJbnN0YW5jZSAmJiAhY29uZmlnKSB7XG4gICAgICAgIC8vIHByaW50V2FybihFUlJPUlMuSU5WQUxJRF9PUEVSQVRJT04sICdldmVyeSBjbG91ZGJhc2UgaW5zdGFuY2Ugc2hvdWxkIGhhcyBvbmx5IG9uZSBhdXRoIG9iamVjdCcpXG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhJbnN0YW5jZVxuICAgICAgfVxuXG4gICAgICBjb25maWcgPSBjb25maWcgfHwge1xuICAgICAgICByZWdpb246ICcnLFxuICAgICAgICBwZXJzaXN0ZW5jZTogJ2xvY2FsJyxcbiAgICAgICAgYXBpUGF0aDogQVVUSF9BUElfUFJFRklYLFxuICAgICAgfVxuICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLnBsYXRmb3JtXG4gICAgICAvLyDlpoLkuI3mmI7noa7mjIflrppwZXJzaXN0ZW5jZeWImeS8mOWFiOWPluWQhOW5s+WPsGFkYXB0ZXLpppbpgInvvIzlhbbmrKFsb2NhbFN0b3JhZ2VcbiAgICAgIGNvbnN0IG5ld1BlcnNpc3RlbmNlID0gY29uZmlnLnBlcnNpc3RlbmNlIHx8IGFkYXB0ZXIucHJpbWFyeVN0b3JhZ2VcbiAgICAgIGlmIChuZXdQZXJzaXN0ZW5jZSAmJiBuZXdQZXJzaXN0ZW5jZSAhPT0gdGhpcy5jb25maWcucGVyc2lzdGVuY2UpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb25maWcoeyBwZXJzaXN0ZW5jZTogbmV3UGVyc2lzdGVuY2UgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhdXRoSW5zdGFuY2UsIG9hdXRoSW5zdGFuY2UgfSA9IGdlbmVyYXRlQXV0aEluc3RhbmNlKFxuICAgICAgICB7XG4gICAgICAgICAgd3hDbG91ZDogdGhpcy5jb25maWcud3hDbG91ZCxcbiAgICAgICAgICBzdG9yYWdlOiB0aGlzLmNvbmZpZy5zdG9yYWdlLFxuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBwZXJzaXN0ZW5jZTogdGhpcy5jb25maWcucGVyc2lzdGVuY2UsXG4gICAgICAgICAgaTE4bjogdGhpcy5jb25maWcuaTE4bixcbiAgICAgICAgICBhY2Nlc3NLZXk6IHRoaXMuY29uZmlnLmFjY2Vzc0tleSxcbiAgICAgICAgICB1c2VXeENsb3VkOiB0aGlzLmNvbmZpZy51c2VXeENsb3VkLFxuICAgICAgICAgIHNka1ZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICBkZXRlY3RTZXNzaW9uSW5Vcmw6IHRoaXMuY29uZmlnLmF1dGg/LmRldGVjdFNlc3Npb25JblVybCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVudjogdGhpcy5jb25maWcuZW52LFxuICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICBhcGlPcmlnaW46IHRoaXMucmVxdWVzdC5nZXRCYXNlRW5kUG9pbnQodGhpcy5jb25maWcuZW5kUG9pbnRNb2RlIHx8ICdDTE9VRF9BUEknKSxcbiAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgICAgICBhcHA6IHRoaXMsXG4gICAgICAgICAgZGVidWc6IHRoaXMuY29uZmlnLmRlYnVnLFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBvYXV0aEluc3RhbmNlXG5cbiAgICAgIHRoaXMuYXV0aEluc3RhbmNlID0gYXV0aEluc3RhbmNlXG5cbiAgICAgIHJldHVybiB0aGlzLmF1dGhJbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0IGF1dGhQcm90byA9IGF1dGguY2FsbCh0aGlzLCBjb25maWcpXG4gICAgT2JqZWN0LmFzc2lnbihhdXRoLCBhdXRoUHJvdG8pXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGF1dGgsIE9iamVjdC5nZXRQcm90b3R5cGVPZihhdXRoUHJvdG8pKVxuICAgIHRoaXNbTkFNRVNQQUNFXSA9IGF1dGhcbiAgICByZXR1cm4gYXV0aFxuICB9LFxufVxuXG50cnkge1xuICAvLyDlsJ3or5Xoh6rliqjms6jlhozoh7PlhajlsYDlj5jph49jbG91ZGJhc2VcbiAgLy8g5q2k6KGM5Li65Y+q5Zyo5rWP6KeI5Zmo546v5aKD5LiL5pyJ5pWIXG4gIGNsb3VkYmFzZS5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG59IGNhdGNoIChlKSB7fVxuXG5leHBvcnQgeyBVc2VySW5mbywgQXV0aCB9XG4vKipcbiAqIEBhcGkg5omL5Yqo5rOo5YaM6IezY2xvdWRiYXNlIGFwcFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBdXRoKGFwcDogUGljazxJQ2xvdWRiYXNlLCAncmVnaXN0ZXJDb21wb25lbnQnPikge1xuICB0cnkge1xuICAgIGFwcC5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oZSlcbiAgfVxufVxuIl19
|