@microsoft/ocsdk 0.3.1-main.b56c728 → 0.3.1-main.f65f37d
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 +2 -0
- package/dist/SDK.js +52882 -1771
- package/dist/SDK.min.js +14 -1
- package/lib/Common/Constants.d.ts +1 -0
- package/lib/Common/Constants.js +2 -1
- 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 +418 -358
- 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 +2 -0
- package/lib/Utils/LoggingSanitizer.js +54 -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,102 @@ 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
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1124
|
+
_customData = {
|
|
1125
|
+
RequestId: requestId,
|
|
1126
|
+
Region: response.data.Region,
|
|
1127
|
+
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1128
|
+
TransactionId: response.headers["transaction-id"],
|
|
1129
|
+
RequestPayload: requestPayload,
|
|
1130
|
+
RequestPath: requestPath,
|
|
1131
|
+
RequestMethod: method,
|
|
1132
|
+
ResponseStatusCode: response.status
|
|
1133
|
+
};
|
|
1134
|
+
_description = "Session Init Succeeded";
|
|
1135
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, _customData, _description);
|
|
1136
|
+
}
|
|
1089
1137
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
break;
|
|
1093
|
-
}
|
|
1138
|
+
_context12.next = 42;
|
|
1139
|
+
break;
|
|
1094
1140
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1141
|
+
case 29:
|
|
1142
|
+
_context12.prev = 29;
|
|
1143
|
+
_context12.t0 = _context12["catch"](22);
|
|
1144
|
+
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
1097
1145
|
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6
|
|
1103
|
-
}, "Session Init Failed");
|
|
1146
|
+
if (!this.logger) {
|
|
1147
|
+
_context12.next = 41;
|
|
1148
|
+
break;
|
|
1149
|
+
}
|
|
1104
1150
|
|
|
1105
|
-
|
|
1106
|
-
reject(_context12.t0);
|
|
1151
|
+
_requestPayload = _objectSpread({}, data);
|
|
1107
1152
|
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
}, _callee12, null, [[0, 9]]);
|
|
1114
|
-
}));
|
|
1153
|
+
if (_requestPayload.customContextData) {
|
|
1154
|
+
_LoggingSanitizer.LoggingSanitizer.stripCustomContextDataValues(_requestPayload.customContextData);
|
|
1155
|
+
}
|
|
1115
1156
|
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
}()));
|
|
1157
|
+
if (_requestPayload.preChatResponse) {
|
|
1158
|
+
_LoggingSanitizer.LoggingSanitizer.stripPreChatResponse(_requestPayload.preChatResponse);
|
|
1159
|
+
}
|
|
1120
1160
|
|
|
1121
|
-
|
|
1161
|
+
_context12.next = 38;
|
|
1162
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context12.t0);
|
|
1163
|
+
|
|
1164
|
+
case 38:
|
|
1165
|
+
_customData2 = {
|
|
1166
|
+
RequestId: requestId,
|
|
1167
|
+
ExceptionDetails: _context12.t0,
|
|
1168
|
+
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6,
|
|
1169
|
+
RequestPayload: _requestPayload,
|
|
1170
|
+
RequestPath: requestPath,
|
|
1171
|
+
RequestMethod: method,
|
|
1172
|
+
ResponseStatusCode: _context12.t0.response.status // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
1173
|
+
|
|
1174
|
+
};
|
|
1175
|
+
_description2 = "Session Init Failed";
|
|
1176
|
+
this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, _customData2, _description2);
|
|
1177
|
+
|
|
1178
|
+
case 41:
|
|
1179
|
+
throw _context12.t0;
|
|
1180
|
+
|
|
1181
|
+
case 42:
|
|
1122
1182
|
case "end":
|
|
1123
|
-
return
|
|
1183
|
+
return _context12.stop();
|
|
1124
1184
|
}
|
|
1125
1185
|
}
|
|
1126
|
-
},
|
|
1186
|
+
}, _callee12, this, [[22, 29]]);
|
|
1127
1187
|
}));
|
|
1128
1188
|
|
|
1129
1189
|
function sessionInit(_x17) {
|
|
@@ -1141,8 +1201,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1141
1201
|
}, {
|
|
1142
1202
|
key: "sessionClose",
|
|
1143
1203
|
value: function () {
|
|
1144
|
-
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1145
|
-
var
|
|
1204
|
+
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(requestId) {
|
|
1205
|
+
var _this6 = this;
|
|
1146
1206
|
|
|
1147
1207
|
var sessionCloseOptionalParams,
|
|
1148
1208
|
timer,
|
|
@@ -1155,12 +1215,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1155
1215
|
headers,
|
|
1156
1216
|
data,
|
|
1157
1217
|
options,
|
|
1158
|
-
|
|
1159
|
-
return _regenerator["default"].wrap(function
|
|
1218
|
+
_args14 = arguments;
|
|
1219
|
+
return _regenerator["default"].wrap(function _callee14$(_context14) {
|
|
1160
1220
|
while (1) {
|
|
1161
|
-
switch (
|
|
1221
|
+
switch (_context14.prev = _context14.next) {
|
|
1162
1222
|
case 0:
|
|
1163
|
-
sessionCloseOptionalParams =
|
|
1223
|
+
sessionCloseOptionalParams = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : {};
|
|
1164
1224
|
timer = _Timer.Timer.TIMER();
|
|
1165
1225
|
|
|
1166
1226
|
if (this.logger) {
|
|
@@ -1199,24 +1259,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1199
1259
|
method: "POST",
|
|
1200
1260
|
url: endpoint
|
|
1201
1261
|
};
|
|
1202
|
-
return
|
|
1203
|
-
var
|
|
1262
|
+
return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1263
|
+
var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
|
|
1204
1264
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
|
|
1205
1265
|
|
|
1206
|
-
return _regenerator["default"].wrap(function
|
|
1266
|
+
return _regenerator["default"].wrap(function _callee13$(_context13) {
|
|
1207
1267
|
while (1) {
|
|
1208
|
-
switch (
|
|
1268
|
+
switch (_context13.prev = _context13.next) {
|
|
1209
1269
|
case 0:
|
|
1210
|
-
|
|
1211
|
-
|
|
1270
|
+
_context13.prev = 0;
|
|
1271
|
+
_context13.next = 3;
|
|
1212
1272
|
return axiosInstance(options);
|
|
1213
1273
|
|
|
1214
1274
|
case 3:
|
|
1215
|
-
response =
|
|
1275
|
+
response = _context13.sent;
|
|
1216
1276
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1217
1277
|
|
|
1218
|
-
if (
|
|
1219
|
-
|
|
1278
|
+
if (_this6.logger) {
|
|
1279
|
+
_this6.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, {
|
|
1220
1280
|
RequestId: requestId,
|
|
1221
1281
|
Region: response.data.Region,
|
|
1222
1282
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1225,26 +1285,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1225
1285
|
}
|
|
1226
1286
|
|
|
1227
1287
|
resolve();
|
|
1228
|
-
|
|
1288
|
+
_context13.next = 17;
|
|
1229
1289
|
break;
|
|
1230
1290
|
|
|
1231
1291
|
case 9:
|
|
1232
|
-
|
|
1233
|
-
|
|
1292
|
+
_context13.prev = 9;
|
|
1293
|
+
_context13.t0 = _context13["catch"](0);
|
|
1234
1294
|
_elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
|
|
1235
1295
|
|
|
1236
|
-
if (!
|
|
1237
|
-
|
|
1296
|
+
if (!_this6.logger) {
|
|
1297
|
+
_context13.next = 16;
|
|
1238
1298
|
break;
|
|
1239
1299
|
}
|
|
1240
1300
|
|
|
1241
|
-
|
|
1242
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1301
|
+
_context13.next = 15;
|
|
1302
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context13.t0);
|
|
1243
1303
|
|
|
1244
1304
|
case 15:
|
|
1245
|
-
|
|
1305
|
+
_this6.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, {
|
|
1246
1306
|
RequestId: requestId,
|
|
1247
|
-
ExceptionDetails:
|
|
1307
|
+
ExceptionDetails: _context13.t0,
|
|
1248
1308
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds7
|
|
1249
1309
|
}, "Session Close Failed");
|
|
1250
1310
|
|
|
@@ -1253,26 +1313,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1253
1313
|
|
|
1254
1314
|
case 17:
|
|
1255
1315
|
case "end":
|
|
1256
|
-
return
|
|
1316
|
+
return _context13.stop();
|
|
1257
1317
|
}
|
|
1258
1318
|
}
|
|
1259
|
-
},
|
|
1319
|
+
}, _callee13, null, [[0, 9]]);
|
|
1260
1320
|
}));
|
|
1261
1321
|
|
|
1262
|
-
return function (
|
|
1263
|
-
return
|
|
1322
|
+
return function (_x19, _x20) {
|
|
1323
|
+
return _ref6.apply(this, arguments);
|
|
1264
1324
|
};
|
|
1265
1325
|
}()));
|
|
1266
1326
|
|
|
1267
1327
|
case 15:
|
|
1268
1328
|
case "end":
|
|
1269
|
-
return
|
|
1329
|
+
return _context14.stop();
|
|
1270
1330
|
}
|
|
1271
1331
|
}
|
|
1272
|
-
},
|
|
1332
|
+
}, _callee14, this);
|
|
1273
1333
|
}));
|
|
1274
1334
|
|
|
1275
|
-
function sessionClose(
|
|
1335
|
+
function sessionClose(_x18) {
|
|
1276
1336
|
return _sessionClose.apply(this, arguments);
|
|
1277
1337
|
}
|
|
1278
1338
|
|
|
@@ -1287,12 +1347,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1287
1347
|
}, {
|
|
1288
1348
|
key: "validateAuthChatRecord",
|
|
1289
1349
|
value: function () {
|
|
1290
|
-
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1350
|
+
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId, validateAuthChatRecordOptionalParams) {
|
|
1291
1351
|
var timer, authenticatedUserToken, chatId, endpoint, axiosInstance, headers, options, _response$data, response, elapsedTimeInMilliseconds, _this$logger, _this$logger2, _this$logger3, _elapsedTimeInMilliseconds8;
|
|
1292
1352
|
|
|
1293
|
-
return _regenerator["default"].wrap(function
|
|
1353
|
+
return _regenerator["default"].wrap(function _callee15$(_context15) {
|
|
1294
1354
|
while (1) {
|
|
1295
|
-
switch (
|
|
1355
|
+
switch (_context15.prev = _context15.next) {
|
|
1296
1356
|
case 0:
|
|
1297
1357
|
timer = _Timer.Timer.TIMER();
|
|
1298
1358
|
|
|
@@ -1319,16 +1379,16 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1319
1379
|
method: "GET",
|
|
1320
1380
|
url: endpoint
|
|
1321
1381
|
};
|
|
1322
|
-
|
|
1323
|
-
|
|
1382
|
+
_context15.prev = 9;
|
|
1383
|
+
_context15.next = 12;
|
|
1324
1384
|
return axiosInstance(options);
|
|
1325
1385
|
|
|
1326
1386
|
case 12:
|
|
1327
|
-
response =
|
|
1387
|
+
response = _context15.sent;
|
|
1328
1388
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1329
1389
|
|
|
1330
1390
|
if (!(((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true)) {
|
|
1331
|
-
|
|
1391
|
+
_context15.next = 19;
|
|
1332
1392
|
break;
|
|
1333
1393
|
}
|
|
1334
1394
|
|
|
@@ -1338,7 +1398,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1338
1398
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1339
1399
|
TransactionId: response.headers["transaction-id"]
|
|
1340
1400
|
}, "Validate Auth Chat Record Succeeded");
|
|
1341
|
-
return
|
|
1401
|
+
return _context15.abrupt("return", Promise.resolve(response.data));
|
|
1342
1402
|
|
|
1343
1403
|
case 19:
|
|
1344
1404
|
(_this$logger2 = this.logger) === null || _this$logger2 === void 0 ? void 0 : _this$logger2.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
|
|
@@ -1348,45 +1408,45 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1348
1408
|
TransactionId: response.headers["transaction-id"],
|
|
1349
1409
|
ErrorCode: response.status
|
|
1350
1410
|
}, "Validate Auth Chat Record Failed. Record is not found or request is not authorized");
|
|
1351
|
-
return
|
|
1411
|
+
return _context15.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
|
|
1352
1412
|
|
|
1353
1413
|
case 21:
|
|
1354
|
-
|
|
1414
|
+
_context15.next = 34;
|
|
1355
1415
|
break;
|
|
1356
1416
|
|
|
1357
1417
|
case 23:
|
|
1358
|
-
|
|
1359
|
-
|
|
1418
|
+
_context15.prev = 23;
|
|
1419
|
+
_context15.t0 = _context15["catch"](9);
|
|
1360
1420
|
_elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
|
|
1361
|
-
|
|
1362
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1421
|
+
_context15.next = 28;
|
|
1422
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context15.t0);
|
|
1363
1423
|
|
|
1364
1424
|
case 28:
|
|
1365
1425
|
(_this$logger3 = this.logger) === null || _this$logger3 === void 0 ? void 0 : _this$logger3.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
|
|
1366
1426
|
RequestId: requestId,
|
|
1367
|
-
ExceptionDetails:
|
|
1427
|
+
ExceptionDetails: _context15.t0,
|
|
1368
1428
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds8
|
|
1369
1429
|
}, "Validate Auth Chat Record Failed");
|
|
1370
1430
|
|
|
1371
|
-
if (!(
|
|
1372
|
-
|
|
1431
|
+
if (!(_context15.t0.toString() === "Error: Request failed with status code 404")) {
|
|
1432
|
+
_context15.next = 33;
|
|
1373
1433
|
break;
|
|
1374
1434
|
}
|
|
1375
1435
|
|
|
1376
|
-
return
|
|
1436
|
+
return _context15.abrupt("return", Promise.resolve({}));
|
|
1377
1437
|
|
|
1378
1438
|
case 33:
|
|
1379
|
-
return
|
|
1439
|
+
return _context15.abrupt("return", Promise.reject());
|
|
1380
1440
|
|
|
1381
1441
|
case 34:
|
|
1382
1442
|
case "end":
|
|
1383
|
-
return
|
|
1443
|
+
return _context15.stop();
|
|
1384
1444
|
}
|
|
1385
1445
|
}
|
|
1386
|
-
},
|
|
1446
|
+
}, _callee15, this, [[9, 23]]);
|
|
1387
1447
|
}));
|
|
1388
1448
|
|
|
1389
|
-
function validateAuthChatRecord(
|
|
1449
|
+
function validateAuthChatRecord(_x21, _x22) {
|
|
1390
1450
|
return _validateAuthChatRecord.apply(this, arguments);
|
|
1391
1451
|
}
|
|
1392
1452
|
|
|
@@ -1402,8 +1462,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1402
1462
|
}, {
|
|
1403
1463
|
key: "submitPostChatResponse",
|
|
1404
1464
|
value: function () {
|
|
1405
|
-
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1406
|
-
var
|
|
1465
|
+
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, postChatResponse) {
|
|
1466
|
+
var _this7 = this;
|
|
1407
1467
|
|
|
1408
1468
|
var submitPostChatResponseOptionalParams,
|
|
1409
1469
|
timer,
|
|
@@ -1412,12 +1472,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1412
1472
|
authenticatedUserToken,
|
|
1413
1473
|
headers,
|
|
1414
1474
|
options,
|
|
1415
|
-
|
|
1416
|
-
return _regenerator["default"].wrap(function
|
|
1475
|
+
_args17 = arguments;
|
|
1476
|
+
return _regenerator["default"].wrap(function _callee17$(_context17) {
|
|
1417
1477
|
while (1) {
|
|
1418
|
-
switch (
|
|
1478
|
+
switch (_context17.prev = _context17.next) {
|
|
1419
1479
|
case 0:
|
|
1420
|
-
submitPostChatResponseOptionalParams =
|
|
1480
|
+
submitPostChatResponseOptionalParams = _args17.length > 2 && _args17[2] !== undefined ? _args17[2] : {};
|
|
1421
1481
|
timer = _Timer.Timer.TIMER();
|
|
1422
1482
|
|
|
1423
1483
|
if (this.logger) {
|
|
@@ -1445,24 +1505,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1445
1505
|
method: "POST",
|
|
1446
1506
|
url: endpoint
|
|
1447
1507
|
};
|
|
1448
|
-
return
|
|
1449
|
-
var
|
|
1508
|
+
return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1509
|
+
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
|
|
1450
1510
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
|
|
1451
1511
|
|
|
1452
|
-
return _regenerator["default"].wrap(function
|
|
1512
|
+
return _regenerator["default"].wrap(function _callee16$(_context16) {
|
|
1453
1513
|
while (1) {
|
|
1454
|
-
switch (
|
|
1514
|
+
switch (_context16.prev = _context16.next) {
|
|
1455
1515
|
case 0:
|
|
1456
|
-
|
|
1457
|
-
|
|
1516
|
+
_context16.prev = 0;
|
|
1517
|
+
_context16.next = 3;
|
|
1458
1518
|
return axiosInstance(options);
|
|
1459
1519
|
|
|
1460
1520
|
case 3:
|
|
1461
|
-
response =
|
|
1521
|
+
response = _context16.sent;
|
|
1462
1522
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1463
1523
|
|
|
1464
|
-
if (
|
|
1465
|
-
|
|
1524
|
+
if (_this7.logger) {
|
|
1525
|
+
_this7.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, {
|
|
1466
1526
|
RequestId: requestId,
|
|
1467
1527
|
Region: response.data.Region,
|
|
1468
1528
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1471,26 +1531,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1471
1531
|
}
|
|
1472
1532
|
|
|
1473
1533
|
resolve();
|
|
1474
|
-
|
|
1534
|
+
_context16.next = 17;
|
|
1475
1535
|
break;
|
|
1476
1536
|
|
|
1477
1537
|
case 9:
|
|
1478
|
-
|
|
1479
|
-
|
|
1538
|
+
_context16.prev = 9;
|
|
1539
|
+
_context16.t0 = _context16["catch"](0);
|
|
1480
1540
|
_elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
|
|
1481
1541
|
|
|
1482
|
-
if (!
|
|
1483
|
-
|
|
1542
|
+
if (!_this7.logger) {
|
|
1543
|
+
_context16.next = 16;
|
|
1484
1544
|
break;
|
|
1485
1545
|
}
|
|
1486
1546
|
|
|
1487
|
-
|
|
1488
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1547
|
+
_context16.next = 15;
|
|
1548
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context16.t0);
|
|
1489
1549
|
|
|
1490
1550
|
case 15:
|
|
1491
|
-
|
|
1551
|
+
_this7.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, {
|
|
1492
1552
|
RequestId: requestId,
|
|
1493
|
-
ExceptionDetails:
|
|
1553
|
+
ExceptionDetails: _context16.t0,
|
|
1494
1554
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds9
|
|
1495
1555
|
}, "Submit Post Chat Failed");
|
|
1496
1556
|
|
|
@@ -1499,26 +1559,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1499
1559
|
|
|
1500
1560
|
case 17:
|
|
1501
1561
|
case "end":
|
|
1502
|
-
return
|
|
1562
|
+
return _context16.stop();
|
|
1503
1563
|
}
|
|
1504
1564
|
}
|
|
1505
|
-
},
|
|
1565
|
+
}, _callee16, null, [[0, 9]]);
|
|
1506
1566
|
}));
|
|
1507
1567
|
|
|
1508
|
-
return function (
|
|
1509
|
-
return
|
|
1568
|
+
return function (_x25, _x26) {
|
|
1569
|
+
return _ref7.apply(this, arguments);
|
|
1510
1570
|
};
|
|
1511
1571
|
}()));
|
|
1512
1572
|
|
|
1513
1573
|
case 11:
|
|
1514
1574
|
case "end":
|
|
1515
|
-
return
|
|
1575
|
+
return _context17.stop();
|
|
1516
1576
|
}
|
|
1517
1577
|
}
|
|
1518
|
-
},
|
|
1578
|
+
}, _callee17, this);
|
|
1519
1579
|
}));
|
|
1520
1580
|
|
|
1521
|
-
function submitPostChatResponse(
|
|
1581
|
+
function submitPostChatResponse(_x23, _x24) {
|
|
1522
1582
|
return _submitPostChatResponse.apply(this, arguments);
|
|
1523
1583
|
}
|
|
1524
1584
|
|
|
@@ -1534,8 +1594,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1534
1594
|
}, {
|
|
1535
1595
|
key: "getSurveyInviteLink",
|
|
1536
1596
|
value: function () {
|
|
1537
|
-
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1538
|
-
var
|
|
1597
|
+
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(surveyOwnerId, surveyInviteAPIRequestBody) {
|
|
1598
|
+
var _this8 = this;
|
|
1539
1599
|
|
|
1540
1600
|
var getsurveyInviteLinkOptionalParams,
|
|
1541
1601
|
timer,
|
|
@@ -1545,12 +1605,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1545
1605
|
requestId,
|
|
1546
1606
|
headers,
|
|
1547
1607
|
options,
|
|
1548
|
-
|
|
1549
|
-
return _regenerator["default"].wrap(function
|
|
1608
|
+
_args19 = arguments;
|
|
1609
|
+
return _regenerator["default"].wrap(function _callee19$(_context19) {
|
|
1550
1610
|
while (1) {
|
|
1551
|
-
switch (
|
|
1611
|
+
switch (_context19.prev = _context19.next) {
|
|
1552
1612
|
case 0:
|
|
1553
|
-
getsurveyInviteLinkOptionalParams =
|
|
1613
|
+
getsurveyInviteLinkOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
|
|
1554
1614
|
timer = _Timer.Timer.TIMER();
|
|
1555
1615
|
|
|
1556
1616
|
if (this.logger) {
|
|
@@ -1583,25 +1643,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1583
1643
|
method: "POST",
|
|
1584
1644
|
url: endpoint
|
|
1585
1645
|
};
|
|
1586
|
-
return
|
|
1587
|
-
var
|
|
1646
|
+
return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1647
|
+
var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
|
|
1588
1648
|
var response, data, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
|
|
1589
1649
|
|
|
1590
|
-
return _regenerator["default"].wrap(function
|
|
1650
|
+
return _regenerator["default"].wrap(function _callee18$(_context18) {
|
|
1591
1651
|
while (1) {
|
|
1592
|
-
switch (
|
|
1652
|
+
switch (_context18.prev = _context18.next) {
|
|
1593
1653
|
case 0:
|
|
1594
|
-
|
|
1595
|
-
|
|
1654
|
+
_context18.prev = 0;
|
|
1655
|
+
_context18.next = 3;
|
|
1596
1656
|
return axiosInstance(options);
|
|
1597
1657
|
|
|
1598
1658
|
case 3:
|
|
1599
|
-
response =
|
|
1659
|
+
response = _context18.sent;
|
|
1600
1660
|
data = response.data;
|
|
1601
1661
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1602
1662
|
|
|
1603
|
-
if (
|
|
1604
|
-
|
|
1663
|
+
if (_this8.logger) {
|
|
1664
|
+
_this8.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, {
|
|
1605
1665
|
Region: response.data.Region,
|
|
1606
1666
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1607
1667
|
TransactionId: response.headers["transaction-id"]
|
|
@@ -1609,25 +1669,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1609
1669
|
}
|
|
1610
1670
|
|
|
1611
1671
|
resolve(data);
|
|
1612
|
-
|
|
1672
|
+
_context18.next = 18;
|
|
1613
1673
|
break;
|
|
1614
1674
|
|
|
1615
1675
|
case 10:
|
|
1616
|
-
|
|
1617
|
-
|
|
1676
|
+
_context18.prev = 10;
|
|
1677
|
+
_context18.t0 = _context18["catch"](0);
|
|
1618
1678
|
_elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
|
|
1619
1679
|
|
|
1620
|
-
if (!
|
|
1621
|
-
|
|
1680
|
+
if (!_this8.logger) {
|
|
1681
|
+
_context18.next = 17;
|
|
1622
1682
|
break;
|
|
1623
1683
|
}
|
|
1624
1684
|
|
|
1625
|
-
|
|
1626
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1685
|
+
_context18.next = 16;
|
|
1686
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context18.t0);
|
|
1627
1687
|
|
|
1628
1688
|
case 16:
|
|
1629
|
-
|
|
1630
|
-
ExceptionDetails:
|
|
1689
|
+
_this8.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, {
|
|
1690
|
+
ExceptionDetails: _context18.t0,
|
|
1631
1691
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds10
|
|
1632
1692
|
}, "Get Survey Invite Link Failed");
|
|
1633
1693
|
|
|
@@ -1636,26 +1696,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1636
1696
|
|
|
1637
1697
|
case 18:
|
|
1638
1698
|
case "end":
|
|
1639
|
-
return
|
|
1699
|
+
return _context18.stop();
|
|
1640
1700
|
}
|
|
1641
1701
|
}
|
|
1642
|
-
},
|
|
1702
|
+
}, _callee18, null, [[0, 10]]);
|
|
1643
1703
|
}));
|
|
1644
1704
|
|
|
1645
|
-
return function (
|
|
1646
|
-
return
|
|
1705
|
+
return function (_x29, _x30) {
|
|
1706
|
+
return _ref8.apply(this, arguments);
|
|
1647
1707
|
};
|
|
1648
1708
|
}()));
|
|
1649
1709
|
|
|
1650
1710
|
case 12:
|
|
1651
1711
|
case "end":
|
|
1652
|
-
return
|
|
1712
|
+
return _context19.stop();
|
|
1653
1713
|
}
|
|
1654
1714
|
}
|
|
1655
|
-
},
|
|
1715
|
+
}, _callee19, this);
|
|
1656
1716
|
}));
|
|
1657
1717
|
|
|
1658
|
-
function getSurveyInviteLink(
|
|
1718
|
+
function getSurveyInviteLink(_x27, _x28) {
|
|
1659
1719
|
return _getSurveyInviteLink.apply(this, arguments);
|
|
1660
1720
|
}
|
|
1661
1721
|
|
|
@@ -1672,8 +1732,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1672
1732
|
}, {
|
|
1673
1733
|
key: "getChatTranscripts",
|
|
1674
1734
|
value: function () {
|
|
1675
|
-
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1676
|
-
var
|
|
1735
|
+
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(requestId, chatId, token) {
|
|
1736
|
+
var _this9 = this;
|
|
1677
1737
|
|
|
1678
1738
|
var getChatTranscriptsOptionalParams,
|
|
1679
1739
|
timer,
|
|
@@ -1683,12 +1743,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1683
1743
|
currentLiveChatVersion,
|
|
1684
1744
|
headers,
|
|
1685
1745
|
options,
|
|
1686
|
-
|
|
1687
|
-
return _regenerator["default"].wrap(function
|
|
1746
|
+
_args21 = arguments;
|
|
1747
|
+
return _regenerator["default"].wrap(function _callee21$(_context21) {
|
|
1688
1748
|
while (1) {
|
|
1689
|
-
switch (
|
|
1749
|
+
switch (_context21.prev = _context21.next) {
|
|
1690
1750
|
case 0:
|
|
1691
|
-
getChatTranscriptsOptionalParams =
|
|
1751
|
+
getChatTranscriptsOptionalParams = _args21.length > 3 && _args21[3] !== undefined ? _args21[3] : {};
|
|
1692
1752
|
timer = _Timer.Timer.TIMER();
|
|
1693
1753
|
|
|
1694
1754
|
if (this.logger) {
|
|
@@ -1723,25 +1783,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1723
1783
|
method: "GET",
|
|
1724
1784
|
url: endpoint
|
|
1725
1785
|
};
|
|
1726
|
-
return
|
|
1727
|
-
var
|
|
1786
|
+
return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1787
|
+
var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
|
|
1728
1788
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds11;
|
|
1729
1789
|
|
|
1730
|
-
return _regenerator["default"].wrap(function
|
|
1790
|
+
return _regenerator["default"].wrap(function _callee20$(_context20) {
|
|
1731
1791
|
while (1) {
|
|
1732
|
-
switch (
|
|
1792
|
+
switch (_context20.prev = _context20.next) {
|
|
1733
1793
|
case 0:
|
|
1734
|
-
|
|
1735
|
-
|
|
1794
|
+
_context20.prev = 0;
|
|
1795
|
+
_context20.next = 3;
|
|
1736
1796
|
return axiosInstance(options);
|
|
1737
1797
|
|
|
1738
1798
|
case 3:
|
|
1739
|
-
response =
|
|
1799
|
+
response = _context20.sent;
|
|
1740
1800
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1741
1801
|
data = response.data;
|
|
1742
1802
|
|
|
1743
|
-
if (
|
|
1744
|
-
|
|
1803
|
+
if (_this9.logger) {
|
|
1804
|
+
_this9.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, {
|
|
1745
1805
|
RequestId: requestId,
|
|
1746
1806
|
Region: response.data.Region,
|
|
1747
1807
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1750,54 +1810,54 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1750
1810
|
}
|
|
1751
1811
|
|
|
1752
1812
|
resolve(data);
|
|
1753
|
-
|
|
1813
|
+
_context20.next = 18;
|
|
1754
1814
|
break;
|
|
1755
1815
|
|
|
1756
1816
|
case 10:
|
|
1757
|
-
|
|
1758
|
-
|
|
1817
|
+
_context20.prev = 10;
|
|
1818
|
+
_context20.t0 = _context20["catch"](0);
|
|
1759
1819
|
_elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
|
|
1760
1820
|
|
|
1761
|
-
if (!
|
|
1762
|
-
|
|
1821
|
+
if (!_this9.logger) {
|
|
1822
|
+
_context20.next = 17;
|
|
1763
1823
|
break;
|
|
1764
1824
|
}
|
|
1765
1825
|
|
|
1766
|
-
|
|
1767
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1826
|
+
_context20.next = 16;
|
|
1827
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context20.t0);
|
|
1768
1828
|
|
|
1769
1829
|
case 16:
|
|
1770
|
-
|
|
1830
|
+
_this9.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, {
|
|
1771
1831
|
RequestId: requestId,
|
|
1772
|
-
ExceptionDetails:
|
|
1832
|
+
ExceptionDetails: _context20.t0,
|
|
1773
1833
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds11
|
|
1774
1834
|
}, "Get Chat Transcript Failed");
|
|
1775
1835
|
|
|
1776
1836
|
case 17:
|
|
1777
|
-
reject(
|
|
1837
|
+
reject(_context20.t0);
|
|
1778
1838
|
|
|
1779
1839
|
case 18:
|
|
1780
1840
|
case "end":
|
|
1781
|
-
return
|
|
1841
|
+
return _context20.stop();
|
|
1782
1842
|
}
|
|
1783
1843
|
}
|
|
1784
|
-
},
|
|
1844
|
+
}, _callee20, null, [[0, 10]]);
|
|
1785
1845
|
}));
|
|
1786
1846
|
|
|
1787
|
-
return function (
|
|
1788
|
-
return
|
|
1847
|
+
return function (_x34, _x35) {
|
|
1848
|
+
return _ref9.apply(this, arguments);
|
|
1789
1849
|
};
|
|
1790
1850
|
}()));
|
|
1791
1851
|
|
|
1792
1852
|
case 14:
|
|
1793
1853
|
case "end":
|
|
1794
|
-
return
|
|
1854
|
+
return _context21.stop();
|
|
1795
1855
|
}
|
|
1796
1856
|
}
|
|
1797
|
-
},
|
|
1857
|
+
}, _callee21, this);
|
|
1798
1858
|
}));
|
|
1799
1859
|
|
|
1800
|
-
function getChatTranscripts(
|
|
1860
|
+
function getChatTranscripts(_x31, _x32, _x33) {
|
|
1801
1861
|
return _getChatTranscripts.apply(this, arguments);
|
|
1802
1862
|
}
|
|
1803
1863
|
|
|
@@ -1814,8 +1874,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1814
1874
|
}, {
|
|
1815
1875
|
key: "emailTranscript",
|
|
1816
1876
|
value: function () {
|
|
1817
|
-
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1818
|
-
var
|
|
1877
|
+
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, token, emailRequestBody) {
|
|
1878
|
+
var _this10 = this;
|
|
1819
1879
|
|
|
1820
1880
|
var emailTranscriptOptionalParams,
|
|
1821
1881
|
timer,
|
|
@@ -1824,12 +1884,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1824
1884
|
authenticatedUserToken,
|
|
1825
1885
|
headers,
|
|
1826
1886
|
options,
|
|
1827
|
-
|
|
1828
|
-
return _regenerator["default"].wrap(function
|
|
1887
|
+
_args23 = arguments;
|
|
1888
|
+
return _regenerator["default"].wrap(function _callee23$(_context23) {
|
|
1829
1889
|
while (1) {
|
|
1830
|
-
switch (
|
|
1890
|
+
switch (_context23.prev = _context23.next) {
|
|
1831
1891
|
case 0:
|
|
1832
|
-
emailTranscriptOptionalParams =
|
|
1892
|
+
emailTranscriptOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
|
|
1833
1893
|
timer = _Timer.Timer.TIMER();
|
|
1834
1894
|
|
|
1835
1895
|
if (this.logger) {
|
|
@@ -1859,24 +1919,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1859
1919
|
method: "POST",
|
|
1860
1920
|
url: endpoint
|
|
1861
1921
|
};
|
|
1862
|
-
return
|
|
1863
|
-
var
|
|
1922
|
+
return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1923
|
+
var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
|
|
1864
1924
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
|
|
1865
1925
|
|
|
1866
|
-
return _regenerator["default"].wrap(function
|
|
1926
|
+
return _regenerator["default"].wrap(function _callee22$(_context22) {
|
|
1867
1927
|
while (1) {
|
|
1868
|
-
switch (
|
|
1928
|
+
switch (_context22.prev = _context22.next) {
|
|
1869
1929
|
case 0:
|
|
1870
|
-
|
|
1871
|
-
|
|
1930
|
+
_context22.prev = 0;
|
|
1931
|
+
_context22.next = 3;
|
|
1872
1932
|
return axiosInstance(options);
|
|
1873
1933
|
|
|
1874
1934
|
case 3:
|
|
1875
|
-
response =
|
|
1935
|
+
response = _context22.sent;
|
|
1876
1936
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1877
1937
|
|
|
1878
|
-
if (
|
|
1879
|
-
|
|
1938
|
+
if (_this10.logger) {
|
|
1939
|
+
_this10.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, {
|
|
1880
1940
|
RequestId: requestId,
|
|
1881
1941
|
Region: response.data.Region,
|
|
1882
1942
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1885,26 +1945,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1885
1945
|
}
|
|
1886
1946
|
|
|
1887
1947
|
resolve();
|
|
1888
|
-
|
|
1948
|
+
_context22.next = 17;
|
|
1889
1949
|
break;
|
|
1890
1950
|
|
|
1891
1951
|
case 9:
|
|
1892
|
-
|
|
1893
|
-
|
|
1952
|
+
_context22.prev = 9;
|
|
1953
|
+
_context22.t0 = _context22["catch"](0);
|
|
1894
1954
|
_elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
|
|
1895
1955
|
|
|
1896
|
-
if (!
|
|
1897
|
-
|
|
1956
|
+
if (!_this10.logger) {
|
|
1957
|
+
_context22.next = 16;
|
|
1898
1958
|
break;
|
|
1899
1959
|
}
|
|
1900
1960
|
|
|
1901
|
-
|
|
1902
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1961
|
+
_context22.next = 15;
|
|
1962
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context22.t0);
|
|
1903
1963
|
|
|
1904
1964
|
case 15:
|
|
1905
|
-
|
|
1965
|
+
_this10.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, {
|
|
1906
1966
|
RequestId: requestId,
|
|
1907
|
-
ExceptionDetails:
|
|
1967
|
+
ExceptionDetails: _context22.t0,
|
|
1908
1968
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds12
|
|
1909
1969
|
}, "Email Transcript Failed");
|
|
1910
1970
|
|
|
@@ -1913,26 +1973,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1913
1973
|
|
|
1914
1974
|
case 17:
|
|
1915
1975
|
case "end":
|
|
1916
|
-
return
|
|
1976
|
+
return _context22.stop();
|
|
1917
1977
|
}
|
|
1918
1978
|
}
|
|
1919
|
-
},
|
|
1979
|
+
}, _callee22, null, [[0, 9]]);
|
|
1920
1980
|
}));
|
|
1921
1981
|
|
|
1922
|
-
return function (
|
|
1923
|
-
return
|
|
1982
|
+
return function (_x39, _x40) {
|
|
1983
|
+
return _ref10.apply(this, arguments);
|
|
1924
1984
|
};
|
|
1925
1985
|
}()));
|
|
1926
1986
|
|
|
1927
1987
|
case 14:
|
|
1928
1988
|
case "end":
|
|
1929
|
-
return
|
|
1989
|
+
return _context23.stop();
|
|
1930
1990
|
}
|
|
1931
1991
|
}
|
|
1932
|
-
},
|
|
1992
|
+
}, _callee23, this);
|
|
1933
1993
|
}));
|
|
1934
1994
|
|
|
1935
|
-
function emailTranscript(
|
|
1995
|
+
function emailTranscript(_x36, _x37, _x38) {
|
|
1936
1996
|
return _emailTranscript.apply(this, arguments);
|
|
1937
1997
|
}
|
|
1938
1998
|
|
|
@@ -1946,13 +2006,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1946
2006
|
}, {
|
|
1947
2007
|
key: "fetchDataMaskingInfo",
|
|
1948
2008
|
value: function () {
|
|
1949
|
-
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1950
|
-
var
|
|
2009
|
+
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId) {
|
|
2010
|
+
var _this11 = this;
|
|
1951
2011
|
|
|
1952
2012
|
var timer, endpoint, axiosInstance, headers, options;
|
|
1953
|
-
return _regenerator["default"].wrap(function
|
|
2013
|
+
return _regenerator["default"].wrap(function _callee25$(_context25) {
|
|
1954
2014
|
while (1) {
|
|
1955
|
-
switch (
|
|
2015
|
+
switch (_context25.prev = _context25.next) {
|
|
1956
2016
|
case 0:
|
|
1957
2017
|
timer = _Timer.Timer.TIMER();
|
|
1958
2018
|
|
|
@@ -1979,25 +2039,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1979
2039
|
method: "GET",
|
|
1980
2040
|
url: endpoint
|
|
1981
2041
|
};
|
|
1982
|
-
return
|
|
1983
|
-
var
|
|
2042
|
+
return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2043
|
+
var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
|
|
1984
2044
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds13;
|
|
1985
2045
|
|
|
1986
|
-
return _regenerator["default"].wrap(function
|
|
2046
|
+
return _regenerator["default"].wrap(function _callee24$(_context24) {
|
|
1987
2047
|
while (1) {
|
|
1988
|
-
switch (
|
|
2048
|
+
switch (_context24.prev = _context24.next) {
|
|
1989
2049
|
case 0:
|
|
1990
|
-
|
|
1991
|
-
|
|
2050
|
+
_context24.prev = 0;
|
|
2051
|
+
_context24.next = 3;
|
|
1992
2052
|
return axiosInstance(options);
|
|
1993
2053
|
|
|
1994
2054
|
case 3:
|
|
1995
|
-
response =
|
|
2055
|
+
response = _context24.sent;
|
|
1996
2056
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1997
2057
|
data = response.data;
|
|
1998
2058
|
|
|
1999
|
-
if (
|
|
2000
|
-
|
|
2059
|
+
if (_this11.logger) {
|
|
2060
|
+
_this11.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, {
|
|
2001
2061
|
RequestId: requestId,
|
|
2002
2062
|
Region: response.data.Region,
|
|
2003
2063
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -2006,26 +2066,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2006
2066
|
}
|
|
2007
2067
|
|
|
2008
2068
|
resolve(data);
|
|
2009
|
-
|
|
2069
|
+
_context24.next = 18;
|
|
2010
2070
|
break;
|
|
2011
2071
|
|
|
2012
2072
|
case 10:
|
|
2013
|
-
|
|
2014
|
-
|
|
2073
|
+
_context24.prev = 10;
|
|
2074
|
+
_context24.t0 = _context24["catch"](0);
|
|
2015
2075
|
_elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
|
|
2016
2076
|
|
|
2017
|
-
if (!
|
|
2018
|
-
|
|
2077
|
+
if (!_this11.logger) {
|
|
2078
|
+
_context24.next = 17;
|
|
2019
2079
|
break;
|
|
2020
2080
|
}
|
|
2021
2081
|
|
|
2022
|
-
|
|
2023
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2082
|
+
_context24.next = 16;
|
|
2083
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context24.t0);
|
|
2024
2084
|
|
|
2025
2085
|
case 16:
|
|
2026
|
-
|
|
2086
|
+
_this11.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, {
|
|
2027
2087
|
RequestId: requestId,
|
|
2028
|
-
ExceptionDetails:
|
|
2088
|
+
ExceptionDetails: _context24.t0,
|
|
2029
2089
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds13
|
|
2030
2090
|
}, "Fetch Data Masking Failed");
|
|
2031
2091
|
|
|
@@ -2034,26 +2094,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2034
2094
|
|
|
2035
2095
|
case 18:
|
|
2036
2096
|
case "end":
|
|
2037
|
-
return
|
|
2097
|
+
return _context24.stop();
|
|
2038
2098
|
}
|
|
2039
2099
|
}
|
|
2040
|
-
},
|
|
2100
|
+
}, _callee24, null, [[0, 10]]);
|
|
2041
2101
|
}));
|
|
2042
2102
|
|
|
2043
|
-
return function (
|
|
2044
|
-
return
|
|
2103
|
+
return function (_x42, _x43) {
|
|
2104
|
+
return _ref11.apply(this, arguments);
|
|
2045
2105
|
};
|
|
2046
2106
|
}()));
|
|
2047
2107
|
|
|
2048
2108
|
case 11:
|
|
2049
2109
|
case "end":
|
|
2050
|
-
return
|
|
2110
|
+
return _context25.stop();
|
|
2051
2111
|
}
|
|
2052
2112
|
}
|
|
2053
|
-
},
|
|
2113
|
+
}, _callee25, this);
|
|
2054
2114
|
}));
|
|
2055
2115
|
|
|
2056
|
-
function fetchDataMaskingInfo(
|
|
2116
|
+
function fetchDataMaskingInfo(_x41) {
|
|
2057
2117
|
return _fetchDataMaskingInfo.apply(this, arguments);
|
|
2058
2118
|
}
|
|
2059
2119
|
|
|
@@ -2069,7 +2129,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2069
2129
|
}, {
|
|
2070
2130
|
key: "makeSecondaryChannelEventRequest",
|
|
2071
2131
|
value: function () {
|
|
2072
|
-
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
2132
|
+
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(requestId, secondaryChannelEventRequestBody) {
|
|
2073
2133
|
var secondaryChannelEventOptionalParams,
|
|
2074
2134
|
timer,
|
|
2075
2135
|
endpoint,
|
|
@@ -2081,13 +2141,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2081
2141
|
elapsedTimeInMilliseconds,
|
|
2082
2142
|
data,
|
|
2083
2143
|
_elapsedTimeInMilliseconds14,
|
|
2084
|
-
|
|
2144
|
+
_args26 = arguments;
|
|
2085
2145
|
|
|
2086
|
-
return _regenerator["default"].wrap(function
|
|
2146
|
+
return _regenerator["default"].wrap(function _callee26$(_context26) {
|
|
2087
2147
|
while (1) {
|
|
2088
|
-
switch (
|
|
2148
|
+
switch (_context26.prev = _context26.next) {
|
|
2089
2149
|
case 0:
|
|
2090
|
-
secondaryChannelEventOptionalParams =
|
|
2150
|
+
secondaryChannelEventOptionalParams = _args26.length > 2 && _args26[2] !== undefined ? _args26[2] : {};
|
|
2091
2151
|
timer = _Timer.Timer.TIMER();
|
|
2092
2152
|
|
|
2093
2153
|
if (this.logger) {
|
|
@@ -2117,12 +2177,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2117
2177
|
method: "POST",
|
|
2118
2178
|
url: endpoint
|
|
2119
2179
|
};
|
|
2120
|
-
|
|
2121
|
-
|
|
2180
|
+
_context26.prev = 12;
|
|
2181
|
+
_context26.next = 15;
|
|
2122
2182
|
return axiosInstance(options);
|
|
2123
2183
|
|
|
2124
2184
|
case 15:
|
|
2125
|
-
response =
|
|
2185
|
+
response = _context26.sent;
|
|
2126
2186
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2127
2187
|
data = response.data;
|
|
2128
2188
|
|
|
@@ -2135,41 +2195,41 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2135
2195
|
}, "Secondary Channel Event Request Succeeded");
|
|
2136
2196
|
}
|
|
2137
2197
|
|
|
2138
|
-
|
|
2198
|
+
_context26.next = 29;
|
|
2139
2199
|
break;
|
|
2140
2200
|
|
|
2141
2201
|
case 21:
|
|
2142
|
-
|
|
2143
|
-
|
|
2202
|
+
_context26.prev = 21;
|
|
2203
|
+
_context26.t0 = _context26["catch"](12);
|
|
2144
2204
|
_elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
|
|
2145
2205
|
|
|
2146
2206
|
if (!this.logger) {
|
|
2147
|
-
|
|
2207
|
+
_context26.next = 28;
|
|
2148
2208
|
break;
|
|
2149
2209
|
}
|
|
2150
2210
|
|
|
2151
|
-
|
|
2152
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2211
|
+
_context26.next = 27;
|
|
2212
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context26.t0);
|
|
2153
2213
|
|
|
2154
2214
|
case 27:
|
|
2155
2215
|
this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, {
|
|
2156
2216
|
RequestId: requestId,
|
|
2157
|
-
ExceptionDetails:
|
|
2217
|
+
ExceptionDetails: _context26.t0,
|
|
2158
2218
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds14
|
|
2159
2219
|
}, "Secondary Channel Event Request Failed");
|
|
2160
2220
|
|
|
2161
2221
|
case 28:
|
|
2162
|
-
throw
|
|
2222
|
+
throw _context26.t0;
|
|
2163
2223
|
|
|
2164
2224
|
case 29:
|
|
2165
2225
|
case "end":
|
|
2166
|
-
return
|
|
2226
|
+
return _context26.stop();
|
|
2167
2227
|
}
|
|
2168
2228
|
}
|
|
2169
|
-
},
|
|
2229
|
+
}, _callee26, this, [[12, 21]]);
|
|
2170
2230
|
}));
|
|
2171
2231
|
|
|
2172
|
-
function makeSecondaryChannelEventRequest(
|
|
2232
|
+
function makeSecondaryChannelEventRequest(_x44, _x45) {
|
|
2173
2233
|
return _makeSecondaryChannelEventRequest.apply(this, arguments);
|
|
2174
2234
|
}
|
|
2175
2235
|
|
|
@@ -2182,8 +2242,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2182
2242
|
}, {
|
|
2183
2243
|
key: "sendTypingIndicator",
|
|
2184
2244
|
value: function () {
|
|
2185
|
-
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
2186
|
-
var
|
|
2245
|
+
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(requestId, currentLiveChatVersion) {
|
|
2246
|
+
var _this12 = this;
|
|
2187
2247
|
|
|
2188
2248
|
var sendTypingIndicatorOptionalParams,
|
|
2189
2249
|
timer,
|
|
@@ -2192,26 +2252,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2192
2252
|
axiosInstance,
|
|
2193
2253
|
headers,
|
|
2194
2254
|
options,
|
|
2195
|
-
|
|
2196
|
-
return _regenerator["default"].wrap(function
|
|
2255
|
+
_args28 = arguments;
|
|
2256
|
+
return _regenerator["default"].wrap(function _callee28$(_context28) {
|
|
2197
2257
|
while (1) {
|
|
2198
|
-
switch (
|
|
2258
|
+
switch (_context28.prev = _context28.next) {
|
|
2199
2259
|
case 0:
|
|
2200
|
-
sendTypingIndicatorOptionalParams =
|
|
2260
|
+
sendTypingIndicatorOptionalParams = _args28.length > 2 && _args28[2] !== undefined ? _args28[2] : {};
|
|
2201
2261
|
|
|
2202
2262
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2203
|
-
|
|
2263
|
+
_context28.next = 3;
|
|
2204
2264
|
break;
|
|
2205
2265
|
}
|
|
2206
2266
|
|
|
2207
|
-
return
|
|
2267
|
+
return _context28.abrupt("return", Promise.resolve());
|
|
2208
2268
|
|
|
2209
2269
|
case 3:
|
|
2210
2270
|
timer = _Timer.Timer.TIMER();
|
|
2211
2271
|
customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
|
|
2212
2272
|
|
|
2213
2273
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2214
|
-
|
|
2274
|
+
_context28.next = 7;
|
|
2215
2275
|
break;
|
|
2216
2276
|
}
|
|
2217
2277
|
|
|
@@ -2232,25 +2292,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2232
2292
|
method: "POST",
|
|
2233
2293
|
url: endpoint
|
|
2234
2294
|
};
|
|
2235
|
-
return
|
|
2236
|
-
var
|
|
2295
|
+
return _context28.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2296
|
+
var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(resolve, reject) {
|
|
2237
2297
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds15;
|
|
2238
2298
|
|
|
2239
|
-
return _regenerator["default"].wrap(function
|
|
2299
|
+
return _regenerator["default"].wrap(function _callee27$(_context27) {
|
|
2240
2300
|
while (1) {
|
|
2241
|
-
switch (
|
|
2301
|
+
switch (_context27.prev = _context27.next) {
|
|
2242
2302
|
case 0:
|
|
2243
|
-
|
|
2244
|
-
|
|
2303
|
+
_context27.prev = 0;
|
|
2304
|
+
_context27.next = 3;
|
|
2245
2305
|
return axiosInstance(options);
|
|
2246
2306
|
|
|
2247
2307
|
case 3:
|
|
2248
|
-
response =
|
|
2308
|
+
response = _context27.sent;
|
|
2249
2309
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2250
2310
|
data = response.data;
|
|
2251
2311
|
|
|
2252
|
-
if (
|
|
2253
|
-
|
|
2312
|
+
if (_this12.logger) {
|
|
2313
|
+
_this12.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, {
|
|
2254
2314
|
RequestId: requestId,
|
|
2255
2315
|
Region: data.Region,
|
|
2256
2316
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -2259,54 +2319,54 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2259
2319
|
}
|
|
2260
2320
|
|
|
2261
2321
|
resolve();
|
|
2262
|
-
|
|
2322
|
+
_context27.next = 18;
|
|
2263
2323
|
break;
|
|
2264
2324
|
|
|
2265
2325
|
case 10:
|
|
2266
|
-
|
|
2267
|
-
|
|
2326
|
+
_context27.prev = 10;
|
|
2327
|
+
_context27.t0 = _context27["catch"](0);
|
|
2268
2328
|
_elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
|
|
2269
2329
|
|
|
2270
|
-
if (!
|
|
2271
|
-
|
|
2330
|
+
if (!_this12.logger) {
|
|
2331
|
+
_context27.next = 17;
|
|
2272
2332
|
break;
|
|
2273
2333
|
}
|
|
2274
2334
|
|
|
2275
|
-
|
|
2276
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2335
|
+
_context27.next = 16;
|
|
2336
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context27.t0);
|
|
2277
2337
|
|
|
2278
2338
|
case 16:
|
|
2279
|
-
|
|
2339
|
+
_this12.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, {
|
|
2280
2340
|
RequestId: requestId,
|
|
2281
|
-
ExceptionDetails:
|
|
2341
|
+
ExceptionDetails: _context27.t0,
|
|
2282
2342
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds15
|
|
2283
2343
|
}, "Send Typing Indicator Failed");
|
|
2284
2344
|
|
|
2285
2345
|
case 17:
|
|
2286
|
-
reject(
|
|
2346
|
+
reject(_context27.t0);
|
|
2287
2347
|
|
|
2288
2348
|
case 18:
|
|
2289
2349
|
case "end":
|
|
2290
|
-
return
|
|
2350
|
+
return _context27.stop();
|
|
2291
2351
|
}
|
|
2292
2352
|
}
|
|
2293
|
-
},
|
|
2353
|
+
}, _callee27, null, [[0, 10]]);
|
|
2294
2354
|
}));
|
|
2295
2355
|
|
|
2296
|
-
return function (
|
|
2297
|
-
return
|
|
2356
|
+
return function (_x48, _x49) {
|
|
2357
|
+
return _ref12.apply(this, arguments);
|
|
2298
2358
|
};
|
|
2299
2359
|
}()));
|
|
2300
2360
|
|
|
2301
2361
|
case 14:
|
|
2302
2362
|
case "end":
|
|
2303
|
-
return
|
|
2363
|
+
return _context28.stop();
|
|
2304
2364
|
}
|
|
2305
2365
|
}
|
|
2306
|
-
},
|
|
2366
|
+
}, _callee28, this);
|
|
2307
2367
|
}));
|
|
2308
2368
|
|
|
2309
|
-
function sendTypingIndicator(
|
|
2369
|
+
function sendTypingIndicator(_x46, _x47) {
|
|
2310
2370
|
return _sendTypingIndicator.apply(this, arguments);
|
|
2311
2371
|
}
|
|
2312
2372
|
|
|
@@ -2322,4 +2382,4 @@ exports["default"] = SDK;
|
|
|
2322
2382
|
getChatTokenTimeBetweenRetriesOnFailure: 10000,
|
|
2323
2383
|
maxRequestRetriesOnFailure: 3
|
|
2324
2384
|
});
|
|
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
|
|
2385
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiZGVzY3JpcHRpb24iLCJjdXN0b21EYXRhIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsInF1ZXJ5UGFyYW1zIiwicmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJSZXF1ZXN0UGF5bG9hZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJMaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsIkVycm9yQ29kZSIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJ3aWRnZXRBcHBJZCIsIkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVEIiwidG9rZW4iLCJnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyIsIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwib3JnYW5pemF0aW9uSWQiLCJhdXRob3JpemF0aW9uIiwiTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJHRVRDSEFUVFJBTlNDUklQVEZBSUxFRCIsImVtYWlsUmVxdWVzdEJvZHkiLCJlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyIsIkVNQUlMVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJFTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJFTUFJTFRSQU5TQ1JJUFRGQUlMRUQiLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsIkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRoIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0lBRXFCQSxHO0FBU25CLGVBQTJCQyx3QkFBM0IsRUFBbUw7QUFBQSxRQUEzRkMsYUFBMkYsdUVBQXhERixHQUFHLENBQUNHLG9CQUFvRDtBQUFBLFFBQXRCQyxNQUFzQjtBQUFBO0FBQUEsU0FBeEpILHdCQUF3SixHQUF4SkEsd0JBQXdKO0FBQUEsU0FBM0ZDLGFBQTJGLEdBQTNGQSxhQUEyRjtBQUFBLFNBQXRCRSxNQUFzQixHQUF0QkEsTUFBc0I7QUFBQTs7QUFDakw7QUFDQSxRQUFJLENBQUNDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtKLGFBQWpCLEVBQWdDSyxNQUFqQyxJQUEyQyx5QkFBUUwsYUFBUixNQUEyQixRQUExRSxFQUFvRjtBQUNsRixXQUFLQSxhQUFMLEdBQXFCRixHQUFHLENBQUNHLG9CQUF6QjtBQUNELEtBSmdMLENBTWpMOzs7QUFDQSxvQ0FBa0JFLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTixHQUFHLENBQUNHLG9CQUFoQixDQUFsQixrQ0FBeUQ7QUFBcEQsVUFBTUssR0FBRyxtQkFBVDs7QUFDSCxVQUFJLENBQUMsS0FBS04sYUFBTCxDQUFtQk8sY0FBbkIsQ0FBa0NELEdBQWxDLENBQUwsRUFBNkM7QUFBRTtBQUM3QyxjQUFNLElBQUlFLEtBQUosb0JBQXNCRixHQUF0QiwyQkFBTjtBQUNEO0FBQ0YsS0FYZ0wsQ0Fhakw7OztBQUNBLFFBQVFHLFNBQVIsR0FBc0JWLHdCQUF0QixDQUFRVSxTQUFSOztBQUNBLFFBQUksQ0FBQ04sTUFBTSxDQUFDTyxNQUFQLENBQWNDLGdCQUFkLEVBQXlCQyxRQUF6QixDQUFrQ0gsU0FBbEMsQ0FBTCxFQUFnRTtBQUM5RCxZQUFNLElBQUlELEtBQUoscUJBQU47QUFDRCxLQWpCZ0wsQ0FtQmpMOzs7QUFDQSxRQUFNSyx5Q0FBeUMsR0FBR1YsTUFBTSxDQUFDQyxJQUFQLENBQVlMLHdCQUFaLENBQWxEOztBQXBCaUwsK0NBcUIvSmUsc0JBQVVDLDBDQXJCcUo7QUFBQTs7QUFBQTtBQXFCakwsMERBQXdFO0FBQUEsWUFBN0RULElBQTZEOztBQUN0RSxZQUFJLENBQUNPLHlDQUF5QyxDQUFDRCxRQUExQyxDQUFtRE4sSUFBbkQsQ0FBTCxFQUE4RDtBQUM1RCxnQkFBTSxJQUFJRSxLQUFKLG9CQUFzQkYsSUFBdEIsbUNBQU47QUFDRDtBQUNGO0FBekJnTDtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQTJCakwsU0FBS1UsZUFBTCxHQUF1QkMsdUJBQWdCQyxFQUF2QztBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7Ozs7Ozt5R0FDRSxpQkFBMkJDLFNBQTNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOENDLGdCQUFBQSxXQUE5QywyREFBNEQsS0FBNUQ7QUFDUUMsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7O0FBRUUsb0JBQUksS0FBS3JCLE1BQVQsRUFBaUI7QUFDZix1QkFBS0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQkMsYUFEdEIsRUFFRTtBQUFFQyxvQkFBQUEsU0FBUyxFQUFFVjtBQUFiLG1CQUZGLEVBR0UseUJBSEY7QUFJRDs7QUFDRCxvQkFBSSxDQUFDQSxTQUFMLEVBQWdCO0FBQ2RBLGtCQUFBQSxTQUFTLEdBQUcsbUJBQVo7QUFDRDs7QUFFS1csZ0JBQUFBLFFBWlIsYUFZc0IsS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFacEQsY0FZOERDLGlDQUFxQkMsa0JBWm5GLGNBWXlHLEtBQUtsQyx3QkFBTCxDQUE4Qm1DLEtBWnZJLGNBWWdKLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBWjlLLHdCQVlvTWhCLFNBWnBNLHdCQVkyTixLQUFLcEIsd0JBQUwsQ0FBOEJVLFNBWnpQO0FBYVEyQixnQkFBQUEsYUFiUixHQWF3QkMsa0JBQU1DLE1BQU4sRUFieEI7QUFjRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFRyxrQkFBQUEsT0FBTyxFQUFFLEtBQUt2QyxhQUFMLENBQW1Cd0M7QUFBOUIsaUJBQTFCO0FBRUlDLGdCQUFBQSxPQWhCTixHQWdCZ0IsRUFoQmhCOztBQWlCRSxvQkFBSXJCLFdBQUosRUFBaUI7QUFDZnFCLGtCQUFBQSxPQUFPLG1DQUFRM0Isc0JBQVU0QixrQkFBbEIsR0FBeUNELE9BQXpDLENBQVA7QUFDRDs7QUFuQkg7QUFBQSx1QkFvQnlCTCxhQUFhLENBQUNPLEdBQWQsQ0FBa0JiLFFBQWxCLEVBQTRCO0FBQ2pEVyxrQkFBQUEsT0FBTyxFQUFQQTtBQURpRCxpQkFBNUIsQ0FwQnpCOztBQUFBO0FBb0JRRyxnQkFBQUEsUUFwQlI7QUF1QlFDLGdCQUFBQSx5QkF2QlIsR0F1Qm9DeEIsS0FBSyxDQUFDeUIsbUJBdkIxQztBQXdCVUMsZ0JBQUFBLElBeEJWLEdBd0JtQkgsUUF4Qm5CLENBd0JVRyxJQXhCVjs7QUF5QkUsb0JBQUlBLElBQUksQ0FBQzlCLGVBQUwsSUFBd0I4QixJQUFJLENBQUM5QixlQUFMLEtBQXlCQSx1QkFBZ0IrQixFQUFyRSxFQUF5RTtBQUN2RSx1QkFBS2hDLGVBQUwsR0FBdUIrQixJQUFJLENBQUM5QixlQUE1QjtBQUNEOztBQUNEOEIsZ0JBQUFBLElBQUksQ0FBQ04sT0FBTCxHQUFlLEVBQWY7O0FBQ0Esb0JBQUlHLFFBQVEsQ0FBQ0gsT0FBVCxJQUFvQkcsUUFBUSxDQUFDSCxPQUFULENBQWlCLE1BQWpCLENBQXhCLEVBQWtEO0FBQ2hETSxrQkFBQUEsSUFBSSxDQUFDTixPQUFMLENBQWEsTUFBYixJQUF1QkcsUUFBUSxDQUFDSCxPQUFULENBQWlCLE1BQWpCLENBQXZCO0FBQ0Q7O0FBQ0Qsb0JBQUksS0FBS3ZDLE1BQVQsRUFBaUI7QUFDZix1QkFBS0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQnNCLG9CQUR0QixFQUVFO0FBQUVwQixvQkFBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCK0Isb0JBQUFBLE1BQU0sRUFBRU4sUUFBUSxDQUFDRyxJQUFULENBQWNHLE1BQTlDO0FBQXNEQyxvQkFBQUEseUJBQXlCLEVBQUVOLHlCQUFqRjtBQUE0R08sb0JBQUFBLGFBQWEsRUFBRVIsUUFBUSxDQUFDSCxPQUFULENBQWlCLGdCQUFqQjtBQUEzSCxtQkFGRixFQUdFLDJCQUhGO0FBSUQ7O0FBckNILGlEQXNDU00sSUF0Q1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUF5Q0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7eUdBQ0Usa0JBQTJCNUIsU0FBM0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4Q2tDLGdCQUFBQSwyQkFBOUMsOERBQTBHLEVBQTFHO0FBQ1FoQyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLckIsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CMkIsbUJBRHRCLEVBRUU7QUFBRXpCLG9CQUFBQSxTQUFTLEVBQUVWO0FBQWIsbUJBRkYsRUFHRSx5QkFIRjtBQUlEOztBQUNELG9CQUFJLENBQUNBLFNBQUwsRUFBZ0I7QUFDZEEsa0JBQUFBLFNBQVMsR0FBRyxtQkFBWjtBQUNELGlCQVZILENBWUU7OztBQUNJVyxnQkFBQUEsUUFiTixhQWFvQixLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQWJsRCxjQWE0REMsaUNBQXFCdUIsK0JBYmpGLGNBYW9ILEtBQUt4RCx3QkFBTCxDQUE4Qm1DLEtBYmxKLGNBYTJKLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBYnpMLGNBYXFNaEIsU0Fick07QUFjUWlCLGdCQUFBQSxhQWRSLEdBY3dCQyxrQkFBTUMsTUFBTixFQWR4QjtBQWVFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVHLGtCQUFBQSxPQUFPLEVBQUUsS0FBS3ZDLGFBQUwsQ0FBbUJ3QztBQUE5QixpQkFBMUIsRUFmRixDQWlCRTs7QUFDUWdCLGdCQUFBQSxzQkFsQlYsR0FrQmtESCwyQkFsQmxELENBa0JVRyxzQkFsQlYsRUFrQmtDQyxXQWxCbEMsR0FrQmtESiwyQkFsQmxELENBa0JrQ0ksV0FsQmxDO0FBbUJRaEIsZ0JBQUFBLE9BbkJSLEdBbUI2QjNCLHNCQUFVNEMsY0FuQnZDLEVBcUJFOztBQUNBLG9CQUFJRixzQkFBSixFQUE0QjtBQUMxQjFCLGtCQUFBQSxRQUFRLGFBQU0sS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFBcEMsY0FBOENDLGlDQUFxQjJCLG1DQUFuRSxjQUEwRyxLQUFLNUQsd0JBQUwsQ0FBOEJtQyxLQUF4SSxjQUFpSixLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQUEvSyxjQUEyTGhCLFNBQTNMLENBQVI7QUFDQXNCLGtCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJKLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDRCxpQkF6QkgsQ0EyQkU7OztBQUNBLG9CQUFJQyxXQUFKLEVBQWlCO0FBQ2YzQixrQkFBQUEsUUFBUSxlQUFRMkIsV0FBUixDQUFSO0FBQ0Q7O0FBQ0QzQixnQkFBQUEsUUFBUSx5QkFBa0IsS0FBSy9CLHdCQUFMLENBQThCVSxTQUFoRCxDQUFSO0FBRU1vRCxnQkFBQUEsT0FqQ1IsR0FpQ3NDO0FBQ2xDcEIsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQixrQkFBQUEsTUFBTSxFQUFFLEtBRjBCO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFFakM7QUFINkIsaUJBakN0QztBQUFBLGtEQXVDUyxJQUFJa0MsT0FBSjtBQUFBLDJHQUFZLGtCQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVROUIsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUakIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CeEIsS0FBSyxDQUFDeUIsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSUVILFFBSkYsQ0FJUEcsSUFKTzs7QUFLZixnQ0FBSSxLQUFJLENBQUM3QyxNQUFULEVBQWlCO0FBQ2YsOEJBQUEsS0FBSSxDQUFDQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9Cd0MscUJBRHRCLEVBRUU7QUFBRXRDLGdDQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0IrQixnQ0FBQUEsTUFBTSxFQUFFTixRQUFRLENBQUNHLElBQVQsQ0FBY0csTUFBOUM7QUFBc0RDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQWpGO0FBQTRHTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQTNILCtCQUZGLEVBR0UsMkJBSEY7QUFJRDs7QUFDRHdCLDRCQUFBQSxPQUFPLENBQUNsQixJQUFELENBQVA7QUFYZTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWFURiw0QkFBQUEsMEJBYlMsR0FhbUJ4QixLQUFLLENBQUN5QixtQkFiekI7O0FBQUEsaUNBY1gsS0FBSSxDQUFDNUMsTUFkTTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLG1DQWVQa0UsbUNBQWlCQyw2QkFBakIsY0FmTzs7QUFBQTtBQWdCYiw0QkFBQSxLQUFJLENBQUNuRSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBUzZDLEtBQXpCLEVBQ0UzQywyQkFBb0I0QyxrQkFEdEIsRUFFRTtBQUFFMUMsOEJBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QnFELDhCQUFBQSxnQkFBZ0IsY0FBeEM7QUFBaURyQiw4QkFBQUEseUJBQXlCLEVBQUVOO0FBQTVFLDZCQUZGLEVBR0Usd0JBSEY7O0FBaEJhO0FBcUJmcUIsNEJBQUFBLE1BQU07O0FBckJTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXZDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQWdFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozt3R0FDRSxrQkFBMEIvQyxTQUExQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2Q3NELGdCQUFBQSwwQkFBN0MsOERBQXVHLEVBQXZHO0FBQTJHQyxnQkFBQUEsaUJBQTNHLDhEQUF1SSxDQUF2STtBQUE2SztBQUNyS3JELGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRVVrQyxnQkFBQUEsV0FGVixHQUUwRWdCLDBCQUYxRSxDQUVVaEIsV0FGVixFQUV1QkQsc0JBRnZCLEdBRTBFaUIsMEJBRjFFLENBRXVCakIsc0JBRnZCLEVBRStDbUIsc0JBRi9DLEdBRTBFRiwwQkFGMUUsQ0FFK0NFLHNCQUYvQzs7QUFHRSxvQkFBSSxLQUFLekUsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CaUQsbUJBRHRCLEVBRUU7QUFBRS9DLG9CQUFBQSxTQUFTLEVBQUVWO0FBQWIsbUJBRkYsRUFHRSx3QkFIRjtBQUlEOztBQVJILHNCQVNNdUQsaUJBQWlCLEdBQUcsQ0FUMUI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBVVUsSUFBSWxFLEtBQUosNkJBVlY7O0FBQUE7QUFhRSxvQkFBSSxDQUFDVyxTQUFMLEVBQWdCO0FBQ2RBLGtCQUFBQSxTQUFTLEdBQUcsbUJBQVo7QUFDRDs7QUFDS3NCLGdCQUFBQSxPQWhCUixHQWdCNkIzQixzQkFBVTRDLGNBaEJ2QztBQWlCTTVCLGdCQUFBQSxRQWpCTixhQWlCb0IsS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFqQmxELGNBaUI0REMsaUNBQXFCNkMsd0JBakJqRixjQWlCNkcsS0FBSzlFLHdCQUFMLENBQThCbUMsS0FqQjNJLGNBaUJvSixLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQWpCbEwsY0FpQjhMaEIsU0FqQjlMOztBQW1CRSxvQkFBSSxLQUFLSCxlQUFMLEtBQXlCQyx1QkFBZ0IrQixFQUF6QyxJQUFnRDJCLHNCQUFzQixJQUFJQSxzQkFBc0IsS0FBSzFELHVCQUFnQitCLEVBQXpILEVBQThIO0FBQzVIbEIsa0JBQUFBLFFBQVEsYUFBTSxLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQUFwQyxjQUE4Q0MsaUNBQXFCOEMsMEJBQW5FLGNBQWlHLEtBQUsvRSx3QkFBTCxDQUE4Qm1DLEtBQS9ILGNBQXdJLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBQXRLLGNBQWtMaEIsU0FBbEwsQ0FBUjs7QUFDQSxzQkFBSXFDLHNCQUFKLEVBQTRCO0FBQzFCMUIsb0JBQUFBLFFBQVEsYUFBTSxLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQUFwQyxjQUE4Q0MsaUNBQXFCK0MsOEJBQW5FLGNBQXFHLEtBQUtoRix3QkFBTCxDQUE4Qm1DLEtBQW5JLGNBQTRJLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBQTFLLGNBQXNMaEIsU0FBdEwsQ0FBUjtBQUNBc0Isb0JBQUFBLE9BQU8sQ0FBQ21CLG1DQUF1Qkosc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNEO0FBQ0YsaUJBTkQsTUFNTztBQUNMLHNCQUFJQSxzQkFBSixFQUE0QjtBQUMxQjFCLG9CQUFBQSxRQUFRLGFBQU0sS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFBcEMsY0FBOENDLGlDQUFxQmdELDRCQUFuRSxjQUFtRyxLQUFLakYsd0JBQUwsQ0FBOEJtQyxLQUFqSSxjQUEwSSxLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQUF4SyxjQUFvTGhCLFNBQXBMLENBQVI7QUFDQXNCLG9CQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJKLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDRDtBQUNGOztBQUVELG9CQUFJQyxXQUFKLEVBQWlCO0FBQ2YzQixrQkFBQUEsUUFBUSxlQUFRMkIsV0FBUixDQUFSO0FBQ0Q7O0FBQ0QzQixnQkFBQUEsUUFBUSx5QkFBa0IsS0FBSy9CLHdCQUFMLENBQThCVSxTQUFoRCxDQUFSO0FBRU1vRCxnQkFBQUEsT0FyQ1IsR0FxQ3NDO0FBQ2xDcEIsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQixrQkFBQUEsTUFBTSxFQUFFLEtBRjBCO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFFakM7QUFINkIsaUJBckN0QztBQTBDUU0sZ0JBQUFBLGFBMUNSLEdBMEN3QkMsa0JBQU1DLE1BQU4sRUExQ3hCO0FBMkNFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVHLGtCQUFBQSxPQUFPLEVBQUUsS0FBS3ZDLGFBQUwsQ0FBbUJ3QztBQUE5QixpQkFBMUI7QUEzQ0Ysa0RBNENTLElBQUl3QixPQUFKO0FBQUEsNEdBQVksa0JBQU9DLE9BQVAsRUFBZ0JDLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVE5QixhQUFhLENBQUN5QixPQUFELENBRnJCOztBQUFBO0FBRVRqQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUJ4QixLQUFLLENBQUN5QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJRUgsUUFKRixDQUlQRyxJQUpPLEVBS2Y7O0FBTGUsaUNBTVhBLElBTlc7QUFBQTtBQUFBO0FBQUE7O0FBT2JBLDRCQUFBQSxJQUFJLENBQUM1QixTQUFMLEdBQWlCQSxTQUFqQjs7QUFDQSxnQ0FBSSxNQUFJLENBQUNqQixNQUFULEVBQWlCO0FBQ2YsOEJBQUEsTUFBSSxDQUFDQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9Cc0QscUJBRHRCLEVBRUU7QUFBRXBELGdDQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0IrQixnQ0FBQUEsTUFBTSxFQUFFTixRQUFRLENBQUNHLElBQVQsQ0FBY0csTUFBOUM7QUFBc0RDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQWpGO0FBQTRHTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQTNILCtCQUZGLEVBR0UsMEJBSEY7QUFJRDs7QUFDRHdCLDRCQUFBQSxPQUFPLENBQUNsQixJQUFELENBQVA7QUFkYTs7QUFBQTtBQUFBLGtDQW1CWFUsV0FBVyxJQUFJYixRQUFRLENBQUNzQyxNQUFULEtBQW9CcEUsc0JBQVVxRSxtQkFuQmxDO0FBQUE7QUFBQTtBQUFBOztBQW9CYmpCLDRCQUFBQSxNQUFNLENBQUN0QixRQUFELENBQU47QUFwQmE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQXdCVEMsNEJBQUFBLDJCQXhCUyxHQXdCbUJ4QixLQUFLLENBQUN5QixtQkF4QnpCOztBQUFBLGlDQXlCWCxNQUFJLENBQUM1QyxNQXpCTTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLG1DQTBCUGtFLG1DQUFpQkMsNkJBQWpCLGNBMUJPOztBQUFBO0FBMkJiLDRCQUFBLE1BQUksQ0FBQ25FLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTNkMsS0FBekIsRUFDRTNDLDJCQUFvQnlELGtCQUR0QixFQUVFO0FBQUV2RCw4QkFBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCcUQsOEJBQUFBLGdCQUFnQixjQUF4QztBQUFpRHJCLDhCQUFBQSx5QkFBeUIsRUFBRU47QUFBNUUsNkJBRkYsRUFHRSx1QkFIRjs7QUEzQmE7QUFnQ2ZxQiw0QkFBQUEsTUFBTSxjQUFOO0FBaENlOztBQUFBO0FBQUEsa0NBcUNiUSxpQkFBaUIsR0FBRyxDQUFwQixJQUF5QixNQUFJLENBQUMxRSxhQUFMLENBQW1CcUYsc0JBckMvQjtBQUFBO0FBQUE7QUFBQTs7QUFzQ2ZuQiw0QkFBQUEsTUFBTSxDQUFDLElBQUkxRCxLQUFKLG9FQUFzRSxNQUFJLENBQUNSLGFBQUwsQ0FBbUJxRixzQkFBekYsRUFBRCxDQUFOO0FBdENlOztBQUFBO0FBMENqQjtBQUNBQyw0QkFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZiw4QkFBQSxNQUFJLENBQUNDLFlBQUwsQ0FBa0JwRSxTQUFsQixFQUE2QnNELDBCQUE3QixFQUF5REMsaUJBQWlCLEdBQUcsQ0FBN0UsRUFBZ0ZjLElBQWhGLENBQXFGLFVBQUM1QyxRQUFEO0FBQUEsdUNBQWNxQixPQUFPLENBQUNyQixRQUFELENBQXJCO0FBQUEsK0JBQXJGLFdBQTRILFVBQUM2QyxLQUFEO0FBQUEsdUNBQVd2QixNQUFNLENBQUN1QixLQUFELENBQWpCO0FBQUEsK0JBQTVIO0FBQ0QsNkJBRlMsRUFFUCxNQUFJLENBQUN6RixhQUFMLENBQW1CMEYsdUNBRlosQ0FBVjs7QUEzQ2lCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQTVDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQTZGQTtBQUNGO0FBQ0E7QUFDQTs7Ozs7aUhBQ0Usa0JBQW1DQyx3QkFBbkM7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1F0RSxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVVaUMsZ0JBQUFBLHNCQUZWLEdBRXFDbUMsd0JBRnJDLENBRVVuQyxzQkFGVjs7QUFHRSxvQkFBSSxLQUFLdEQsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CaUUscUJBRHRCLEVBRUUsZ0NBRkY7QUFHRDs7QUFFSzlELGdCQUFBQSxRQVRSLGFBU3NCLEtBQUsvQix3QkFBTCxDQUE4QmdDLE1BVHBELGNBUzhEQyxpQ0FBcUI2RCxpQ0FUbkYsY0FTd0gsS0FBSzlGLHdCQUFMLENBQThCbUMsS0FUdEosY0FTK0osS0FBS25DLHdCQUFMLENBQThCb0MsUUFUN0wsY0FTeU0sS0FBS3BDLHdCQUFMLENBQThCbUMsS0FUdk8sd0JBUzBQLEtBQUtuQyx3QkFBTCxDQUE4QlUsU0FUeFI7QUFVUWdDLGdCQUFBQSxPQVZSLEdBVTZCM0Isc0JBQVU0QyxjQVZ2QztBQVdFakIsZ0JBQUFBLE9BQU8sQ0FBQ21CLG1DQUF1Qkosc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUVNSyxnQkFBQUEsT0FiUixHQWFzQztBQUNsQ3BCLGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDcUIsa0JBQUFBLE1BQU0sRUFBRSxLQUYwQjtBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBRWpDO0FBSDZCLGlCQWJ0QztBQW1CUU0sZ0JBQUFBLGFBbkJSLEdBbUJ3QkMsa0JBQU1DLE1BQU4sRUFuQnhCO0FBQUEsa0RBb0JTLElBQUkwQixPQUFKO0FBQUEsNEdBQVksa0JBQU9DLE9BQVAsRUFBZ0JDLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVE5QixhQUFhLENBQUN5QixPQUFELENBRnJCOztBQUFBO0FBRVRqQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUJ4QixLQUFLLENBQUN5QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJRUgsUUFKRixDQUlQRyxJQUpPLEVBTWY7O0FBTmUsaUNBT1hBLElBUFc7QUFBQTtBQUFBO0FBQUE7O0FBUWIsZ0NBQUksTUFBSSxDQUFDN0MsTUFBVCxFQUFpQjtBQUNmLDhCQUFBLE1BQUksQ0FBQ0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQmlFLHFCQUR0QixFQUVFO0FBQUUxQyxnQ0FBQUEsTUFBTSxFQUFFTixRQUFRLENBQUNHLElBQVQsQ0FBY0csTUFBeEI7QUFBZ0NDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQTNEO0FBQXNGTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIzQixzQkFBVWdGLGFBQTNCO0FBQXJHLCtCQUZGLEVBR0UsNERBSEY7QUFJRDs7QUFDRDdCLDRCQUFBQSxPQUFPLENBQUNsQixJQUFELENBQVA7QUFkYTs7QUFBQTtBQWlCZjtBQUNBa0IsNEJBQUFBLE9BQU87QUFsQlE7O0FBQUE7QUFBQTtBQUFBO0FBcUJUcEIsNEJBQUFBLDJCQXJCUyxHQXFCbUJ4QixLQUFLLENBQUN5QixtQkFyQnpCOztBQUFBLGlDQXNCWCxNQUFJLENBQUM1QyxNQXRCTTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLG1DQXVCUGtFLG1DQUFpQkMsNkJBQWpCLGNBdkJPOztBQUFBO0FBd0JiLDRCQUFBLE1BQUksQ0FBQ25FLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTNkMsS0FBekIsRUFDRTNDLDJCQUFvQmlFLHFCQUR0QixFQUVFO0FBQUVwQiw4QkFBQUEsZ0JBQWdCLGNBQWxCO0FBQTJCckIsOEJBQUFBLHlCQUF5QixFQUFFTjtBQUF0RCw2QkFGRixFQUdFLGdDQUhGOztBQXhCYTtBQTZCZnFCLDRCQUFBQSxNQUFNLGNBQU47QUE3QmU7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBcEJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBdURFO0FBQ0o7QUFDQTtBQUNBOzs7OztvSEFDRSxrQkFBc0NULFdBQXRDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRcEMsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7O0FBRUUsb0JBQUksS0FBS3JCLE1BQVQsRUFBaUI7QUFDZix1QkFBS0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQm9FLHdCQUR0QixFQUVFLG9DQUZGO0FBR0Q7O0FBRUtqRSxnQkFBQUEsUUFSUixhQVFzQixLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQVJwRCxjQVE4REMsaUNBQXFCZ0UsaUNBUm5GLGNBUXdILEtBQUtqRyx3QkFBTCxDQUE4Qm1DLEtBUnRKLGNBUStKLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBUjdMLGNBUXlNc0IsV0FSek07QUFTUWhCLGdCQUFBQSxPQVRSLEdBUzZCM0Isc0JBQVU0QyxjQVR2QztBQVVRRyxnQkFBQUEsT0FWUixHQVVzQztBQUNsQ3BCLGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDcUIsa0JBQUFBLE1BQU0sRUFBRSxLQUYwQjtBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBRWpDO0FBSDZCLGlCQVZ0QztBQWdCUU0sZ0JBQUFBLGFBaEJSLEdBZ0J3QkMsa0JBQU1DLE1BQU4sRUFoQnhCO0FBQUEsa0RBaUJTLElBQUkwQixPQUFKO0FBQUEsNEdBQVksa0JBQU9DLE9BQVAsRUFBZ0JDLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVE5QixhQUFhLENBQUN5QixPQUFELENBRnJCOztBQUFBO0FBRVRqQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUJ4QixLQUFLLENBQUN5QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJRUgsUUFKRixDQUlQRyxJQUpPOztBQUFBLGlDQUtYQSxJQUxXO0FBQUE7QUFBQTtBQUFBOztBQU1iLGdDQUFJLE1BQUksQ0FBQzdDLE1BQVQsRUFBaUI7QUFDZiw4QkFBQSxNQUFJLENBQUNBLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTQyxJQUF6QixFQUNFQywyQkFBb0JvRSx3QkFEdEIsRUFFRTtBQUFFN0MsZ0NBQUFBLE1BQU0sRUFBRU4sUUFBUSxDQUFDRyxJQUFULENBQWNHLE1BQXhCO0FBQWdDQyxnQ0FBQUEseUJBQXlCLEVBQUVOLHlCQUEzRDtBQUFzRk8sZ0NBQUFBLGFBQWEsRUFBRVIsUUFBUSxDQUFDSCxPQUFULENBQWlCM0Isc0JBQVVnRixhQUEzQjtBQUFyRywrQkFGRixFQUdFLHNDQUhGO0FBSUQ7O0FBQ0Q3Qiw0QkFBQUEsT0FBTyxDQUFDbEIsSUFBRCxDQUFQO0FBWmE7O0FBQUE7QUFlZjtBQUNBLGdDQUFJLE1BQUksQ0FBQzdDLE1BQVQsRUFBaUI7QUFDZiw4QkFBQSxNQUFJLENBQUNBLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTd0UsSUFBekIsRUFDRXRFLDJCQUFvQm9FLHdCQUR0QixFQUVFO0FBQUU3QyxnQ0FBQUEsTUFBTSxFQUFFTixRQUFRLENBQUNHLElBQVQsQ0FBY0csTUFBeEI7QUFBZ0NDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQTNEO0FBQXNGTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIzQixzQkFBVWdGLGFBQTNCO0FBQXJHLCtCQUZGLEVBR0Usd0RBSEY7QUFJRDs7QUFDRDdCLDRCQUFBQSxPQUFPO0FBdEJROztBQUFBO0FBQUE7QUFBQTtBQXlCVHBCLDRCQUFBQSwyQkF6QlMsR0F5Qm1CeEIsS0FBSyxDQUFDeUIsbUJBekJ6Qjs7QUFBQSxpQ0EwQlgsTUFBSSxDQUFDNUMsTUExQk07QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxtQ0EyQlBrRSxtQ0FBaUJDLDZCQUFqQixjQTNCTzs7QUFBQTtBQTRCYiw0QkFBQSxNQUFJLENBQUNuRSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBUzZDLEtBQXpCLEVBQ0UzQywyQkFBb0JvRSx3QkFEdEIsRUFFRTtBQUFFdkIsOEJBQUFBLGdCQUFnQixjQUFsQjtBQUEyQnJCLDhCQUFBQSx5QkFBeUIsRUFBRU47QUFBdEQsNkJBRkYsRUFHRSxtQ0FIRjs7QUE1QmE7QUFpQ2ZxQiw0QkFBQUEsTUFBTSxjQUFOO0FBakNlOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQWpCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQXdEQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7OztnSEFDRSxtQkFBa0MvQyxTQUFsQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBcUQrRSxnQkFBQUEsK0JBQXJELGlFQUE0SCxFQUE1SDtBQUNRN0UsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7O0FBRUUsb0JBQUksS0FBS3JCLE1BQVQsRUFBaUI7QUFDZix1QkFBS0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQndFLDJCQUR0QixFQUVFO0FBQUV0RSxvQkFBQUEsU0FBUyxFQUFFVjtBQUFiLG1CQUZGLEVBR0UsZ0NBSEY7QUFJRDs7QUFFS1csZ0JBQUFBLFFBVFIsYUFTc0IsS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFUcEQsY0FTOERDLGlDQUFxQm9FLHdCQVRuRixjQVMrRyxLQUFLckcsd0JBQUwsQ0FBOEJtQyxLQVQ3SSxjQVNzSixLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQVRwTCxjQVNnTWhCLFNBVGhNO0FBVVFpQixnQkFBQUEsYUFWUixHQVV3QkMsa0JBQU1DLE1BQU4sRUFWeEI7QUFXRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFRyxrQkFBQUEsT0FBTyxFQUFFLEtBQUt2QyxhQUFMLENBQW1Cd0M7QUFBOUIsaUJBQTFCO0FBRU9nQixnQkFBQUEsc0JBYlQsR0FhNkQwQywrQkFiN0QsQ0FhUzFDLHNCQWJULEVBYWlDNkMsV0FiakMsR0FhNkRILCtCQWI3RCxDQWFpQ0csV0FiakMsRUFhOENDLFVBYjlDLEdBYTZESiwrQkFiN0QsQ0FhOENJLFVBYjlDO0FBZVE3RCxnQkFBQUEsT0FmUixHQWU2QjNCLHNCQUFVNEMsY0FmdkM7O0FBaUJFLG9CQUFJRixzQkFBSixFQUE0QjtBQUMxQmYsa0JBQUFBLE9BQU8sQ0FBQ21CLG1DQUF1Qkosc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNEOztBQUVLVCxnQkFBQUEsSUFyQlIsR0FxQjRCc0QsV0FBVyxJQUFJLEVBckIzQztBQXVCUUUsZ0JBQUFBLE9BdkJSLEdBdUJrQjtBQUNkLDJCQUFTLEtBQUt4Ryx3QkFBTCxDQUE4Qm1DLEtBRHpCO0FBRWQsOEJBQVksS0FBS25DLHdCQUFMLENBQThCb0M7QUFGNUIsaUJBdkJsQjs7QUE0QkUsb0JBQUlZLElBQUksSUFBSUEsSUFBSSxDQUFDeUQsaUJBQWpCLEVBQW9DO0FBQzVCQyxrQkFBQUEsT0FENEIsR0FDbEJDLHFDQUFrQkMsSUFBbEIsQ0FBdUI1RCxJQUFJLENBQUN5RCxpQkFBNUIsQ0FEa0I7QUFFbENyRyxrQkFBQUEsTUFBTSxDQUFDeUcsTUFBUCxDQUFjTCxPQUFkLEVBQXVCO0FBQUMscUNBQWlCRTtBQUFsQixtQkFBdkI7QUFDRDs7QUFFRCxvQkFBSTFELElBQUksQ0FBQzhELGVBQVQsRUFBMEI7QUFDdEIxRyxrQkFBQUEsTUFBTSxDQUFDeUcsTUFBUCxDQUFjTCxPQUFkLEVBQXVCO0FBQUMsdUNBQW1CeEQsSUFBSSxDQUFDOEQ7QUFBekIsbUJBQXZCO0FBQ0g7O0FBRUQ5RCxnQkFBQUEsSUFBSSxDQUFDK0QsUUFBTCxHQUFnQkMsSUFBSSxDQUFDQyxVQUFMLENBQWdCLFFBQWhCLEVBQTBCQyxNQUExQixDQUFpQ0MsSUFBSSxDQUFDQyxTQUFMLENBQWVaLE9BQWYsQ0FBakMsRUFBMERhLE1BQTFELENBQWlFLEtBQWpFLEVBQXdFQyxRQUF4RSxFQUFoQjs7QUFyQ0Ysc0JBdUNNZixVQUFVLElBQUksQ0FBQ2dCLE1BQU0sQ0FBQ0MsUUF2QzVCO0FBQUE7QUFBQTtBQUFBOztBQUFBLG1EQXdDV3ZELE9BQU8sQ0FBQ0UsTUFBUixDQUFlLElBQUkxRCxLQUFKLGdEQUFmLENBeENYOztBQUFBO0FBMkNFLG9CQUFJOEYsVUFBSixFQUFnQjtBQUNkdkQsa0JBQUFBLElBQUksQ0FBQ3lFLE9BQUwsR0FBZUMseUJBQVlDLGNBQVosRUFBZjtBQUNBM0Usa0JBQUFBLElBQUksQ0FBQzRFLE1BQUwsR0FBY0MsdUJBQVdDLGFBQVgsRUFBZDtBQUNBOUUsa0JBQUFBLElBQUksQ0FBQytFLFNBQUwsR0FBaUJSLE1BQU0sQ0FBQ1MsUUFBUCxDQUFnQkMsSUFBakM7QUFDQWpGLGtCQUFBQSxJQUFJLENBQUNrRixFQUFMLEdBQVVDLGVBQU9DLFNBQVAsRUFBVjtBQUNEOztBQUVELG9CQUFJLENBQUNwRixJQUFJLENBQUNxRixNQUFWLEVBQWtCO0FBQ2hCckYsa0JBQUFBLElBQUksQ0FBQ3FGLE1BQUwsR0FBY3RILHNCQUFVdUgsYUFBeEI7QUFDRCxpQkFwREgsQ0FzREU7OztBQXRERixzQkF1RE10RixJQUFJLENBQUNxRixNQUFMLElBQWUsQ0FBQ0Usb0JBQVFDLGdCQUFSLENBQXlCM0gsUUFBekIsQ0FBa0NtQyxJQUFJLENBQUNxRixNQUF2QyxDQXZEdEI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsbURBd0RXcEUsT0FBTyxDQUFDRSxNQUFSLENBQWUsSUFBSTFELEtBQUosZ0NBQWtDdUMsSUFBSSxDQUFDcUYsTUFBdkMsT0FBZixDQXhEWDs7QUFBQTtBQTJEUXZFLGdCQUFBQSxPQTNEUixHQTJEc0M7QUFDbENkLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDTixrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ3FCLGtCQUFBQSxNQUFNLEVBQUUsTUFIMEI7QUFJbENDLGtCQUFBQSxHQUFHLEVBQUVqQztBQUo2QixpQkEzRHRDO0FBQUEsbURBa0VTLElBQUlrQyxPQUFKO0FBQUEsNEdBQVksbUJBQU9DLE9BQVAsRUFBZ0JDLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVE5QixhQUFhLENBQUN5QixPQUFELENBRnJCOztBQUFBO0FBRVRqQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUJ4QixLQUFLLENBQUN5QixtQkFIekI7QUFJUkMsNEJBQUFBLEtBSlEsR0FJQUgsUUFKQSxDQUlSRyxJQUpROztBQUtmLGdDQUFHQSxLQUFILEVBQVM7QUFDUCxrQ0FBSSxNQUFJLENBQUM3QyxNQUFULEVBQWlCO0FBQ2YsZ0NBQUEsTUFBSSxDQUFDQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CNkcsNkJBRHRCLEVBRUU7QUFBRTNHLGtDQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0IrQixrQ0FBQUEsTUFBTSxFQUFFTixRQUFRLENBQUNHLElBQVQsQ0FBY0csTUFBOUM7QUFBc0RDLGtDQUFBQSx5QkFBeUIsRUFBRU4seUJBQWpGO0FBQTRHTyxrQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQTNILGlDQUZGLEVBR0Usa0NBSEY7QUFJRDs7QUFDRHdCLDhCQUFBQSxPQUFPLENBQUNsQixLQUFELENBQVA7QUFDRDs7QUFiYztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWVURiw0QkFBQUEsMkJBZlMsR0FlbUJ4QixLQUFLLENBQUN5QixtQkFmekI7O0FBQUEsaUNBZ0JYLE1BQUksQ0FBQzVDLE1BaEJNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsbUNBaUJQa0UsbUNBQWlCQyw2QkFBakIsZUFqQk87O0FBQUE7QUFrQmIsNEJBQUEsTUFBSSxDQUFDbkUsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVM2QyxLQUF6QixFQUNFM0MsMkJBQW9COEcsMEJBRHRCLEVBRUU7QUFBRTVHLDhCQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0JxRCw4QkFBQUEsZ0JBQWdCLGVBQXhDO0FBQWlEckIsOEJBQUFBLHlCQUF5QixFQUFFTjtBQUE1RSw2QkFGRixFQUdFLCtCQUhGOztBQWxCYTtBQXVCZnFCLDRCQUFBQSxNQUFNLGVBQU47O0FBdkJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQWxFVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQThGQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozt1R0FDRSxtQkFBeUIvQyxTQUF6QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNEN1SCxnQkFBQUEseUJBQTVDLGlFQUFvRyxFQUFwRztBQUNRckgsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7O0FBRUUsb0JBQUksS0FBS3JCLE1BQVQsRUFBaUI7QUFDVHlJLGtCQUFBQSxXQURTLEdBQ0ssc0JBREw7QUFFVEMsa0JBQUFBLFVBRlMsR0FFSTtBQUNqQi9HLG9CQUFBQSxTQUFTLEVBQUVWO0FBRE0sbUJBRko7QUFLZix1QkFBS2pCLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTQyxJQUF6QixFQUErQkMsMkJBQW9Ca0gsa0JBQW5ELEVBQXVFRCxVQUF2RSxFQUFtRkQsV0FBbkY7QUFDRDs7QUFFS3ZHLGdCQUFBQSxhQVZSLEdBVXdCQyxrQkFBTUMsTUFBTixFQVZ4QjtBQVdFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVHLGtCQUFBQSxPQUFPLEVBQUUsS0FBS3ZDLGFBQUwsQ0FBbUJ3QztBQUE5QixpQkFBMUI7QUFFUWlCLGdCQUFBQSxXQWJWLEdBYTJFaUYseUJBYjNFLENBYVVqRixXQWJWLEVBYXVCRCxzQkFidkIsR0FhMkVrRix5QkFiM0UsQ0FhdUJsRixzQkFidkIsRUFhK0M2QyxXQWIvQyxHQWEyRXFDLHlCQWIzRSxDQWErQ3JDLFdBYi9DLEVBYTREQyxVQWI1RCxHQWEyRW9DLHlCQWIzRSxDQWE0RHBDLFVBYjVEO0FBZVE3RCxnQkFBQUEsT0FmUixHQWU2QjNCLHNCQUFVNEMsY0FmdkM7QUFnQk1vRixnQkFBQUEsV0FoQk4sY0FnQndCOUcsaUNBQXFCK0csdUJBaEI3QyxjQWdCd0UsS0FBS2hKLHdCQUFMLENBQThCbUMsS0FoQnRHLGNBZ0IrRyxLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQWhCN0ksY0FnQnlKaEIsU0FoQnpKOztBQWtCRSxvQkFBSXFDLHNCQUFKLEVBQTRCO0FBQzFCc0Ysa0JBQUFBLFdBQVcsY0FBTzlHLGlDQUFxQmdILDJCQUE1QixjQUEyRCxLQUFLakosd0JBQUwsQ0FBOEJtQyxLQUF6RixjQUFrRyxLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQUFoSSxjQUE0SWhCLFNBQTVJLENBQVg7QUFDQXNCLGtCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJKLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDRDs7QUFFRCxvQkFBSUMsV0FBSixFQUFpQjtBQUNmcUYsa0JBQUFBLFdBQVcsZUFBUXJGLFdBQVIsQ0FBWDtBQUNEOztBQUVLd0YsZ0JBQUFBLFdBM0JSLHVCQTJCbUMsS0FBS2xKLHdCQUFMLENBQThCVSxTQTNCakU7QUE0QkVxSSxnQkFBQUEsV0FBVyxlQUFRRyxXQUFSLENBQVg7QUFFTWxGLGdCQUFBQSxHQTlCUixhQThCaUIsS0FBS2hFLHdCQUFMLENBQThCZ0MsTUE5Qi9DLFNBOEJ3RCtHLFdBOUJ4RDtBQWdDUS9GLGdCQUFBQSxJQWhDUixHQWdDNEJzRCxXQUFXLElBQUksRUFoQzNDOztBQUFBLHNCQWtDTUMsVUFBVSxJQUFJLENBQUNnQixNQUFNLENBQUNDLFFBbEM1QjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREFtQ1d2RCxPQUFPLENBQUNFLE1BQVIsQ0FBZSxJQUFJMUQsS0FBSixnREFBZixDQW5DWDs7QUFBQTtBQXNDRSxvQkFBSThGLFVBQUosRUFBZ0I7QUFDZHZELGtCQUFBQSxJQUFJLENBQUN5RSxPQUFMLEdBQWVDLHlCQUFZQyxjQUFaLEVBQWY7QUFDQTNFLGtCQUFBQSxJQUFJLENBQUM0RSxNQUFMLEdBQWNDLHVCQUFXQyxhQUFYLEVBQWQ7QUFDQTlFLGtCQUFBQSxJQUFJLENBQUMrRSxTQUFMLEdBQWlCUixNQUFNLENBQUNTLFFBQVAsQ0FBZ0JDLElBQWpDO0FBQ0FqRixrQkFBQUEsSUFBSSxDQUFDa0YsRUFBTCxHQUFVQyxlQUFPQyxTQUFQLEVBQVY7QUFDRCxpQkEzQ0gsQ0E2Q0U7OztBQUNBLG9CQUFJLENBQUNwRixJQUFJLENBQUNxRixNQUFWLEVBQWtCO0FBQ2hCckYsa0JBQUFBLElBQUksQ0FBQ3FGLE1BQUwsR0FBY3RILHNCQUFVdUgsYUFBeEI7QUFDRCxpQkFoREgsQ0FrREU7OztBQWxERixzQkFtRE10RixJQUFJLENBQUNxRixNQUFMLElBQWUsQ0FBQ0Usb0JBQVFDLGdCQUFSLENBQXlCM0gsUUFBekIsQ0FBa0NtQyxJQUFJLENBQUNxRixNQUF2QyxDQW5EdEI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsbURBb0RXcEUsT0FBTyxDQUFDRSxNQUFSLENBQWUsSUFBSTFELEtBQUosZ0NBQWtDdUMsSUFBSSxDQUFDcUYsTUFBdkMsT0FBZixDQXBEWDs7QUFBQTtBQXVEUXRFLGdCQUFBQSxNQXZEUixHQXVEaUIsTUF2RGpCO0FBd0RRRCxnQkFBQUEsT0F4RFIsR0F3RHNDO0FBQ2xDZCxrQkFBQUEsSUFBSSxFQUFKQSxJQURrQztBQUVsQ04sa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQixrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEE7QUFKa0MsaUJBeER0QztBQUFBO0FBQUE7QUFBQSx1QkFnRTJCM0IsYUFBYSxDQUFDeUIsT0FBRCxDQWhFeEM7O0FBQUE7QUFnRVVqQixnQkFBQUEsUUFoRVY7O0FBa0VJLG9CQUFJLEtBQUsxQyxNQUFULEVBQWlCO0FBQ1QyQyxrQkFBQUEseUJBRFMsR0FDbUJ4QixLQUFLLENBQUN5QixtQkFEekI7QUFHVG9HLGtCQUFBQSxjQUhTLHFCQUdZbkcsSUFIWjs7QUFLZixzQkFBSW1HLGNBQWMsQ0FBQzFDLGlCQUFuQixFQUFzQztBQUNwQ3BDLHVEQUFpQitFLDRCQUFqQixDQUE4Q0QsY0FBYyxDQUFDMUMsaUJBQTdEO0FBQ0Q7O0FBRUQsc0JBQUkwQyxjQUFjLENBQUNFLGVBQW5CLEVBQW9DO0FBQ2xDaEYsdURBQWlCaUYsb0JBQWpCLENBQXNDSCxjQUFjLENBQUNFLGVBQXJEO0FBQ0Q7O0FBRUtSLGtCQUFBQSxXQWJTLEdBYUk7QUFDakIvRyxvQkFBQUEsU0FBUyxFQUFFVixTQURNO0FBRWpCK0Isb0JBQUFBLE1BQU0sRUFBRU4sUUFBUSxDQUFDRyxJQUFULENBQWNHLE1BRkw7QUFHakJDLG9CQUFBQSx5QkFBeUIsRUFBRU4seUJBSFY7QUFJakJPLG9CQUFBQSxhQUFhLEVBQUVSLFFBQVEsQ0FBQ0gsT0FBVCxDQUFpQixnQkFBakIsQ0FKRTtBQUtqQjZHLG9CQUFBQSxjQUFjLEVBQUVKLGNBTEM7QUFNakJLLG9CQUFBQSxXQUFXLEVBQUVULFdBTkk7QUFPakJVLG9CQUFBQSxhQUFhLEVBQUUxRixNQVBFO0FBUWpCMkYsb0JBQUFBLGtCQUFrQixFQUFFN0csUUFBUSxDQUFDc0M7QUFSWixtQkFiSjtBQXdCVHlELGtCQUFBQSxZQXhCUyxHQXdCSyx3QkF4Qkw7QUEwQmYsdUJBQUt6SSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFBK0JDLDJCQUFvQitILG9CQUFuRCxFQUF5RWQsV0FBekUsRUFBcUZELFlBQXJGO0FBQ0Q7O0FBN0ZMO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBK0ZVOUYsZ0JBQUFBLDJCQS9GVixHQStGc0N4QixLQUFLLENBQUN5QixtQkEvRjVDOztBQUFBLHFCQWdHUSxLQUFLNUMsTUFoR2I7QUFBQTtBQUFBO0FBQUE7O0FBa0dZZ0osZ0JBQUFBLGVBbEdaLHFCQWtHaUNuRyxJQWxHakM7O0FBb0dNLG9CQUFJbUcsZUFBYyxDQUFDMUMsaUJBQW5CLEVBQXNDO0FBQ3BDcEMscURBQWlCK0UsNEJBQWpCLENBQThDRCxlQUFjLENBQUMxQyxpQkFBN0Q7QUFDRDs7QUFFRCxvQkFBSTBDLGVBQWMsQ0FBQ0UsZUFBbkIsRUFBb0M7QUFDbENoRixxREFBaUJpRixvQkFBakIsQ0FBc0NILGVBQWMsQ0FBQ0UsZUFBckQ7QUFDRDs7QUExR1A7QUFBQSx1QkE0R1loRixtQ0FBaUJDLDZCQUFqQixlQTVHWjs7QUFBQTtBQThHWXVFLGdCQUFBQSxZQTlHWixHQThHeUI7QUFDakIvRyxrQkFBQUEsU0FBUyxFQUFFVixTQURNO0FBRWpCcUQsa0JBQUFBLGdCQUFnQixlQUZDO0FBR2pCckIsa0JBQUFBLHlCQUF5QixFQUFFTiwyQkFIVjtBQUlqQnlHLGtCQUFBQSxjQUFjLEVBQUVKLGVBSkM7QUFLakJLLGtCQUFBQSxXQUFXLEVBQUVULFdBTEk7QUFNakJVLGtCQUFBQSxhQUFhLEVBQUUxRixNQU5FO0FBT2pCMkYsa0JBQUFBLGtCQUFrQixFQUFFLGNBQWU3RyxRQUFmLENBQXdCc0MsTUFQM0IsQ0FPa0M7O0FBUGxDLGlCQTlHekI7QUF3SFl5RCxnQkFBQUEsYUF4SFosR0F3SDBCLHFCQXhIMUI7QUF5SE0scUJBQUt6SSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBUzZDLEtBQXpCLEVBQWdDM0MsMkJBQW9CZ0ksaUJBQXBELEVBQXVFZixZQUF2RSxFQUFtRkQsYUFBbkY7O0FBekhOO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFnSUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7d0dBQ0UsbUJBQTBCeEgsU0FBMUI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2Q3lJLGdCQUFBQSwwQkFBN0MsaUVBQXVHLEVBQXZHO0FBQ1F2SSxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLckIsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9Ca0ksbUJBRHRCLEVBRUU7QUFBRWhJLG9CQUFBQSxTQUFTLEVBQUVWO0FBQWIsbUJBRkYsRUFHRSx1QkFIRjtBQUlEOztBQUNHVyxnQkFBQUEsUUFSTixhQVFvQixLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQVJsRCxjQVE0REMsaUNBQXFCOEgsd0JBUmpGLGNBUTZHLEtBQUsvSix3QkFBTCxDQUE4Qm1DLEtBUjNJLGNBUW9KLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBUmxMLGNBUThMaEIsU0FSOUwsd0JBUXFOLEtBQUtwQix3QkFBTCxDQUE4QlUsU0FSblA7QUFTUTJCLGdCQUFBQSxhQVRSLEdBU3dCQyxrQkFBTUMsTUFBTixFQVR4QjtBQVVFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVHLGtCQUFBQSxPQUFPLEVBQUUsS0FBS3ZDLGFBQUwsQ0FBbUJ3QztBQUE5QixpQkFBMUI7QUFFUWdCLGdCQUFBQSxzQkFaVixHQVkrRW9HLDBCQVovRSxDQVlVcEcsc0JBWlYsRUFZa0N1RyxlQVpsQyxHQVkrRUgsMEJBWi9FLENBWWtDRyxlQVpsQyxFQVltREMsZ0JBWm5ELEdBWStFSiwwQkFaL0UsQ0FZbURJLGdCQVpuRCxFQVlxRUMsTUFackUsR0FZK0VMLDBCQVovRSxDQVlxRUssTUFackU7QUFjUXhILGdCQUFBQSxPQWRSLEdBYzZCM0Isc0JBQVU0QyxjQWR2QztBQWVRWCxnQkFBQUEsSUFmUixHQWVvQixFQWZwQixFQWV3Qjs7QUFDdEJBLGdCQUFBQSxJQUFJLENBQUNrSCxNQUFMLEdBQWNBLE1BQWQ7O0FBRUEsb0JBQUl6RyxzQkFBSixFQUE0QjtBQUMxQjFCLGtCQUFBQSxRQUFRLGFBQU0sS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFBcEMsY0FBOENDLGlDQUFxQmtJLDRCQUFuRSxjQUFtRyxLQUFLbkssd0JBQUwsQ0FBOEJtQyxLQUFqSSxjQUEwSSxLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQUF4SyxjQUFvTGhCLFNBQXBMLHdCQUEyTSxLQUFLcEIsd0JBQUwsQ0FBOEJVLFNBQXpPLENBQVI7QUFDQWdDLGtCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJKLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDRDs7QUFFRCxvQkFBSXVHLGVBQUosRUFBcUI7QUFDbkJqSSxrQkFBQUEsUUFBUSwyQkFBUjtBQUNEOztBQUVELG9CQUFJa0ksZ0JBQUosRUFBcUI7QUFDbkJsSSxrQkFBQUEsUUFBUSw0QkFBUjtBQUNEOztBQUVLK0IsZ0JBQUFBLE9BL0JSLEdBK0JzQztBQUNsQ2Qsa0JBQUFBLElBQUksRUFBSkEsSUFEa0M7QUFFbENOLGtCQUFBQSxPQUFPLEVBQVBBLE9BRmtDO0FBR2xDcUIsa0JBQUFBLE1BQU0sRUFBRSxNQUgwQjtBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBRWpDO0FBSjZCLGlCQS9CdEM7QUFBQSxtREFzQ1MsSUFBSWtDLE9BQUo7QUFBQSw0R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTlCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGpCLDRCQUFBQSxRQUZTO0FBR1RDLDRCQUFBQSx5QkFIUyxHQUdtQnhCLEtBQUssQ0FBQ3lCLG1CQUh6Qjs7QUFJZixnQ0FBSSxNQUFJLENBQUM1QyxNQUFULEVBQWlCO0FBQ2YsOEJBQUEsTUFBSSxDQUFDQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9Cd0kscUJBRHRCLEVBRUU7QUFBRXRJLGdDQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0IrQixnQ0FBQUEsTUFBTSxFQUFFTixRQUFRLENBQUNHLElBQVQsQ0FBY0csTUFBOUM7QUFBc0RDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQWpGO0FBQTRHTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQTNILCtCQUZGLEVBR0UseUJBSEY7QUFJRDs7QUFDRHdCLDRCQUFBQSxPQUFPO0FBVlE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFZVHBCLDRCQUFBQSwyQkFaUyxHQVltQnhCLEtBQUssQ0FBQ3lCLG1CQVp6Qjs7QUFBQSxpQ0FhWCxNQUFJLENBQUM1QyxNQWJNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsbUNBY1BrRSxtQ0FBaUJDLDZCQUFqQixlQWRPOztBQUFBO0FBZWIsNEJBQUEsTUFBSSxDQUFDbkUsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVM2QyxLQUF6QixFQUNFM0MsMkJBQW9CeUksa0JBRHRCLEVBRUU7QUFBRXZJLDhCQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0JxRCw4QkFBQUEsZ0JBQWdCLGVBQXhDO0FBQWlEckIsOEJBQUFBLHlCQUF5QixFQUFFTjtBQUE1RSw2QkFGRixFQUdFLHNCQUhGOztBQWZhO0FBb0JmcUIsNEJBQUFBLE1BQU07O0FBcEJTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXRDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQThEQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7OztrSEFDRSxtQkFBb0MvQyxTQUFwQyxFQUF1RGtKLG9DQUF2RDtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1FoSixnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLckIsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CMkksNkJBRHRCLEVBRUU7QUFBRXpJLG9CQUFBQSxTQUFTLEVBQUVWO0FBQWIsbUJBRkYsRUFHRSxtQ0FIRjtBQUlEOztBQUNPcUMsZ0JBQUFBLHNCQVJWLEdBUTZDNkcsb0NBUjdDLENBUVU3RyxzQkFSVixFQVFrQ3lHLE1BUmxDLEdBUTZDSSxvQ0FSN0MsQ0FRa0NKLE1BUmxDO0FBU1FuSSxnQkFBQUEsUUFUUixhQVNzQixLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQVRwRCxjQVM4REMsaUNBQXFCdUkscUNBVG5GLGNBUzRILEtBQUt4Syx3QkFBTCxDQUE4Qm1DLEtBVDFKLGNBU21LLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBVGpNLGNBUzZNOEgsTUFUN00sY0FTdU45SSxTQVR2Tix3QkFTOE8sS0FBS3BCLHdCQUFMLENBQThCVSxTQVQ1UTtBQVVRMkIsZ0JBQUFBLGFBVlIsR0FVd0JDLGtCQUFNQyxNQUFOLEVBVnhCO0FBV0UsNENBQVdGLGFBQVgsRUFBMEI7QUFBRUcsa0JBQUFBLE9BQU8sRUFBRSxLQUFLdkMsYUFBTCxDQUFtQndDO0FBQTlCLGlCQUExQjtBQUNNQyxnQkFBQUEsT0FaUixHQVk2QjNCLHNCQUFVNEMsY0FadkM7O0FBYUUsb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCZixrQkFBQUEsT0FBTyxDQUFDbUIsbUNBQXVCSixzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0Q7O0FBQ0tLLGdCQUFBQSxPQWhCUixHQWdCc0M7QUFDbENwQixrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ3FCLGtCQUFBQSxNQUFNLEVBQUUsS0FGMEI7QUFHbENDLGtCQUFBQSxHQUFHLEVBQUVqQztBQUg2QixpQkFoQnRDO0FBQUE7QUFBQTtBQUFBLHVCQXVCMkJNLGFBQWEsQ0FBQ3lCLE9BQUQsQ0F2QnhDOztBQUFBO0FBdUJVakIsZ0JBQUFBLFFBdkJWO0FBd0JVQyxnQkFBQUEseUJBeEJWLEdBd0JzQ3hCLEtBQUssQ0FBQ3lCLG1CQXhCNUM7O0FBQUEsc0JBeUJRLG1CQUFBRixRQUFRLENBQUNHLElBQVQsa0VBQWV5SCxhQUFmLE1BQWlDLElBekJ6QztBQUFBO0FBQUE7QUFBQTs7QUEwQk0scUNBQUt0SyxNQUFMLDhEQUFhc0IsR0FBYixDQUFpQkMsbUJBQVNDLElBQTFCLEVBQ0VDLDJCQUFvQjhJLCtCQUR0QixFQUVFO0FBQUU1SSxrQkFBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCK0Isa0JBQUFBLE1BQU0sRUFBRU4sUUFBUSxDQUFDRyxJQUFULENBQWNHLE1BQTlDO0FBQXNEQyxrQkFBQUEseUJBQXlCLEVBQUVOLHlCQUFqRjtBQUE0R08sa0JBQUFBLGFBQWEsRUFBRVIsUUFBUSxDQUFDSCxPQUFULENBQWlCLGdCQUFqQjtBQUEzSCxpQkFGRixFQUdFLHFDQUhGO0FBMUJOLG1EQThCYXVCLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQnJCLFFBQVEsQ0FBQ0csSUFBekIsQ0E5QmI7O0FBQUE7QUFnQ00sc0NBQUs3QyxNQUFMLGdFQUFhc0IsR0FBYixDQUFpQkMsbUJBQVNDLElBQTFCLEVBQ0VDLDJCQUFvQitJLDRCQUR0QixFQUVFO0FBQUU3SSxrQkFBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCK0Isa0JBQUFBLE1BQU0sRUFBRU4sUUFBUSxDQUFDRyxJQUFULENBQWNHLE1BQTlDO0FBQXNEQyxrQkFBQUEseUJBQXlCLEVBQUVOLHlCQUFqRjtBQUE0R08sa0JBQUFBLGFBQWEsRUFBRVIsUUFBUSxDQUFDSCxPQUFULENBQWlCLGdCQUFqQixDQUEzSDtBQUErSmtJLGtCQUFBQSxTQUFTLEVBQUUvSCxRQUFRLENBQUNzQztBQUFuTCxpQkFGRixFQUdFLG9GQUhGO0FBaENOLG1EQW9DYWxCLE9BQU8sQ0FBQ0UsTUFBUixDQUFlLElBQUkxRCxLQUFKLENBQVUsb0ZBQVYsQ0FBZixDQXBDYjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBdUNVcUMsZ0JBQUFBLDJCQXZDVixHQXVDc0N4QixLQUFLLENBQUN5QixtQkF2QzVDO0FBQUE7QUFBQSx1QkF3Q1VzQixtQ0FBaUJDLDZCQUFqQixlQXhDVjs7QUFBQTtBQXlDSSxzQ0FBS25FLE1BQUwsZ0VBQWFzQixHQUFiLENBQWlCQyxtQkFBUzZDLEtBQTFCLEVBQ0UzQywyQkFBb0IrSSw0QkFEdEIsRUFFRTtBQUFFN0ksa0JBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QnFELGtCQUFBQSxnQkFBZ0IsZUFBeEM7QUFBaURyQixrQkFBQUEseUJBQXlCLEVBQUVOO0FBQTVFLGlCQUZGLEVBR0Usa0NBSEY7O0FBekNKLHNCQTZDVSxjQUFNd0UsUUFBTixPQUFxQiw0Q0E3Qy9CO0FBQUE7QUFBQTtBQUFBOztBQUFBLG1EQThDZXJELE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixFQUFoQixDQTlDZjs7QUFBQTtBQUFBLG1EQWdEZUQsT0FBTyxDQUFDRSxNQUFSLEVBaERmOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBcURBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7a0hBQ0UsbUJBQW9DL0MsU0FBcEMsRUFBdUR5SixnQkFBdkQ7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUZDLGdCQUFBQSxvQ0FBakYsaUVBQStKLEVBQS9KO0FBQ1F4SixnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLckIsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CbUoscUJBRHRCLEVBRUU7QUFBRWpKLG9CQUFBQSxTQUFTLEVBQUVWO0FBQWIsbUJBRkYsRUFHRSwwQkFIRjtBQUlEOztBQUNHVyxnQkFBQUEsUUFSTixhQVFvQixLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQVJsRCxjQVE0REMsaUNBQXFCK0ksMEJBUmpGLGNBUStHLEtBQUtoTCx3QkFBTCxDQUE4Qm1DLEtBUjdJLGNBUXNKLEtBQUtuQyx3QkFBTCxDQUE4Qm9DLFFBUnBMLGNBUWdNaEIsU0FSaE0sd0JBUXVOLEtBQUtwQix3QkFBTCxDQUE4QlUsU0FSclA7QUFTUTJCLGdCQUFBQSxhQVRSLEdBU3dCQyxrQkFBTUMsTUFBTixFQVR4QjtBQVVFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVHLGtCQUFBQSxPQUFPLEVBQUUsS0FBS3ZDLGFBQUwsQ0FBbUJ3QztBQUE5QixpQkFBMUI7QUFFUWdCLGdCQUFBQSxzQkFaVixHQVlxQ3FILG9DQVpyQyxDQVlVckgsc0JBWlY7QUFjUWYsZ0JBQUFBLE9BZFIsR0FjNkIzQixzQkFBVTRDLGNBZHZDOztBQWdCRSxvQkFBSUYsc0JBQUosRUFBNEI7QUFDMUIxQixrQkFBQUEsUUFBUSxhQUFNLEtBQUsvQix3QkFBTCxDQUE4QmdDLE1BQXBDLGNBQThDQyxpQ0FBcUJnSiw4QkFBbkUsY0FBcUcsS0FBS2pMLHdCQUFMLENBQThCbUMsS0FBbkksY0FBNEksS0FBS25DLHdCQUFMLENBQThCb0MsUUFBMUssY0FBc0xoQixTQUF0TCx3QkFBNk0sS0FBS3BCLHdCQUFMLENBQThCVSxTQUEzTyxDQUFSO0FBQ0FnQyxrQkFBQUEsT0FBTyxDQUFDbUIsbUNBQXVCSixzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0Q7O0FBRUtLLGdCQUFBQSxPQXJCUixHQXFCc0M7QUFDbENkLGtCQUFBQSxJQUFJLEVBQUVtRSxJQUFJLENBQUNDLFNBQUwsQ0FBZXlELGdCQUFmLENBRDRCO0FBRWxDbkksa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQixrQkFBQUEsTUFBTSxFQUFFLE1BSDBCO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFFakM7QUFKNkIsaUJBckJ0QztBQUFBLG1EQTRCUyxJQUFJa0MsT0FBSjtBQUFBLDRHQUFZLG1CQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVROUIsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUakIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CeEIsS0FBSyxDQUFDeUIsbUJBSHpCOztBQUlmLGdDQUFJLE1BQUksQ0FBQzVDLE1BQVQsRUFBaUI7QUFDZiw4QkFBQSxNQUFJLENBQUNBLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTQyxJQUF6QixFQUNFQywyQkFBb0JzSix1QkFEdEIsRUFFRTtBQUFFcEosZ0NBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QitCLGdDQUFBQSxNQUFNLEVBQUVOLFFBQVEsQ0FBQ0csSUFBVCxDQUFjRyxNQUE5QztBQUFzREMsZ0NBQUFBLHlCQUF5QixFQUFFTix5QkFBakY7QUFBNEdPLGdDQUFBQSxhQUFhLEVBQUVSLFFBQVEsQ0FBQ0gsT0FBVCxDQUFpQixnQkFBakI7QUFBM0gsK0JBRkYsRUFHRSw0QkFIRjtBQUlEOztBQUNEd0IsNEJBQUFBLE9BQU87QUFWUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVlUcEIsNEJBQUFBLDJCQVpTLEdBWW1CeEIsS0FBSyxDQUFDeUIsbUJBWnpCOztBQUFBLGlDQWFYLE1BQUksQ0FBQzVDLE1BYk07QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxtQ0FjUGtFLG1DQUFpQkMsNkJBQWpCLGVBZE87O0FBQUE7QUFlYiw0QkFBQSxNQUFJLENBQUNuRSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBUzZDLEtBQXpCLEVBQ0UzQywyQkFBb0J1SixvQkFEdEIsRUFFRTtBQUFFckosOEJBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QnFELDhCQUFBQSxnQkFBZ0IsZUFBeEM7QUFBaURyQiw4QkFBQUEseUJBQXlCLEVBQUVOO0FBQTVFLDZCQUZGLEVBR0UseUJBSEY7O0FBZmE7QUFvQmZxQiw0QkFBQUEsTUFBTTs7QUFwQlM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBNUJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBcURBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7K0dBQ0UsbUJBQWlDaUgsYUFBakMsRUFBd0RDLDBCQUF4RDtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTRGQyxnQkFBQUEsaUNBQTVGLGlFQUFvSyxFQUFwSztBQUNRaEssZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7O0FBRUUsb0JBQUksS0FBS3JCLE1BQVQsRUFBaUI7QUFDZix1QkFBS0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQjJKLDBCQUR0QixFQUVFO0FBQUVDLG9CQUFBQSxhQUFhLEVBQUVKO0FBQWpCLG1CQUZGLEVBR0UsZ0NBSEY7QUFJRDs7QUFDR3JKLGdCQUFBQSxRQVJOLGFBUW9CLEtBQUsvQix3QkFBTCxDQUE4QmdDLE1BUmxELGNBUTREQyxpQ0FBcUJ3SiwrQkFSakYsY0FRb0gsS0FBS3pMLHdCQUFMLENBQThCbUMsS0FSbEosY0FRMkppSixhQVIzSjtBQVNRL0ksZ0JBQUFBLGFBVFIsR0FTd0JDLGtCQUFNQyxNQUFOLEVBVHhCO0FBVUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRUcsa0JBQUFBLE9BQU8sRUFBRSxLQUFLdkMsYUFBTCxDQUFtQndDO0FBQTlCLGlCQUExQjtBQUVRZ0IsZ0JBQUFBLHNCQVpWLEdBWWdENkgsaUNBWmhELENBWVU3SCxzQkFaVixFQVlrQ3JDLFNBWmxDLEdBWWdEa0ssaUNBWmhELENBWWtDbEssU0FabEM7QUFlUXNCLGdCQUFBQSxPQWZSLEdBZTZCM0Isc0JBQVU0QyxjQWZ2Qzs7QUFpQkUsb0JBQUlGLHNCQUFKLEVBQTZCO0FBQzNCMUIsa0JBQUFBLFFBQVEsYUFBTSxLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQUFwQyxjQUE4Q0MsaUNBQXFCeUosbUNBQW5FLGNBQTBHLEtBQUsxTCx3QkFBTCxDQUE4Qm1DLEtBQXhJLGNBQWlKaUosYUFBakosQ0FBUjtBQUNBMUksa0JBQUFBLE9BQU8sQ0FBQ21CLG1DQUF1Qkosc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBZixrQkFBQUEsT0FBTyxDQUFDbUIsbUNBQXVCOEgsV0FBeEIsQ0FBUCxHQUE4QyxLQUFLM0wsd0JBQUwsQ0FBOEJvQyxRQUE1RTtBQUNEOztBQUVELG9CQUFJaEIsU0FBSixFQUFlO0FBQ2JzQixrQkFBQUEsT0FBTyxDQUFDbUIsbUNBQXVCekMsU0FBeEIsQ0FBUCxHQUE0Q0EsU0FBNUM7QUFDRDs7QUFFSzBDLGdCQUFBQSxPQTNCUixHQTJCc0M7QUFDbENkLGtCQUFBQSxJQUFJLEVBQUVtRSxJQUFJLENBQUNDLFNBQUwsQ0FBZWlFLDBCQUFmLENBRDRCO0FBRWxDM0ksa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQixrQkFBQUEsTUFBTSxFQUFFLE1BSDBCO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFFakM7QUFKNkIsaUJBM0J0QztBQUFBLG1EQWtDUyxJQUFJa0MsT0FBSjtBQUFBLDRHQUFZLG1CQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVROUIsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUakIsNEJBQUFBLFFBRlM7QUFHUEcsNEJBQUFBLElBSE8sR0FHRUgsUUFIRixDQUdQRyxJQUhPO0FBSVRGLDRCQUFBQSx5QkFKUyxHQUltQnhCLEtBQUssQ0FBQ3lCLG1CQUp6Qjs7QUFLZixnQ0FBSSxNQUFJLENBQUM1QyxNQUFULEVBQWlCO0FBQ2YsOEJBQUEsTUFBSSxDQUFDQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CZ0ssNEJBRHRCLEVBRUU7QUFBRXpJLGdDQUFBQSxNQUFNLEVBQUVOLFFBQVEsQ0FBQ0csSUFBVCxDQUFjRyxNQUF4QjtBQUFnQ0MsZ0NBQUFBLHlCQUF5QixFQUFFTix5QkFBM0Q7QUFBc0ZPLGdDQUFBQSxhQUFhLEVBQUVSLFFBQVEsQ0FBQ0gsT0FBVCxDQUFpQixnQkFBakI7QUFBckcsK0JBRkYsRUFHRSxrQ0FIRjtBQUlEOztBQUNEd0IsNEJBQUFBLE9BQU8sQ0FBQ2xCLElBQUQsQ0FBUDtBQVhlO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBYVRGLDRCQUFBQSw0QkFiUyxHQWFtQnhCLEtBQUssQ0FBQ3lCLG1CQWJ6Qjs7QUFBQSxpQ0FjWCxNQUFJLENBQUM1QyxNQWRNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsbUNBZVBrRSxtQ0FBaUJDLDZCQUFqQixlQWZPOztBQUFBO0FBZ0JiLDRCQUFBLE1BQUksQ0FBQ25FLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTNkMsS0FBekIsRUFDRTNDLDJCQUFvQmlLLHlCQUR0QixFQUVFO0FBQUVwSCw4QkFBQUEsZ0JBQWdCLGVBQWxCO0FBQTJCckIsOEJBQUFBLHlCQUF5QixFQUFFTjtBQUF0RCw2QkFGRixFQUdFLCtCQUhGOztBQWhCYTtBQXFCZnFCLDRCQUFBQSxNQUFNOztBQXJCUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFsQ1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUE0REE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OzhHQUNFLG1CQUFnQy9DLFNBQWhDLEVBQW1EOEksTUFBbkQsRUFBbUU0QixLQUFuRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtGQyxnQkFBQUEsZ0NBQWxGLGlFQUF3SixFQUF4SjtBQUNRekssZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7O0FBRUUsb0JBQUksS0FBS3JCLE1BQVQsRUFBaUI7QUFDZix1QkFBS0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQm9LLHdCQUR0QixFQUVFO0FBQUVsSyxvQkFBQUEsU0FBUyxFQUFFVjtBQUFiLG1CQUZGLEVBR0UsNkJBSEY7QUFJRDs7QUFDR1csZ0JBQUFBLFFBUk4sYUFRb0IsS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFSbEQsY0FRNERDLGlDQUFxQmdLLDZCQVJqRixjQVFrSC9CLE1BUmxILGNBUTRIOUksU0FSNUgsd0JBUW1KLEtBQUtwQix3QkFBTCxDQUE4QlUsU0FSakw7QUFTUTJCLGdCQUFBQSxhQVRSLEdBU3dCQyxrQkFBTUMsTUFBTixFQVR4QjtBQVVFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVHLGtCQUFBQSxPQUFPLEVBQUUsS0FBS3ZDLGFBQUwsQ0FBbUJ3QztBQUE5QixpQkFBMUI7QUFFUWdCLGdCQUFBQSxzQkFaVixHQVk2RHNJLGdDQVo3RCxDQVlVdEksc0JBWlYsRUFZa0NtQixzQkFabEMsR0FZNkRtSCxnQ0FaN0QsQ0FZa0NuSCxzQkFabEM7QUFjUWxDLGdCQUFBQSxPQWRSLEdBYzZCM0Isc0JBQVU0QyxjQWR2QztBQWVFakIsZ0JBQUFBLE9BQU8sQ0FBQ21CLG1DQUF1QnFJLGNBQXhCLENBQVAsR0FBaUQsS0FBS2xNLHdCQUFMLENBQThCbUMsS0FBL0U7QUFDQU8sZ0JBQUFBLE9BQU8sQ0FBQ21CLG1DQUF1QjhILFdBQXhCLENBQVAsR0FBOEMsS0FBSzNMLHdCQUFMLENBQThCb0MsUUFBNUU7QUFDQU0sZ0JBQUFBLE9BQU8sQ0FBQ21CLG1DQUF1QnNJLGFBQXhCLENBQVAsR0FBZ0RMLEtBQWhEOztBQUVBLG9CQUFJLEtBQUs3SyxlQUFMLEtBQXlCQyx1QkFBZ0IrQixFQUF6QyxJQUFnRDJCLHNCQUFzQixJQUFJQSxzQkFBc0IsS0FBSzFELHVCQUFnQitCLEVBQXpILEVBQTZIO0FBQzNIbEIsa0JBQUFBLFFBQVEsYUFBTSxLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQUFwQyxjQUE4Q0MsaUNBQXFCbUssK0JBQW5FLGNBQXNHbEMsTUFBdEcsY0FBZ0g5SSxTQUFoSCx3QkFBdUksS0FBS3BCLHdCQUFMLENBQThCVSxTQUFySyxDQUFSOztBQUNBLHNCQUFJK0Msc0JBQUosRUFBNEI7QUFDMUIxQixvQkFBQUEsUUFBUSxhQUFNLEtBQUsvQix3QkFBTCxDQUE4QmdDLE1BQXBDLGNBQThDQyxpQ0FBcUJvSyxtQ0FBbkUsY0FBMEduQyxNQUExRyxjQUFvSDlJLFNBQXBILHdCQUEySSxLQUFLcEIsd0JBQUwsQ0FBOEJVLFNBQXpLLENBQVI7QUFDRDtBQUNGLGlCQUxELE1BTUssSUFBSStDLHNCQUFKLEVBQTRCO0FBQy9CMUIsa0JBQUFBLFFBQVEsYUFBTSxLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQUFwQyxjQUE4Q0MsaUNBQXFCcUssaUNBQW5FLGNBQXdHcEMsTUFBeEcsY0FBa0g5SSxTQUFsSCx3QkFBeUksS0FBS3BCLHdCQUFMLENBQThCVSxTQUF2SyxDQUFSO0FBQ0Q7O0FBRUtvRCxnQkFBQUEsT0E3QlIsR0E2QnNDO0FBQ2xDcEIsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQixrQkFBQUEsTUFBTSxFQUFFLEtBRjBCO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFFakM7QUFINkIsaUJBN0J0QztBQUFBLG1EQW1DUyxJQUFJa0MsT0FBSjtBQUFBLDRHQUFZLG1CQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVROUIsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUakIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CeEIsS0FBSyxDQUFDeUIsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSUVILFFBSkYsQ0FJUEcsSUFKTzs7QUFLZixnQ0FBSSxNQUFJLENBQUM3QyxNQUFULEVBQWlCO0FBQ2YsOEJBQUEsTUFBSSxDQUFDQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CMkssMEJBRHRCLEVBRUU7QUFBRXpLLGdDQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0IrQixnQ0FBQUEsTUFBTSxFQUFFTixRQUFRLENBQUNHLElBQVQsQ0FBY0csTUFBOUM7QUFBc0RDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQWpGO0FBQTRHTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQTNILCtCQUZGLEVBR0UsK0JBSEY7QUFJRDs7QUFDRHdCLDRCQUFBQSxPQUFPLENBQUNsQixJQUFELENBQVA7QUFYZTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWFURiw0QkFBQUEsNEJBYlMsR0FhbUJ4QixLQUFLLENBQUN5QixtQkFiekI7O0FBQUEsaUNBY1gsTUFBSSxDQUFDNUMsTUFkTTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLG1DQWVQa0UsbUNBQWlCQyw2QkFBakIsZUFmTzs7QUFBQTtBQWdCYiw0QkFBQSxNQUFJLENBQUNuRSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBUzZDLEtBQXpCLEVBQ0UzQywyQkFBb0I0Syx1QkFEdEIsRUFFRTtBQUFFMUssOEJBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QnFELDhCQUFBQSxnQkFBZ0IsZUFBeEM7QUFBaURyQiw4QkFBQUEseUJBQXlCLEVBQUVOO0FBQTVFLDZCQUZGLEVBR0UsNEJBSEY7O0FBaEJhO0FBcUJmcUIsNEJBQUFBLE1BQU0sZUFBTjs7QUFyQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBbkNUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBNkRBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzsyR0FDRSxtQkFBNkIvQyxTQUE3QixFQUFnRDBLLEtBQWhELEVBQStEVyxnQkFBL0Q7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBeUZDLGdCQUFBQSw2QkFBekYsaUVBQXlKLEVBQXpKO0FBQ1FwTCxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLckIsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBU0MsSUFBekIsRUFDRUMsMkJBQW9CK0ssc0JBRHRCLEVBRUU7QUFBRTdLLG9CQUFBQSxTQUFTLEVBQUVWO0FBQWIsbUJBRkYsRUFHRSwwQkFIRjtBQUlEOztBQUNHVyxnQkFBQUEsUUFSTixhQVFvQixLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQVJsRCxjQVE0REMsaUNBQXFCMkssa0NBUmpGLGNBUXVIeEwsU0FSdkgsd0JBUThJLEtBQUtwQix3QkFBTCxDQUE4QlUsU0FSNUs7QUFTUTJCLGdCQUFBQSxhQVRSLEdBU3dCQyxrQkFBTUMsTUFBTixFQVR4QjtBQVVFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVHLGtCQUFBQSxPQUFPLEVBQUUsS0FBS3ZDLGFBQUwsQ0FBbUJ3QztBQUE5QixpQkFBMUI7QUFFUWdCLGdCQUFBQSxzQkFaVixHQVlxQ2lKLDZCQVpyQyxDQVlVakosc0JBWlY7QUFjUWYsZ0JBQUFBLE9BZFIsR0FjNkIzQixzQkFBVTRDLGNBZHZDO0FBZUVqQixnQkFBQUEsT0FBTyxDQUFDbUIsbUNBQXVCcUksY0FBeEIsQ0FBUCxHQUFpRCxLQUFLbE0sd0JBQUwsQ0FBOEJtQyxLQUEvRTtBQUNBTyxnQkFBQUEsT0FBTyxDQUFDbUIsbUNBQXVCOEgsV0FBeEIsQ0FBUCxHQUE4QyxLQUFLM0wsd0JBQUwsQ0FBOEJvQyxRQUE1RTtBQUNBTSxnQkFBQUEsT0FBTyxDQUFDbUIsbUNBQXVCc0ksYUFBeEIsQ0FBUCxHQUFnREwsS0FBaEQ7O0FBRUEsb0JBQUlySSxzQkFBSixFQUE0QjtBQUMxQjFCLGtCQUFBQSxRQUFRLGFBQU0sS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFBcEMsY0FBOENDLGlDQUFxQjRLLHNDQUFuRSxjQUE2R3pMLFNBQTdHLHdCQUFvSSxLQUFLcEIsd0JBQUwsQ0FBOEJVLFNBQWxLLENBQVI7QUFDRDs7QUFFS29ELGdCQUFBQSxPQXZCUixHQXVCc0M7QUFDbENkLGtCQUFBQSxJQUFJLEVBQUVtRSxJQUFJLENBQUNDLFNBQUwsQ0FBZXFGLGdCQUFmLENBRDRCO0FBRWxDL0osa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQixrQkFBQUEsTUFBTSxFQUFFLE1BSDBCO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFFakM7QUFKNkIsaUJBdkJ0QztBQUFBLG1EQThCUyxJQUFJa0MsT0FBSjtBQUFBLDZHQUFZLG1CQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVROUIsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUakIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CeEIsS0FBSyxDQUFDeUIsbUJBSHpCOztBQUlmLGdDQUFJLE9BQUksQ0FBQzVDLE1BQVQsRUFBaUI7QUFDZiw4QkFBQSxPQUFJLENBQUNBLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTQyxJQUF6QixFQUNFQywyQkFBb0JrTCx3QkFEdEIsRUFFRTtBQUFFaEwsZ0NBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QitCLGdDQUFBQSxNQUFNLEVBQUVOLFFBQVEsQ0FBQ0csSUFBVCxDQUFjRyxNQUE5QztBQUFzREMsZ0NBQUFBLHlCQUF5QixFQUFFTix5QkFBakY7QUFBNEdPLGdDQUFBQSxhQUFhLEVBQUVSLFFBQVEsQ0FBQ0gsT0FBVCxDQUFpQixnQkFBakI7QUFBM0gsK0JBRkYsRUFHRSw0QkFIRjtBQUlEOztBQUNEd0IsNEJBQUFBLE9BQU87QUFWUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVlUcEIsNEJBQUFBLDRCQVpTLEdBWW1CeEIsS0FBSyxDQUFDeUIsbUJBWnpCOztBQUFBLGlDQWFYLE9BQUksQ0FBQzVDLE1BYk07QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxtQ0FjUGtFLG1DQUFpQkMsNkJBQWpCLGVBZE87O0FBQUE7QUFlYiw0QkFBQSxPQUFJLENBQUNuRSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBUzZDLEtBQXpCLEVBQ0UzQywyQkFBb0JtTCxxQkFEdEIsRUFFRTtBQUFFakwsOEJBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QnFELDhCQUFBQSxnQkFBZ0IsZUFBeEM7QUFBaURyQiw4QkFBQUEseUJBQXlCLEVBQUVOO0FBQTVFLDZCQUZGLEVBR0UseUJBSEY7O0FBZmE7QUFvQmZxQiw0QkFBQUEsTUFBTTs7QUFwQlM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBOUJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBdURBO0FBQ0Y7QUFDQTtBQUNBOzs7OztnSEFDRSxtQkFBa0MvQyxTQUFsQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUUUsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7O0FBRUUsb0JBQUksS0FBS3JCLE1BQVQsRUFBaUI7QUFDZix1QkFBS0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQm9MLHVCQUR0QixFQUVFO0FBQUVsTCxvQkFBQUEsU0FBUyxFQUFFVjtBQUFiLG1CQUZGLEVBR0UsNEJBSEY7QUFJRDs7QUFDRCxvQkFBSSxDQUFDQSxTQUFMLEVBQWdCO0FBQ2RBLGtCQUFBQSxTQUFTLEdBQUcsbUJBQVo7QUFDRDs7QUFFS1csZ0JBQUFBLFFBWlIsYUFZc0IsS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFacEQsY0FZOERDLGlDQUFxQmdMLGdDQVpuRixjQVl1SCxLQUFLak4sd0JBQUwsQ0FBOEJtQyxLQVpySjtBQWFRRSxnQkFBQUEsYUFiUixHQWF3QkMsa0JBQU1DLE1BQU4sRUFieEI7QUFjRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFRyxrQkFBQUEsT0FBTyxFQUFFLEtBQUt2QyxhQUFMLENBQW1Cd0M7QUFBOUIsaUJBQTFCO0FBRU1DLGdCQUFBQSxPQWhCUixHQWdCNkIzQixzQkFBVTRDLGNBaEJ2QztBQWlCRWpCLGdCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJxSSxjQUF4QixDQUFQLEdBQWlELEtBQUtsTSx3QkFBTCxDQUE4Qm1DLEtBQS9FO0FBQ0FPLGdCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJ6QyxTQUF4QixDQUFQLEdBQTRDQSxTQUE1QztBQUVNMEMsZ0JBQUFBLE9BcEJSLEdBb0JzQztBQUNsQ3BCLGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDcUIsa0JBQUFBLE1BQU0sRUFBRSxLQUYwQjtBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBRWpDO0FBSDZCLGlCQXBCdEM7QUFBQSxtREEwQlMsSUFBSWtDLE9BQUo7QUFBQSw2R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTlCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGpCLDRCQUFBQSxRQUZTO0FBR1RDLDRCQUFBQSx5QkFIUyxHQUdtQnhCLEtBQUssQ0FBQ3lCLG1CQUh6QjtBQUlQQyw0QkFBQUEsSUFKTyxHQUlFSCxRQUpGLENBSVBHLElBSk87O0FBS2YsZ0NBQUksT0FBSSxDQUFDN0MsTUFBVCxFQUFpQjtBQUNmLDhCQUFBLE9BQUksQ0FBQ0EsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQnNMLHlCQUR0QixFQUVFO0FBQUVwTCxnQ0FBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCK0IsZ0NBQUFBLE1BQU0sRUFBRU4sUUFBUSxDQUFDRyxJQUFULENBQWNHLE1BQTlDO0FBQXNEQyxnQ0FBQUEseUJBQXlCLEVBQUVOLHlCQUFqRjtBQUE0R08sZ0NBQUFBLGFBQWEsRUFBRVIsUUFBUSxDQUFDSCxPQUFULENBQWlCLGdCQUFqQjtBQUEzSCwrQkFGRixFQUdFLDhCQUhGO0FBSUQ7O0FBQ0R3Qiw0QkFBQUEsT0FBTyxDQUFDbEIsSUFBRCxDQUFQO0FBWGU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFhVEYsNEJBQUFBLDRCQWJTLEdBYW1CeEIsS0FBSyxDQUFDeUIsbUJBYnpCOztBQUFBLGlDQWNYLE9BQUksQ0FBQzVDLE1BZE07QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxtQ0FlUGtFLG1DQUFpQkMsNkJBQWpCLGVBZk87O0FBQUE7QUFnQmIsNEJBQUEsT0FBSSxDQUFDbkUsTUFBTCxDQUFZc0IsR0FBWixDQUFnQkMsbUJBQVM2QyxLQUF6QixFQUNFM0MsMkJBQW9CdUwsc0JBRHRCLEVBRUU7QUFBRXJMLDhCQUFBQSxTQUFTLEVBQUVWLFNBQWI7QUFBd0JxRCw4QkFBQUEsZ0JBQWdCLGVBQXhDO0FBQWlEckIsOEJBQUFBLHlCQUF5QixFQUFFTjtBQUE1RSw2QkFGRixFQUdFLDJCQUhGOztBQWhCYTtBQXFCZnFCLDRCQUFBQSxNQUFNOztBQXJCUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkExQlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFvREE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs0SEFDRSxtQkFBOEMvQyxTQUE5QyxFQUFpRWdNLGdDQUFqRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUEyR0MsZ0JBQUFBLG1DQUEzRyxpRUFBdUwsRUFBdkw7QUFDUS9MLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCOztBQUVFLG9CQUFJLEtBQUtyQixNQUFULEVBQWlCO0FBQ2YsdUJBQUtBLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTQyxJQUF6QixFQUNFQywyQkFBb0IwTCxtQ0FEdEIsRUFFRTtBQUFFeEwsb0JBQUFBLFNBQVMsRUFBRVY7QUFBYixtQkFGRixFQUdFLHlDQUhGO0FBSUQ7O0FBQ0dXLGdCQUFBQSxRQVJOLGFBUW9CLEtBQUsvQix3QkFBTCxDQUE4QmdDLE1BUmxELGNBUTREQyxpQ0FBcUJzTCxpQ0FSakYsY0FRc0gsS0FBS3ZOLHdCQUFMLENBQThCbUMsS0FScEosY0FRNkosS0FBS25DLHdCQUFMLENBQThCb0MsUUFSM0wsY0FRdU1oQixTQVJ2TTtBQVNRaUIsZ0JBQUFBLGFBVFIsR0FTd0JDLGtCQUFNQyxNQUFOLEVBVHhCO0FBVUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRUcsa0JBQUFBLE9BQU8sRUFBRSxLQUFLdkMsYUFBTCxDQUFtQndDO0FBQTlCLGlCQUExQjtBQUVRZ0IsZ0JBQUFBLHNCQVpWLEdBWXFDNEosbUNBWnJDLENBWVU1SixzQkFaVjtBQWNRZixnQkFBQUEsT0FkUixHQWM2QjNCLHNCQUFVNEMsY0FkdkM7QUFlRWpCLGdCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJxSSxjQUF4QixDQUFQLEdBQWlELEtBQUtsTSx3QkFBTCxDQUE4Qm1DLEtBQS9FOztBQUVBLG9CQUFJc0Isc0JBQUosRUFBNEI7QUFDMUJmLGtCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJKLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQTFCLGtCQUFBQSxRQUFRLGFBQU0sS0FBSy9CLHdCQUFMLENBQThCZ0MsTUFBcEMsY0FBOENDLGlDQUFxQnVMLHFDQUFuRSxjQUE0RyxLQUFLeE4sd0JBQUwsQ0FBOEJtQyxLQUExSSxjQUFtSixLQUFLbkMsd0JBQUwsQ0FBOEJvQyxRQUFqTCxjQUE2TGhCLFNBQTdMLENBQVI7QUFDRDs7QUFFRFcsZ0JBQUFBLFFBQVEsSUFBSSxnQkFBZ0JoQixzQkFBVTBNLGdCQUF0QztBQUVNM0osZ0JBQUFBLE9BeEJSLEdBd0JzQztBQUNsQ2Qsa0JBQUFBLElBQUksRUFBRW1FLElBQUksQ0FBQ0MsU0FBTCxDQUFlZ0csZ0NBQWYsQ0FENEI7QUFFbEMxSyxrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ3FCLGtCQUFBQSxNQUFNLEVBQUUsTUFIMEI7QUFJbENDLGtCQUFBQSxHQUFHLEVBQUVqQztBQUo2QixpQkF4QnRDO0FBQUE7QUFBQTtBQUFBLHVCQWdDMkJNLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FoQ3hDOztBQUFBO0FBZ0NVakIsZ0JBQUFBLFFBaENWO0FBaUNVQyxnQkFBQUEseUJBakNWLEdBaUNzQ3hCLEtBQUssQ0FBQ3lCLG1CQWpDNUM7QUFrQ1lDLGdCQUFBQSxJQWxDWixHQWtDcUJILFFBbENyQixDQWtDWUcsSUFsQ1o7O0FBbUNJLG9CQUFJLEtBQUs3QyxNQUFULEVBQWlCO0FBQ2YsdUJBQUtBLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTQyxJQUF6QixFQUNFQywyQkFBb0I4TCxxQ0FEdEIsRUFFRTtBQUFFNUwsb0JBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QitCLG9CQUFBQSxNQUFNLEVBQUVILElBQUksQ0FBQ0csTUFBckM7QUFBNkNDLG9CQUFBQSx5QkFBeUIsRUFBRU4seUJBQXhFO0FBQW1HTyxvQkFBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQWxILG1CQUZGLEVBR0UsMkNBSEY7QUFJRDs7QUF4Q0w7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUEwQ1VJLGdCQUFBQSw0QkExQ1YsR0EwQ3NDeEIsS0FBSyxDQUFDeUIsbUJBMUM1Qzs7QUFBQSxxQkEyQ1EsS0FBSzVDLE1BM0NiO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsdUJBNENZa0UsbUNBQWlCQyw2QkFBakIsZUE1Q1o7O0FBQUE7QUE2Q00scUJBQUtuRSxNQUFMLENBQVlzQixHQUFaLENBQWdCQyxtQkFBUzZDLEtBQXpCLEVBQ0UzQywyQkFBb0IrTCxrQ0FEdEIsRUFFRTtBQUFFN0wsa0JBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QnFELGtCQUFBQSxnQkFBZ0IsZUFBeEM7QUFBaURyQixrQkFBQUEseUJBQXlCLEVBQUVOO0FBQTVFLGlCQUZGLEVBR0Usd0NBSEY7O0FBN0NOO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFzREE7QUFDRjtBQUNBOzs7OzsrR0FDRSxtQkFBaUMxQixTQUFqQyxFQUFvRHdELHNCQUFwRDtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRmdKLGdCQUFBQSxpQ0FBcEYsaUVBQTRKLEVBQTVKOztBQUFBLHNCQUVNLENBQUNoSixzQkFBRCxJQUEyQkEsc0JBQXNCLEtBQUsxRCx1QkFBZ0IrQixFQUY1RTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREFHV2dCLE9BQU8sQ0FBQ0MsT0FBUixFQUhYOztBQUFBO0FBS1E1QyxnQkFBQUEsS0FMUixHQUtnQkMsYUFBTUMsS0FBTixFQUxoQjtBQU1VcU0sZ0JBQUFBLG1CQU5WLEdBTWtDRCxpQ0FObEMsQ0FNVUMsbUJBTlY7O0FBQUEsc0JBT00sQ0FBQ2pKLHNCQUFELElBQTJCQSxzQkFBc0IsS0FBSzFELHVCQUFnQitCLEVBUDVFO0FBQUE7QUFBQTtBQUFBOztBQUFBLHNCQU93RixJQUFJeEMsS0FBSixDQUFVLDBDQUFWLENBUHhGOztBQUFBO0FBUVFzQixnQkFBQUEsUUFSUixhQVFzQixLQUFLL0Isd0JBQUwsQ0FBOEJnQyxNQVJwRCxjQVE4REMsaUNBQXFCNkwsdUJBUm5GLGNBUThHMU0sU0FSOUc7QUFTUWlCLGdCQUFBQSxhQVRSLEdBU3dCQyxrQkFBTUMsTUFBTixFQVR4QjtBQVdRRyxnQkFBQUEsT0FYUixHQVc2QjNCLHNCQUFVNEMsY0FYdkM7QUFZRWpCLGdCQUFBQSxPQUFPLENBQUNtQixtQ0FBdUJxSSxjQUF4QixDQUFQLEdBQWlELEtBQUtsTSx3QkFBTCxDQUE4Qm1DLEtBQS9FOztBQUNBLG9CQUFJMEwsbUJBQUosRUFBeUI7QUFDdkJuTCxrQkFBQUEsT0FBTyxDQUFDM0Isc0JBQVU4TSxtQkFBWCxDQUFQLEdBQXlDQSxtQkFBekM7QUFDRDs7QUFFSy9KLGdCQUFBQSxPQWpCUixHQWlCc0M7QUFDbENwQixrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ3FCLGtCQUFBQSxNQUFNLEVBQUUsTUFGMEI7QUFHbENDLGtCQUFBQSxHQUFHLEVBQUVqQztBQUg2QixpQkFqQnRDO0FBQUEsbURBc0JTLElBQUlrQyxPQUFKO0FBQUEsNkdBQVksbUJBQU9DLE9BQVAsRUFBZ0JDLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVE5QixhQUFhLENBQUN5QixPQUFELENBRnJCOztBQUFBO0FBRVRqQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUJ4QixLQUFLLENBQUN5QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJRUgsUUFKRixDQUlQRyxJQUpPOztBQUtmLGdDQUFJLE9BQUksQ0FBQzdDLE1BQVQsRUFBaUI7QUFDZiw4QkFBQSxPQUFJLENBQUNBLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTQyxJQUF6QixFQUNFQywyQkFBb0JtTSw0QkFEdEIsRUFFRTtBQUFFak0sZ0NBQUFBLFNBQVMsRUFBRVYsU0FBYjtBQUF3QitCLGdDQUFBQSxNQUFNLEVBQUVILElBQUksQ0FBQ0csTUFBckM7QUFBNkNDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQXhFO0FBQW1HTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQWxILCtCQUZGLEVBR0UsaUNBSEY7QUFJRDs7QUFDRHdCLDRCQUFBQSxPQUFPO0FBWFE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFhVHBCLDRCQUFBQSw0QkFiUyxHQWFtQnhCLEtBQUssQ0FBQ3lCLG1CQWJ6Qjs7QUFBQSxpQ0FjWCxPQUFJLENBQUM1QyxNQWRNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsbUNBZVBrRSxtQ0FBaUJDLDZCQUFqQixlQWZPOztBQUFBO0FBZ0JiLDRCQUFBLE9BQUksQ0FBQ25FLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTNkMsS0FBekIsRUFDRTNDLDJCQUFvQm9NLHlCQUR0QixFQUVFO0FBQUVsTSw4QkFBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCcUQsOEJBQUFBLGdCQUFnQixlQUF4QztBQUFpRHJCLDhCQUFBQSx5QkFBeUIsRUFBRU47QUFBNUUsNkJBRkYsRUFHRSw4QkFIRjs7QUFoQmE7QUFxQmZxQiw0QkFBQUEsTUFBTSxlQUFOOztBQXJCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF0QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7Ozs7OztpQ0E3a0NtQnBFLEcsMEJBQ3NDO0FBQ3ZEdUYsRUFBQUEsc0JBQXNCLEVBQUUsRUFEK0I7QUFFdkRLLEVBQUFBLHVDQUF1QyxFQUFFLEtBRmM7QUFHdkRsRCxFQUFBQSwwQkFBMEIsRUFBRTtBQUgyQixDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uIH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCAqIGFzIGhhc2ggZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDM1LFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDNcbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIFNES0NvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjaGFubmVsSWRcbiAgICBjb25zdCB7IGNoYW5uZWxJZCB9ID0gb21uaWNoYW5uZWxDb25maWd1cmF0aW9uO1xuICAgIGlmICghT2JqZWN0LnZhbHVlcyhDaGFubmVsSWQpLmluY2x1ZGVzKGNoYW5uZWxJZCBhcyBDaGFubmVsSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhbm5lbElkYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgT0MgY29uZmlnXG4gICAgY29uc3QgY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24pO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIENvbnN0YW50cy5yZXF1aXJlZE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgIGlmICghY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJyR7a2V5fScgaW4gT21uaWNoYW5uZWxDb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0Q29uZmlnKHJlcXVlc3RJZDogc3RyaW5nLCBieXBhc3NDYWNoZSA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBDb25maWcgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICBoZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5oZWFkZXJzIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQoZW5kcG9pbnQsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24gJiYgZGF0YS5MaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICB9XG4gICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VTUyxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBlbmRwb2ludCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG4gICAgZW5kcG9pbnQgKz0gYD9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsXG4gICAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcmV0cnkgZm9yIGdldGNoYXR0b2tlbiBoYXMgZXhjZWVkZWQgaXRzIG1heCB2YWx1ZSBvZiAke3RoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50fWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLldBUk4sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHthdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwge1wiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwge1wicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkfSk7XG4gICAgfVxuXG4gICAgZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHtkYXRhfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiO1xuICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG5cbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHsuLi5kYXRhfTtcblxuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2UocmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbixcbiAgICAgICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSxcbiAgICAgICAgICBSZXF1ZXN0UGF5bG9hZDogcmVxdWVzdFBheWxvYWQsXG4gICAgICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCI7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAodGhpcy5sb2dnZXIpIHtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHsuLi5kYXRhfTtcblxuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2UocmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsXG4gICAgICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBSZXF1ZXN0UGF5bG9hZDogcmVxdWVzdFBheWxvYWQsXG4gICAgICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlLnN0YXR1cyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IFwiU2Vzc2lvbiBJbml0IEZhaWxlZFwiO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KXtcbiAgICAgIGVuZHBvaW50ICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlc3Npb24gQ2xvc2UgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgICAgICBcIlNlc3Npb24gQ2xvc2UgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY2hhdElkIH0gPSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyPy5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyPy5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdLCBFcnJvckNvZGU6IHJlc3BvbnNlLnN0YXR1c30sXG4gICAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWRcIik7XG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgfSA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcztcblxuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCxcbiAgICAgICAgICAgIHsgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYXQgdHJhbnNjcmlwdHMgZm9yIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIGNoYXRJZCBDaGF0IHRocmVhZCBJZC5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdHJhbnNjcmlwdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRyYW5zY3JpcHRzKHJlcXVlc3RJZDogc3RyaW5nLCBjaGF0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpe1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggZGF0YSBtYXNraW5nIGluZm8gb2YgdGhlIG9yZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmZXRjaERhdGFNYXNraW5nSW5mbyhyZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8SURhdGFNYXNraW5nSW5mbz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSBzZWNvbmRhcnlDaGFubmVsIGV2ZW50IHJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keTogb2JqZWN0LCBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtczogSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIGVuZHBvaW50ICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgaGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
|