@microsoft/ocsdk 0.3.1-main.7086781 → 0.3.1-main.df49844
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/CHANGELOG.md +6 -0
- package/dist/SDK.js +52882 -1771
- package/dist/SDK.min.js +14 -1
- package/lib/Common/Constants.d.ts +3 -1
- package/lib/Common/Constants.js +4 -2
- package/lib/Common/Constants.js.map +1 -1
- package/lib/Common/Enums.d.ts +3 -3
- package/lib/Common/Enums.js +4 -4
- package/lib/Common/OmnichannelEndpoints.d.ts +1 -1
- package/lib/Common/OmnichannelEndpoints.js +2 -2
- package/lib/Interfaces/ISDK.d.ts +1 -1
- package/lib/Model/IOCSDKLogData.d.ts +3 -0
- package/lib/Model/InitContext.d.ts +5 -0
- package/lib/Model/InitContext.js +4 -1
- package/lib/Model/InitContext.js.map +1 -1
- package/lib/SDK.d.ts +1 -1
- package/lib/SDK.js +415 -357
- package/lib/SDK.js.map +1 -1
- package/lib/Utils/CustomContextData.d.ts +5 -0
- package/lib/Utils/CustomContextData.js +57 -0
- package/lib/Utils/CustomContextData.js.map +1 -0
- package/lib/Utils/LoggingSanitizer.d.ts +3 -0
- package/lib/Utils/LoggingSanitizer.js +67 -5
- package/lib/Utils/LoggingSanitizer.js.map +1 -1
- package/lib/Utils/TelemetryHelper.js +8 -3
- package/lib/Utils/TelemetryHelper.js.map +1 -1
- package/package.json +2 -2
package/lib/SDK.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
+
var _typeof3 = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
5
7
|
Object.defineProperty(exports, "__esModule", {
|
|
6
8
|
value: true
|
|
7
9
|
});
|
|
@@ -47,6 +49,14 @@ var _axiosRetry = _interopRequireDefault(require("./Utils/axiosRetry"));
|
|
|
47
49
|
|
|
48
50
|
var _uuid = require("./Utils/uuid");
|
|
49
51
|
|
|
52
|
+
var hash = _interopRequireWildcard(require("crypto"));
|
|
53
|
+
|
|
54
|
+
var _CustomContextData = require("./Utils/CustomContextData");
|
|
55
|
+
|
|
56
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
57
|
+
|
|
58
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
59
|
+
|
|
50
60
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
51
61
|
|
|
52
62
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
@@ -795,15 +805,15 @@ var SDK = /*#__PURE__*/function () {
|
|
|
795
805
|
return getReconnectAvailability;
|
|
796
806
|
}()
|
|
797
807
|
/**
|
|
798
|
-
*
|
|
808
|
+
*
|
|
799
809
|
* @param requestId: RequestId to use for session init.
|
|
800
810
|
* @param queueAvailabilityOptionalParams: Optional parameters for session init.
|
|
801
811
|
*/
|
|
802
812
|
|
|
803
813
|
}, {
|
|
804
|
-
key: "
|
|
814
|
+
key: "getAgentAvailability",
|
|
805
815
|
value: function () {
|
|
806
|
-
var
|
|
816
|
+
var _getAgentAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(requestId) {
|
|
807
817
|
var _this5 = this;
|
|
808
818
|
|
|
809
819
|
var queueAvailabilityOptionalParams,
|
|
@@ -815,6 +825,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
815
825
|
getContext,
|
|
816
826
|
headers,
|
|
817
827
|
data,
|
|
828
|
+
cachObj,
|
|
829
|
+
tempArr,
|
|
818
830
|
options,
|
|
819
831
|
_args11 = arguments;
|
|
820
832
|
return _regenerator["default"].wrap(function _callee11$(_context11) {
|
|
@@ -825,12 +837,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
825
837
|
timer = _Timer.Timer.TIMER();
|
|
826
838
|
|
|
827
839
|
if (this.logger) {
|
|
828
|
-
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.
|
|
840
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSTARTED, {
|
|
829
841
|
RequestId: requestId
|
|
830
|
-
}, "Get
|
|
842
|
+
}, "Get agent availability started");
|
|
831
843
|
}
|
|
832
844
|
|
|
833
|
-
endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].
|
|
845
|
+
endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].GetAgentAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
|
|
834
846
|
axiosInstance = _axios["default"].create();
|
|
835
847
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
836
848
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
@@ -843,15 +855,34 @@ var SDK = /*#__PURE__*/function () {
|
|
|
843
855
|
}
|
|
844
856
|
|
|
845
857
|
data = initContext || {};
|
|
858
|
+
cachObj = {
|
|
859
|
+
"orgId": this.omnichannelConfiguration.orgId,
|
|
860
|
+
"widgetId": this.omnichannelConfiguration.widgetId
|
|
861
|
+
};
|
|
862
|
+
|
|
863
|
+
if (data && data.customContextData) {
|
|
864
|
+
tempArr = _CustomContextData.CustomContextData.sort(data.customContextData);
|
|
865
|
+
Object.assign(cachObj, {
|
|
866
|
+
"customContext": tempArr
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
if (data.portalcontactid) {
|
|
871
|
+
Object.assign(cachObj, {
|
|
872
|
+
"portalcontactid": data.portalcontactid
|
|
873
|
+
});
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
|
|
846
877
|
|
|
847
878
|
if (!(getContext && !window.document)) {
|
|
848
|
-
_context11.next =
|
|
879
|
+
_context11.next = 16;
|
|
849
880
|
break;
|
|
850
881
|
}
|
|
851
882
|
|
|
852
883
|
return _context11.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
853
884
|
|
|
854
|
-
case
|
|
885
|
+
case 16:
|
|
855
886
|
if (getContext) {
|
|
856
887
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
857
888
|
data.device = _DeviceInfo.DeviceInfo.getDeviceType();
|
|
@@ -865,13 +896,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
865
896
|
|
|
866
897
|
|
|
867
898
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
868
|
-
_context11.next =
|
|
899
|
+
_context11.next = 20;
|
|
869
900
|
break;
|
|
870
901
|
}
|
|
871
902
|
|
|
872
903
|
return _context11.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
873
904
|
|
|
874
|
-
case
|
|
905
|
+
case 20:
|
|
875
906
|
options = {
|
|
876
907
|
data: data,
|
|
877
908
|
headers: headers,
|
|
@@ -897,12 +928,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
897
928
|
|
|
898
929
|
if (_data) {
|
|
899
930
|
if (_this5.logger) {
|
|
900
|
-
_this5.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.
|
|
931
|
+
_this5.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, {
|
|
901
932
|
RequestId: requestId,
|
|
902
933
|
Region: response.data.Region,
|
|
903
934
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
904
935
|
TransactionId: response.headers["transaction-id"]
|
|
905
|
-
}, "Get
|
|
936
|
+
}, "Get agent availability Succeeded");
|
|
906
937
|
}
|
|
907
938
|
|
|
908
939
|
resolve(_data);
|
|
@@ -925,11 +956,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
925
956
|
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context10.t0);
|
|
926
957
|
|
|
927
958
|
case 15:
|
|
928
|
-
_this5.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.
|
|
959
|
+
_this5.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, {
|
|
929
960
|
RequestId: requestId,
|
|
930
961
|
ExceptionDetails: _context10.t0,
|
|
931
962
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds5
|
|
932
|
-
}, "Get
|
|
963
|
+
}, "Get agent availability failed");
|
|
933
964
|
|
|
934
965
|
case 16:
|
|
935
966
|
reject(_context10.t0);
|
|
@@ -947,7 +978,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
947
978
|
};
|
|
948
979
|
}()));
|
|
949
980
|
|
|
950
|
-
case
|
|
981
|
+
case 22:
|
|
951
982
|
case "end":
|
|
952
983
|
return _context11.stop();
|
|
953
984
|
}
|
|
@@ -955,11 +986,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
955
986
|
}, _callee11, this);
|
|
956
987
|
}));
|
|
957
988
|
|
|
958
|
-
function
|
|
959
|
-
return
|
|
989
|
+
function getAgentAvailability(_x14) {
|
|
990
|
+
return _getAgentAvailability.apply(this, arguments);
|
|
960
991
|
}
|
|
961
992
|
|
|
962
|
-
return
|
|
993
|
+
return getAgentAvailability;
|
|
963
994
|
}()
|
|
964
995
|
/**
|
|
965
996
|
* Starts a session to omnichannel.
|
|
@@ -970,32 +1001,47 @@ var SDK = /*#__PURE__*/function () {
|
|
|
970
1001
|
}, {
|
|
971
1002
|
key: "sessionInit",
|
|
972
1003
|
value: function () {
|
|
973
|
-
var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
974
|
-
var _this6 = this;
|
|
975
|
-
|
|
1004
|
+
var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(requestId) {
|
|
976
1005
|
var sessionInitOptionalParams,
|
|
977
1006
|
timer,
|
|
1007
|
+
description,
|
|
1008
|
+
customData,
|
|
978
1009
|
axiosInstance,
|
|
979
1010
|
reconnectId,
|
|
980
1011
|
authenticatedUserToken,
|
|
981
1012
|
initContext,
|
|
982
1013
|
getContext,
|
|
983
1014
|
headers,
|
|
984
|
-
|
|
1015
|
+
requestPath,
|
|
1016
|
+
queryParams,
|
|
1017
|
+
url,
|
|
985
1018
|
data,
|
|
1019
|
+
method,
|
|
986
1020
|
options,
|
|
987
|
-
|
|
988
|
-
|
|
1021
|
+
response,
|
|
1022
|
+
elapsedTimeInMilliseconds,
|
|
1023
|
+
requestPayload,
|
|
1024
|
+
_customData,
|
|
1025
|
+
_description,
|
|
1026
|
+
_elapsedTimeInMilliseconds6,
|
|
1027
|
+
_requestPayload,
|
|
1028
|
+
_customData2,
|
|
1029
|
+
_description2,
|
|
1030
|
+
_args12 = arguments;
|
|
1031
|
+
|
|
1032
|
+
return _regenerator["default"].wrap(function _callee12$(_context12) {
|
|
989
1033
|
while (1) {
|
|
990
|
-
switch (
|
|
1034
|
+
switch (_context12.prev = _context12.next) {
|
|
991
1035
|
case 0:
|
|
992
|
-
sessionInitOptionalParams =
|
|
1036
|
+
sessionInitOptionalParams = _args12.length > 1 && _args12[1] !== undefined ? _args12[1] : {};
|
|
993
1037
|
timer = _Timer.Timer.TIMER();
|
|
994
1038
|
|
|
995
1039
|
if (this.logger) {
|
|
996
|
-
|
|
1040
|
+
description = "Session Init Started";
|
|
1041
|
+
customData = {
|
|
997
1042
|
RequestId: requestId
|
|
998
|
-
}
|
|
1043
|
+
};
|
|
1044
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, customData, description);
|
|
999
1045
|
}
|
|
1000
1046
|
|
|
1001
1047
|
axiosInstance = _axios["default"].create();
|
|
@@ -1004,28 +1050,30 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1004
1050
|
});
|
|
1005
1051
|
reconnectId = sessionInitOptionalParams.reconnectId, authenticatedUserToken = sessionInitOptionalParams.authenticatedUserToken, initContext = sessionInitOptionalParams.initContext, getContext = sessionInitOptionalParams.getContext;
|
|
1006
1052
|
headers = _Constants["default"].defaultHeaders;
|
|
1007
|
-
|
|
1053
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
1008
1054
|
|
|
1009
1055
|
if (authenticatedUserToken) {
|
|
1010
|
-
|
|
1056
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
1011
1057
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1012
1058
|
}
|
|
1013
1059
|
|
|
1014
1060
|
if (reconnectId) {
|
|
1015
|
-
|
|
1061
|
+
requestPath += "/".concat(reconnectId);
|
|
1016
1062
|
}
|
|
1017
1063
|
|
|
1018
|
-
|
|
1064
|
+
queryParams = "channelId=".concat(this.omnichannelConfiguration.channelId);
|
|
1065
|
+
requestPath += "?".concat(queryParams);
|
|
1066
|
+
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1019
1067
|
data = initContext || {};
|
|
1020
1068
|
|
|
1021
1069
|
if (!(getContext && !window.document)) {
|
|
1022
|
-
|
|
1070
|
+
_context12.next = 16;
|
|
1023
1071
|
break;
|
|
1024
1072
|
}
|
|
1025
1073
|
|
|
1026
|
-
return
|
|
1074
|
+
return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
1027
1075
|
|
|
1028
|
-
case
|
|
1076
|
+
case 16:
|
|
1029
1077
|
if (getContext) {
|
|
1030
1078
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
1031
1079
|
data.device = _DeviceInfo.DeviceInfo.getDeviceType();
|
|
@@ -1040,90 +1088,100 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1040
1088
|
|
|
1041
1089
|
|
|
1042
1090
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
1043
|
-
|
|
1091
|
+
_context12.next = 20;
|
|
1044
1092
|
break;
|
|
1045
1093
|
}
|
|
1046
1094
|
|
|
1047
|
-
return
|
|
1095
|
+
return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1048
1096
|
|
|
1049
|
-
case
|
|
1097
|
+
case 20:
|
|
1098
|
+
method = "POST";
|
|
1050
1099
|
options = {
|
|
1051
1100
|
data: data,
|
|
1052
1101
|
headers: headers,
|
|
1053
|
-
method:
|
|
1054
|
-
url:
|
|
1102
|
+
method: method,
|
|
1103
|
+
url: url
|
|
1055
1104
|
};
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1105
|
+
_context12.prev = 22;
|
|
1106
|
+
_context12.next = 25;
|
|
1107
|
+
return axiosInstance(options);
|
|
1059
1108
|
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
switch (_context12.prev = _context12.next) {
|
|
1063
|
-
case 0:
|
|
1064
|
-
_context12.prev = 0;
|
|
1065
|
-
_context12.next = 3;
|
|
1066
|
-
return axiosInstance(options);
|
|
1109
|
+
case 25:
|
|
1110
|
+
response = _context12.sent;
|
|
1067
1111
|
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1112
|
+
if (this.logger) {
|
|
1113
|
+
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1114
|
+
requestPayload = _objectSpread({}, data);
|
|
1071
1115
|
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
Region: response.data.Region,
|
|
1076
|
-
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1077
|
-
TransactionId: response.headers["transaction-id"]
|
|
1078
|
-
}, "Session Init Succeeded");
|
|
1079
|
-
}
|
|
1116
|
+
if (requestPayload.customContextData) {
|
|
1117
|
+
_LoggingSanitizer.LoggingSanitizer.stripCustomContextDataValues(requestPayload.customContextData);
|
|
1118
|
+
}
|
|
1080
1119
|
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1120
|
+
if (requestPayload.preChatResponse) {
|
|
1121
|
+
_LoggingSanitizer.LoggingSanitizer.stripPreChatResponse(requestPayload.preChatResponse);
|
|
1122
|
+
}
|
|
1084
1123
|
|
|
1085
|
-
|
|
1086
|
-
_context12.prev = 9;
|
|
1087
|
-
_context12.t0 = _context12["catch"](0);
|
|
1088
|
-
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
1124
|
+
_LoggingSanitizer.LoggingSanitizer.stripGeolocation(requestPayload);
|
|
1089
1125
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1126
|
+
_customData = {
|
|
1127
|
+
RequestId: requestId,
|
|
1128
|
+
Region: response.data.Region,
|
|
1129
|
+
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1130
|
+
TransactionId: response.headers["transaction-id"],
|
|
1131
|
+
RequestPayload: requestPayload,
|
|
1132
|
+
RequestPath: requestPath,
|
|
1133
|
+
RequestMethod: method,
|
|
1134
|
+
ResponseStatusCode: response.status
|
|
1135
|
+
};
|
|
1136
|
+
_description = "Session Init Succeeded";
|
|
1137
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, _customData, _description);
|
|
1138
|
+
}
|
|
1094
1139
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1140
|
+
_context12.next = 34;
|
|
1141
|
+
break;
|
|
1097
1142
|
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6
|
|
1103
|
-
}, "Session Init Failed");
|
|
1143
|
+
case 29:
|
|
1144
|
+
_context12.prev = 29;
|
|
1145
|
+
_context12.t0 = _context12["catch"](22);
|
|
1146
|
+
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
1104
1147
|
|
|
1105
|
-
|
|
1106
|
-
|
|
1148
|
+
if (this.logger) {
|
|
1149
|
+
_requestPayload = _objectSpread({}, data);
|
|
1107
1150
|
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
}
|
|
1151
|
+
if (_requestPayload.customContextData) {
|
|
1152
|
+
_LoggingSanitizer.LoggingSanitizer.stripCustomContextDataValues(_requestPayload.customContextData);
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
if (_requestPayload.preChatResponse) {
|
|
1156
|
+
_LoggingSanitizer.LoggingSanitizer.stripPreChatResponse(_requestPayload.preChatResponse);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
_LoggingSanitizer.LoggingSanitizer.stripGeolocation(_requestPayload);
|
|
1160
|
+
|
|
1161
|
+
_LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context12.t0);
|
|
1162
|
+
|
|
1163
|
+
_customData2 = {
|
|
1164
|
+
RequestId: requestId,
|
|
1165
|
+
ExceptionDetails: _context12.t0,
|
|
1166
|
+
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6,
|
|
1167
|
+
RequestPayload: _requestPayload,
|
|
1168
|
+
RequestPath: requestPath,
|
|
1169
|
+
RequestMethod: method,
|
|
1170
|
+
ResponseStatusCode: _context12.t0.response.status // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
1115
1171
|
|
|
1116
|
-
return function (_x18, _x19) {
|
|
1117
|
-
return _ref6.apply(this, arguments);
|
|
1118
1172
|
};
|
|
1119
|
-
|
|
1173
|
+
_description2 = "Session Init Failed";
|
|
1174
|
+
this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, _customData2, _description2);
|
|
1175
|
+
}
|
|
1120
1176
|
|
|
1121
|
-
|
|
1177
|
+
throw _context12.t0;
|
|
1178
|
+
|
|
1179
|
+
case 34:
|
|
1122
1180
|
case "end":
|
|
1123
|
-
return
|
|
1181
|
+
return _context12.stop();
|
|
1124
1182
|
}
|
|
1125
1183
|
}
|
|
1126
|
-
},
|
|
1184
|
+
}, _callee12, this, [[22, 29]]);
|
|
1127
1185
|
}));
|
|
1128
1186
|
|
|
1129
1187
|
function sessionInit(_x17) {
|
|
@@ -1141,8 +1199,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1141
1199
|
}, {
|
|
1142
1200
|
key: "sessionClose",
|
|
1143
1201
|
value: function () {
|
|
1144
|
-
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1145
|
-
var
|
|
1202
|
+
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(requestId) {
|
|
1203
|
+
var _this6 = this;
|
|
1146
1204
|
|
|
1147
1205
|
var sessionCloseOptionalParams,
|
|
1148
1206
|
timer,
|
|
@@ -1155,12 +1213,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1155
1213
|
headers,
|
|
1156
1214
|
data,
|
|
1157
1215
|
options,
|
|
1158
|
-
|
|
1159
|
-
return _regenerator["default"].wrap(function
|
|
1216
|
+
_args14 = arguments;
|
|
1217
|
+
return _regenerator["default"].wrap(function _callee14$(_context14) {
|
|
1160
1218
|
while (1) {
|
|
1161
|
-
switch (
|
|
1219
|
+
switch (_context14.prev = _context14.next) {
|
|
1162
1220
|
case 0:
|
|
1163
|
-
sessionCloseOptionalParams =
|
|
1221
|
+
sessionCloseOptionalParams = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : {};
|
|
1164
1222
|
timer = _Timer.Timer.TIMER();
|
|
1165
1223
|
|
|
1166
1224
|
if (this.logger) {
|
|
@@ -1199,24 +1257,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1199
1257
|
method: "POST",
|
|
1200
1258
|
url: endpoint
|
|
1201
1259
|
};
|
|
1202
|
-
return
|
|
1203
|
-
var
|
|
1260
|
+
return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1261
|
+
var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
|
|
1204
1262
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
|
|
1205
1263
|
|
|
1206
|
-
return _regenerator["default"].wrap(function
|
|
1264
|
+
return _regenerator["default"].wrap(function _callee13$(_context13) {
|
|
1207
1265
|
while (1) {
|
|
1208
|
-
switch (
|
|
1266
|
+
switch (_context13.prev = _context13.next) {
|
|
1209
1267
|
case 0:
|
|
1210
|
-
|
|
1211
|
-
|
|
1268
|
+
_context13.prev = 0;
|
|
1269
|
+
_context13.next = 3;
|
|
1212
1270
|
return axiosInstance(options);
|
|
1213
1271
|
|
|
1214
1272
|
case 3:
|
|
1215
|
-
response =
|
|
1273
|
+
response = _context13.sent;
|
|
1216
1274
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1217
1275
|
|
|
1218
|
-
if (
|
|
1219
|
-
|
|
1276
|
+
if (_this6.logger) {
|
|
1277
|
+
_this6.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, {
|
|
1220
1278
|
RequestId: requestId,
|
|
1221
1279
|
Region: response.data.Region,
|
|
1222
1280
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1225,26 +1283,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1225
1283
|
}
|
|
1226
1284
|
|
|
1227
1285
|
resolve();
|
|
1228
|
-
|
|
1286
|
+
_context13.next = 17;
|
|
1229
1287
|
break;
|
|
1230
1288
|
|
|
1231
1289
|
case 9:
|
|
1232
|
-
|
|
1233
|
-
|
|
1290
|
+
_context13.prev = 9;
|
|
1291
|
+
_context13.t0 = _context13["catch"](0);
|
|
1234
1292
|
_elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
|
|
1235
1293
|
|
|
1236
|
-
if (!
|
|
1237
|
-
|
|
1294
|
+
if (!_this6.logger) {
|
|
1295
|
+
_context13.next = 16;
|
|
1238
1296
|
break;
|
|
1239
1297
|
}
|
|
1240
1298
|
|
|
1241
|
-
|
|
1242
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1299
|
+
_context13.next = 15;
|
|
1300
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context13.t0);
|
|
1243
1301
|
|
|
1244
1302
|
case 15:
|
|
1245
|
-
|
|
1303
|
+
_this6.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, {
|
|
1246
1304
|
RequestId: requestId,
|
|
1247
|
-
ExceptionDetails:
|
|
1305
|
+
ExceptionDetails: _context13.t0,
|
|
1248
1306
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds7
|
|
1249
1307
|
}, "Session Close Failed");
|
|
1250
1308
|
|
|
@@ -1253,26 +1311,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1253
1311
|
|
|
1254
1312
|
case 17:
|
|
1255
1313
|
case "end":
|
|
1256
|
-
return
|
|
1314
|
+
return _context13.stop();
|
|
1257
1315
|
}
|
|
1258
1316
|
}
|
|
1259
|
-
},
|
|
1317
|
+
}, _callee13, null, [[0, 9]]);
|
|
1260
1318
|
}));
|
|
1261
1319
|
|
|
1262
|
-
return function (
|
|
1263
|
-
return
|
|
1320
|
+
return function (_x19, _x20) {
|
|
1321
|
+
return _ref6.apply(this, arguments);
|
|
1264
1322
|
};
|
|
1265
1323
|
}()));
|
|
1266
1324
|
|
|
1267
1325
|
case 15:
|
|
1268
1326
|
case "end":
|
|
1269
|
-
return
|
|
1327
|
+
return _context14.stop();
|
|
1270
1328
|
}
|
|
1271
1329
|
}
|
|
1272
|
-
},
|
|
1330
|
+
}, _callee14, this);
|
|
1273
1331
|
}));
|
|
1274
1332
|
|
|
1275
|
-
function sessionClose(
|
|
1333
|
+
function sessionClose(_x18) {
|
|
1276
1334
|
return _sessionClose.apply(this, arguments);
|
|
1277
1335
|
}
|
|
1278
1336
|
|
|
@@ -1287,12 +1345,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1287
1345
|
}, {
|
|
1288
1346
|
key: "validateAuthChatRecord",
|
|
1289
1347
|
value: function () {
|
|
1290
|
-
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1348
|
+
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId, validateAuthChatRecordOptionalParams) {
|
|
1291
1349
|
var timer, authenticatedUserToken, chatId, endpoint, axiosInstance, headers, options, _response$data, response, elapsedTimeInMilliseconds, _this$logger, _this$logger2, _this$logger3, _elapsedTimeInMilliseconds8;
|
|
1292
1350
|
|
|
1293
|
-
return _regenerator["default"].wrap(function
|
|
1351
|
+
return _regenerator["default"].wrap(function _callee15$(_context15) {
|
|
1294
1352
|
while (1) {
|
|
1295
|
-
switch (
|
|
1353
|
+
switch (_context15.prev = _context15.next) {
|
|
1296
1354
|
case 0:
|
|
1297
1355
|
timer = _Timer.Timer.TIMER();
|
|
1298
1356
|
|
|
@@ -1319,16 +1377,16 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1319
1377
|
method: "GET",
|
|
1320
1378
|
url: endpoint
|
|
1321
1379
|
};
|
|
1322
|
-
|
|
1323
|
-
|
|
1380
|
+
_context15.prev = 9;
|
|
1381
|
+
_context15.next = 12;
|
|
1324
1382
|
return axiosInstance(options);
|
|
1325
1383
|
|
|
1326
1384
|
case 12:
|
|
1327
|
-
response =
|
|
1385
|
+
response = _context15.sent;
|
|
1328
1386
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1329
1387
|
|
|
1330
1388
|
if (!(((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true)) {
|
|
1331
|
-
|
|
1389
|
+
_context15.next = 19;
|
|
1332
1390
|
break;
|
|
1333
1391
|
}
|
|
1334
1392
|
|
|
@@ -1338,7 +1396,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1338
1396
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1339
1397
|
TransactionId: response.headers["transaction-id"]
|
|
1340
1398
|
}, "Validate Auth Chat Record Succeeded");
|
|
1341
|
-
return
|
|
1399
|
+
return _context15.abrupt("return", Promise.resolve(response.data));
|
|
1342
1400
|
|
|
1343
1401
|
case 19:
|
|
1344
1402
|
(_this$logger2 = this.logger) === null || _this$logger2 === void 0 ? void 0 : _this$logger2.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
|
|
@@ -1348,45 +1406,45 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1348
1406
|
TransactionId: response.headers["transaction-id"],
|
|
1349
1407
|
ErrorCode: response.status
|
|
1350
1408
|
}, "Validate Auth Chat Record Failed. Record is not found or request is not authorized");
|
|
1351
|
-
return
|
|
1409
|
+
return _context15.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
|
|
1352
1410
|
|
|
1353
1411
|
case 21:
|
|
1354
|
-
|
|
1412
|
+
_context15.next = 34;
|
|
1355
1413
|
break;
|
|
1356
1414
|
|
|
1357
1415
|
case 23:
|
|
1358
|
-
|
|
1359
|
-
|
|
1416
|
+
_context15.prev = 23;
|
|
1417
|
+
_context15.t0 = _context15["catch"](9);
|
|
1360
1418
|
_elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
|
|
1361
|
-
|
|
1362
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1419
|
+
_context15.next = 28;
|
|
1420
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context15.t0);
|
|
1363
1421
|
|
|
1364
1422
|
case 28:
|
|
1365
1423
|
(_this$logger3 = this.logger) === null || _this$logger3 === void 0 ? void 0 : _this$logger3.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
|
|
1366
1424
|
RequestId: requestId,
|
|
1367
|
-
ExceptionDetails:
|
|
1425
|
+
ExceptionDetails: _context15.t0,
|
|
1368
1426
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds8
|
|
1369
1427
|
}, "Validate Auth Chat Record Failed");
|
|
1370
1428
|
|
|
1371
|
-
if (!(
|
|
1372
|
-
|
|
1429
|
+
if (!(_context15.t0.toString() === "Error: Request failed with status code 404")) {
|
|
1430
|
+
_context15.next = 33;
|
|
1373
1431
|
break;
|
|
1374
1432
|
}
|
|
1375
1433
|
|
|
1376
|
-
return
|
|
1434
|
+
return _context15.abrupt("return", Promise.resolve({}));
|
|
1377
1435
|
|
|
1378
1436
|
case 33:
|
|
1379
|
-
return
|
|
1437
|
+
return _context15.abrupt("return", Promise.reject());
|
|
1380
1438
|
|
|
1381
1439
|
case 34:
|
|
1382
1440
|
case "end":
|
|
1383
|
-
return
|
|
1441
|
+
return _context15.stop();
|
|
1384
1442
|
}
|
|
1385
1443
|
}
|
|
1386
|
-
},
|
|
1444
|
+
}, _callee15, this, [[9, 23]]);
|
|
1387
1445
|
}));
|
|
1388
1446
|
|
|
1389
|
-
function validateAuthChatRecord(
|
|
1447
|
+
function validateAuthChatRecord(_x21, _x22) {
|
|
1390
1448
|
return _validateAuthChatRecord.apply(this, arguments);
|
|
1391
1449
|
}
|
|
1392
1450
|
|
|
@@ -1402,8 +1460,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1402
1460
|
}, {
|
|
1403
1461
|
key: "submitPostChatResponse",
|
|
1404
1462
|
value: function () {
|
|
1405
|
-
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1406
|
-
var
|
|
1463
|
+
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, postChatResponse) {
|
|
1464
|
+
var _this7 = this;
|
|
1407
1465
|
|
|
1408
1466
|
var submitPostChatResponseOptionalParams,
|
|
1409
1467
|
timer,
|
|
@@ -1412,12 +1470,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1412
1470
|
authenticatedUserToken,
|
|
1413
1471
|
headers,
|
|
1414
1472
|
options,
|
|
1415
|
-
|
|
1416
|
-
return _regenerator["default"].wrap(function
|
|
1473
|
+
_args17 = arguments;
|
|
1474
|
+
return _regenerator["default"].wrap(function _callee17$(_context17) {
|
|
1417
1475
|
while (1) {
|
|
1418
|
-
switch (
|
|
1476
|
+
switch (_context17.prev = _context17.next) {
|
|
1419
1477
|
case 0:
|
|
1420
|
-
submitPostChatResponseOptionalParams =
|
|
1478
|
+
submitPostChatResponseOptionalParams = _args17.length > 2 && _args17[2] !== undefined ? _args17[2] : {};
|
|
1421
1479
|
timer = _Timer.Timer.TIMER();
|
|
1422
1480
|
|
|
1423
1481
|
if (this.logger) {
|
|
@@ -1445,24 +1503,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1445
1503
|
method: "POST",
|
|
1446
1504
|
url: endpoint
|
|
1447
1505
|
};
|
|
1448
|
-
return
|
|
1449
|
-
var
|
|
1506
|
+
return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1507
|
+
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
|
|
1450
1508
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
|
|
1451
1509
|
|
|
1452
|
-
return _regenerator["default"].wrap(function
|
|
1510
|
+
return _regenerator["default"].wrap(function _callee16$(_context16) {
|
|
1453
1511
|
while (1) {
|
|
1454
|
-
switch (
|
|
1512
|
+
switch (_context16.prev = _context16.next) {
|
|
1455
1513
|
case 0:
|
|
1456
|
-
|
|
1457
|
-
|
|
1514
|
+
_context16.prev = 0;
|
|
1515
|
+
_context16.next = 3;
|
|
1458
1516
|
return axiosInstance(options);
|
|
1459
1517
|
|
|
1460
1518
|
case 3:
|
|
1461
|
-
response =
|
|
1519
|
+
response = _context16.sent;
|
|
1462
1520
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1463
1521
|
|
|
1464
|
-
if (
|
|
1465
|
-
|
|
1522
|
+
if (_this7.logger) {
|
|
1523
|
+
_this7.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, {
|
|
1466
1524
|
RequestId: requestId,
|
|
1467
1525
|
Region: response.data.Region,
|
|
1468
1526
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1471,26 +1529,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1471
1529
|
}
|
|
1472
1530
|
|
|
1473
1531
|
resolve();
|
|
1474
|
-
|
|
1532
|
+
_context16.next = 17;
|
|
1475
1533
|
break;
|
|
1476
1534
|
|
|
1477
1535
|
case 9:
|
|
1478
|
-
|
|
1479
|
-
|
|
1536
|
+
_context16.prev = 9;
|
|
1537
|
+
_context16.t0 = _context16["catch"](0);
|
|
1480
1538
|
_elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
|
|
1481
1539
|
|
|
1482
|
-
if (!
|
|
1483
|
-
|
|
1540
|
+
if (!_this7.logger) {
|
|
1541
|
+
_context16.next = 16;
|
|
1484
1542
|
break;
|
|
1485
1543
|
}
|
|
1486
1544
|
|
|
1487
|
-
|
|
1488
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1545
|
+
_context16.next = 15;
|
|
1546
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context16.t0);
|
|
1489
1547
|
|
|
1490
1548
|
case 15:
|
|
1491
|
-
|
|
1549
|
+
_this7.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, {
|
|
1492
1550
|
RequestId: requestId,
|
|
1493
|
-
ExceptionDetails:
|
|
1551
|
+
ExceptionDetails: _context16.t0,
|
|
1494
1552
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds9
|
|
1495
1553
|
}, "Submit Post Chat Failed");
|
|
1496
1554
|
|
|
@@ -1499,26 +1557,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1499
1557
|
|
|
1500
1558
|
case 17:
|
|
1501
1559
|
case "end":
|
|
1502
|
-
return
|
|
1560
|
+
return _context16.stop();
|
|
1503
1561
|
}
|
|
1504
1562
|
}
|
|
1505
|
-
},
|
|
1563
|
+
}, _callee16, null, [[0, 9]]);
|
|
1506
1564
|
}));
|
|
1507
1565
|
|
|
1508
|
-
return function (
|
|
1509
|
-
return
|
|
1566
|
+
return function (_x25, _x26) {
|
|
1567
|
+
return _ref7.apply(this, arguments);
|
|
1510
1568
|
};
|
|
1511
1569
|
}()));
|
|
1512
1570
|
|
|
1513
1571
|
case 11:
|
|
1514
1572
|
case "end":
|
|
1515
|
-
return
|
|
1573
|
+
return _context17.stop();
|
|
1516
1574
|
}
|
|
1517
1575
|
}
|
|
1518
|
-
},
|
|
1576
|
+
}, _callee17, this);
|
|
1519
1577
|
}));
|
|
1520
1578
|
|
|
1521
|
-
function submitPostChatResponse(
|
|
1579
|
+
function submitPostChatResponse(_x23, _x24) {
|
|
1522
1580
|
return _submitPostChatResponse.apply(this, arguments);
|
|
1523
1581
|
}
|
|
1524
1582
|
|
|
@@ -1534,8 +1592,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1534
1592
|
}, {
|
|
1535
1593
|
key: "getSurveyInviteLink",
|
|
1536
1594
|
value: function () {
|
|
1537
|
-
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1538
|
-
var
|
|
1595
|
+
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(surveyOwnerId, surveyInviteAPIRequestBody) {
|
|
1596
|
+
var _this8 = this;
|
|
1539
1597
|
|
|
1540
1598
|
var getsurveyInviteLinkOptionalParams,
|
|
1541
1599
|
timer,
|
|
@@ -1545,12 +1603,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1545
1603
|
requestId,
|
|
1546
1604
|
headers,
|
|
1547
1605
|
options,
|
|
1548
|
-
|
|
1549
|
-
return _regenerator["default"].wrap(function
|
|
1606
|
+
_args19 = arguments;
|
|
1607
|
+
return _regenerator["default"].wrap(function _callee19$(_context19) {
|
|
1550
1608
|
while (1) {
|
|
1551
|
-
switch (
|
|
1609
|
+
switch (_context19.prev = _context19.next) {
|
|
1552
1610
|
case 0:
|
|
1553
|
-
getsurveyInviteLinkOptionalParams =
|
|
1611
|
+
getsurveyInviteLinkOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
|
|
1554
1612
|
timer = _Timer.Timer.TIMER();
|
|
1555
1613
|
|
|
1556
1614
|
if (this.logger) {
|
|
@@ -1583,25 +1641,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1583
1641
|
method: "POST",
|
|
1584
1642
|
url: endpoint
|
|
1585
1643
|
};
|
|
1586
|
-
return
|
|
1587
|
-
var
|
|
1644
|
+
return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1645
|
+
var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
|
|
1588
1646
|
var response, data, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
|
|
1589
1647
|
|
|
1590
|
-
return _regenerator["default"].wrap(function
|
|
1648
|
+
return _regenerator["default"].wrap(function _callee18$(_context18) {
|
|
1591
1649
|
while (1) {
|
|
1592
|
-
switch (
|
|
1650
|
+
switch (_context18.prev = _context18.next) {
|
|
1593
1651
|
case 0:
|
|
1594
|
-
|
|
1595
|
-
|
|
1652
|
+
_context18.prev = 0;
|
|
1653
|
+
_context18.next = 3;
|
|
1596
1654
|
return axiosInstance(options);
|
|
1597
1655
|
|
|
1598
1656
|
case 3:
|
|
1599
|
-
response =
|
|
1657
|
+
response = _context18.sent;
|
|
1600
1658
|
data = response.data;
|
|
1601
1659
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1602
1660
|
|
|
1603
|
-
if (
|
|
1604
|
-
|
|
1661
|
+
if (_this8.logger) {
|
|
1662
|
+
_this8.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, {
|
|
1605
1663
|
Region: response.data.Region,
|
|
1606
1664
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1607
1665
|
TransactionId: response.headers["transaction-id"]
|
|
@@ -1609,25 +1667,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1609
1667
|
}
|
|
1610
1668
|
|
|
1611
1669
|
resolve(data);
|
|
1612
|
-
|
|
1670
|
+
_context18.next = 18;
|
|
1613
1671
|
break;
|
|
1614
1672
|
|
|
1615
1673
|
case 10:
|
|
1616
|
-
|
|
1617
|
-
|
|
1674
|
+
_context18.prev = 10;
|
|
1675
|
+
_context18.t0 = _context18["catch"](0);
|
|
1618
1676
|
_elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
|
|
1619
1677
|
|
|
1620
|
-
if (!
|
|
1621
|
-
|
|
1678
|
+
if (!_this8.logger) {
|
|
1679
|
+
_context18.next = 17;
|
|
1622
1680
|
break;
|
|
1623
1681
|
}
|
|
1624
1682
|
|
|
1625
|
-
|
|
1626
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1683
|
+
_context18.next = 16;
|
|
1684
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context18.t0);
|
|
1627
1685
|
|
|
1628
1686
|
case 16:
|
|
1629
|
-
|
|
1630
|
-
ExceptionDetails:
|
|
1687
|
+
_this8.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, {
|
|
1688
|
+
ExceptionDetails: _context18.t0,
|
|
1631
1689
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds10
|
|
1632
1690
|
}, "Get Survey Invite Link Failed");
|
|
1633
1691
|
|
|
@@ -1636,26 +1694,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1636
1694
|
|
|
1637
1695
|
case 18:
|
|
1638
1696
|
case "end":
|
|
1639
|
-
return
|
|
1697
|
+
return _context18.stop();
|
|
1640
1698
|
}
|
|
1641
1699
|
}
|
|
1642
|
-
},
|
|
1700
|
+
}, _callee18, null, [[0, 10]]);
|
|
1643
1701
|
}));
|
|
1644
1702
|
|
|
1645
|
-
return function (
|
|
1646
|
-
return
|
|
1703
|
+
return function (_x29, _x30) {
|
|
1704
|
+
return _ref8.apply(this, arguments);
|
|
1647
1705
|
};
|
|
1648
1706
|
}()));
|
|
1649
1707
|
|
|
1650
1708
|
case 12:
|
|
1651
1709
|
case "end":
|
|
1652
|
-
return
|
|
1710
|
+
return _context19.stop();
|
|
1653
1711
|
}
|
|
1654
1712
|
}
|
|
1655
|
-
},
|
|
1713
|
+
}, _callee19, this);
|
|
1656
1714
|
}));
|
|
1657
1715
|
|
|
1658
|
-
function getSurveyInviteLink(
|
|
1716
|
+
function getSurveyInviteLink(_x27, _x28) {
|
|
1659
1717
|
return _getSurveyInviteLink.apply(this, arguments);
|
|
1660
1718
|
}
|
|
1661
1719
|
|
|
@@ -1672,8 +1730,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1672
1730
|
}, {
|
|
1673
1731
|
key: "getChatTranscripts",
|
|
1674
1732
|
value: function () {
|
|
1675
|
-
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1676
|
-
var
|
|
1733
|
+
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(requestId, chatId, token) {
|
|
1734
|
+
var _this9 = this;
|
|
1677
1735
|
|
|
1678
1736
|
var getChatTranscriptsOptionalParams,
|
|
1679
1737
|
timer,
|
|
@@ -1683,12 +1741,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1683
1741
|
currentLiveChatVersion,
|
|
1684
1742
|
headers,
|
|
1685
1743
|
options,
|
|
1686
|
-
|
|
1687
|
-
return _regenerator["default"].wrap(function
|
|
1744
|
+
_args21 = arguments;
|
|
1745
|
+
return _regenerator["default"].wrap(function _callee21$(_context21) {
|
|
1688
1746
|
while (1) {
|
|
1689
|
-
switch (
|
|
1747
|
+
switch (_context21.prev = _context21.next) {
|
|
1690
1748
|
case 0:
|
|
1691
|
-
getChatTranscriptsOptionalParams =
|
|
1749
|
+
getChatTranscriptsOptionalParams = _args21.length > 3 && _args21[3] !== undefined ? _args21[3] : {};
|
|
1692
1750
|
timer = _Timer.Timer.TIMER();
|
|
1693
1751
|
|
|
1694
1752
|
if (this.logger) {
|
|
@@ -1723,25 +1781,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1723
1781
|
method: "GET",
|
|
1724
1782
|
url: endpoint
|
|
1725
1783
|
};
|
|
1726
|
-
return
|
|
1727
|
-
var
|
|
1784
|
+
return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1785
|
+
var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
|
|
1728
1786
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds11;
|
|
1729
1787
|
|
|
1730
|
-
return _regenerator["default"].wrap(function
|
|
1788
|
+
return _regenerator["default"].wrap(function _callee20$(_context20) {
|
|
1731
1789
|
while (1) {
|
|
1732
|
-
switch (
|
|
1790
|
+
switch (_context20.prev = _context20.next) {
|
|
1733
1791
|
case 0:
|
|
1734
|
-
|
|
1735
|
-
|
|
1792
|
+
_context20.prev = 0;
|
|
1793
|
+
_context20.next = 3;
|
|
1736
1794
|
return axiosInstance(options);
|
|
1737
1795
|
|
|
1738
1796
|
case 3:
|
|
1739
|
-
response =
|
|
1797
|
+
response = _context20.sent;
|
|
1740
1798
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1741
1799
|
data = response.data;
|
|
1742
1800
|
|
|
1743
|
-
if (
|
|
1744
|
-
|
|
1801
|
+
if (_this9.logger) {
|
|
1802
|
+
_this9.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, {
|
|
1745
1803
|
RequestId: requestId,
|
|
1746
1804
|
Region: response.data.Region,
|
|
1747
1805
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1750,54 +1808,54 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1750
1808
|
}
|
|
1751
1809
|
|
|
1752
1810
|
resolve(data);
|
|
1753
|
-
|
|
1811
|
+
_context20.next = 18;
|
|
1754
1812
|
break;
|
|
1755
1813
|
|
|
1756
1814
|
case 10:
|
|
1757
|
-
|
|
1758
|
-
|
|
1815
|
+
_context20.prev = 10;
|
|
1816
|
+
_context20.t0 = _context20["catch"](0);
|
|
1759
1817
|
_elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
|
|
1760
1818
|
|
|
1761
|
-
if (!
|
|
1762
|
-
|
|
1819
|
+
if (!_this9.logger) {
|
|
1820
|
+
_context20.next = 17;
|
|
1763
1821
|
break;
|
|
1764
1822
|
}
|
|
1765
1823
|
|
|
1766
|
-
|
|
1767
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1824
|
+
_context20.next = 16;
|
|
1825
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context20.t0);
|
|
1768
1826
|
|
|
1769
1827
|
case 16:
|
|
1770
|
-
|
|
1828
|
+
_this9.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, {
|
|
1771
1829
|
RequestId: requestId,
|
|
1772
|
-
ExceptionDetails:
|
|
1830
|
+
ExceptionDetails: _context20.t0,
|
|
1773
1831
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds11
|
|
1774
1832
|
}, "Get Chat Transcript Failed");
|
|
1775
1833
|
|
|
1776
1834
|
case 17:
|
|
1777
|
-
reject(
|
|
1835
|
+
reject(_context20.t0);
|
|
1778
1836
|
|
|
1779
1837
|
case 18:
|
|
1780
1838
|
case "end":
|
|
1781
|
-
return
|
|
1839
|
+
return _context20.stop();
|
|
1782
1840
|
}
|
|
1783
1841
|
}
|
|
1784
|
-
},
|
|
1842
|
+
}, _callee20, null, [[0, 10]]);
|
|
1785
1843
|
}));
|
|
1786
1844
|
|
|
1787
|
-
return function (
|
|
1788
|
-
return
|
|
1845
|
+
return function (_x34, _x35) {
|
|
1846
|
+
return _ref9.apply(this, arguments);
|
|
1789
1847
|
};
|
|
1790
1848
|
}()));
|
|
1791
1849
|
|
|
1792
1850
|
case 14:
|
|
1793
1851
|
case "end":
|
|
1794
|
-
return
|
|
1852
|
+
return _context21.stop();
|
|
1795
1853
|
}
|
|
1796
1854
|
}
|
|
1797
|
-
},
|
|
1855
|
+
}, _callee21, this);
|
|
1798
1856
|
}));
|
|
1799
1857
|
|
|
1800
|
-
function getChatTranscripts(
|
|
1858
|
+
function getChatTranscripts(_x31, _x32, _x33) {
|
|
1801
1859
|
return _getChatTranscripts.apply(this, arguments);
|
|
1802
1860
|
}
|
|
1803
1861
|
|
|
@@ -1814,8 +1872,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1814
1872
|
}, {
|
|
1815
1873
|
key: "emailTranscript",
|
|
1816
1874
|
value: function () {
|
|
1817
|
-
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1818
|
-
var
|
|
1875
|
+
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, token, emailRequestBody) {
|
|
1876
|
+
var _this10 = this;
|
|
1819
1877
|
|
|
1820
1878
|
var emailTranscriptOptionalParams,
|
|
1821
1879
|
timer,
|
|
@@ -1824,12 +1882,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1824
1882
|
authenticatedUserToken,
|
|
1825
1883
|
headers,
|
|
1826
1884
|
options,
|
|
1827
|
-
|
|
1828
|
-
return _regenerator["default"].wrap(function
|
|
1885
|
+
_args23 = arguments;
|
|
1886
|
+
return _regenerator["default"].wrap(function _callee23$(_context23) {
|
|
1829
1887
|
while (1) {
|
|
1830
|
-
switch (
|
|
1888
|
+
switch (_context23.prev = _context23.next) {
|
|
1831
1889
|
case 0:
|
|
1832
|
-
emailTranscriptOptionalParams =
|
|
1890
|
+
emailTranscriptOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
|
|
1833
1891
|
timer = _Timer.Timer.TIMER();
|
|
1834
1892
|
|
|
1835
1893
|
if (this.logger) {
|
|
@@ -1859,24 +1917,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1859
1917
|
method: "POST",
|
|
1860
1918
|
url: endpoint
|
|
1861
1919
|
};
|
|
1862
|
-
return
|
|
1863
|
-
var
|
|
1920
|
+
return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1921
|
+
var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
|
|
1864
1922
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
|
|
1865
1923
|
|
|
1866
|
-
return _regenerator["default"].wrap(function
|
|
1924
|
+
return _regenerator["default"].wrap(function _callee22$(_context22) {
|
|
1867
1925
|
while (1) {
|
|
1868
|
-
switch (
|
|
1926
|
+
switch (_context22.prev = _context22.next) {
|
|
1869
1927
|
case 0:
|
|
1870
|
-
|
|
1871
|
-
|
|
1928
|
+
_context22.prev = 0;
|
|
1929
|
+
_context22.next = 3;
|
|
1872
1930
|
return axiosInstance(options);
|
|
1873
1931
|
|
|
1874
1932
|
case 3:
|
|
1875
|
-
response =
|
|
1933
|
+
response = _context22.sent;
|
|
1876
1934
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1877
1935
|
|
|
1878
|
-
if (
|
|
1879
|
-
|
|
1936
|
+
if (_this10.logger) {
|
|
1937
|
+
_this10.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, {
|
|
1880
1938
|
RequestId: requestId,
|
|
1881
1939
|
Region: response.data.Region,
|
|
1882
1940
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1885,26 +1943,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1885
1943
|
}
|
|
1886
1944
|
|
|
1887
1945
|
resolve();
|
|
1888
|
-
|
|
1946
|
+
_context22.next = 17;
|
|
1889
1947
|
break;
|
|
1890
1948
|
|
|
1891
1949
|
case 9:
|
|
1892
|
-
|
|
1893
|
-
|
|
1950
|
+
_context22.prev = 9;
|
|
1951
|
+
_context22.t0 = _context22["catch"](0);
|
|
1894
1952
|
_elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
|
|
1895
1953
|
|
|
1896
|
-
if (!
|
|
1897
|
-
|
|
1954
|
+
if (!_this10.logger) {
|
|
1955
|
+
_context22.next = 16;
|
|
1898
1956
|
break;
|
|
1899
1957
|
}
|
|
1900
1958
|
|
|
1901
|
-
|
|
1902
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1959
|
+
_context22.next = 15;
|
|
1960
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context22.t0);
|
|
1903
1961
|
|
|
1904
1962
|
case 15:
|
|
1905
|
-
|
|
1963
|
+
_this10.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, {
|
|
1906
1964
|
RequestId: requestId,
|
|
1907
|
-
ExceptionDetails:
|
|
1965
|
+
ExceptionDetails: _context22.t0,
|
|
1908
1966
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds12
|
|
1909
1967
|
}, "Email Transcript Failed");
|
|
1910
1968
|
|
|
@@ -1913,26 +1971,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1913
1971
|
|
|
1914
1972
|
case 17:
|
|
1915
1973
|
case "end":
|
|
1916
|
-
return
|
|
1974
|
+
return _context22.stop();
|
|
1917
1975
|
}
|
|
1918
1976
|
}
|
|
1919
|
-
},
|
|
1977
|
+
}, _callee22, null, [[0, 9]]);
|
|
1920
1978
|
}));
|
|
1921
1979
|
|
|
1922
|
-
return function (
|
|
1923
|
-
return
|
|
1980
|
+
return function (_x39, _x40) {
|
|
1981
|
+
return _ref10.apply(this, arguments);
|
|
1924
1982
|
};
|
|
1925
1983
|
}()));
|
|
1926
1984
|
|
|
1927
1985
|
case 14:
|
|
1928
1986
|
case "end":
|
|
1929
|
-
return
|
|
1987
|
+
return _context23.stop();
|
|
1930
1988
|
}
|
|
1931
1989
|
}
|
|
1932
|
-
},
|
|
1990
|
+
}, _callee23, this);
|
|
1933
1991
|
}));
|
|
1934
1992
|
|
|
1935
|
-
function emailTranscript(
|
|
1993
|
+
function emailTranscript(_x36, _x37, _x38) {
|
|
1936
1994
|
return _emailTranscript.apply(this, arguments);
|
|
1937
1995
|
}
|
|
1938
1996
|
|
|
@@ -1946,13 +2004,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1946
2004
|
}, {
|
|
1947
2005
|
key: "fetchDataMaskingInfo",
|
|
1948
2006
|
value: function () {
|
|
1949
|
-
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1950
|
-
var
|
|
2007
|
+
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId) {
|
|
2008
|
+
var _this11 = this;
|
|
1951
2009
|
|
|
1952
2010
|
var timer, endpoint, axiosInstance, headers, options;
|
|
1953
|
-
return _regenerator["default"].wrap(function
|
|
2011
|
+
return _regenerator["default"].wrap(function _callee25$(_context25) {
|
|
1954
2012
|
while (1) {
|
|
1955
|
-
switch (
|
|
2013
|
+
switch (_context25.prev = _context25.next) {
|
|
1956
2014
|
case 0:
|
|
1957
2015
|
timer = _Timer.Timer.TIMER();
|
|
1958
2016
|
|
|
@@ -1979,25 +2037,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1979
2037
|
method: "GET",
|
|
1980
2038
|
url: endpoint
|
|
1981
2039
|
};
|
|
1982
|
-
return
|
|
1983
|
-
var
|
|
2040
|
+
return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2041
|
+
var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
|
|
1984
2042
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds13;
|
|
1985
2043
|
|
|
1986
|
-
return _regenerator["default"].wrap(function
|
|
2044
|
+
return _regenerator["default"].wrap(function _callee24$(_context24) {
|
|
1987
2045
|
while (1) {
|
|
1988
|
-
switch (
|
|
2046
|
+
switch (_context24.prev = _context24.next) {
|
|
1989
2047
|
case 0:
|
|
1990
|
-
|
|
1991
|
-
|
|
2048
|
+
_context24.prev = 0;
|
|
2049
|
+
_context24.next = 3;
|
|
1992
2050
|
return axiosInstance(options);
|
|
1993
2051
|
|
|
1994
2052
|
case 3:
|
|
1995
|
-
response =
|
|
2053
|
+
response = _context24.sent;
|
|
1996
2054
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1997
2055
|
data = response.data;
|
|
1998
2056
|
|
|
1999
|
-
if (
|
|
2000
|
-
|
|
2057
|
+
if (_this11.logger) {
|
|
2058
|
+
_this11.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, {
|
|
2001
2059
|
RequestId: requestId,
|
|
2002
2060
|
Region: response.data.Region,
|
|
2003
2061
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -2006,26 +2064,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2006
2064
|
}
|
|
2007
2065
|
|
|
2008
2066
|
resolve(data);
|
|
2009
|
-
|
|
2067
|
+
_context24.next = 18;
|
|
2010
2068
|
break;
|
|
2011
2069
|
|
|
2012
2070
|
case 10:
|
|
2013
|
-
|
|
2014
|
-
|
|
2071
|
+
_context24.prev = 10;
|
|
2072
|
+
_context24.t0 = _context24["catch"](0);
|
|
2015
2073
|
_elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
|
|
2016
2074
|
|
|
2017
|
-
if (!
|
|
2018
|
-
|
|
2075
|
+
if (!_this11.logger) {
|
|
2076
|
+
_context24.next = 17;
|
|
2019
2077
|
break;
|
|
2020
2078
|
}
|
|
2021
2079
|
|
|
2022
|
-
|
|
2023
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2080
|
+
_context24.next = 16;
|
|
2081
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context24.t0);
|
|
2024
2082
|
|
|
2025
2083
|
case 16:
|
|
2026
|
-
|
|
2084
|
+
_this11.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, {
|
|
2027
2085
|
RequestId: requestId,
|
|
2028
|
-
ExceptionDetails:
|
|
2086
|
+
ExceptionDetails: _context24.t0,
|
|
2029
2087
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds13
|
|
2030
2088
|
}, "Fetch Data Masking Failed");
|
|
2031
2089
|
|
|
@@ -2034,26 +2092,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2034
2092
|
|
|
2035
2093
|
case 18:
|
|
2036
2094
|
case "end":
|
|
2037
|
-
return
|
|
2095
|
+
return _context24.stop();
|
|
2038
2096
|
}
|
|
2039
2097
|
}
|
|
2040
|
-
},
|
|
2098
|
+
}, _callee24, null, [[0, 10]]);
|
|
2041
2099
|
}));
|
|
2042
2100
|
|
|
2043
|
-
return function (
|
|
2044
|
-
return
|
|
2101
|
+
return function (_x42, _x43) {
|
|
2102
|
+
return _ref11.apply(this, arguments);
|
|
2045
2103
|
};
|
|
2046
2104
|
}()));
|
|
2047
2105
|
|
|
2048
2106
|
case 11:
|
|
2049
2107
|
case "end":
|
|
2050
|
-
return
|
|
2108
|
+
return _context25.stop();
|
|
2051
2109
|
}
|
|
2052
2110
|
}
|
|
2053
|
-
},
|
|
2111
|
+
}, _callee25, this);
|
|
2054
2112
|
}));
|
|
2055
2113
|
|
|
2056
|
-
function fetchDataMaskingInfo(
|
|
2114
|
+
function fetchDataMaskingInfo(_x41) {
|
|
2057
2115
|
return _fetchDataMaskingInfo.apply(this, arguments);
|
|
2058
2116
|
}
|
|
2059
2117
|
|
|
@@ -2069,7 +2127,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2069
2127
|
}, {
|
|
2070
2128
|
key: "makeSecondaryChannelEventRequest",
|
|
2071
2129
|
value: function () {
|
|
2072
|
-
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
2130
|
+
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(requestId, secondaryChannelEventRequestBody) {
|
|
2073
2131
|
var secondaryChannelEventOptionalParams,
|
|
2074
2132
|
timer,
|
|
2075
2133
|
endpoint,
|
|
@@ -2081,13 +2139,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2081
2139
|
elapsedTimeInMilliseconds,
|
|
2082
2140
|
data,
|
|
2083
2141
|
_elapsedTimeInMilliseconds14,
|
|
2084
|
-
|
|
2142
|
+
_args26 = arguments;
|
|
2085
2143
|
|
|
2086
|
-
return _regenerator["default"].wrap(function
|
|
2144
|
+
return _regenerator["default"].wrap(function _callee26$(_context26) {
|
|
2087
2145
|
while (1) {
|
|
2088
|
-
switch (
|
|
2146
|
+
switch (_context26.prev = _context26.next) {
|
|
2089
2147
|
case 0:
|
|
2090
|
-
secondaryChannelEventOptionalParams =
|
|
2148
|
+
secondaryChannelEventOptionalParams = _args26.length > 2 && _args26[2] !== undefined ? _args26[2] : {};
|
|
2091
2149
|
timer = _Timer.Timer.TIMER();
|
|
2092
2150
|
|
|
2093
2151
|
if (this.logger) {
|
|
@@ -2117,12 +2175,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2117
2175
|
method: "POST",
|
|
2118
2176
|
url: endpoint
|
|
2119
2177
|
};
|
|
2120
|
-
|
|
2121
|
-
|
|
2178
|
+
_context26.prev = 12;
|
|
2179
|
+
_context26.next = 15;
|
|
2122
2180
|
return axiosInstance(options);
|
|
2123
2181
|
|
|
2124
2182
|
case 15:
|
|
2125
|
-
response =
|
|
2183
|
+
response = _context26.sent;
|
|
2126
2184
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2127
2185
|
data = response.data;
|
|
2128
2186
|
|
|
@@ -2135,41 +2193,41 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2135
2193
|
}, "Secondary Channel Event Request Succeeded");
|
|
2136
2194
|
}
|
|
2137
2195
|
|
|
2138
|
-
|
|
2196
|
+
_context26.next = 29;
|
|
2139
2197
|
break;
|
|
2140
2198
|
|
|
2141
2199
|
case 21:
|
|
2142
|
-
|
|
2143
|
-
|
|
2200
|
+
_context26.prev = 21;
|
|
2201
|
+
_context26.t0 = _context26["catch"](12);
|
|
2144
2202
|
_elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
|
|
2145
2203
|
|
|
2146
2204
|
if (!this.logger) {
|
|
2147
|
-
|
|
2205
|
+
_context26.next = 28;
|
|
2148
2206
|
break;
|
|
2149
2207
|
}
|
|
2150
2208
|
|
|
2151
|
-
|
|
2152
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2209
|
+
_context26.next = 27;
|
|
2210
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context26.t0);
|
|
2153
2211
|
|
|
2154
2212
|
case 27:
|
|
2155
2213
|
this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, {
|
|
2156
2214
|
RequestId: requestId,
|
|
2157
|
-
ExceptionDetails:
|
|
2215
|
+
ExceptionDetails: _context26.t0,
|
|
2158
2216
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds14
|
|
2159
2217
|
}, "Secondary Channel Event Request Failed");
|
|
2160
2218
|
|
|
2161
2219
|
case 28:
|
|
2162
|
-
throw
|
|
2220
|
+
throw _context26.t0;
|
|
2163
2221
|
|
|
2164
2222
|
case 29:
|
|
2165
2223
|
case "end":
|
|
2166
|
-
return
|
|
2224
|
+
return _context26.stop();
|
|
2167
2225
|
}
|
|
2168
2226
|
}
|
|
2169
|
-
},
|
|
2227
|
+
}, _callee26, this, [[12, 21]]);
|
|
2170
2228
|
}));
|
|
2171
2229
|
|
|
2172
|
-
function makeSecondaryChannelEventRequest(
|
|
2230
|
+
function makeSecondaryChannelEventRequest(_x44, _x45) {
|
|
2173
2231
|
return _makeSecondaryChannelEventRequest.apply(this, arguments);
|
|
2174
2232
|
}
|
|
2175
2233
|
|
|
@@ -2182,8 +2240,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2182
2240
|
}, {
|
|
2183
2241
|
key: "sendTypingIndicator",
|
|
2184
2242
|
value: function () {
|
|
2185
|
-
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
2186
|
-
var
|
|
2243
|
+
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(requestId, currentLiveChatVersion) {
|
|
2244
|
+
var _this12 = this;
|
|
2187
2245
|
|
|
2188
2246
|
var sendTypingIndicatorOptionalParams,
|
|
2189
2247
|
timer,
|
|
@@ -2192,26 +2250,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2192
2250
|
axiosInstance,
|
|
2193
2251
|
headers,
|
|
2194
2252
|
options,
|
|
2195
|
-
|
|
2196
|
-
return _regenerator["default"].wrap(function
|
|
2253
|
+
_args28 = arguments;
|
|
2254
|
+
return _regenerator["default"].wrap(function _callee28$(_context28) {
|
|
2197
2255
|
while (1) {
|
|
2198
|
-
switch (
|
|
2256
|
+
switch (_context28.prev = _context28.next) {
|
|
2199
2257
|
case 0:
|
|
2200
|
-
sendTypingIndicatorOptionalParams =
|
|
2258
|
+
sendTypingIndicatorOptionalParams = _args28.length > 2 && _args28[2] !== undefined ? _args28[2] : {};
|
|
2201
2259
|
|
|
2202
2260
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2203
|
-
|
|
2261
|
+
_context28.next = 3;
|
|
2204
2262
|
break;
|
|
2205
2263
|
}
|
|
2206
2264
|
|
|
2207
|
-
return
|
|
2265
|
+
return _context28.abrupt("return", Promise.resolve());
|
|
2208
2266
|
|
|
2209
2267
|
case 3:
|
|
2210
2268
|
timer = _Timer.Timer.TIMER();
|
|
2211
2269
|
customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
|
|
2212
2270
|
|
|
2213
2271
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2214
|
-
|
|
2272
|
+
_context28.next = 7;
|
|
2215
2273
|
break;
|
|
2216
2274
|
}
|
|
2217
2275
|
|
|
@@ -2232,25 +2290,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2232
2290
|
method: "POST",
|
|
2233
2291
|
url: endpoint
|
|
2234
2292
|
};
|
|
2235
|
-
return
|
|
2236
|
-
var
|
|
2293
|
+
return _context28.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2294
|
+
var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(resolve, reject) {
|
|
2237
2295
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds15;
|
|
2238
2296
|
|
|
2239
|
-
return _regenerator["default"].wrap(function
|
|
2297
|
+
return _regenerator["default"].wrap(function _callee27$(_context27) {
|
|
2240
2298
|
while (1) {
|
|
2241
|
-
switch (
|
|
2299
|
+
switch (_context27.prev = _context27.next) {
|
|
2242
2300
|
case 0:
|
|
2243
|
-
|
|
2244
|
-
|
|
2301
|
+
_context27.prev = 0;
|
|
2302
|
+
_context27.next = 3;
|
|
2245
2303
|
return axiosInstance(options);
|
|
2246
2304
|
|
|
2247
2305
|
case 3:
|
|
2248
|
-
response =
|
|
2306
|
+
response = _context27.sent;
|
|
2249
2307
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2250
2308
|
data = response.data;
|
|
2251
2309
|
|
|
2252
|
-
if (
|
|
2253
|
-
|
|
2310
|
+
if (_this12.logger) {
|
|
2311
|
+
_this12.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, {
|
|
2254
2312
|
RequestId: requestId,
|
|
2255
2313
|
Region: data.Region,
|
|
2256
2314
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -2259,54 +2317,54 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2259
2317
|
}
|
|
2260
2318
|
|
|
2261
2319
|
resolve();
|
|
2262
|
-
|
|
2320
|
+
_context27.next = 18;
|
|
2263
2321
|
break;
|
|
2264
2322
|
|
|
2265
2323
|
case 10:
|
|
2266
|
-
|
|
2267
|
-
|
|
2324
|
+
_context27.prev = 10;
|
|
2325
|
+
_context27.t0 = _context27["catch"](0);
|
|
2268
2326
|
_elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
|
|
2269
2327
|
|
|
2270
|
-
if (!
|
|
2271
|
-
|
|
2328
|
+
if (!_this12.logger) {
|
|
2329
|
+
_context27.next = 17;
|
|
2272
2330
|
break;
|
|
2273
2331
|
}
|
|
2274
2332
|
|
|
2275
|
-
|
|
2276
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2333
|
+
_context27.next = 16;
|
|
2334
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context27.t0);
|
|
2277
2335
|
|
|
2278
2336
|
case 16:
|
|
2279
|
-
|
|
2337
|
+
_this12.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, {
|
|
2280
2338
|
RequestId: requestId,
|
|
2281
|
-
ExceptionDetails:
|
|
2339
|
+
ExceptionDetails: _context27.t0,
|
|
2282
2340
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds15
|
|
2283
2341
|
}, "Send Typing Indicator Failed");
|
|
2284
2342
|
|
|
2285
2343
|
case 17:
|
|
2286
|
-
reject(
|
|
2344
|
+
reject(_context27.t0);
|
|
2287
2345
|
|
|
2288
2346
|
case 18:
|
|
2289
2347
|
case "end":
|
|
2290
|
-
return
|
|
2348
|
+
return _context27.stop();
|
|
2291
2349
|
}
|
|
2292
2350
|
}
|
|
2293
|
-
},
|
|
2351
|
+
}, _callee27, null, [[0, 10]]);
|
|
2294
2352
|
}));
|
|
2295
2353
|
|
|
2296
|
-
return function (
|
|
2297
|
-
return
|
|
2354
|
+
return function (_x48, _x49) {
|
|
2355
|
+
return _ref12.apply(this, arguments);
|
|
2298
2356
|
};
|
|
2299
2357
|
}()));
|
|
2300
2358
|
|
|
2301
2359
|
case 14:
|
|
2302
2360
|
case "end":
|
|
2303
|
-
return
|
|
2361
|
+
return _context28.stop();
|
|
2304
2362
|
}
|
|
2305
2363
|
}
|
|
2306
|
-
},
|
|
2364
|
+
}, _callee28, this);
|
|
2307
2365
|
}));
|
|
2308
2366
|
|
|
2309
|
-
function sendTypingIndicator(
|
|
2367
|
+
function sendTypingIndicator(_x46, _x47) {
|
|
2310
2368
|
return _sendTypingIndicator.apply(this, arguments);
|
|
2311
2369
|
}
|
|
2312
2370
|
|
|
@@ -2322,4 +2380,4 @@ exports["default"] = SDK;
|
|
|
2322
2380
|
getChatTokenTimeBetweenRetriesOnFailure: 10000,
|
|
2323
2381
|
maxRequestRetriesOnFailure: 3
|
|
2324
2382
|
});
|
|
2325
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUUVVFVUVBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0UXVldWVBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0Iiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJHRVRRVUVVRUFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVFFVRVVFQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwiRXJyb3JDb2RlIiwidG9TdHJpbmciLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJKU09OIiwic3RyaW5naWZ5IiwiU1VCTUlUUE9TVENIQVRTVUNDRUVERUQiLCJTVUJNSVRQT1NUQ0hBVEZBSUxFRCIsInN1cnZleU93bmVySWQiLCJzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSIsImdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJGRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVEIiwiRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7SUFFcUJBLEc7QUFTbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBLFFBQTNGQyxhQUEyRix1RUFBeERGLEdBQUcsQ0FBQ0csb0JBQW9EO0FBQUEsUUFBdEJDLE1BQXNCO0FB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Ly8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNESyBpbXBsZW1lbnRzIElTREsge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMzUsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogM1xuICB9O1xuICBcbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb21uaWNoYW5uZWxDb25maWd1cmF0aW9uOiBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uLCBwcml2YXRlIGNvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uLCBwcml2YXRlIGxvZ2dlcj86IE9DU0RLTG9nZ2VyKSB7XG4gICAgLy8gU2V0cyB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgcGFzc2VkIGNvbmZpZ3VyYXRpb24gaXMgZW1wdHkgb3IgaXMgbm90IGFuIG9iamVjdFxuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5jb25maWd1cmF0aW9uKS5sZW5ndGggfHwgdHlwZW9mIChjb25maWd1cmF0aW9uKSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIFNESyBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBTREtDb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUcsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWR9LFxuICAgICAgICBcIkdldCBDaGF0IENvbmZpZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldChlbmRwb2ludCwge1xuICAgICAgaGVhZGVycyxcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbiAmJiBkYXRhLkxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cbiAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzOyAgXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gU3VjY2VlZGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZSBjYXNlXG4gICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgKyAxID49IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50KSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSByZXRyeSBmb3IgZ2V0Y2hhdHRva2VuIGhhcyBleGNlZWRlZCBpdHMgbWF4IHZhbHVlIG9mICR7dGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnR9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHJpZXMgdW50aWwgaXQgcmVhY2hlcyBpdHMgbGltaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldENoYXRUb2tlbihyZXF1ZXN0SWQsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLCBjdXJyZW50UmV0cnlDb3VudCArIDEpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNvbHZlKHJlc3BvbnNlKSkuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcbiAgICAgIH0sIHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgIHsgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuV0FSTixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFF1ZXVlQXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFFVRVVFQVZBSUxBQklMSVRZU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBxdWV1ZSBhdmFpbGFiaWxpdHkgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRRdWV1ZUF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHthdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHtkYXRhfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRRVUVVRUFWQUlMQUJJTElUWVNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IHF1ZXVlIGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFFVRVVFQVZBSUxBQklMSVRZRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgcXVldWUgYXZhaWxhYmlsaXR5IGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlNlc3Npb24gSW5pdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUmVjb25uZWN0Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCl7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YT8uYXV0aENoYXRFeGlzdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdWNjZWVkZWRcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSwgRXJyb3JDb2RlOiByZXNwb25zZS5zdGF0dXN9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkXCIpO1xuICAgICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdXJ2ZXlJbnZpdGVMaW5rKHN1cnZleU93bmVySWQ6IHN0cmluZywgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHk6IG9iamVjdCwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zOiBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELFxuICAgICAgICB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSxcbiAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuICkge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKXtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gOyAgICAgIFxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICBlbmRwb2ludCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IGRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7ICAgXG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgaGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59Il19
|
|
2383
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiZGVzY3JpcHRpb24iLCJjdXN0b21EYXRhIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsInF1ZXJ5UGFyYW1zIiwicmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwiUmVxdWVzdFBheWxvYWQiLCJSZXF1ZXN0UGF0aCIsIlJlcXVlc3RNZXRob2QiLCJSZXNwb25zZVN0YXR1c0NvZGUiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJFcnJvckNvZGUiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsImRlZmF1bHRDaGFubmVsSWQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJTZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQkEsRztBQVNuQixlQUEyQkMsd0JBQTNCLEVBQW1MO0FBQUEsUUFBM0ZDLGFBQTJGLHVFQUF4REYsR0FBRyxDQUFDRyxvQkFBb0Q7QUFBQSxRQUF0QkMsTUFBc0I7QUFBQTtBQUFBLFNBQXhKSCx3QkFBd0osR0FBeEpBLHdCQUF3SjtBQUFBLFNBQTNGQyxhQUEyRixHQUEzRkEsYUFBMkY7QUFBQSxTQUF0QkUsTUFBc0IsR0FBdEJBLE1BQXNCO0FBQUE7O0FBQ2pMO0FBQ0EsUUFBSSxDQUFDQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxLQUFLSixhQUFqQixFQUFnQ0ssTUFBakMsSUFBMkMseUJBQVFMLGFBQVIsTUFBMkIsUUFBMUUsRUFBb0Y7QUFDbEYsV0FBS0EsYUFBTCxHQUFxQkYsR0FBRyxDQUFDRyxvQkFBekI7QUFDRCxLQUpnTCxDQU1qTDs7O0FBQ0Esb0NBQWtCRSxNQUFNLENBQUNDLElBQVAsQ0FBWU4sR0FBRyxDQUFDRyxvQkFBaEIsQ0FBbEIsa0NBQXlEO0FBQXBELFVBQU1LLEdBQUcsbUJBQVQ7O0FBQ0gsVUFBSSxDQUFDLEtBQUtOLGFBQUwsQ0FBbUJPLGNBQW5CLENBQWtDRCxHQUFsQyxDQUFMLEVBQTZDO0FBQUU7QUFDN0MsY0FBTSxJQUFJRSxLQUFKLG9CQUFzQkYsR0FBdEIsMkJBQU47QUFDRDtBQUNGLEtBWGdMLENBYWpMOzs7QUFDQSxRQUFRRyxTQUFS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Q21CcEUsRywwQkFDc0M7QUFDdkR1RixFQUFBQSxzQkFBc0IsRUFBRSxFQUQrQjtBQUV2REssRUFBQUEsdUNBQXVDLEVBQUUsS0FGYztBQUd2RGxELEVBQUFBLDBCQUEwQixFQUFFO0FBSDJCLEMiLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbm5lbElkLCBMaXZlQ2hhdFZlcnNpb24gfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zXCJcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IEluaXRDb250ZXh0IGZyb20gXCIuL01vZGVsL0luaXRDb250ZXh0XCI7XG5pbXBvcnQgTG9jYWxlcyBmcm9tIFwiLi9Db21tb24vTG9jYWxlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZ1Nhbml0aXplciB9IGZyb20gXCIuL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXJcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCBPQ1NES0xvZ2dlciBmcm9tIFwiLi9Db21tb24vT0NTREtMb2dnZXJcIjtcbmltcG9ydCB7IE9DU0RLVGVsZW1ldHJ5RXZlbnQgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gXCIuL1V0aWxzL09TSW5mb1wiO1xuaW1wb3J0IE9tbmljaGFubmVsRW5kcG9pbnRzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiO1xuaW1wb3J0IE9tbmljaGFubmVsSFRUUEhlYWRlcnMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gXCIuL0NvbW1vbi9NYXBwaW5nc1wiO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tIFwiLi9VdGlscy9UaW1lclwiO1xuaW1wb3J0IGF4aW9zUmV0cnkgZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeVwiO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vVXRpbHMvdXVpZFwiO1xuaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBDdXN0b21Db250ZXh0RGF0YSB9IGZyb20gXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNESyBpbXBsZW1lbnRzIElTREsge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMzUsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogM1xuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJyR7a2V5fScgaW4gU0RLQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUcsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWR9LFxuICAgICAgICBcIkdldCBDaGF0IENvbmZpZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldChlbmRwb2ludCwge1xuICAgICAgaGVhZGVycyxcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbiAmJiBkYXRhLkxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cbiAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gU3VjY2VlZGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZSBjYXNlXG4gICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgKyAxID49IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50KSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSByZXRyeSBmb3IgZ2V0Y2hhdHRva2VuIGhhcyBleGNlZWRlZCBpdHMgbWF4IHZhbHVlIG9mICR7dGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnR9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHJpZXMgdW50aWwgaXQgcmVhY2hlcyBpdHMgbGltaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldENoYXRUb2tlbihyZXF1ZXN0SWQsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLCBjdXJyZW50UmV0cnlDb3VudCArIDEpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNvbHZlKHJlc3BvbnNlKSkuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcbiAgICAgIH0sIHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgIHsgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuV0FSTixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0QWdlbnRBdmFpbGFiaWxpdHkocmVxdWVzdElkOiBzdHJpbmcsIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFF1ZXVlQXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD1sY3dgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3Qge2F1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGNvbnN0IGNhY2hPYmogPSB7XG4gICAgICBcIm9yZ0lkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgXCJ3aWRnZXRJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgIGNvbnN0IHRlbXBBcnIgPSBDdXN0b21Db250ZXh0RGF0YS5zb3J0KGRhdGEuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7XCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnJ9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7XCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWR9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3Qge2RhdGF9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELFxuICAgICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCI7XG4gICAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGBjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcblxuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gey4uLmRhdGF9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhyZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShyZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHJlcXVlc3RQYXlsb2FkKTtcblxuICAgICAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgICAgIFJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgICAgIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sXG4gICAgICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0sXG4gICAgICAgICAgUmVxdWVzdFBheWxvYWQ6IHJlcXVlc3RQYXlsb2FkLFxuICAgICAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IFwiU2Vzc2lvbiBJbml0IFN1Y2NlZWRlZFwiO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSB7Li4uZGF0YX07XG5cbiAgICAgICAgaWYgKHJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICAgIH1cblxuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24ocmVxdWVzdFBheWxvYWQpO1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcblxuICAgICAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgICAgIFJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLFxuICAgICAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgUmVxdWVzdFBheWxvYWQ6IHJlcXVlc3RQYXlsb2FkLFxuICAgICAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiAoZXJyb3IgYXMgYW55KS5yZXNwb25zZS5zdGF0dXMgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBcIlNlc3Npb24gSW5pdCBGYWlsZWRcIjtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUmVjb25uZWN0Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCl7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YT8uYXV0aENoYXRFeGlzdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdWNjZWVkZWRcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSwgRXJyb3JDb2RlOiByZXNwb25zZS5zdGF0dXN9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkXCIpO1xuICAgICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdXJ2ZXlJbnZpdGVMaW5rKHN1cnZleU93bmVySWQ6IHN0cmluZywgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHk6IG9iamVjdCwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zOiBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELFxuICAgICAgICB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSxcbiAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuICkge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKXtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICBlbmRwb2ludCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IGRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIGhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
|