@microsoft/ocsdk 0.5.15-main.75e2923 → 0.5.15
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/SDK.js +4 -4
- package/dist/SDK.min.js +4 -4
- package/lib/Common/OmnichannelHTTPHeaders.d.ts +1 -0
- package/lib/Common/OmnichannelHTTPHeaders.js +2 -1
- package/lib/Common/OmnichannelHTTPHeaders.js.map +1 -1
- package/lib/Interfaces/IReconnectAvailabilityOptionalParams.d.ts +3 -0
- package/lib/Interfaces/IReconnectAvailabilityOptionalParams.js +2 -0
- package/lib/Interfaces/IReconnectAvailabilityOptionalParams.js.map +1 -0
- package/lib/Interfaces/ISDK.d.ts +2 -1
- package/lib/SDK.d.ts +4 -1
- package/lib/SDK.js +81 -72
- package/lib/SDK.js.map +1 -1
- package/package.json +1 -1
package/lib/SDK.js
CHANGED
|
@@ -106,6 +106,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
106
106
|
headers[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
|
|
107
107
|
}
|
|
108
108
|
});
|
|
109
|
+
(0, _defineProperty2["default"])(this, "setCorrelationIdInHeader", function (correlationId, headers) {
|
|
110
|
+
if (correlationId) {
|
|
111
|
+
headers[_OmnichannelHTTPHeaders["default"].correlationId] = correlationId;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
109
114
|
|
|
110
115
|
// Sets to default configuration if passed configuration is empty or is not an object
|
|
111
116
|
if (!Object.keys(this.configuration).length || (0, _typeof2["default"])(configuration) !== "object") {
|
|
@@ -268,7 +273,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
268
273
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatConfig
|
|
269
274
|
});
|
|
270
275
|
requestHeaders = {};
|
|
271
|
-
|
|
276
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
272
277
|
|
|
273
278
|
if (bypassCache) {
|
|
274
279
|
requestHeaders = _objectSpread(_objectSpread({}, _Constants["default"].bypassCacheHeaders), requestHeaders);
|
|
@@ -376,8 +381,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
376
381
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
377
382
|
}
|
|
378
383
|
|
|
379
|
-
|
|
380
|
-
this.setSessionIdHeader(this.sessionId, requestHeaders); // If should only be applicable on unauth chat & the flag enabled
|
|
384
|
+
this.addDefaultHeaders(requestId, requestHeaders); // If should only be applicable on unauth chat & the flag enabled
|
|
381
385
|
|
|
382
386
|
shouldUseSigQueryParam = !authenticatedUserToken && this.configuration.useUnauthReconnectIdSigQueryParam === true;
|
|
383
387
|
|
|
@@ -457,7 +461,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
457
461
|
};
|
|
458
462
|
}()));
|
|
459
463
|
|
|
460
|
-
case
|
|
464
|
+
case 19:
|
|
461
465
|
case "end":
|
|
462
466
|
return _context4.stop();
|
|
463
467
|
}
|
|
@@ -528,7 +532,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
528
532
|
}
|
|
529
533
|
|
|
530
534
|
requestHeaders = _Constants["default"].defaultHeaders;
|
|
531
|
-
|
|
535
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
532
536
|
endpoint = (0, _endpointsCreators.createGetChatTokenEndpoint)(currentLiveChatVersion || this.liveChatVersion, authenticatedUserToken ? true : false, multiBot);
|
|
533
537
|
|
|
534
538
|
if (authenticatedUserToken) {
|
|
@@ -704,8 +708,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
704
708
|
requestHeaders = _Constants["default"].defaultHeaders;
|
|
705
709
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
706
710
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
707
|
-
this.
|
|
708
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
711
|
+
this.addDefaultHeaders(reconnectableChatsParams === null || reconnectableChatsParams === void 0 ? void 0 : reconnectableChatsParams.requestId, requestHeaders);
|
|
709
712
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
710
713
|
method = "GET";
|
|
711
714
|
options = {
|
|
@@ -778,7 +781,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
778
781
|
};
|
|
779
782
|
}()));
|
|
780
783
|
|
|
781
|
-
case
|
|
784
|
+
case 14:
|
|
782
785
|
case "end":
|
|
783
786
|
return _context8.stop();
|
|
784
787
|
}
|
|
@@ -804,17 +807,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
804
807
|
var _this$configuration$d6,
|
|
805
808
|
_this5 = this;
|
|
806
809
|
|
|
807
|
-
var
|
|
810
|
+
var optionalParams,
|
|
811
|
+
timer,
|
|
812
|
+
requestPath,
|
|
813
|
+
requestHeaders,
|
|
814
|
+
url,
|
|
815
|
+
method,
|
|
816
|
+
options,
|
|
817
|
+
axiosInstance,
|
|
818
|
+
_args10 = arguments;
|
|
808
819
|
return _regenerator["default"].wrap(function _callee10$(_context10) {
|
|
809
820
|
while (1) {
|
|
810
821
|
switch (_context10.prev = _context10.next) {
|
|
811
822
|
case 0:
|
|
823
|
+
optionalParams = _args10.length > 1 && _args10[1] !== undefined ? _args10[1] : {};
|
|
812
824
|
timer = _Timer.Timer.TIMER();
|
|
813
825
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSTARTED, "Get Reconnectable availability Started");
|
|
814
826
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatReconnectAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(reconnectId);
|
|
815
827
|
requestHeaders = _Constants["default"].defaultHeaders;
|
|
816
|
-
this.
|
|
817
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
828
|
+
this.addDefaultHeaders(optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, requestHeaders);
|
|
818
829
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
819
830
|
method = "GET";
|
|
820
831
|
options = {
|
|
@@ -846,14 +857,14 @@ var SDK = /*#__PURE__*/function () {
|
|
|
846
857
|
break;
|
|
847
858
|
}
|
|
848
859
|
|
|
849
|
-
_this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability succeeded",
|
|
860
|
+
_this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability succeeded", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
850
861
|
|
|
851
862
|
resolve(data);
|
|
852
863
|
return _context9.abrupt("return");
|
|
853
864
|
|
|
854
865
|
case 10:
|
|
855
866
|
// No data found so returning null
|
|
856
|
-
_this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability didn't send any valid data",
|
|
867
|
+
_this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability didn't send any valid data", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
857
868
|
|
|
858
869
|
resolve();
|
|
859
870
|
return _context9.abrupt("return");
|
|
@@ -863,7 +874,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
863
874
|
_context9.t0 = _context9["catch"](0);
|
|
864
875
|
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
865
876
|
|
|
866
|
-
_this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYFAILED, "Get Reconnect Availability failed",
|
|
877
|
+
_this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYFAILED, "Get Reconnect Availability failed", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context9.t0, undefined, requestHeaders);
|
|
867
878
|
|
|
868
879
|
if ((0, _isExpectedAxiosError["default"])(_context9.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
869
880
|
reject(new Error(_this5.HTTPTimeOutErrorMessage));
|
|
@@ -949,8 +960,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
949
960
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
950
961
|
}
|
|
951
962
|
|
|
952
|
-
this.
|
|
953
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
963
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
954
964
|
data = initContext || {};
|
|
955
965
|
cachObj = {
|
|
956
966
|
"orgId": this.omnichannelConfiguration.orgId,
|
|
@@ -973,13 +983,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
973
983
|
data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
|
|
974
984
|
|
|
975
985
|
if (!(getContext && !window.document)) {
|
|
976
|
-
_context12.next =
|
|
986
|
+
_context12.next = 17;
|
|
977
987
|
break;
|
|
978
988
|
}
|
|
979
989
|
|
|
980
990
|
return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
981
991
|
|
|
982
|
-
case
|
|
992
|
+
case 17:
|
|
983
993
|
if (getContext) {
|
|
984
994
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
985
995
|
data.device = _DeviceInfo.DeviceInfo.getDeviceType();
|
|
@@ -993,13 +1003,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
993
1003
|
|
|
994
1004
|
|
|
995
1005
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
996
|
-
_context12.next =
|
|
1006
|
+
_context12.next = 21;
|
|
997
1007
|
break;
|
|
998
1008
|
}
|
|
999
1009
|
|
|
1000
1010
|
return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1001
1011
|
|
|
1002
|
-
case
|
|
1012
|
+
case 21:
|
|
1003
1013
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1004
1014
|
method = "POST";
|
|
1005
1015
|
options = {
|
|
@@ -1063,7 +1073,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1063
1073
|
};
|
|
1064
1074
|
}()));
|
|
1065
1075
|
|
|
1066
|
-
case
|
|
1076
|
+
case 25:
|
|
1067
1077
|
case "end":
|
|
1068
1078
|
return _context12.stop();
|
|
1069
1079
|
}
|
|
@@ -1137,8 +1147,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1137
1147
|
Object.assign(requestHeaders, (_Object$assign = {}, (0, _defineProperty2["default"])(_Object$assign, _OmnichannelHTTPHeaders["default"].authenticatedUserToken, authenticatedUserToken), (0, _defineProperty2["default"])(_Object$assign, _OmnichannelHTTPHeaders["default"].authCodeNonce, this.configuration.authCodeNonce), _Object$assign));
|
|
1138
1148
|
}
|
|
1139
1149
|
|
|
1140
|
-
this.
|
|
1141
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
1150
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
1142
1151
|
this.setRequestIdHeader(requestId, requestHeaders); // If should only be applicable on unauth chat & the flag enabled
|
|
1143
1152
|
|
|
1144
1153
|
shouldUseSigQueryParam = !authenticatedUserToken && this.configuration.useUnauthReconnectIdSigQueryParam === true;
|
|
@@ -1158,13 +1167,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1158
1167
|
}
|
|
1159
1168
|
|
|
1160
1169
|
if (!(getContext && !window.document)) {
|
|
1161
|
-
_context14.next =
|
|
1170
|
+
_context14.next = 20;
|
|
1162
1171
|
break;
|
|
1163
1172
|
}
|
|
1164
1173
|
|
|
1165
1174
|
return _context14.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
1166
1175
|
|
|
1167
|
-
case
|
|
1176
|
+
case 20:
|
|
1168
1177
|
if (getContext) {
|
|
1169
1178
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
1170
1179
|
data.device = _DeviceInfo.DeviceInfo.getDeviceType();
|
|
@@ -1179,13 +1188,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1179
1188
|
|
|
1180
1189
|
|
|
1181
1190
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
1182
|
-
_context14.next =
|
|
1191
|
+
_context14.next = 24;
|
|
1183
1192
|
break;
|
|
1184
1193
|
}
|
|
1185
1194
|
|
|
1186
1195
|
return _context14.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1187
1196
|
|
|
1188
|
-
case
|
|
1197
|
+
case 24:
|
|
1189
1198
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1190
1199
|
method = "POST";
|
|
1191
1200
|
options = {
|
|
@@ -1247,7 +1256,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1247
1256
|
};
|
|
1248
1257
|
}()));
|
|
1249
1258
|
|
|
1250
|
-
case
|
|
1259
|
+
case 28:
|
|
1251
1260
|
case "end":
|
|
1252
1261
|
return _context14.stop();
|
|
1253
1262
|
}
|
|
@@ -1317,8 +1326,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1317
1326
|
Object.assign(requestHeaders, (_Object$assign2 = {}, (0, _defineProperty2["default"])(_Object$assign2, _OmnichannelHTTPHeaders["default"].authenticatedUserToken, authenticatedUserToken), (0, _defineProperty2["default"])(_Object$assign2, _OmnichannelHTTPHeaders["default"].authCodeNonce, this.configuration.authCodeNonce), _Object$assign2));
|
|
1318
1327
|
}
|
|
1319
1328
|
|
|
1320
|
-
this.
|
|
1321
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
1329
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
1322
1330
|
this.setRequestIdHeader(requestId, requestHeaders);
|
|
1323
1331
|
|
|
1324
1332
|
if (reconnectId) {
|
|
@@ -1328,13 +1336,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1328
1336
|
data.channelId = this.omnichannelConfiguration.channelId;
|
|
1329
1337
|
|
|
1330
1338
|
if (!(getContext && !window.document)) {
|
|
1331
|
-
_context15.next =
|
|
1339
|
+
_context15.next = 18;
|
|
1332
1340
|
break;
|
|
1333
1341
|
}
|
|
1334
1342
|
|
|
1335
1343
|
return _context15.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
1336
1344
|
|
|
1337
|
-
case
|
|
1345
|
+
case 18:
|
|
1338
1346
|
if (getContext) {
|
|
1339
1347
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
1340
1348
|
data.device = _DeviceInfo.DeviceInfo.getDeviceType();
|
|
@@ -1349,13 +1357,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1349
1357
|
|
|
1350
1358
|
|
|
1351
1359
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
1352
|
-
_context15.next =
|
|
1360
|
+
_context15.next = 22;
|
|
1353
1361
|
break;
|
|
1354
1362
|
}
|
|
1355
1363
|
|
|
1356
1364
|
return _context15.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1357
1365
|
|
|
1358
|
-
case
|
|
1366
|
+
case 22:
|
|
1359
1367
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1360
1368
|
method = "POST";
|
|
1361
1369
|
options = {
|
|
@@ -1365,11 +1373,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1365
1373
|
url: url,
|
|
1366
1374
|
timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.sessionInit
|
|
1367
1375
|
};
|
|
1368
|
-
_context15.prev =
|
|
1369
|
-
_context15.next =
|
|
1376
|
+
_context15.prev = 25;
|
|
1377
|
+
_context15.next = 28;
|
|
1370
1378
|
return axiosInstance(options);
|
|
1371
1379
|
|
|
1372
|
-
case
|
|
1380
|
+
case 28:
|
|
1373
1381
|
response = _context15.sent;
|
|
1374
1382
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1375
1383
|
_data2 = response.data, headers = response.headers;
|
|
@@ -1383,39 +1391,39 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1383
1391
|
|
|
1384
1392
|
|
|
1385
1393
|
if (!(Object.keys(_data2).length === 0)) {
|
|
1386
|
-
_context15.next =
|
|
1394
|
+
_context15.next = 35;
|
|
1387
1395
|
break;
|
|
1388
1396
|
}
|
|
1389
1397
|
|
|
1390
1398
|
throw new Error("Empty data received from getChatToken");
|
|
1391
1399
|
|
|
1392
|
-
case
|
|
1400
|
+
case 35:
|
|
1393
1401
|
_data2.requestId = requestId;
|
|
1394
1402
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.CREATESESSIONSUCCEEDED, "Create coversation call Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1395
1403
|
return _context15.abrupt("return", _data2);
|
|
1396
1404
|
|
|
1397
|
-
case
|
|
1398
|
-
_context15.prev =
|
|
1399
|
-
_context15.t0 = _context15["catch"](
|
|
1405
|
+
case 40:
|
|
1406
|
+
_context15.prev = 40;
|
|
1407
|
+
_context15.t0 = _context15["catch"](25);
|
|
1400
1408
|
_elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
|
|
1401
1409
|
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.CREATESESSIONFAILED, "Create conversation call failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context15.t0, data, requestHeaders);
|
|
1402
1410
|
|
|
1403
1411
|
if (!(0, _isExpectedAxiosError["default"])(_context15.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1404
|
-
_context15.next =
|
|
1412
|
+
_context15.next = 46;
|
|
1405
1413
|
break;
|
|
1406
1414
|
}
|
|
1407
1415
|
|
|
1408
1416
|
throw new Error(this.HTTPTimeOutErrorMessage);
|
|
1409
1417
|
|
|
1410
|
-
case
|
|
1418
|
+
case 46:
|
|
1411
1419
|
throw _context15.t0;
|
|
1412
1420
|
|
|
1413
|
-
case
|
|
1421
|
+
case 47:
|
|
1414
1422
|
case "end":
|
|
1415
1423
|
return _context15.stop();
|
|
1416
1424
|
}
|
|
1417
1425
|
}
|
|
1418
|
-
}, _callee15, this, [[
|
|
1426
|
+
}, _callee15, this, [[25, 40]]);
|
|
1419
1427
|
}));
|
|
1420
1428
|
|
|
1421
1429
|
function createConversation(_x20) {
|
|
@@ -1477,8 +1485,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1477
1485
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1478
1486
|
}
|
|
1479
1487
|
|
|
1480
|
-
this.
|
|
1481
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
1488
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
1482
1489
|
|
|
1483
1490
|
if (isReconnectChat) {
|
|
1484
1491
|
requestPath += "&isReconnectChat=true";
|
|
@@ -1550,7 +1557,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1550
1557
|
};
|
|
1551
1558
|
}()));
|
|
1552
1559
|
|
|
1553
|
-
case
|
|
1560
|
+
case 18:
|
|
1554
1561
|
case "end":
|
|
1555
1562
|
return _context17.stop();
|
|
1556
1563
|
}
|
|
@@ -1599,8 +1606,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1599
1606
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1600
1607
|
}
|
|
1601
1608
|
|
|
1602
|
-
this.
|
|
1603
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
1609
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
1604
1610
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1605
1611
|
method = "GET";
|
|
1606
1612
|
options = {
|
|
@@ -1674,7 +1680,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1674
1680
|
};
|
|
1675
1681
|
}()));
|
|
1676
1682
|
|
|
1677
|
-
case
|
|
1683
|
+
case 13:
|
|
1678
1684
|
case "end":
|
|
1679
1685
|
return _context19.stop();
|
|
1680
1686
|
}
|
|
@@ -1728,6 +1734,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1728
1734
|
});
|
|
1729
1735
|
authenticatedUserToken = submitPostChatResponseOptionalParams.authenticatedUserToken;
|
|
1730
1736
|
requestHeaders = _Constants["default"].defaultHeaders;
|
|
1737
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
1731
1738
|
|
|
1732
1739
|
if (authenticatedUserToken) {
|
|
1733
1740
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
@@ -1796,7 +1803,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1796
1803
|
};
|
|
1797
1804
|
}()));
|
|
1798
1805
|
|
|
1799
|
-
case
|
|
1806
|
+
case 14:
|
|
1800
1807
|
case "end":
|
|
1801
1808
|
return _context21.stop();
|
|
1802
1809
|
}
|
|
@@ -1865,8 +1872,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1865
1872
|
requestHeaders[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
|
|
1866
1873
|
}
|
|
1867
1874
|
|
|
1868
|
-
this.
|
|
1869
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
1875
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
1870
1876
|
|
|
1871
1877
|
if (requestId) {
|
|
1872
1878
|
requestHeaders[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
|
|
@@ -1933,7 +1939,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1933
1939
|
};
|
|
1934
1940
|
}()));
|
|
1935
1941
|
|
|
1936
|
-
case
|
|
1942
|
+
case 15:
|
|
1937
1943
|
case "end":
|
|
1938
1944
|
return _context23.stop();
|
|
1939
1945
|
}
|
|
@@ -2007,8 +2013,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2007
2013
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
2008
2014
|
}
|
|
2009
2015
|
|
|
2010
|
-
this.
|
|
2011
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
2016
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
2012
2017
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
2013
2018
|
method = "GET";
|
|
2014
2019
|
options = {
|
|
@@ -2068,7 +2073,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2068
2073
|
};
|
|
2069
2074
|
}()));
|
|
2070
2075
|
|
|
2071
|
-
case
|
|
2076
|
+
case 17:
|
|
2072
2077
|
case "end":
|
|
2073
2078
|
return _context25.stop();
|
|
2074
2079
|
}
|
|
@@ -2133,8 +2138,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2133
2138
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
2134
2139
|
}
|
|
2135
2140
|
|
|
2136
|
-
this.
|
|
2137
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
2141
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
2138
2142
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
2139
2143
|
method = "POST";
|
|
2140
2144
|
options = {
|
|
@@ -2196,7 +2200,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2196
2200
|
};
|
|
2197
2201
|
}()));
|
|
2198
2202
|
|
|
2199
|
-
case
|
|
2203
|
+
case 17:
|
|
2200
2204
|
case "end":
|
|
2201
2205
|
return _context27.stop();
|
|
2202
2206
|
}
|
|
@@ -2243,8 +2247,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2243
2247
|
requestHeaders = _Constants["default"].defaultHeaders;
|
|
2244
2248
|
requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
|
|
2245
2249
|
requestHeaders[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
|
|
2246
|
-
this.
|
|
2247
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
2250
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
2248
2251
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
2249
2252
|
method = "GET";
|
|
2250
2253
|
options = {
|
|
@@ -2302,7 +2305,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2302
2305
|
};
|
|
2303
2306
|
}()));
|
|
2304
2307
|
|
|
2305
|
-
case
|
|
2308
|
+
case 14:
|
|
2306
2309
|
case "end":
|
|
2307
2310
|
return _context29.stop();
|
|
2308
2311
|
}
|
|
@@ -2364,8 +2367,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2364
2367
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
2365
2368
|
}
|
|
2366
2369
|
|
|
2367
|
-
this.
|
|
2368
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
2370
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
2369
2371
|
requestPath += "?channelId=" + _Constants["default"].defaultChannelId;
|
|
2370
2372
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
2371
2373
|
method = "POST";
|
|
@@ -2428,7 +2430,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2428
2430
|
};
|
|
2429
2431
|
}()));
|
|
2430
2432
|
|
|
2431
|
-
case
|
|
2433
|
+
case 16:
|
|
2432
2434
|
case "end":
|
|
2433
2435
|
return _context31.stop();
|
|
2434
2436
|
}
|
|
@@ -2497,8 +2499,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2497
2499
|
requestHeaders[_Constants["default"].customerDisplayName] = customerDisplayName;
|
|
2498
2500
|
}
|
|
2499
2501
|
|
|
2500
|
-
this.
|
|
2501
|
-
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
2502
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
2502
2503
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
2503
2504
|
method = "POST";
|
|
2504
2505
|
options = {
|
|
@@ -2555,7 +2556,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2555
2556
|
};
|
|
2556
2557
|
}()));
|
|
2557
2558
|
|
|
2558
|
-
case
|
|
2559
|
+
case 17:
|
|
2559
2560
|
case "end":
|
|
2560
2561
|
return _context33.stop();
|
|
2561
2562
|
}
|
|
@@ -2667,6 +2668,14 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2667
2668
|
this.logger.log(logLevel, telemetryEventType, customData, description);
|
|
2668
2669
|
} // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2669
2670
|
|
|
2671
|
+
}, {
|
|
2672
|
+
key: "addDefaultHeaders",
|
|
2673
|
+
value: function addDefaultHeaders(requestId, requestHeaders) {
|
|
2674
|
+
this.setSessionIdHeader(this.sessionId, requestHeaders);
|
|
2675
|
+
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
2676
|
+
this.setCorrelationIdInHeader(requestId, requestHeaders);
|
|
2677
|
+
} // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2678
|
+
|
|
2670
2679
|
}]);
|
|
2671
2680
|
return SDK;
|
|
2672
2681
|
}();
|
|
@@ -2702,4 +2711,4 @@ exports["default"] = SDK;
|
|
|
2702
2711
|
waitTimeBetweenRetriesConfig: _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs,
|
|
2703
2712
|
ocUserAgent: []
|
|
2704
2713
|
});
|
|
2705
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiU0RLRXJyb3IiLCJDbGllbnRIVFRQVGltZW91dEVycm9yTmFtZSIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwicmVxdWVzdElkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwib2NVc2VyQWdlbnQiLCJsaXZlQ2hhdFZlcnNpb24iLCJMaXZlQ2hhdFZlcnNpb24iLCJWMiIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUTENXRkNTREVUQUlMU1NUQVJURUQiLCJyZXF1ZXN0UGF0aCIsIk9tbmljaGFubmVsRW5kcG9pbnRzIiwiTGN3RmNzRGV0YWlsc1BhdGgiLCJvcmdJZCIsIm1ldGhvZCIsInVybCIsIm9yZ1VybCIsImF4aW9zSW5zdGFuY2UiLCJheGlvcyIsImNyZWF0ZSIsInJldHJpZXMiLCJtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSIsIndhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzIiwid2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZyIsImdldENoYXRDb25maWciLCJyZXF1ZXN0SGVhZGVycyIsImdldCIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsInJlc3BvbnNlIiwiZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIm1pbGxpU2Vjb25kc0VsYXBzZWQiLCJkYXRhIiwiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCIsInVuZGVmaW5lZCIsIkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQiLCJieXBhc3NDYWNoZSIsIkdFVENIQVRDT05GSUdGU1RBUlRFRCIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIndpZGdldElkIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCIsIkdFVENIQVRDT05GSUdGQUlMRUQiLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwiR0VUTFdJU1RBVFVTU1RBUlRFRCIsIkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJoZWFkZXJPdmVyd3JpdGVzIiwiZ2V0TFdJRGV0YWlscyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJzZXRTZXNzaW9uSWRIZWFkZXIiLCJzaG91bGRVc2VTaWdRdWVyeVBhcmFtIiwidXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtIiwicGFyYW1zIiwic2lnIiwib3B0aW9ucyIsInJlc29sdmUiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJIVFRQVGltZU91dEVycm9yTWVzc2FnZSIsImdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIiwiY3VycmVudFJldHJ5Q291bnQiLCJjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIiwicmVmcmVzaFRva2VuIiwiTXNPY0JvdEFwcGxpY2F0aW9uSWQiLCJtdWx0aUJvdCIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJlbmRwb2ludCIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwidG9Mb3dlckNhc2UiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NVQ0NFRURFRCIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU0ZBSUxFRCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNUQVJURUQiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJXQVJOIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZRkFJTEVEIiwicXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImdldEFnZW50QXZhaWxhYmlsaXR5IiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwic2Vzc2lvbkluaXQiLCJzaG91bGRSZXRyeSIsImVycm9yIiwiYmFzZVBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsInNldFJlcXVlc3RJZEhlYWRlciIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJDUkVBVEVTRVNTSU9OU1RBUlRFRCIsIkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGgiLCJMaXZlQ2hhdENvbm5lY3RvclBhdGgiLCJDUkVBVEVTRVNTSU9OU1VDQ0VFREVEIiwiQ1JFQVRFU0VTU0lPTkZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsInNlc3Npb25DbG9zZSIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwiY29kZSIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwibG9nIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsImdldFN1cnZleUludml0ZUxpbmsiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJnZXRDaGF0VHJhbnNjcmlwdHMiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJlbWFpbFRyYW5zY3JpcHQiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJmZXRjaERhdGFNYXNraW5nSW5mbyIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwibWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwic2VuZFR5cGluZ0luZGljYXRvciIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIiwibG9nTGV2ZWwiLCJ0ZWxlbWV0cnlFdmVudFR5cGUiLCJkZXNjcmlwdGlvbiIsInJlcXVlc3RQYXlsb2FkIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwic2FuaXRpemVkUmVxdWVzdEhlYWRlcnMiLCJhdXRoVG9rZW5EZXRhaWxzIiwic3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMiLCJhdG9iIiwicGF5bG9hZCIsInNwbGl0IiwianNvbkRhdGEiLCJwYXJzZSIsImx3aUNvbnRleHRzIiwic3ViIiwiZXhwIiwibHdpQ29udGV4dHNEYXRhIiwiY3VzdG9tRGF0YSIsIlJlcXVlc3RJZCIsIlJlZ2lvbiIsIkVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJUcmFuc2FjdGlvbklkIiwidHJhbnNhY3Rpb25pZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsIlJlcXVlc3RIZWFkZXJzIiwiUmVzcG9uc2VFcnJvcmNvZGUiLCJlcnJvcmNvZGUiLCJBdXRoVG9rZW5EZXRhaWxzIiwic3Vic3RyaW5nIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsImRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztB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SCxFQUFBQSxvQkFBb0IsRUFBRSxLQWQyQztBQWVqRWtJLEVBQUFBLG1CQUFtQixFQUFFLElBZjRDO0FBZ0JqRTdELEVBQUFBLDZCQUE2QixFQUFFO0FBaEJrQyxDO2lDQURoRHRNLEcsMEJBb0JzQztBQUN2RFUsRUFBQUEsYUFBYSxFQUFFLG9CQUFTa1MsU0FBVCxDQUFtQixDQUFuQixFQUFzQixDQUF0QixDQUR3QztBQUV2REMsRUFBQUEsc0JBQXNCLEVBQUUsRUFGK0I7QUFHdkRDLEVBQUFBLHVDQUF1QyxFQUFFLEtBSGM7QUFJdkRsTSxFQUFBQSxzQkFBc0IsRUFBRSxJQUorQjtBQUt2RHpELEVBQUFBLDBCQUEwQixFQUFFLENBTDJCO0FBTXZETyxFQUFBQSxxQkFBcUIsRUFBRU8sU0FOZ0M7QUFPdkROLEVBQUFBLG9CQUFvQixFQUFFM0QsR0FBRyxDQUFDK1MsMkJBUDZCO0FBUXZEeE4sRUFBQUEsaUNBQWlDLEVBQUUsS0FSb0I7QUFTdkRsQyxFQUFBQSw0QkFBNEIsRUFBRTJQLDREQVR5QjtBQVV2RHBSLEVBQUFBLFdBQVcsRUFBRTtBQVYwQyxDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGhhc2ggZnJvbSBcImNyeXB0b1wiO1xuXG5pbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiwgT0NTREtUZWxlbWV0cnlFdmVudCwgU0RLRXJyb3IgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCBheGlvc1JldHJ5SGFuZGxlciwgeyBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCB9IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlIYW5kbGVyXCI7XG5cbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zXCJcbmltcG9ydCBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IEluaXRDb250ZXh0IGZyb20gXCIuL01vZGVsL0luaXRDb250ZXh0XCI7XG5pbXBvcnQgTG9jYWxlcyBmcm9tIFwiLi9Db21tb24vTG9jYWxlc1wiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IHsgTG9nZ2luZ1Nhbml0aXplciB9IGZyb20gXCIuL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXJcIjtcbmltcG9ydCBPQ1NES0xvZ2dlciBmcm9tIFwiLi9Db21tb24vT0NTREtMb2dnZXJcIjtcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gXCIuL1V0aWxzL09TSW5mb1wiO1xuaW1wb3J0IE9tbmljaGFubmVsRW5kcG9pbnRzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiO1xuaW1wb3J0IE9tbmljaGFubmVsSFRUUEhlYWRlcnMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyIGZyb20gXCIuL0ludGVyZmFjZXMvT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlclwiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgUmVxdWVzdFRpbWVvdXRDb25maWcgfSBmcm9tIFwiLi9Db21tb24vUmVxdWVzdFRpbWVvdXRDb25maWdcIjtcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gXCIuL0NvbW1vbi9NYXBwaW5nc1wiO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tIFwiLi9VdGlscy9UaW1lclwiO1xuaW1wb3J0IHsgYWRkT2NVc2VyQWdlbnRIZWFkZXIgfSBmcm9tIFwiLi9VdGlscy9odHRwSGVhZGVyc1V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCB9IGZyb20gXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCI7XG5pbXBvcnQgaXNFeHBlY3RlZEF4aW9zRXJyb3IgZnJvbSBcIi4vVXRpbHMvaXNFeHBlY3RlZEF4aW9zRXJyb3JcIjtcbmltcG9ydCBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciBmcm9tIFwiLi9VdGlscy9TZXNzaW9uSW5pdFJldHJ5SGFuZGxlclwiO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vVXRpbHMvdXVpZFwiO1xuaW1wb3J0IHsgd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MgfSBmcm9tIFwiLi9VdGlscy93YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnOiBSZXF1ZXN0VGltZW91dENvbmZpZyA9IHtcbiAgICBnZXRDaGF0Q29uZmlnOiAxMjAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgZ2V0Q2hhdFRva2VuOiAxNTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgZ2V0U3VydmV5SW52aXRlTGluazogMTUwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDUwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRDb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IHtcbiAgICBhdXRoQ29kZU5vbmNlOiB1dWlkdjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiB0cnVlLFxuICAgIG1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlOiA1LFxuICAgIGRlZmF1bHRSZXF1ZXN0VGltZW91dDogdW5kZWZpbmVkLFxuICAgIHJlcXVlc3RUaW1lb3V0Q29uZmlnOiBTREsuZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnLFxuICAgIHVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbTogZmFsc2UsXG4gICAgd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZzogd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MsXG4gICAgb2NVc2VyQWdlbnQ6IFtdXG4gIH07XG5cbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgb2NVc2VyQWdlbnQ6IHN0cmluZ1tdO1xuICBIVFRQVGltZU91dEVycm9yTWVzc2FnZSA9IGAke1NES0Vycm9yLkNsaWVudEhUVFBUaW1lb3V0RXJyb3JOYW1lfTogJHtTREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTWVzc2FnZX1gO1xuXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb21uaWNoYW5uZWxDb25maWd1cmF0aW9uOiBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uLCBwcml2YXRlIGNvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uLCBwcml2YXRlIGxvZ2dlcj86IE9DU0RLTG9nZ2VyKSB7XG4gICAgLy8gU2V0cyB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgcGFzc2VkIGNvbmZpZ3VyYXRpb24gaXMgZW1wdHkgb3IgaXMgbm90IGFuIG9iamVjdFxuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5jb25maWd1cmF0aW9uKS5sZW5ndGggfHwgdHlwZW9mIChjb25maWd1cmF0aW9uKSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIFNESyBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGluZGl2aWR1YWwgZW5kcG9pbnRUaW1lb3V0IGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjaGFubmVsSWRcbiAgICBjb25zdCB7IGNoYW5uZWxJZCB9ID0gb21uaWNoYW5uZWxDb25maWd1cmF0aW9uO1xuICAgIGlmICghT2JqZWN0LnZhbHVlcyhDaGFubmVsSWQpLmluY2x1ZGVzKGNoYW5uZWxJZCBhcyBDaGFubmVsSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhbm5lbElkYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgT0MgY29uZmlnXG4gICAgY29uc3QgY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24pO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIENvbnN0YW50cy5yZXF1aXJlZE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgIGlmICghY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJyR7a2V5fScgaW4gT21uaWNoYW5uZWxDb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vY1VzZXJBZ2VudCA9IHRoaXMuY29uZmlndXJhdGlvbi5vY1VzZXJBZ2VudDtcbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExDVyBGQ1MgRGV0YWlscyBvZiB0aGUgT3JnLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExjd0Zjc0RldGFpbHMoKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgc3RhcnRlZFwiLCBcIlwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxjd0Zjc0RldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN1Y2NlZWRlZFwiLCBcIlwiLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBmYWlsZWRcIiwgXCJcIiwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0Q29uZmlnKHJlcXVlc3RJZDogc3RyaW5nLCBieXBhc3NDYWNoZSA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGU1RBUlRFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbmZpZ1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9P3JlcXVlc3RJZD0ke3JlcXVlc3RJZH0mY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgIH0pO1xuXG4gICAgbGV0IHJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICByZXF1ZXN0SGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VFREVELCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELCBcIkdldCBMV0kgRGV0YWlscyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGEgZW5kcG9pbnQgZm9yIGFub255bW91cyBjaGF0cyB0byBnZXQgTFdJIERldGFpbHNcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXJXaXRoTm90Rm91bmQoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0TFdJRGV0YWlscyxcbiAgICB9KTtcblxuICAgIC8vIEV4dHJhY3QgYXV0aCB0b2tlbiBhbmQgcmVjb25uZWN0IGlkIGZyb20gb3B0aW9uYWwgcGFyYW1cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlY29ubmVjdElkIH0gPSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfTtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU0ZBSUxFRCwgXCJHZXQgTFdJIERldGFpbHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4sIE1zT2NCb3RBcHBsaWNhdGlvbklkIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBtdWx0aUJvdCA9IChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKT8gdHJ1ZTogZmFsc2U7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCwgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50KGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gYXMgTGl2ZUNoYXRWZXJzaW9uIHx8IHRoaXMubGl2ZUNoYXRWZXJzaW9uLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID8gdHJ1ZSA6IGZhbHNlLCBtdWx0aUJvdCk7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIFxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG4gICAgaWYgKE1zT2NCb3RBcHBsaWNhdGlvbklkICYmIE1zT2NCb3RBcHBsaWNhdGlvbklkLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtc1snTXMtT2MtQm90LUFwcGxpY2F0aW9uLUlkJ10gPSBNc09jQm90QXBwbGljYXRpb25JZDtcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBwYXJhbXMucmVmcmVzaFRva2VuID0gJ3RydWUnXG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IChjdXJyZW50UmV0cnlDb3VudCA+IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSkgPyBjdXJyZW50UmV0cnlDb3VudCA6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHJldHJ5T240Mjk6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5LFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUb2tlblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIGNoZWNrIGlmIGRhdGEgaXMgZW1wdHksIGlmIHNvLCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJFbXB0eSBkYXRhIHJlY2VpdmVkIGZyb20gZ2V0Q2hhdFRva2VuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsIFwiR2V0IENoYXQgVG9rZW4gc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RhYmxlQ2hhdHMocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zOiBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKTogUHJvbWlzZTxSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVEFSVEVELCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM/LnJlcXVlc3RJZCB8fCB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdGFibGVDaGF0c1xuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUU0ZBSUxFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBSZWNvbm5lY3RhYmxlIGF2YWlsYWJpbGl0eSBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5XQVJOLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKidcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBjb25zdCByZXRyeU9uNDI5ID0gdHJ1ZTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkluaXQsXG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcihlcnJvciwgcmV0cnlPbjQyOSksXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gYXV0aGVudGljYXRlZFVzZXJUb2tlblxuICAgICAgPyBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGg7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikgeyAgICAgXG4gICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCB7XG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dOiBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXTogdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQgJiYgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ29udmVyc2F0aW9uKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVEFSVEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHJldHJ5T240MjkgPSB0cnVlO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyKGVycm9yLCByZXRyeU9uNDI5KSxcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JQYXRoO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9L3dpZGdldEFwcC8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS9jb252ZXJzYXRpb25gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHsgICAgIFxuICAgICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0SGVhZGVycywge1xuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTogYXV0aGVudGljYXRlZFVzZXJUb2tlbixcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV06IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGRhdGEucmVjb25uZWN0SWQgPSByZWNvbm5lY3RJZDtcbiAgICB9XG5cbiAgICBkYXRhLmNoYW5uZWxJZCA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZDtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIGNoZWNrIGlmIGRhdGEgaXMgZW1wdHksIGlmIHNvLCB0aGVuIHRocm93IGFuIGVycm9yXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIik7XG4gICAgICB9XG5cbiAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTlNVQ0NFRURFRCwgXCJDcmVhdGUgY292ZXJzYXRpb24gY2FsbCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9ORkFJTEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICBcbiAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCwgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkNsb3NlXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkIH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGEuY2hhdElkID0gY2hhdElkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCwgXCJTZXNzaW9uIENsb3NlIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsIFwiU2Vzc2lvbiBjbG9zZSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCB9ID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcblxuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggZGF0YSBtYXNraW5nIGluZm8gb2YgdGhlIG9yZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmZXRjaERhdGFNYXNraW5nSW5mbyhyZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8SURhdGFNYXNraW5nSW5mbz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlbmRUeXBpbmdJbmRpY2F0b3JcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB0ZWxlbWV0cnlFdmVudFR5cGUgVGVsZW1ldHJ5IGV2ZW50IHR5cGUgaW4gd2hpY2ggZXZlbnQgd2lsbCBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2VcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICovXG4gIHByaXZhdGUgbG9nV2l0aExvZ2dlcihsb2dMZXZlbDogTG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZTogT0NTREtUZWxlbWV0cnlFdmVudCwgZGVzY3JpcHRpb246IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLCByZXNwb25zZT86IEF4aW9zUmVzcG9uc2U8YW55PiwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlciwgcmVxdWVzdFBhdGg/OiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCByZXF1ZXN0UGF5bG9hZD86IGFueSwgcmVxdWVzdEhlYWRlcnM/OiBhbnkpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzID0gdW5kZWZpbmVkO1xuICAgIGxldCBhdXRoVG9rZW5EZXRhaWxzOiBhbnkgPSB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmIChyZXF1ZXN0SGVhZGVycykge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB7IC4uLnJlcXVlc3RIZWFkZXJzIH07XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUmVxdWVzdEhlYWRlcnNTZW5zaXRpdmVQcm9wZXJ0aWVzKHNhbml0aXplZFJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgaWYgKHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0pIHtcbiAgICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuYXRvYikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl07XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdG9rZW4uc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5hdG9iKHBheWxvYWQpO1xuICAgICAgICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgbHdpQ29udGV4dHMgPSBqc29uRGF0YVtcImx3aWNvbnRleHRzXCJdO1xuICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgc3ViOiBqc29uRGF0YVtcInN1YlwiXSxcbiAgICAgICAgICAgICAgZXhwOiBqc29uRGF0YVtcImV4cFwiXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGx3aUNvbnRleHRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGx3aUNvbnRleHRzRGF0YSA9IEpTT04ucGFyc2UobHdpQ29udGV4dHMpO1xuICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMobHdpQ29udGV4dHNEYXRhKTtcbiAgICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscy5sd2lDb250ZXh0cyA9IGx3aUNvbnRleHRzRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmRhdGEgfHwgZXJyb3IgOiB1bmRlZmluZWQsIFxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLFxuICAgICAgUmVxdWVzdEhlYWRlcnM6IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzLFxuICAgICAgUmVzcG9uc2VFcnJvcmNvZGU6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmhlYWRlcnM/LmVycm9yY29kZSA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBBdXRoVG9rZW5EZXRhaWxzOiBhdXRoVG9rZW5EZXRhaWxzXG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRBdXRoQ29kZU5vbmNlID0gKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChoZWFkZXJzPy5hdXRoY29kZW5vbmNlKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSA9IGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2U7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRTZXNzaW9uSWRIZWFkZXIgPSAoc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZF0gPSBzZXNzaW9uSWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZXF1ZXN0SWRIZWFkZXIgPSAocmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IFN0cmluZ01hcCkgPT4ge1xuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
2714
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiU0RLRXJyb3IiLCJDbGllbnRIVFRQVGltZW91dEVycm9yTmFtZSIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwicmVxdWVzdElkIiwiY29ycmVsYXRpb25JZCIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImNoYW5uZWxJZCIsInZhbHVlcyIsIkNoYW5uZWxJZCIsImluY2x1ZGVzIiwiRXJyb3IiLCJjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIkNvbnN0YW50cyIsInJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIm9jVXNlckFnZW50IiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJ0aW1lciIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxjd0Zjc0RldGFpbHNQYXRoIiwib3JnSWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwicmVxdWVzdEhlYWRlcnMiLCJnZXQiLCJ0aW1lb3V0IiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0IiwicmVxdWVzdFRpbWVvdXRDb25maWciLCJyZXNwb25zZSIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiZGF0YSIsIkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQiLCJ1bmRlZmluZWQiLCJHRVRMQ1dGQ1NERVRBSUxTRkFJTEVEIiwiYnlwYXNzQ2FjaGUiLCJHRVRDSEFUQ09ORklHRlNUQVJURUQiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJ3aWRnZXRJZCIsImFkZERlZmF1bHRIZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCIsIkdFVENIQVRDT05GSUdGQUlMRUQiLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwiR0VUTFdJU1RBVFVTU1RBUlRFRCIsIkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJoZWFkZXJPdmVyd3JpdGVzIiwiZ2V0TFdJRGV0YWlscyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJzaG91bGRVc2VTaWdRdWVyeVBhcmFtIiwidXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtIiwicGFyYW1zIiwic2lnIiwib3B0aW9ucyIsInJlc29sdmUiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJIVFRQVGltZU91dEVycm9yTWVzc2FnZSIsImdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIiwiY3VycmVudFJldHJ5Q291bnQiLCJjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIiwicmVmcmVzaFRva2VuIiwiTXNPY0JvdEFwcGxpY2F0aW9uSWQiLCJtdWx0aUJvdCIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJlbmRwb2ludCIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwidG9Mb3dlckNhc2UiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NVQ0NFRURFRCIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU0ZBSUxFRCIsIm9wdGlvbmFsUGFyYW1zIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRCIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsImdldFJlY29ubmVjdEF2YWlsYWJpbGl0eSIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIldBUk4iLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQiLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwiY3VzdG9tQ29udGV4dERhdGEiLCJ0ZW1wQXJyIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwiYXNzaWduIiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJoYXNoIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ0b1N0cmluZyIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzZXNzaW9uSW5pdCIsInNob3VsZFJldHJ5IiwiZXJyb3IiLCJiYXNlUGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwic2V0UmVxdWVzdElkSGVhZGVyIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsIkNSRUFURVNFU1NJT05TVEFSVEVEIiwiTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCIsIkxpdmVDaGF0Q29ubmVjdG9yUGF0aCIsIkNSRUFURVNFU1NJT05TVUNDRUVERUQiLCJDUkVBVEVTRVNTSU9ORkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJjb2RlIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsImVtYWlsVHJhbnNjcmlwdCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyIsImF1dGhUb2tlbkRldGFpbHMiLCJzdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyIsImF0b2IiLCJwYXlsb2FkIiwic3BsaXQiLCJqc29uRGF0YSIsInBhcnNlIiwibHdpQ29udGV4dHMiLCJzdWIiLCJleHAiLCJsd2lDb250ZXh0c0RhdGEiLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwiUmVxdWVzdEhlYWRlcnMiLCJSZXNwb25zZUVycm9yY29kZSIsImVycm9yY29kZSIsIkF1dGhUb2tlbkRldGFpbHMiLCJzZXRTZXNzaW9uSWRIZWFkZXIiLCJzZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIiLCJzdWJzdHJpbmciLCJnZXRDaGF0VG9rZW5SZXRyeUNvdW50IiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIiwi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LEVBQUFBLGtCQUFrQixFQUFFLEtBVjZDO0FBV2pFWSxFQUFBQSxlQUFlLEVBQUUsSUFYZ0Q7QUFZakVNLEVBQUFBLG9CQUFvQixFQUFFLElBWjJDO0FBYWpFTyxFQUFBQSxnQ0FBZ0MsRUFBRSxLQWIrQjtBQWNqRTFILEVBQUFBLG9CQUFvQixFQUFFLEtBZDJDO0FBZWpFa0ksRUFBQUEsbUJBQW1CLEVBQUUsSUFmNEM7QUFnQmpFN0QsRUFBQUEsNkJBQTZCLEVBQUU7QUFoQmtDLEM7aUNBRGhEeE0sRywwQkFvQnNDO0FBQ3ZEVSxFQUFBQSxhQUFhLEVBQUUsb0JBQVNzUyxTQUFULENBQW1CLENBQW5CLEVBQXNCLENBQXRCLENBRHdDO0FBRXZEQyxFQUFBQSxzQkFBc0IsRUFBRSxFQUYrQjtBQUd2REMsRUFBQUEsdUNBQXVDLEVBQUUsS0FIYztBQUl2RHJNLEVBQUFBLHNCQUFzQixFQUFFLElBSitCO0FBS3ZEekQsRUFBQUEsMEJBQTBCLEVBQUUsQ0FMMkI7QUFNdkRPLEVBQUFBLHFCQUFxQixFQUFFTyxTQU5nQztBQU92RE4sRUFBQUEsb0JBQW9CLEVBQUU1RCxHQUFHLENBQUNtVCwyQkFQNkI7QUFRdkQzTixFQUFBQSxpQ0FBaUMsRUFBRSxLQVJvQjtBQVN2RGxDLEVBQUFBLDRCQUE0QixFQUFFOFAsNERBVHlCO0FBVXZEdlIsRUFBQUEsV0FBVyxFQUFFO0FBVjBDLEMiLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiY3J5cHRvXCI7XG5cbmltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uLCBPQ1NES1RlbGVtZXRyeUV2ZW50LCBTREtFcnJvciB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IGF4aW9zUmV0cnlIYW5kbGVyLCB7IGF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kIH0gZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeUhhbmRsZXJcIjtcblxuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDdXN0b21Db250ZXh0RGF0YSB9IGZyb20gXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgZnJvbSBcIi4vSW50ZXJmYWNlcy9PbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VGltZW91dENvbmZpZyB9IGZyb20gXCIuL0NvbW1vbi9SZXF1ZXN0VGltZW91dENvbmZpZ1wiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgeyBhZGRPY1VzZXJBZ2VudEhlYWRlciB9IGZyb20gXCIuL1V0aWxzL2h0dHBIZWFkZXJzVXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50IH0gZnJvbSBcIi4vVXRpbHMvZW5kcG9pbnRzQ3JlYXRvcnNcIjtcbmltcG9ydCBpc0V4cGVjdGVkQXhpb3NFcnJvciBmcm9tIFwiLi9VdGlscy9pc0V4cGVjdGVkQXhpb3NFcnJvclwiO1xuaW1wb3J0IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIGZyb20gXCIuL1V0aWxzL1Nlc3Npb25Jbml0UmV0cnlIYW5kbGVyXCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgeyB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyB9IGZyb20gXCIuL1V0aWxzL3dhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzXCI7XG5pbXBvcnQgSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNESyBpbXBsZW1lbnRzIElTREsge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWc6IFJlcXVlc3RUaW1lb3V0Q29uZmlnID0ge1xuICAgIGdldENoYXRDb25maWc6IDEyMDAwMCxcbiAgICBnZXRMV0lEZXRhaWxzOiAxNTAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDE1MDAwLFxuICAgIHNlc3Npb25Jbml0OiAxNTAwMCxcbiAgICBzZXNzaW9uQ2xvc2U6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdGFibGVDaGF0czogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxNTAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxNTAwMCxcbiAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogNTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogNTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogMTUwMDAsXG4gICAgZ2V0QWdlbnRBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHNlbmRUeXBpbmdJbmRpY2F0b3I6IDUwMDAsXG4gICAgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQ6IDE1MDAwXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGF1dGhDb2RlTm9uY2U6IHV1aWR2NCgpLnN1YnN0cmluZygwLCA4KSxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeUNvdW50OiAxMCxcbiAgICBnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmU6IDEwMDAwLFxuICAgIGdldENoYXRUb2tlblJldHJ5T240Mjk6IHRydWUsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDUsXG4gICAgZGVmYXVsdFJlcXVlc3RUaW1lb3V0OiB1bmRlZmluZWQsXG4gICAgcmVxdWVzdFRpbWVvdXRDb25maWc6IFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWcsXG4gICAgdXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtOiBmYWxzZSxcbiAgICB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnOiB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyxcbiAgICBvY1VzZXJBZ2VudDogW11cbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBvY1VzZXJBZ2VudDogc3RyaW5nW107XG4gIEhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlID0gYCR7U0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck5hbWV9OiAke1NES0Vycm9yLkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlfWA7XG5cblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9jVXNlckFnZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLm9jVXNlckFnZW50O1xuICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gTGl2ZUNoYXRWZXJzaW9uLlYyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgTENXIEZDUyBEZXRhaWxzIG9mIHRoZSBPcmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TGN3RmNzRGV0YWlscygpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU1NUQVJURUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdGFydGVkXCIsIFwiXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGN3RmNzRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTU1VDQ0VFREVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgc3VjY2VlZGVkXCIsIFwiXCIsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU0ZBSUxFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIGZhaWxlZFwiLCBcIlwiLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgfSk7XG5cbiAgICBsZXQgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICByZXF1ZXN0SGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VFREVELCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELCBcIkdldCBMV0kgRGV0YWlscyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGEgZW5kcG9pbnQgZm9yIGFub255bW91cyBjaGF0cyB0byBnZXQgTFdJIERldGFpbHNcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXJXaXRoTm90Rm91bmQoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0TFdJRGV0YWlscyxcbiAgICB9KTtcblxuICAgIC8vIEV4dHJhY3QgYXV0aCB0b2tlbiBhbmQgcmVjb25uZWN0IGlkIGZyb20gb3B0aW9uYWwgcGFyYW1cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlY29ubmVjdElkIH0gPSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9O1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0TFdJRGV0YWlsc1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCwgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24sIHJlZnJlc2hUb2tlbiwgTXNPY0JvdEFwcGxpY2F0aW9uSWQgfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IG11bHRpQm90ID0gKE1zT2NCb3RBcHBsaWNhdGlvbklkICYmIE1zT2NCb3RBcHBsaWNhdGlvbklkLmxlbmd0aCA+IDApPyB0cnVlOiBmYWxzZTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50KGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gYXMgTGl2ZUNoYXRWZXJzaW9uIHx8IHRoaXMubGl2ZUNoYXRWZXJzaW9uLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID8gdHJ1ZSA6IGZhbHNlLCBtdWx0aUJvdCk7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIFxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG4gICAgaWYgKE1zT2NCb3RBcHBsaWNhdGlvbklkICYmIE1zT2NCb3RBcHBsaWNhdGlvbklkLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtc1snTXMtT2MtQm90LUFwcGxpY2F0aW9uLUlkJ10gPSBNc09jQm90QXBwbGljYXRpb25JZDtcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBwYXJhbXMucmVmcmVzaFRva2VuID0gJ3RydWUnXG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IChjdXJyZW50UmV0cnlDb3VudCA+IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSkgPyBjdXJyZW50UmV0cnlDb3VudCA6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHJldHJ5T240Mjk6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5LFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUb2tlblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIGNoZWNrIGlmIGRhdGEgaXMgZW1wdHksIGlmIHNvLCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJFbXB0eSBkYXRhIHJlY2VpdmVkIGZyb20gZ2V0Q2hhdFRva2VuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsIFwiR2V0IENoYXQgVG9rZW4gc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RhYmxlQ2hhdHMocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zOiBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKTogUHJvbWlzZTxSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVEFSVEVELCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM/LnJlcXVlc3RJZCB8fCB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcz8ucmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNGQUlMRUQsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcsIG9wdGlvbmFsUGFyYW1zOiBJUmVjb25uZWN0QXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBSZWNvbm5lY3RhYmxlIGF2YWlsYWJpbGl0eSBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMob3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgUmVjb25uZWN0IEF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGNvbnN0IGNhY2hPYmogPSB7XG4gICAgICBcIm9yZ0lkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgXCJ3aWRnZXRJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgIGNvbnN0IHRlbXBBcnIgPSBDdXN0b21Db250ZXh0RGF0YS5zb3J0KGRhdGEuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkIH0pO1xuICAgIH1cblxuICAgIGRhdGEuY2FjaGVLZXkgPSBoYXNoLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkuZGlnZXN0KCdoZXgnKS50b1N0cmluZygpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqJ1xuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHJldHJ5T240MjkgPSB0cnVlO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyKGVycm9yLCByZXRyeU9uNDI5KSxcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aFxuICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aDtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtiYXNlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7ICAgICBcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdEhlYWRlcnMsIHtcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl06IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sXG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdOiB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cblxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQgJiYgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ29udmVyc2F0aW9uKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVEFSVEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHJldHJ5T240MjkgPSB0cnVlO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyKGVycm9yLCByZXRyeU9uNDI5KSxcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JQYXRoO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9L3dpZGdldEFwcC8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS9jb252ZXJzYXRpb25gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHsgICAgIFxuICAgICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0SGVhZGVycywge1xuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTogYXV0aGVudGljYXRlZFVzZXJUb2tlbixcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV06IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZGF0YS5yZWNvbm5lY3RJZCA9IHJlY29ubmVjdElkO1xuICAgIH1cblxuICAgIGRhdGEuY2hhbm5lbElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgZGF0YSByZWNlaXZlZCBmcm9tIGdldENoYXRUb2tlblwiKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9OU1VDQ0VFREVELCBcIkNyZWF0ZSBjb3ZlcnNhdGlvbiBjYWxsIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05GQUlMRUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgIFxuICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY2hhdElkIH0gPSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELCBcIlN1Ym1pdCBQb3N0IENoYXQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcblxuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55LCByZXF1ZXN0SGVhZGVycz86IGFueSk6IHZvaWQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0UGF5bG9hZCkge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB7IC4uLnJlcXVlc3RQYXlsb2FkIH07XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGF1dGhUb2tlbkRldGFpbHM6IGFueSA9IHVuZGVmaW5lZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKHJlcXVlc3RIZWFkZXJzKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyA9IHsgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMoc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICBpZiAocmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSkge1xuICAgICAgICBpZiAod2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5hdG9iKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0b2tlbi5zcGxpdChcIi5cIilbMV07XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gd2luZG93LmF0b2IocGF5bG9hZCk7XG4gICAgICAgICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBsd2lDb250ZXh0cyA9IGpzb25EYXRhW1wibHdpY29udGV4dHNcIl07XG4gICAgICAgICAgICBhdXRoVG9rZW5EZXRhaWxzID0ge1xuICAgICAgICAgICAgICBzdWI6IGpzb25EYXRhW1wic3ViXCJdLFxuICAgICAgICAgICAgICBleHA6IGpzb25EYXRhW1wiZXhwXCJdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAobHdpQ29udGV4dHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgbHdpQ29udGV4dHNEYXRhID0gSlNPTi5wYXJzZShsd2lDb250ZXh0cyk7XG4gICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhsd2lDb250ZXh0c0RhdGEpO1xuICAgICAgICAgICAgICBhdXRoVG9rZW5EZXRhaWxzLmx3aUNvbnRleHRzID0gbHdpQ29udGV4dHNEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uZGF0YSB8fCBlcnJvciA6IHVuZGVmaW5lZCwgXG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWQsXG4gICAgICBSZXF1ZXN0SGVhZGVyczogc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMsXG4gICAgICBSZXNwb25zZUVycm9yY29kZTogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uaGVhZGVycz8uZXJyb3Jjb2RlIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEF1dGhUb2tlbkRldGFpbHM6IGF1dGhUb2tlbkRldGFpbHNcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldEF1dGhDb2RlTm9uY2UgPSAoaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2UpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlID0gaGVhZGVycz8uYXV0aGNvZGVub25jZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldFNlc3Npb25JZEhlYWRlciA9IChzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkXSA9IHNlc3Npb25JZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFJlcXVlc3RJZEhlYWRlciA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogU3RyaW5nTWFwKSA9PiB7XG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIgPSAoY29ycmVsYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBoZWFkZXJzOiBTdHJpbmdNYXApID0+IHtcbiAgICBpZiAoY29ycmVsYXRpb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmNvcnJlbGF0aW9uSWRdID0gY29ycmVsYXRpb25JZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|