botframework-directlinejs 0.15.8 → 0.15.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/directline.js +1 -1
- package/dist/directline.js.LICENSE.txt +18 -7
- package/dist/stats.json +47422 -28993
- package/lib/createDeferred.js +2 -3
- package/lib/directLine.js +32 -31
- package/lib/directLine.mock.js +19 -24
- package/lib/directLineStreaming.js +459 -482
- package/lib/parseFilename.js +3 -2
- package/lib/streaming/WebSocketClientWithNetworkInformation.js +33 -46
- package/package.json +31 -34
|
@@ -8,8 +8,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.DirectLineStreaming = void 0;
|
|
9
9
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
-
var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet"));
|
|
12
|
-
var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet"));
|
|
13
11
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
14
12
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
13
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
@@ -23,9 +21,13 @@ var _createDeferred = _interopRequireDefault(require("./createDeferred"));
|
|
|
23
21
|
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
24
22
|
var _directLine = require("./directLine");
|
|
25
23
|
var _WebSocketClientWithNetworkInformation = _interopRequireDefault(require("./streaming/WebSocketClientWithNetworkInformation"));
|
|
26
|
-
var _excluded = ["attachments"];
|
|
27
|
-
function
|
|
28
|
-
function
|
|
24
|
+
var _excluded = ["attachments"];
|
|
25
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t8 in e) "default" !== _t8 && {}.hasOwnProperty.call(e, _t8) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t8)) && (i.get || i.set) ? o(f, _t8, i) : f[_t8] = e[_t8]); return f; })(e, t); }
|
|
26
|
+
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
|
27
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
28
|
+
function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
|
|
29
|
+
function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
|
|
30
|
+
function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } // In order to keep file size down, only import the parts of rxjs that we use
|
|
29
31
|
var DIRECT_LINE_VERSION = 'DirectLine/3.0';
|
|
30
32
|
var MAX_RETRY_COUNT = 3;
|
|
31
33
|
var refreshTokenLifetime = 30 * 60 * 1000;
|
|
@@ -40,7 +42,7 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
40
42
|
this.connectionStatus$ = c$;
|
|
41
43
|
this.shouldQueue = sq;
|
|
42
44
|
}
|
|
43
|
-
(0, _createClass2["default"])(StreamHandler, [{
|
|
45
|
+
return (0, _createClass2["default"])(StreamHandler, [{
|
|
44
46
|
key: "setSubscriber",
|
|
45
47
|
value: function setSubscriber(s) {
|
|
46
48
|
this.subscriber = s;
|
|
@@ -50,60 +52,58 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
50
52
|
value: function () {
|
|
51
53
|
var _processRequest = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(request, logger) {
|
|
52
54
|
var streams, stream0, activitySetJson, activitySet, activity, attachments, stream, attachment, dataUri;
|
|
53
|
-
return _regenerator["default"].wrap(function
|
|
54
|
-
while (1) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
_context.next = 9;
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
// Only one activity is expected in a set in streaming
|
|
69
|
-
this.subscriber.error(new Error('there should be exactly one activity'));
|
|
70
|
-
return _context.abrupt("return", BFSE.StreamingResponse.create(500));
|
|
71
|
-
case 9:
|
|
72
|
-
activity = activitySet.activities[0];
|
|
73
|
-
if (!(streams.length > 0)) {
|
|
74
|
-
_context.next = 21;
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
attachments = (0, _toConsumableArray2["default"])(activity.attachments);
|
|
78
|
-
case 12:
|
|
79
|
-
if (!(stream = streams.shift())) {
|
|
80
|
-
_context.next = 20;
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
_context.next = 15;
|
|
84
|
-
return stream.readAsString();
|
|
85
|
-
case 15:
|
|
86
|
-
attachment = _context.sent;
|
|
87
|
-
dataUri = 'data:text/plain;base64,' + attachment;
|
|
88
|
-
attachments.push({
|
|
89
|
-
contentType: stream.contentType,
|
|
90
|
-
contentUrl: dataUri
|
|
91
|
-
});
|
|
92
|
-
_context.next = 12;
|
|
55
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
56
|
+
while (1) switch (_context.prev = _context.next) {
|
|
57
|
+
case 0:
|
|
58
|
+
streams = (0, _toConsumableArray2["default"])(request.streams);
|
|
59
|
+
stream0 = streams.shift();
|
|
60
|
+
_context.next = 1;
|
|
61
|
+
return stream0.readAsString();
|
|
62
|
+
case 1:
|
|
63
|
+
activitySetJson = _context.sent;
|
|
64
|
+
activitySet = JSON.parse(activitySetJson);
|
|
65
|
+
if (!(activitySet.activities.length !== 1)) {
|
|
66
|
+
_context.next = 2;
|
|
93
67
|
break;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
68
|
+
}
|
|
69
|
+
// Only one activity is expected in a set in streaming
|
|
70
|
+
this.subscriber.error(new Error('there should be exactly one activity'));
|
|
71
|
+
return _context.abrupt("return", BFSE.StreamingResponse.create(500));
|
|
72
|
+
case 2:
|
|
73
|
+
activity = activitySet.activities[0];
|
|
74
|
+
if (!(streams.length > 0)) {
|
|
75
|
+
_context.next = 6;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
attachments = (0, _toConsumableArray2["default"])(activity.attachments);
|
|
79
|
+
case 3:
|
|
80
|
+
if (!(stream = streams.shift())) {
|
|
81
|
+
_context.next = 5;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
_context.next = 4;
|
|
85
|
+
return stream.readAsString();
|
|
86
|
+
case 4:
|
|
87
|
+
attachment = _context.sent;
|
|
88
|
+
dataUri = 'data:text/plain;base64,' + attachment;
|
|
89
|
+
attachments.push({
|
|
90
|
+
contentType: stream.contentType,
|
|
91
|
+
contentUrl: dataUri
|
|
92
|
+
});
|
|
93
|
+
_context.next = 3;
|
|
94
|
+
break;
|
|
95
|
+
case 5:
|
|
96
|
+
activity.attachments = attachments;
|
|
97
|
+
case 6:
|
|
98
|
+
if (this.shouldQueue()) {
|
|
99
|
+
this.activityQueue.push(activity);
|
|
100
|
+
} else {
|
|
101
|
+
this.subscriber.next(activity);
|
|
102
|
+
}
|
|
103
|
+
return _context.abrupt("return", BFSE.StreamingResponse.create(200));
|
|
104
|
+
case 7:
|
|
105
|
+
case "end":
|
|
106
|
+
return _context.stop();
|
|
107
107
|
}
|
|
108
108
|
}, _callee, this);
|
|
109
109
|
}));
|
|
@@ -128,23 +128,19 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
128
128
|
this.subscriber.complete();
|
|
129
129
|
}
|
|
130
130
|
}]);
|
|
131
|
-
return StreamHandler;
|
|
132
131
|
}();
|
|
133
132
|
var _networkInformation = /*#__PURE__*/new WeakMap();
|
|
134
|
-
var DirectLineStreaming = /*#__PURE__*/function () {
|
|
133
|
+
var DirectLineStreaming = exports.DirectLineStreaming = /*#__PURE__*/function () {
|
|
135
134
|
function DirectLineStreaming(options) {
|
|
136
135
|
var _this2 = this;
|
|
137
136
|
(0, _classCallCheck2["default"])(this, DirectLineStreaming);
|
|
138
137
|
(0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(_directLine.ConnectionStatus.Uninitialized));
|
|
139
138
|
(0, _defineProperty2["default"])(this, "_botAgent", '');
|
|
140
|
-
|
|
141
|
-
writable: true,
|
|
142
|
-
value: void 0
|
|
143
|
-
});
|
|
139
|
+
_classPrivateFieldInitSpec(this, _networkInformation, void 0);
|
|
144
140
|
// Rectifies `options.networkInformation`.
|
|
145
141
|
var networkInformation = options === null || options === void 0 ? void 0 : options.networkInformation;
|
|
146
142
|
if (typeof networkInformation === 'undefined' || typeof networkInformation.addEventListener === 'function' && typeof networkInformation.removeEventListener === 'function' && typeof networkInformation.type === 'string') {
|
|
147
|
-
(
|
|
143
|
+
_classPrivateFieldSet(_networkInformation, this, networkInformation);
|
|
148
144
|
} else {
|
|
149
145
|
console.warn('botframework-directlinejs: "networkInformation" option specified must be a `NetworkInformation`-like instance extending `EventTarget` interface with a `type` property returning a string.');
|
|
150
146
|
}
|
|
@@ -160,21 +156,19 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
160
156
|
this.queueActivities = true;
|
|
161
157
|
this.activity$ = _Observable.Observable.create(/*#__PURE__*/function () {
|
|
162
158
|
var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(subscriber) {
|
|
163
|
-
return _regenerator["default"].wrap(function
|
|
164
|
-
while (1) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
});
|
|
159
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
160
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
161
|
+
case 0:
|
|
162
|
+
_this2.activitySubscriber = subscriber;
|
|
163
|
+
_this2.theStreamHandler = new StreamHandler(subscriber, _this2.connectionStatus$, function () {
|
|
164
|
+
return _this2.queueActivities;
|
|
165
|
+
});
|
|
171
166
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
167
|
+
// Resolving connectDeferred will kick-off the connection.
|
|
168
|
+
_this2.connectDeferred.resolve();
|
|
169
|
+
case 1:
|
|
170
|
+
case "end":
|
|
171
|
+
return _context2.stop();
|
|
178
172
|
}
|
|
179
173
|
}, _callee2);
|
|
180
174
|
}));
|
|
@@ -186,7 +180,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
186
180
|
// connectWithRetryAsync() will create the connectDeferred object required in activity$.
|
|
187
181
|
this.connectWithRetryAsync();
|
|
188
182
|
}
|
|
189
|
-
(0, _createClass2["default"])(DirectLineStreaming, [{
|
|
183
|
+
return (0, _createClass2["default"])(DirectLineStreaming, [{
|
|
190
184
|
key: "reconnect",
|
|
191
185
|
value: function reconnect(_ref2) {
|
|
192
186
|
var conversationId = _ref2.conversationId,
|
|
@@ -235,75 +229,74 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
235
229
|
res,
|
|
236
230
|
_yield$res$json,
|
|
237
231
|
token,
|
|
238
|
-
_args3 = arguments
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
break;
|
|
253
|
-
}
|
|
254
|
-
numberOfAttempts++;
|
|
255
|
-
_context3.next = 9;
|
|
256
|
-
return new Promise(function (r) {
|
|
257
|
-
return setTimeout(r, refreshTokenInterval);
|
|
258
|
-
});
|
|
259
|
-
case 9:
|
|
260
|
-
_context3.prev = 9;
|
|
261
|
-
_context3.next = 12;
|
|
262
|
-
return (0, _crossFetch["default"])("".concat(this.domain, "/tokens/refresh"), {
|
|
263
|
-
method: 'POST',
|
|
264
|
-
headers: this.commonHeaders()
|
|
265
|
-
});
|
|
266
|
-
case 12:
|
|
267
|
-
res = _context3.sent;
|
|
268
|
-
if (!res.ok) {
|
|
269
|
-
_context3.next = 22;
|
|
270
|
-
break;
|
|
271
|
-
}
|
|
272
|
-
numberOfAttempts = 0;
|
|
273
|
-
_context3.next = 17;
|
|
274
|
-
return res.json();
|
|
275
|
-
case 17:
|
|
276
|
-
_yield$res$json = _context3.sent;
|
|
277
|
-
token = _yield$res$json.token;
|
|
278
|
-
this.token = token;
|
|
279
|
-
_context3.next = 23;
|
|
232
|
+
_args3 = arguments,
|
|
233
|
+
_t;
|
|
234
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
235
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
236
|
+
case 0:
|
|
237
|
+
firstCall = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : true;
|
|
238
|
+
retryCount = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : 0;
|
|
239
|
+
_context3.next = 1;
|
|
240
|
+
return this.waitUntilOnline();
|
|
241
|
+
case 1:
|
|
242
|
+
numberOfAttempts = 0;
|
|
243
|
+
case 2:
|
|
244
|
+
if (!(numberOfAttempts < MAX_RETRY_COUNT)) {
|
|
245
|
+
_context3.next = 10;
|
|
280
246
|
break;
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
247
|
+
}
|
|
248
|
+
numberOfAttempts++;
|
|
249
|
+
_context3.next = 3;
|
|
250
|
+
return new Promise(function (r) {
|
|
251
|
+
return setTimeout(r, refreshTokenInterval);
|
|
252
|
+
});
|
|
253
|
+
case 3:
|
|
254
|
+
_context3.prev = 3;
|
|
255
|
+
_context3.next = 4;
|
|
256
|
+
return (0, _crossFetch["default"])("".concat(this.domain, "/tokens/refresh"), {
|
|
257
|
+
method: 'POST',
|
|
258
|
+
headers: this.commonHeaders()
|
|
259
|
+
});
|
|
260
|
+
case 4:
|
|
261
|
+
res = _context3.sent;
|
|
262
|
+
if (!res.ok) {
|
|
263
|
+
_context3.next = 6;
|
|
297
264
|
break;
|
|
298
|
-
|
|
299
|
-
|
|
265
|
+
}
|
|
266
|
+
numberOfAttempts = 0;
|
|
267
|
+
_context3.next = 5;
|
|
268
|
+
return res.json();
|
|
269
|
+
case 5:
|
|
270
|
+
_yield$res$json = _context3.sent;
|
|
271
|
+
token = _yield$res$json.token;
|
|
272
|
+
this.token = token;
|
|
273
|
+
_context3.next = 7;
|
|
274
|
+
break;
|
|
275
|
+
case 6:
|
|
276
|
+
if (res.status === 403 || res.status === 403) {
|
|
277
|
+
console.error("Fatal error while refreshing the token: ".concat(res.status, " ").concat(res.statusText));
|
|
300
278
|
this.streamConnection.disconnect();
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
279
|
+
} else {
|
|
280
|
+
console.warn("Refresh attempt #".concat(numberOfAttempts, " failed: ").concat(res.status, " ").concat(res.statusText));
|
|
281
|
+
}
|
|
282
|
+
case 7:
|
|
283
|
+
_context3.next = 9;
|
|
284
|
+
break;
|
|
285
|
+
case 8:
|
|
286
|
+
_context3.prev = 8;
|
|
287
|
+
_t = _context3["catch"](3);
|
|
288
|
+
console.warn("Refresh attempt #".concat(numberOfAttempts, " threw an exception: ").concat(_t));
|
|
289
|
+
case 9:
|
|
290
|
+
_context3.next = 2;
|
|
291
|
+
break;
|
|
292
|
+
case 10:
|
|
293
|
+
console.error('Retries exhausted');
|
|
294
|
+
this.streamConnection.disconnect();
|
|
295
|
+
case 11:
|
|
296
|
+
case "end":
|
|
297
|
+
return _context3.stop();
|
|
305
298
|
}
|
|
306
|
-
}, _callee3, this, [[
|
|
299
|
+
}, _callee3, this, [[3, 8]]);
|
|
307
300
|
}));
|
|
308
301
|
function refreshToken() {
|
|
309
302
|
return _refreshToken.apply(this, arguments);
|
|
@@ -322,53 +315,51 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
322
315
|
}
|
|
323
316
|
var resp$ = _Observable.Observable.create(/*#__PURE__*/function () {
|
|
324
317
|
var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(subscriber) {
|
|
325
|
-
var request, resp, numberOfStreams, idString, _JSON$parse, id;
|
|
326
|
-
return _regenerator["default"].wrap(function
|
|
327
|
-
while (1) {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
return _context4.stop();
|
|
369
|
-
}
|
|
318
|
+
var request, resp, numberOfStreams, idString, _JSON$parse, id, _t2;
|
|
319
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
320
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
321
|
+
case 0:
|
|
322
|
+
request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations/' + _this3.conversationId + '/activities');
|
|
323
|
+
request.setBody(JSON.stringify(activity));
|
|
324
|
+
_context4.prev = 1;
|
|
325
|
+
_context4.next = 2;
|
|
326
|
+
return _this3.streamConnection.send(request);
|
|
327
|
+
case 2:
|
|
328
|
+
resp = _context4.sent;
|
|
329
|
+
if (!(resp.statusCode !== 200)) {
|
|
330
|
+
_context4.next = 3;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
throw new Error('PostActivity returned ' + resp.statusCode);
|
|
334
|
+
case 3:
|
|
335
|
+
numberOfStreams = resp.streams.length;
|
|
336
|
+
if (!(numberOfStreams !== 1)) {
|
|
337
|
+
_context4.next = 4;
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
throw new Error('Expected one stream but got ' + numberOfStreams);
|
|
341
|
+
case 4:
|
|
342
|
+
_context4.next = 5;
|
|
343
|
+
return resp.streams[0].readAsString();
|
|
344
|
+
case 5:
|
|
345
|
+
idString = _context4.sent;
|
|
346
|
+
_JSON$parse = JSON.parse(idString), id = _JSON$parse.Id;
|
|
347
|
+
subscriber.next(id);
|
|
348
|
+
return _context4.abrupt("return", subscriber.complete());
|
|
349
|
+
case 6:
|
|
350
|
+
_context4.prev = 6;
|
|
351
|
+
_t2 = _context4["catch"](1);
|
|
352
|
+
// If there is a network issue then its handled by
|
|
353
|
+
// the disconnectionHandler. Everything else can
|
|
354
|
+
// be retried
|
|
355
|
+
console.warn(_t2);
|
|
356
|
+
_this3.streamConnection.disconnect();
|
|
357
|
+
return _context4.abrupt("return", subscriber.error(_t2));
|
|
358
|
+
case 7:
|
|
359
|
+
case "end":
|
|
360
|
+
return _context4.stop();
|
|
370
361
|
}
|
|
371
|
-
}, _callee4, null, [[
|
|
362
|
+
}, _callee4, null, [[1, 6]]);
|
|
372
363
|
}));
|
|
373
364
|
return function (_x4) {
|
|
374
365
|
return _ref3.apply(this, arguments);
|
|
@@ -385,108 +376,104 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
385
376
|
return _Observable.Observable.create(function (subscriber) {
|
|
386
377
|
var httpContentList = [];
|
|
387
378
|
(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
388
|
-
var arrayBuffers, url, request, activityStream, resp, _yield$resp$streams$, id;
|
|
389
|
-
return _regenerator["default"].wrap(function
|
|
390
|
-
while (1) {
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
var
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
_context5.next = 12;
|
|
409
|
-
break;
|
|
410
|
-
}
|
|
411
|
-
_context5.next = 7;
|
|
412
|
-
return res.arrayBuffer();
|
|
413
|
-
case 7:
|
|
414
|
-
_context5.t0 = _context5.sent;
|
|
415
|
-
_context5.t1 = media;
|
|
416
|
-
return _context5.abrupt("return", {
|
|
417
|
-
arrayBuffer: _context5.t0,
|
|
418
|
-
media: _context5.t1
|
|
419
|
-
});
|
|
420
|
-
case 12:
|
|
421
|
-
throw new Error('...');
|
|
422
|
-
case 13:
|
|
423
|
-
case "end":
|
|
424
|
-
return _context5.stop();
|
|
379
|
+
var arrayBuffers, url, request, activityStream, resp, _yield$resp$streams$, id, _t5;
|
|
380
|
+
return _regenerator["default"].wrap(function (_context6) {
|
|
381
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
382
|
+
case 0:
|
|
383
|
+
_context6.prev = 0;
|
|
384
|
+
_context6.next = 1;
|
|
385
|
+
return Promise.all(attachments.map(/*#__PURE__*/function () {
|
|
386
|
+
var _ref5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(attachment) {
|
|
387
|
+
var media, res, _t3, _t4;
|
|
388
|
+
return _regenerator["default"].wrap(function (_context5) {
|
|
389
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
390
|
+
case 0:
|
|
391
|
+
media = attachment;
|
|
392
|
+
_context5.next = 1;
|
|
393
|
+
return (0, _crossFetch["default"])(media.contentUrl);
|
|
394
|
+
case 1:
|
|
395
|
+
res = _context5.sent;
|
|
396
|
+
if (!res.ok) {
|
|
397
|
+
_context5.next = 3;
|
|
398
|
+
break;
|
|
425
399
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
_context6.next = 29;
|
|
400
|
+
_context5.next = 2;
|
|
401
|
+
return res.arrayBuffer();
|
|
402
|
+
case 2:
|
|
403
|
+
_t3 = _context5.sent;
|
|
404
|
+
_t4 = media;
|
|
405
|
+
return _context5.abrupt("return", {
|
|
406
|
+
arrayBuffer: _t3,
|
|
407
|
+
media: _t4
|
|
408
|
+
});
|
|
409
|
+
case 3:
|
|
410
|
+
throw new Error('...');
|
|
411
|
+
case 4:
|
|
412
|
+
case "end":
|
|
413
|
+
return _context5.stop();
|
|
414
|
+
}
|
|
415
|
+
}, _callee5);
|
|
416
|
+
}));
|
|
417
|
+
return function (_x5) {
|
|
418
|
+
return _ref5.apply(this, arguments);
|
|
419
|
+
};
|
|
420
|
+
}()));
|
|
421
|
+
case 1:
|
|
422
|
+
arrayBuffers = _context6.sent;
|
|
423
|
+
arrayBuffers.forEach(function (_ref6) {
|
|
424
|
+
var arrayBuffer = _ref6.arrayBuffer,
|
|
425
|
+
media = _ref6.media;
|
|
426
|
+
var buffer = _buffer.Buffer.from(arrayBuffer);
|
|
427
|
+
var stream = new BFSE.SubscribableStream();
|
|
428
|
+
stream.write(buffer);
|
|
429
|
+
var httpContent = new BFSE.HttpContent({
|
|
430
|
+
type: media.contentType,
|
|
431
|
+
contentLength: buffer.length
|
|
432
|
+
}, stream);
|
|
433
|
+
httpContentList.push(httpContent);
|
|
434
|
+
});
|
|
435
|
+
url = "/v3/directline/conversations/".concat(_this4.conversationId, "/users/").concat(messageWithoutAttachments.from.id, "/upload");
|
|
436
|
+
request = BFSE.StreamingRequest.create('PUT', url);
|
|
437
|
+
activityStream = new BFSE.SubscribableStream();
|
|
438
|
+
activityStream.write(JSON.stringify(messageWithoutAttachments), 'utf-8');
|
|
439
|
+
request.addStream(new BFSE.HttpContent({
|
|
440
|
+
type: 'application/vnd.microsoft.activity',
|
|
441
|
+
contentLength: activityStream.length
|
|
442
|
+
}, activityStream));
|
|
443
|
+
httpContentList.forEach(function (e) {
|
|
444
|
+
return request.addStream(e);
|
|
445
|
+
});
|
|
446
|
+
_context6.next = 2;
|
|
447
|
+
return _this4.streamConnection.send(request);
|
|
448
|
+
case 2:
|
|
449
|
+
resp = _context6.sent;
|
|
450
|
+
if (!(resp.streams && resp.streams.length !== 1)) {
|
|
451
|
+
_context6.next = 3;
|
|
479
452
|
break;
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
453
|
+
}
|
|
454
|
+
subscriber.error(new Error("Invalid stream count ".concat(resp.streams.length)));
|
|
455
|
+
_context6.next = 5;
|
|
456
|
+
break;
|
|
457
|
+
case 3:
|
|
458
|
+
_context6.next = 4;
|
|
459
|
+
return resp.streams[0].readAsJson();
|
|
460
|
+
case 4:
|
|
461
|
+
_yield$resp$streams$ = _context6.sent;
|
|
462
|
+
id = _yield$resp$streams$.Id;
|
|
463
|
+
subscriber.next(id);
|
|
464
|
+
subscriber.complete();
|
|
465
|
+
case 5:
|
|
466
|
+
_context6.next = 7;
|
|
467
|
+
break;
|
|
468
|
+
case 6:
|
|
469
|
+
_context6.prev = 6;
|
|
470
|
+
_t5 = _context6["catch"](0);
|
|
471
|
+
subscriber.error(_t5);
|
|
472
|
+
case 7:
|
|
473
|
+
case "end":
|
|
474
|
+
return _context6.stop();
|
|
488
475
|
}
|
|
489
|
-
}, _callee6, null, [[0,
|
|
476
|
+
}, _callee6, null, [[0, 6]]);
|
|
490
477
|
}))();
|
|
491
478
|
});
|
|
492
479
|
}
|
|
@@ -495,23 +482,21 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
495
482
|
value: function () {
|
|
496
483
|
var _waitUntilOnline = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
497
484
|
var _this5 = this;
|
|
498
|
-
return _regenerator["default"].wrap(function
|
|
499
|
-
while (1) {
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
return _context7.stop();
|
|
514
|
-
}
|
|
485
|
+
return _regenerator["default"].wrap(function (_context7) {
|
|
486
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
487
|
+
case 0:
|
|
488
|
+
return _context7.abrupt("return", new Promise(function (resolve, reject) {
|
|
489
|
+
_this5.connectionStatus$.subscribe(function (cs) {
|
|
490
|
+
if (cs === _directLine.ConnectionStatus.Online) {
|
|
491
|
+
return resolve();
|
|
492
|
+
}
|
|
493
|
+
}, function (e) {
|
|
494
|
+
return reject(e);
|
|
495
|
+
});
|
|
496
|
+
}));
|
|
497
|
+
case 1:
|
|
498
|
+
case "end":
|
|
499
|
+
return _context7.stop();
|
|
515
500
|
}
|
|
516
501
|
}, _callee7);
|
|
517
502
|
}));
|
|
@@ -526,109 +511,105 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
526
511
|
var _connectAsync = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
527
512
|
var _this6 = this;
|
|
528
513
|
var re, params, abortController, urlSearchParams, wsUrl;
|
|
529
|
-
return _regenerator["default"].wrap(function
|
|
530
|
-
while (1) {
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
var
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
}
|
|
567
|
-
return _this6.theStreamHandler.processRequest(streamingRequest);
|
|
568
|
-
}
|
|
569
|
-
},
|
|
570
|
-
url: wsUrl
|
|
571
|
-
});
|
|
572
|
-
_this6.queueActivities = true;
|
|
573
|
-
_context8.next = 5;
|
|
574
|
-
return _this6.streamConnection.connect();
|
|
575
|
-
case 5:
|
|
576
|
-
request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations');
|
|
577
|
-
_context8.next = 8;
|
|
578
|
-
return _this6.streamConnection.send(request);
|
|
579
|
-
case 8:
|
|
580
|
-
response = _context8.sent;
|
|
581
|
-
if (!(response.statusCode !== 200)) {
|
|
582
|
-
_context8.next = 11;
|
|
583
|
-
break;
|
|
584
|
-
}
|
|
585
|
-
throw new Error('Connection response code ' + response.statusCode);
|
|
586
|
-
case 11:
|
|
587
|
-
if (!(response.streams.length !== 1)) {
|
|
588
|
-
_context8.next = 13;
|
|
589
|
-
break;
|
|
514
|
+
return _regenerator["default"].wrap(function (_context9) {
|
|
515
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
516
|
+
case 0:
|
|
517
|
+
re = new RegExp('^http(s?)');
|
|
518
|
+
if (re.test(this.domain)) {
|
|
519
|
+
_context9.next = 1;
|
|
520
|
+
break;
|
|
521
|
+
}
|
|
522
|
+
throw 'Domain must begin with http or https';
|
|
523
|
+
case 1:
|
|
524
|
+
params = {
|
|
525
|
+
token: this.token
|
|
526
|
+
};
|
|
527
|
+
if (this.conversationId) {
|
|
528
|
+
params['conversationId'] = this.conversationId;
|
|
529
|
+
}
|
|
530
|
+
abortController = new AbortController();
|
|
531
|
+
urlSearchParams = new URLSearchParams(params).toString();
|
|
532
|
+
wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams); // This promise will resolve when it is disconnected.
|
|
533
|
+
return _context9.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
534
|
+
var _ref7 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
|
|
535
|
+
var request, response, responseString, conversation, _t6;
|
|
536
|
+
return _regenerator["default"].wrap(function (_context8) {
|
|
537
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
538
|
+
case 0:
|
|
539
|
+
_context8.prev = 0;
|
|
540
|
+
_this6.streamConnection = new _WebSocketClientWithNetworkInformation["default"]({
|
|
541
|
+
disconnectionHandler: resolve,
|
|
542
|
+
networkInformation: _classPrivateFieldGet(_networkInformation, _this6),
|
|
543
|
+
requestHandler: {
|
|
544
|
+
processRequest: function processRequest(streamingRequest) {
|
|
545
|
+
// If `streamConnection` is still current, allow call to `processRequest()`, otherwise, ignore calls to `processRequest()`.
|
|
546
|
+
// This prevents zombie connections from sending us requests.
|
|
547
|
+
if (abortController.signal.aborted) {
|
|
548
|
+
throw new Error('Cannot process streaming request, `streamingConnection` should be disconnected.');
|
|
549
|
+
}
|
|
550
|
+
return _this6.theStreamHandler.processRequest(streamingRequest);
|
|
590
551
|
}
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
case 21:
|
|
607
|
-
_this6.theStreamHandler.flush();
|
|
608
|
-
_this6.queueActivities = false;
|
|
609
|
-
_context8.next = 28;
|
|
610
|
-
break;
|
|
611
|
-
case 25:
|
|
612
|
-
_context8.prev = 25;
|
|
613
|
-
_context8.t0 = _context8["catch"](0);
|
|
614
|
-
reject(_context8.t0);
|
|
615
|
-
case 28:
|
|
616
|
-
case "end":
|
|
617
|
-
return _context8.stop();
|
|
552
|
+
},
|
|
553
|
+
url: wsUrl
|
|
554
|
+
});
|
|
555
|
+
_this6.queueActivities = true;
|
|
556
|
+
_context8.next = 1;
|
|
557
|
+
return _this6.streamConnection.connect();
|
|
558
|
+
case 1:
|
|
559
|
+
request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations');
|
|
560
|
+
_context8.next = 2;
|
|
561
|
+
return _this6.streamConnection.send(request);
|
|
562
|
+
case 2:
|
|
563
|
+
response = _context8.sent;
|
|
564
|
+
if (!(response.statusCode !== 200)) {
|
|
565
|
+
_context8.next = 3;
|
|
566
|
+
break;
|
|
618
567
|
}
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
568
|
+
throw new Error('Connection response code ' + response.statusCode);
|
|
569
|
+
case 3:
|
|
570
|
+
if (!(response.streams.length !== 1)) {
|
|
571
|
+
_context8.next = 4;
|
|
572
|
+
break;
|
|
573
|
+
}
|
|
574
|
+
throw new Error('Expected 1 stream but got ' + response.streams.length);
|
|
575
|
+
case 4:
|
|
576
|
+
_context8.next = 5;
|
|
577
|
+
return response.streams[0].readAsString();
|
|
578
|
+
case 5:
|
|
579
|
+
responseString = _context8.sent;
|
|
580
|
+
conversation = JSON.parse(responseString);
|
|
581
|
+
_this6.conversationId = conversation.conversationId;
|
|
582
|
+
_this6.connectionStatus$.next(_directLine.ConnectionStatus.Online);
|
|
583
|
+
|
|
584
|
+
// Wait until DL consumers have had a chance to be notified
|
|
585
|
+
// of the connection status change.
|
|
586
|
+
// This is specific to RxJS implementation of observable, which calling subscribe() after next() will still get the value.
|
|
587
|
+
_context8.next = 6;
|
|
588
|
+
return _this6.waitUntilOnline();
|
|
589
|
+
case 6:
|
|
590
|
+
_this6.theStreamHandler.flush();
|
|
591
|
+
_this6.queueActivities = false;
|
|
592
|
+
_context8.next = 8;
|
|
593
|
+
break;
|
|
594
|
+
case 7:
|
|
595
|
+
_context8.prev = 7;
|
|
596
|
+
_t6 = _context8["catch"](0);
|
|
597
|
+
reject(_t6);
|
|
598
|
+
case 8:
|
|
599
|
+
case "end":
|
|
600
|
+
return _context8.stop();
|
|
601
|
+
}
|
|
602
|
+
}, _callee8, null, [[0, 7]]);
|
|
627
603
|
}));
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
604
|
+
return function (_x6, _x7) {
|
|
605
|
+
return _ref7.apply(this, arguments);
|
|
606
|
+
};
|
|
607
|
+
}())["finally"](function () {
|
|
608
|
+
return abortController.abort();
|
|
609
|
+
}));
|
|
610
|
+
case 2:
|
|
611
|
+
case "end":
|
|
612
|
+
return _context9.stop();
|
|
632
613
|
}
|
|
633
614
|
}, _callee9, this);
|
|
634
615
|
}));
|
|
@@ -640,83 +621,81 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
640
621
|
}, {
|
|
641
622
|
key: "connectWithRetryAsync",
|
|
642
623
|
value: function () {
|
|
643
|
-
var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
624
|
+
var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
|
|
644
625
|
var _this7 = this;
|
|
645
|
-
var numRetries, start;
|
|
646
|
-
return _regenerator["default"].wrap(function
|
|
647
|
-
while (1) {
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
_context10.next = 27;
|
|
658
|
-
break;
|
|
659
|
-
}
|
|
660
|
-
numRetries--;
|
|
661
|
-
start = Date.now();
|
|
662
|
-
_context10.prev = 7;
|
|
663
|
-
_context10.next = 10;
|
|
664
|
-
return this.connectAsync();
|
|
665
|
-
case 10:
|
|
666
|
-
_context10.next = 15;
|
|
626
|
+
var numRetries, start, _t7;
|
|
627
|
+
return _regenerator["default"].wrap(function (_context0) {
|
|
628
|
+
while (1) switch (_context0.prev = _context0.next) {
|
|
629
|
+
case 0:
|
|
630
|
+
_context0.next = 1;
|
|
631
|
+
return (this.connectDeferred = (0, _createDeferred["default"])()).promise;
|
|
632
|
+
case 1:
|
|
633
|
+
numRetries = MAX_RETRY_COUNT;
|
|
634
|
+
this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
|
|
635
|
+
case 2:
|
|
636
|
+
if (!(numRetries > 0)) {
|
|
637
|
+
_context0.next = 10;
|
|
667
638
|
break;
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
// If the current connection lasted for more than a minute, the previous connection is good, which means:
|
|
686
|
-
// - we should reset the retry counter, and;
|
|
687
|
-
// - we should reconnect immediately.
|
|
688
|
-
if (!(60000 < Date.now() - start)) {
|
|
689
|
-
_context10.next = 22;
|
|
690
|
-
break;
|
|
691
|
-
}
|
|
692
|
-
numRetries = MAX_RETRY_COUNT;
|
|
693
|
-
_context10.next = 25;
|
|
639
|
+
}
|
|
640
|
+
numRetries--;
|
|
641
|
+
start = Date.now();
|
|
642
|
+
_context0.prev = 3;
|
|
643
|
+
_context0.next = 4;
|
|
644
|
+
return this.connectAsync();
|
|
645
|
+
case 4:
|
|
646
|
+
_context0.next = 6;
|
|
647
|
+
break;
|
|
648
|
+
case 5:
|
|
649
|
+
_context0.prev = 5;
|
|
650
|
+
_t7 = _context0["catch"](3);
|
|
651
|
+
console.error(_t7);
|
|
652
|
+
case 6:
|
|
653
|
+
if (!(this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended)) {
|
|
654
|
+
_context0.next = 7;
|
|
694
655
|
break;
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
656
|
+
}
|
|
657
|
+
return _context0.abrupt("return");
|
|
658
|
+
case 7:
|
|
659
|
+
// Make sure we don't signal ConnectionStatus.Connecting twice or more without an actual connection.
|
|
660
|
+
// Subsequent retries should be transparent.
|
|
661
|
+
if (this.connectionStatus$.getValue() !== _directLine.ConnectionStatus.Connecting) {
|
|
662
|
+
this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
// If the current connection lasted for more than a minute, the previous connection is good, which means:
|
|
666
|
+
// - we should reset the retry counter, and;
|
|
667
|
+
// - we should reconnect immediately.
|
|
668
|
+
if (!(60000 < Date.now() - start)) {
|
|
669
|
+
_context0.next = 8;
|
|
706
670
|
break;
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
671
|
+
}
|
|
672
|
+
numRetries = MAX_RETRY_COUNT;
|
|
673
|
+
_context0.next = 9;
|
|
674
|
+
break;
|
|
675
|
+
case 8:
|
|
676
|
+
if (!(numRetries > 0)) {
|
|
677
|
+
_context0.next = 9;
|
|
713
678
|
break;
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
679
|
+
}
|
|
680
|
+
_context0.next = 9;
|
|
681
|
+
return new Promise(function (r) {
|
|
682
|
+
return setTimeout(r, _this7.getRetryDelay());
|
|
683
|
+
});
|
|
684
|
+
case 9:
|
|
685
|
+
_context0.next = 2;
|
|
686
|
+
break;
|
|
687
|
+
case 10:
|
|
688
|
+
// TODO: [TEST] Make sure FailedToConnect is reported immediately after last disconnection, should be no getRetryDelay().
|
|
689
|
+
// Failed to reconnect after multiple retries.
|
|
690
|
+
this.connectionStatus$.next(_directLine.ConnectionStatus.FailedToConnect);
|
|
691
|
+
case 11:
|
|
692
|
+
_context0.next = 0;
|
|
693
|
+
break;
|
|
694
|
+
case 12:
|
|
695
|
+
case "end":
|
|
696
|
+
return _context0.stop();
|
|
718
697
|
}
|
|
719
|
-
},
|
|
698
|
+
}, _callee0, this, [[3, 5]]);
|
|
720
699
|
}));
|
|
721
700
|
function connectWithRetryAsync() {
|
|
722
701
|
return _connectWithRetryAsync.apply(this, arguments);
|
|
@@ -729,7 +708,5 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
729
708
|
return Math.floor(3000 + Math.random() * 12000);
|
|
730
709
|
}
|
|
731
710
|
}]);
|
|
732
|
-
return DirectLineStreaming;
|
|
733
711
|
}();
|
|
734
|
-
exports.DirectLineStreaming = DirectLineStreaming;
|
|
735
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmVoYXZpb3JTdWJqZWN0IiwicmVxdWlyZSIsIl9idWZmZXIiLCJfT2JzZXJ2YWJsZSIsIkJGU0UiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jcmVhdGVEZWZlcnJlZCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY3Jvc3NGZXRjaCIsIl9kaXJlY3RMaW5lIiwiX1dlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24iLCJfZXhjbHVkZWQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiRElSRUNUX0xJTkVfVkVSU0lPTiIsIk1BWF9SRVRSWV9DT1VOVCIsInJlZnJlc2hUb2tlbkxpZmV0aW1lIiwicmVmcmVzaFRva2VuSW50ZXJ2YWwiLCJTdHJlYW1IYW5kbGVyIiwicyIsImMkIiwic3EiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwic2V0U3Vic2NyaWJlciIsIl9wcm9jZXNzUmVxdWVzdCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwiYWN0aXZpdHlTZXRKc29uIiwiYWN0aXZpdHlTZXQiLCJhY3Rpdml0eSIsImF0dGFjaG1lbnRzIiwic3RyZWFtIiwiYXR0YWNobWVudCIsImRhdGFVcmkiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInNoaWZ0IiwicmVhZEFzU3RyaW5nIiwic2VudCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiYWJydXB0IiwiU3RyZWFtaW5nUmVzcG9uc2UiLCJjcmVhdGUiLCJwdXNoIiwiY29udGVudFR5cGUiLCJjb250ZW50VXJsIiwiYWN0aXZpdHlRdWV1ZSIsInN0b3AiLCJwcm9jZXNzUmVxdWVzdCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJmbHVzaCIsIl90aGlzIiwic3Vic2NyaWJlIiwiZm9yRWFjaCIsImEiLCJlbmQiLCJjb21wbGV0ZSIsIl9uZXR3b3JrSW5mb3JtYXRpb24iLCJEaXJlY3RMaW5lU3RyZWFtaW5nIiwib3B0aW9ucyIsIl90aGlzMiIsIkJlaGF2aW9yU3ViamVjdCIsIkNvbm5lY3Rpb25TdGF0dXMiLCJVbmluaXRpYWxpemVkIiwid3JpdGFibGUiLCJuZXR3b3JrSW5mb3JtYXRpb24iLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInR5cGUiLCJfY2xhc3NQcml2YXRlRmllbGRTZXQyIiwiY29uc29sZSIsIndhcm4iLCJ0b2tlbiIsInJlZnJlc2hUb2tlbiIsIkV4cGlyZWRUb2tlbiIsImRvbWFpbiIsImNvbnZlcnNhdGlvbklkIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInF1ZXVlQWN0aXZpdGllcyIsImFjdGl2aXR5JCIsIk9ic2VydmFibGUiLCJfcmVmIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJhY3Rpdml0eVN1YnNjcmliZXIiLCJ0aGVTdHJlYW1IYW5kbGVyIiwiY29ubmVjdERlZmVycmVkIiwicmVzb2x2ZSIsIl94MyIsInNoYXJlIiwiY29ubmVjdFdpdGhSZXRyeUFzeW5jIiwicmVjb25uZWN0IiwiX3JlZjIiLCJnZXRWYWx1ZSIsIkVuZGVkIiwic3RyZWFtQ29ubmVjdGlvbiIsImRpc2Nvbm5lY3QiLCJjb21tb25IZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImNvbmNhdCIsImN1c3RvbUFnZW50IiwidW5kZWZpbmVkIiwiY2xpZW50QWdlbnQiLCJfcmVmcmVzaFRva2VuIiwiX2NhbGxlZTMiLCJmaXJzdENhbGwiLCJyZXRyeUNvdW50IiwibnVtYmVyT2ZBdHRlbXB0cyIsInJlcyIsIl95aWVsZCRyZXMkanNvbiIsIl9hcmdzMyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsIndhaXRVbnRpbE9ubGluZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsIm9rIiwianNvbiIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJ0MCIsInBvc3RBY3Rpdml0eSIsIl90aGlzMyIsIkZhaWxlZFRvQ29ubmVjdCIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJfcmVmMyIsIl9jYWxsZWU0IiwicmVzcCIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiX0pTT04kcGFyc2UiLCJpZCIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInN0YXR1c0NvZGUiLCJJZCIsIl94NCIsIm1lc3NhZ2UiLCJfdGhpczQiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImh0dHBDb250ZW50TGlzdCIsIl9jYWxsZWU2IiwiYXJyYXlCdWZmZXJzIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJfeWllbGQkcmVzcCRzdHJlYW1zJCIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsImFsbCIsIm1hcCIsIl9yZWY1IiwiX2NhbGxlZTUiLCJtZWRpYSIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsImFycmF5QnVmZmVyIiwidDEiLCJfeDUiLCJfcmVmNiIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwiYWRkU3RyZWFtIiwiZSIsInJlYWRBc0pzb24iLCJfd2FpdFVudGlsT25saW5lIiwiX2NhbGxlZTciLCJfdGhpczUiLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJyZWplY3QiLCJjcyIsIk9ubGluZSIsIl9jb25uZWN0QXN5bmMiLCJfY2FsbGVlOSIsIl90aGlzNiIsInJlIiwicGFyYW1zIiwiYWJvcnRDb250cm9sbGVyIiwidXJsU2VhcmNoUGFyYW1zIiwid3NVcmwiLCJfY2FsbGVlOSQiLCJfY29udGV4dDkiLCJSZWdFeHAiLCJ0ZXN0IiwiQWJvcnRDb250cm9sbGVyIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJyZXBsYWNlIiwiX3JlZjciLCJfY2FsbGVlOCIsInJlc3BvbnNlIiwicmVzcG9uc2VTdHJpbmciLCJjb252ZXJzYXRpb24iLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIiwiZGlzY29ubmVjdGlvbkhhbmRsZXIiLCJfY2xhc3NQcml2YXRlRmllbGRHZXQyIiwicmVxdWVzdEhhbmRsZXIiLCJzdHJlYW1pbmdSZXF1ZXN0Iiwic2lnbmFsIiwiYWJvcnRlZCIsImNvbm5lY3QiLCJfeDYiLCJfeDciLCJhYm9ydCIsImNvbm5lY3RBc3luYyIsIl9jb25uZWN0V2l0aFJldHJ5QXN5bmMiLCJfY2FsbGVlMTAiLCJfdGhpczciLCJudW1SZXRyaWVzIiwic3RhcnQiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQxMCIsImNyZWF0ZURlZmVycmVkIiwicHJvbWlzZSIsIkNvbm5lY3RpbmciLCJEYXRlIiwibm93IiwiZ2V0UmV0cnlEZWxheSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvZGlyZWN0TGluZVN0cmVhbWluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbiBvcmRlciB0byBrZWVwIGZpbGUgc2l6ZSBkb3duLCBvbmx5IGltcG9ydCB0aGUgcGFydHMgb2YgcnhqcyB0aGF0IHdlIHVzZVxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCAqIGFzIEJGU0UgZnJvbSAnYm90ZnJhbWV3b3JrLXN0cmVhbWluZyc7XG5pbXBvcnQgY3JlYXRlRGVmZXJyZWQgZnJvbSAnLi9jcmVhdGVEZWZlcnJlZCc7XG5pbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnO1xuXG5pbXBvcnQgeyBBY3Rpdml0eSwgQ29ubmVjdGlvblN0YXR1cywgQ29udmVyc2F0aW9uLCBEaXJlY3RMaW5lLCBJQm90Q29ubmVjdGlvbiwgTWVkaWEsIE1lc3NhZ2UgfSBmcm9tICcuL2RpcmVjdExpbmUnO1xuaW1wb3J0IFdlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24gZnJvbSAnLi9zdHJlYW1pbmcvV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbic7XG5pbXBvcnQgdHlwZSB7IERlZmVycmVkIH0gZnJvbSAnLi9jcmVhdGVEZWZlcnJlZCc7XG5cbmNvbnN0IERJUkVDVF9MSU5FX1ZFUlNJT04gPSAnRGlyZWN0TGluZS8zLjAnO1xuY29uc3QgTUFYX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IHJlZnJlc2hUb2tlbkxpZmV0aW1lID0gMzAgKiA2MCAqIDEwMDA7XG4vL2NvbnN0IHJlZnJlc2hUb2tlbkxpZmV0aW1lID0gNTAwMDtcbi8vIGNvbnN0IHRpbWVvdXQgPSAyMCAqIDEwMDA7XG5jb25zdCByZWZyZXNoVG9rZW5JbnRlcnZhbCA9IHJlZnJlc2hUb2tlbkxpZmV0aW1lIC8gMjtcblxuaW50ZXJmYWNlIERpcmVjdExpbmVTdHJlYW1pbmdPcHRpb25zIHtcbiAgdG9rZW46IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG4gIGRvbWFpbjogc3RyaW5nO1xuICAvLyBBdHRhY2hlZCB0byBhbGwgcmVxdWVzdHMgdG8gaWRlbnRpZnkgcmVxdWVzdGluZyBhZ2VudC5cbiAgYm90QWdlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIFtgTmV0d29ya0luZm9ybWF0aW9uYCBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9OZXR3b3JrX0luZm9ybWF0aW9uX0FQSSkuXG4gICAqIFdoZW4gdGhlIGBOZXR3b3JrSW5mb3JtYXRpb25gIGRldGVjdCBuZXR3b3JrIGNoYW5nZXMgb3Igb2ZmbGluZSwgaXQgd2lsbCBkaXNjb25uZWN0IHRoZSBXZWIgU29ja2V0IGFuZCByZWNvbm5lY3QgaXQuXG4gICAqL1xuICBuZXR3b3JrSW5mb3JtYXRpb24/OiBOZXR3b3JrSW5mb3JtYXRpb247XG59XG5cbmNsYXNzIFN0cmVhbUhhbmRsZXIgaW1wbGVtZW50cyBCRlNFLlJlcXVlc3RIYW5kbGVyIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uU3RhdHVzJDtcbiAgcHJpdmF0ZSBzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBzaG91bGRRdWV1ZTogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBhY3Rpdml0eVF1ZXVlOiBBcnJheTxBY3Rpdml0eT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzOiBTdWJzY3JpYmVyPEFjdGl2aXR5PiwgYyQ6IE9ic2VydmFibGU8Q29ubmVjdGlvblN0YXR1cz4sIHNxOiAoKSA9PiBib29sZWFuKSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkID0gYyQ7XG4gICAgdGhpcy5zaG91bGRRdWV1ZSA9IHNxO1xuICB9XG5cbiAgcHVibGljIHNldFN1YnNjcmliZXIoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4pIHtcbiAgICB0aGlzLnN1YnNjcmliZXIgPSBzO1xuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdDogQkZTRS5JUmVjZWl2ZVJlcXVlc3QsIGxvZ2dlcj86IGFueSk6IFByb21pc2U8QkZTRS5TdHJlYW1pbmdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHN0cmVhbXMgPSBbLi4ucmVxdWVzdC5zdHJlYW1zXTtcbiAgICBjb25zdCBzdHJlYW0wID0gc3RyZWFtcy5zaGlmdCgpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0SnNvbiA9IGF3YWl0IHN0cmVhbTAucmVhZEFzU3RyaW5nKCk7XG4gICAgY29uc3QgYWN0aXZpdHlTZXQgPSBKU09OLnBhcnNlKGFjdGl2aXR5U2V0SnNvbik7XG5cbiAgICBpZiAoYWN0aXZpdHlTZXQuYWN0aXZpdGllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIC8vIE9ubHkgb25lIGFjdGl2aXR5IGlzIGV4cGVjdGVkIGluIGEgc2V0IGluIHN0cmVhbWluZ1xuICAgICAgdGhpcy5zdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcigndGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIGFjdGl2aXR5JykpO1xuICAgICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDUwMCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZpdHkgPSBhY3Rpdml0eVNldC5hY3Rpdml0aWVzWzBdO1xuXG4gICAgaWYgKHN0cmVhbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBbLi4uYWN0aXZpdHkuYXR0YWNobWVudHNdO1xuXG4gICAgICBsZXQgc3RyZWFtOiBCRlNFLkNvbnRlbnRTdHJlYW07XG4gICAgICB3aGlsZSAoKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGF3YWl0IHN0cmVhbS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGF0YVVyaSA9ICdkYXRhOnRleHQvcGxhaW47YmFzZTY0LCcgKyBhdHRhY2htZW50O1xuICAgICAgICBhdHRhY2htZW50cy5wdXNoKHsgY29udGVudFR5cGU6IHN0cmVhbS5jb250ZW50VHlwZSwgY29udGVudFVybDogZGF0YVVyaSB9KTtcbiAgICAgIH1cblxuICAgICAgYWN0aXZpdHkuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRRdWV1ZSgpKSB7XG4gICAgICB0aGlzLmFjdGl2aXR5UXVldWUucHVzaChhY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5uZXh0KGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gQkZTRS5TdHJlYW1pbmdSZXNwb25zZS5jcmVhdGUoMjAwKTtcbiAgfVxuXG4gIHB1YmxpYyBmbHVzaCgpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlLmZvckVhY2goYSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cblxuICBwdWJsaWMgZW5kKCkge1xuICAgIHRoaXMuc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RMaW5lU3RyZWFtaW5nIGltcGxlbWVudHMgSUJvdENvbm5lY3Rpb24ge1xuICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gIHB1YmxpYyBhY3Rpdml0eSQ6IE9ic2VydmFibGU8QWN0aXZpdHk+O1xuXG4gIHByaXZhdGUgYWN0aXZpdHlTdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBjb25uZWN0RGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICAjbmV0d29ya0luZm9ybWF0aW9uOiBOZXR3b3JrSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMpIHtcbiAgICAvLyBSZWN0aWZpZXMgYG9wdGlvbnMubmV0d29ya0luZm9ybWF0aW9uYC5cbiAgICBjb25zdCBuZXR3b3JrSW5mb3JtYXRpb24gPSBvcHRpb25zPy5uZXR3b3JrSW5mb3JtYXRpb247XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgKHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24uYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbi50eXBlID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHRoaXMuI25ldHdvcmtJbmZvcm1hdGlvbiA9IG5ldHdvcmtJbmZvcm1hdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnYm90ZnJhbWV3b3JrLWRpcmVjdGxpbmVqczogXCJuZXR3b3JrSW5mb3JtYXRpb25cIiBvcHRpb24gc3BlY2lmaWVkIG11c3QgYmUgYSBgTmV0d29ya0luZm9ybWF0aW9uYC1saWtlIGluc3RhbmNlIGV4dGVuZGluZyBgRXZlbnRUYXJnZXRgIGludGVyZmFjZSB3aXRoIGEgYHR5cGVgIHByb3BlcnR5IHJldHVybmluZyBhIHN0cmluZy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgLy8gUmVzb2x2aW5nIGNvbm5lY3REZWZlcnJlZCB3aWxsIGtpY2stb2ZmIHRoZSBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH0pLnNoYXJlKCk7XG5cbiAgICAvLyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB3aWxsIGNyZWF0ZSB0aGUgY29ubmVjdERlZmVycmVkIG9iamVjdCByZXF1aXJlZCBpbiBhY3Rpdml0eSQuXG4gICAgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfTogQ29udmVyc2F0aW9uKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25uZWN0aW9uIGhhcyBlbmRlZC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuXG4gICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICB9XG5cbiAgZW5kKCkge1xuICAgIC8vIE9uY2UgZW5kKCkgaXMgY2FsbGVkLCBubyByZWNvbm5lY3Rpb24gY2FuIGJlIG1hZGUuXG4gICAgdGhpcy5hY3Rpdml0eVN1YnNjcmliZXIuY29tcGxldGUoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkVuZGVkKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21tb25IZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgJ3gtbXMtYm90LWFnZW50JzogdGhpcy5fYm90QWdlbnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCb3RBZ2VudChjdXN0b21BZ2VudDogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBjbGllbnRBZ2VudCA9ICdkaXJlY3RsaW5lU3RyZWFtaW5nJztcblxuICAgIGlmIChjdXN0b21BZ2VudCkge1xuICAgICAgY2xpZW50QWdlbnQgKz0gYDsgJHtjdXN0b21BZ2VudH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtESVJFQ1RfTElORV9WRVJTSU9OfSAoJHtjbGllbnRBZ2VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFRva2VuKGZpcnN0Q2FsbCA9IHRydWUsIHJldHJ5Q291bnQgPSAwKSB7XG4gICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcblxuICAgIGxldCBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICB3aGlsZSAobnVtYmVyT2ZBdHRlbXB0cyA8IE1BWF9SRVRSWV9DT1VOVCkge1xuICAgICAgbnVtYmVyT2ZBdHRlbXB0cysrO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHJlZnJlc2hUb2tlbkludGVydmFsKSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmRvbWFpbn0vdG9rZW5zL3JlZnJlc2hgLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB0aGlzLmNvbW1vbkhlYWRlcnMoKSB9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgICAgICAgIGNvbnN0IHsgdG9rZW4gfSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDMgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYXRhbCBlcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0b2tlbjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gZmFpbGVkOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IHRocmV3IGFuIGV4Y2VwdGlvbjogJHtlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ1JldHJpZXMgZXhoYXVzdGVkJyk7XG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkIHx8XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdFxuICAgICkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdDb25uZWN0aW9uIGlzIGNsb3NlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZpdHkudHlwZSA9PT0gJ21lc3NhZ2UnICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwJCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoXG4gICAgICAgICdQT1NUJyxcbiAgICAgICAgJy92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJyArIHRoaXMuY29udmVyc2F0aW9uSWQgKyAnL2FjdGl2aXRpZXMnXG4gICAgICApO1xuICAgICAgcmVxdWVzdC5zZXRCb2R5KEpTT04uc3RyaW5naWZ5KGFjdGl2aXR5KSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzQ29kZSAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoJ1Bvc3RBY3Rpdml0eSByZXR1cm5lZCAnICsgcmVzcC5zdGF0dXNDb2RlKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZTdHJlYW1zID0gcmVzcC5zdHJlYW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bWJlck9mU3RyZWFtcyAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBvbmUgc3RyZWFtIGJ1dCBnb3QgJyArIG51bWJlck9mU3RyZWFtcyk7XG4gICAgICAgIGNvbnN0IGlkU3RyaW5nID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCB7IElkOiBpZCB9ID0gSlNPTi5wYXJzZShpZFN0cmluZyk7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV0d29yayBpc3N1ZSB0aGVuIGl0cyBoYW5kbGVkIGJ5XG4gICAgICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uSGFuZGxlci4gRXZlcnl0aGluZyBlbHNlIGNhblxuICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShzdWJzY3JpYmVyID0+IHtcbiAgICAgIGNvbnN0IGh0dHBDb250ZW50TGlzdCA9IFtdO1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLm1hcChhc3luYyBhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChtZWRpYS5jb250ZW50VXJsKTtcbiAgICAgICAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhcnJheUJ1ZmZlcnMuZm9yRWFjaCgoeyBhcnJheUJ1ZmZlciwgbWVkaWEgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGh0dHBDb250ZW50ID0gbmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBtZWRpYS5jb250ZW50VHlwZSwgY29udGVudExlbmd0aDogYnVmZmVyLmxlbmd0aCB9LCBzdHJlYW0pO1xuICAgICAgICAgICAgaHR0cENvbnRlbnRMaXN0LnB1c2goaHR0cENvbnRlbnQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdXJsID0gYC92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS91c2Vycy8ke21lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMuZnJvbS5pZH0vdXBsb2FkYDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUFVUJywgdXJsKTtcbiAgICAgICAgICBjb25zdCBhY3Rpdml0eVN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgIGFjdGl2aXR5U3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMpLCAndXRmLTgnKTtcbiAgICAgICAgICByZXF1ZXN0LmFkZFN0cmVhbShcbiAgICAgICAgICAgIG5ldyBCRlNFLkh0dHBDb250ZW50KFxuICAgICAgICAgICAgICB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmFjdGl2aXR5JywgY29udGVudExlbmd0aDogYWN0aXZpdHlTdHJlYW0ubGVuZ3RoIH0sXG4gICAgICAgICAgICAgIGFjdGl2aXR5U3RyZWFtXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBodHRwQ29udGVudExpc3QuZm9yRWFjaChlID0+IHJlcXVlc3QuYWRkU3RyZWFtKGUpKTtcblxuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgICBpZiAocmVzcC5zdHJlYW1zICYmIHJlc3Auc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKGBJbnZhbGlkIHN0cmVhbSBjb3VudCAke3Jlc3Auc3RyZWFtcy5sZW5ndGh9YCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IElkOiBpZCB9ID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc0pzb248eyBJZDogc3RyaW5nIH0+KCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRVbnRpbE9ubGluZSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoXG4gICAgICAgIGNzID0+IHtcbiAgICAgICAgICBpZiAoY3MgPT09IENvbm5lY3Rpb25TdGF0dXMuT25saW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZSA9PiByZWplY3QoZSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuXG4gICAgaWYgKCFyZS50ZXN0KHRoaXMuZG9tYWluKSkge1xuICAgICAgdGhyb3cgJ0RvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwcyc7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0geyB0b2tlbjogdGhpcy50b2tlbiB9O1xuXG4gICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHBhcmFtc1snY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gaXQgaXMgZGlzY29ubmVjdGVkLlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbih7XG4gICAgICAgICAgZGlzY29ubmVjdGlvbkhhbmRsZXI6IHJlc29sdmUsXG4gICAgICAgICAgbmV0d29ya0luZm9ybWF0aW9uOiB0aGlzLiNuZXR3b3JrSW5mb3JtYXRpb24sXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHtcbiAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0OiBzdHJlYW1pbmdSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgLy8gSWYgYHN0cmVhbUNvbm5lY3Rpb25gIGlzIHN0aWxsIGN1cnJlbnQsIGFsbG93IGNhbGwgdG8gYHByb2Nlc3NSZXF1ZXN0KClgLCBvdGhlcndpc2UsIGlnbm9yZSBjYWxscyB0byBgcHJvY2Vzc1JlcXVlc3QoKWAuXG4gICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgem9tYmllIGNvbm5lY3Rpb25zIGZyb20gc2VuZGluZyB1cyByZXF1ZXN0cy5cbiAgICAgICAgICAgICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb2Nlc3Mgc3RyZWFtaW5nIHJlcXVlc3QsIGBzdHJlYW1pbmdDb25uZWN0aW9uYCBzaG91bGQgYmUgZGlzY29ubmVjdGVkLicpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlU3RyZWFtSGFuZGxlci5wcm9jZXNzUmVxdWVzdChzdHJlYW1pbmdSZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHVybDogd3NVcmxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5jb25uZWN0KCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BPU1QnLCAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucycpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzQ29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgJyArIHJlc3BvbnNlLnN0cmVhbXMubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG5cbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbi5jb252ZXJzYXRpb25JZDtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuT25saW5lKTtcblxuICAgICAgICAvLyBXYWl0IHVudGlsIERMIGNvbnN1bWVycyBoYXZlIGhhZCBhIGNoYW5jZSB0byBiZSBub3RpZmllZFxuICAgICAgICAvLyBvZiB0aGUgY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlLlxuICAgICAgICAvLyBUaGlzIGlzIHNwZWNpZmljIHRvIFJ4SlMgaW1wbGVtZW50YXRpb24gb2Ygb2JzZXJ2YWJsZSwgd2hpY2ggY2FsbGluZyBzdWJzY3JpYmUoKSBhZnRlciBuZXh0KCkgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbHVlLlxuICAgICAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlci5mbHVzaCgpO1xuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSkuZmluYWxseSgoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RXaXRoUmV0cnlBc3luYygpIHtcbiAgICAvLyBUaGlzIGZvci1sb29wIHdpbGwgYnJlYWsgd2hlbiBzb21lb25lIGNhbGwgZW5kKCkgYW5kIGl0IHdpbGwgc2lnbmFsIENvbm5lY3Rpb25TdGF0dXMuRW5kZWQuXG4gICAgZm9yICg7Oykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNpZ25hbCBhbmQgd2FpdCBmb3Igc29tZW9uZSBraWNraW5nIG9mZiB0aGUgY29ubmVjdGlvbjpcbiAgICAgIC8vIC0gc3Vic2NyaWJlIHRvIGFjdGl2aXR5JCwgb3I7XG4gICAgICAvLyAtIHJldHJpZXMgZXhoYXVzdGVkIChGYWlsZWRUb0Nvbm5lY3QpLCB0aGVuLCBzb21lb25lIGNhbGwgcmVjb25uZWN0KClcbiAgICAgIGF3YWl0ICh0aGlzLmNvbm5lY3REZWZlcnJlZCA9IGNyZWF0ZURlZmVycmVkKCkpLnByb21pc2U7XG5cbiAgICAgIGxldCBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcblxuICAgICAgd2hpbGUgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICAgIG51bVJldHJpZXMtLTtcblxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZWplY3QvcmVzb2x2ZSB3aGVuIGRpc2Nvbm5lY3RlZC5cbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3RBc3luYygpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBzb21lb25lIGNhbGwgZW5kKCkgdG8gYnJlYWsgdGhlIGNvbm5lY3Rpb24sIHdlIHdpbGwgbmV2ZXIgbGlzdGVuIHRvIGFueSByZWNvbm5lY3QoKS5cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgdGhlIGxvb3AgaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGJyb2tlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzaWduYWwgQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nIHR3aWNlIG9yIG1vcmUgd2l0aG91dCBhbiBhY3R1YWwgY29ubmVjdGlvbi5cbiAgICAgICAgLy8gU3Vic2VxdWVudCByZXRyaWVzIHNob3VsZCBiZSB0cmFuc3BhcmVudC5cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSAhPT0gQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIGxhc3RlZCBmb3IgbW9yZSB0aGFuIGEgbWludXRlLCB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBpcyBnb29kLCB3aGljaCBtZWFuczpcbiAgICAgICAgLy8gLSB3ZSBzaG91bGQgcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIsIGFuZDtcbiAgICAgICAgLy8gLSB3ZSBzaG91bGQgcmVjb25uZWN0IGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAoNjAwMDAgPCBEYXRlLm5vdygpIC0gc3RhcnQpIHtcbiAgICAgICAgICBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuICAgICAgICB9IGVsc2UgaWYgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgLy8gU2xlZXAgb25seSBpZiB3ZSBhcmUgZG9pbmcgcmV0cnkuIE90aGVyd2lzZSwgd2UgYXJlIGdvaW5nIHRvIGJyZWFrIHRoZSBsb29wIGFuZCBzaWduYWwgRmFpbGVkVG9Db25uZWN0LlxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCB0aGlzLmdldFJldHJ5RGVsYXkoKSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFtURVNUXSBNYWtlIHN1cmUgRmFpbGVkVG9Db25uZWN0IGlzIHJlcG9ydGVkIGltbWVkaWF0ZWx5IGFmdGVyIGxhc3QgZGlzY29ubmVjdGlvbiwgc2hvdWxkIGJlIG5vIGdldFJldHJ5RGVsYXkoKS5cbiAgICAgIC8vIEZhaWxlZCB0byByZWNvbm5lY3QgYWZ0ZXIgbXVsdGlwbGUgcmV0cmllcy5cbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogTm8gY29kZSB3aWxsIGhpdCB0aGlzIGxpbmUuXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBQUEsZ0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FB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
|
|
712
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmVoYXZpb3JTdWJqZWN0IiwicmVxdWlyZSIsIl9idWZmZXIiLCJfT2JzZXJ2YWJsZSIsIkJGU0UiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jcmVhdGVEZWZlcnJlZCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY3Jvc3NGZXRjaCIsIl9kaXJlY3RMaW5lIiwiX1dlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24iLCJfZXhjbHVkZWQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiaGFzIiwiZ2V0Iiwic2V0IiwiX3Q4IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyIsImEiLCJfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbiIsIlR5cGVFcnJvciIsIl9jbGFzc1ByaXZhdGVGaWVsZEdldCIsInMiLCJfYXNzZXJ0Q2xhc3NCcmFuZCIsIl9jbGFzc1ByaXZhdGVGaWVsZFNldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInJlZnJlc2hUb2tlbkludGVydmFsIiwiU3RyZWFtSGFuZGxlciIsImMkIiwic3EiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwic2V0U3Vic2NyaWJlciIsIl9wcm9jZXNzUmVxdWVzdCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwiYWN0aXZpdHlTZXRKc29uIiwiYWN0aXZpdHlTZXQiLCJhY3Rpdml0eSIsImF0dGFjaG1lbnRzIiwic3RyZWFtIiwiYXR0YWNobWVudCIsImRhdGFVcmkiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzaGlmdCIsInJlYWRBc1N0cmluZyIsInNlbnQiLCJKU09OIiwicGFyc2UiLCJhY3Rpdml0aWVzIiwiZXJyb3IiLCJFcnJvciIsImFicnVwdCIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJzdG9wIiwicHJvY2Vzc1JlcXVlc3QiLCJfeCIsIl94MiIsImFwcGx5IiwiZmx1c2giLCJfdGhpcyIsInN1YnNjcmliZSIsImZvckVhY2giLCJlbmQiLCJjb21wbGV0ZSIsIl9uZXR3b3JrSW5mb3JtYXRpb24iLCJEaXJlY3RMaW5lU3RyZWFtaW5nIiwiZXhwb3J0cyIsIm9wdGlvbnMiLCJfdGhpczIiLCJCZWhhdmlvclN1YmplY3QiLCJDb25uZWN0aW9uU3RhdHVzIiwiVW5pbml0aWFsaXplZCIsIm5ldHdvcmtJbmZvcm1hdGlvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidHlwZSIsImNvbnNvbGUiLCJ3YXJuIiwidG9rZW4iLCJyZWZyZXNoVG9rZW4iLCJFeHBpcmVkVG9rZW4iLCJkb21haW4iLCJjb252ZXJzYXRpb25JZCIsIl9ib3RBZ2VudCIsImdldEJvdEFnZW50IiwiYm90QWdlbnQiLCJxdWV1ZUFjdGl2aXRpZXMiLCJhY3Rpdml0eSQiLCJPYnNlcnZhYmxlIiwiX3JlZiIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiYWN0aXZpdHlTdWJzY3JpYmVyIiwidGhlU3RyZWFtSGFuZGxlciIsImNvbm5lY3REZWZlcnJlZCIsInJlc29sdmUiLCJfeDMiLCJzaGFyZSIsImNvbm5lY3RXaXRoUmV0cnlBc3luYyIsInJlY29ubmVjdCIsIl9yZWYyIiwiZ2V0VmFsdWUiLCJFbmRlZCIsInN0cmVhbUNvbm5lY3Rpb24iLCJkaXNjb25uZWN0IiwiY29tbW9uSGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJjb25jYXQiLCJjdXN0b21BZ2VudCIsInVuZGVmaW5lZCIsImNsaWVudEFnZW50IiwiX3JlZnJlc2hUb2tlbiIsIl9jYWxsZWUzIiwiZmlyc3RDYWxsIiwicmV0cnlDb3VudCIsIm51bWJlck9mQXR0ZW1wdHMiLCJyZXMiLCJfeWllbGQkcmVzJGpzb24iLCJfYXJnczMiLCJfdCIsIl9jb250ZXh0MyIsIndhaXRVbnRpbE9ubGluZSIsIlByb21pc2UiLCJzZXRUaW1lb3V0IiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwib2siLCJqc29uIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInBvc3RBY3Rpdml0eSIsIl90aGlzMyIsIkZhaWxlZFRvQ29ubmVjdCIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJfcmVmMyIsIl9jYWxsZWU0IiwicmVzcCIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiX0pTT04kcGFyc2UiLCJpZCIsIl90MiIsIl9jb250ZXh0NCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInN0YXR1c0NvZGUiLCJJZCIsIl94NCIsIm1lc3NhZ2UiLCJfdGhpczQiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImh0dHBDb250ZW50TGlzdCIsIl9jYWxsZWU2IiwiYXJyYXlCdWZmZXJzIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJfeWllbGQkcmVzcCRzdHJlYW1zJCIsIl90NSIsIl9jb250ZXh0NiIsImFsbCIsIm1hcCIsIl9yZWY1IiwiX2NhbGxlZTUiLCJtZWRpYSIsIl90MyIsIl90NCIsIl9jb250ZXh0NSIsImFycmF5QnVmZmVyIiwiX3g1IiwiX3JlZjYiLCJidWZmZXIiLCJCdWZmZXIiLCJmcm9tIiwiU3Vic2NyaWJhYmxlU3RyZWFtIiwid3JpdGUiLCJodHRwQ29udGVudCIsIkh0dHBDb250ZW50IiwiY29udGVudExlbmd0aCIsImFkZFN0cmVhbSIsInJlYWRBc0pzb24iLCJfd2FpdFVudGlsT25saW5lIiwiX2NhbGxlZTciLCJfdGhpczUiLCJfY29udGV4dDciLCJyZWplY3QiLCJjcyIsIk9ubGluZSIsIl9jb25uZWN0QXN5bmMiLCJfY2FsbGVlOSIsIl90aGlzNiIsInJlIiwicGFyYW1zIiwiYWJvcnRDb250cm9sbGVyIiwidXJsU2VhcmNoUGFyYW1zIiwid3NVcmwiLCJfY29udGV4dDkiLCJSZWdFeHAiLCJ0ZXN0IiwiQWJvcnRDb250cm9sbGVyIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJyZXBsYWNlIiwiX3JlZjciLCJfY2FsbGVlOCIsInJlc3BvbnNlIiwicmVzcG9uc2VTdHJpbmciLCJjb252ZXJzYXRpb24iLCJfdDYiLCJfY29udGV4dDgiLCJXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIiwiZGlzY29ubmVjdGlvbkhhbmRsZXIiLCJyZXF1ZXN0SGFuZGxlciIsInN0cmVhbWluZ1JlcXVlc3QiLCJzaWduYWwiLCJhYm9ydGVkIiwiY29ubmVjdCIsIl94NiIsIl94NyIsImFib3J0IiwiY29ubmVjdEFzeW5jIiwiX2Nvbm5lY3RXaXRoUmV0cnlBc3luYyIsIl9jYWxsZWUwIiwiX3RoaXM3IiwibnVtUmV0cmllcyIsInN0YXJ0IiwiX3Q3IiwiX2NvbnRleHQwIiwiY3JlYXRlRGVmZXJyZWQiLCJwcm9taXNlIiwiQ29ubmVjdGluZyIsIkRhdGUiLCJub3ciLCJnZXRSZXRyeURlbGF5IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIl0sInNvdXJjZXMiOlsiLi4vc3JjL2RpcmVjdExpbmVTdHJlYW1pbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW4gb3JkZXIgdG8ga2VlcCBmaWxlIHNpemUgZG93biwgb25seSBpbXBvcnQgdGhlIHBhcnRzIG9mIHJ4anMgdGhhdCB3ZSB1c2VcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJ3J4anMvU3Vic2NyaWJlcic7XG5pbXBvcnQgKiBhcyBCRlNFIGZyb20gJ2JvdGZyYW1ld29yay1zdHJlYW1pbmcnO1xuaW1wb3J0IGNyZWF0ZURlZmVycmVkIGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuaW1wb3J0IGZldGNoIGZyb20gJ2Nyb3NzLWZldGNoJztcblxuaW1wb3J0IHsgQWN0aXZpdHksIENvbm5lY3Rpb25TdGF0dXMsIENvbnZlcnNhdGlvbiwgRGlyZWN0TGluZSwgSUJvdENvbm5lY3Rpb24sIE1lZGlhLCBNZXNzYWdlIH0gZnJvbSAnLi9kaXJlY3RMaW5lJztcbmltcG9ydCBXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIGZyb20gJy4vc3RyZWFtaW5nL1dlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBEZWZlcnJlZCB9IGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuXG5jb25zdCBESVJFQ1RfTElORV9WRVJTSU9OID0gJ0RpcmVjdExpbmUvMy4wJztcbmNvbnN0IE1BWF9SRVRSWV9DT1VOVCA9IDM7XG5jb25zdCByZWZyZXNoVG9rZW5MaWZldGltZSA9IDMwICogNjAgKiAxMDAwO1xuLy9jb25zdCByZWZyZXNoVG9rZW5MaWZldGltZSA9IDUwMDA7XG4vLyBjb25zdCB0aW1lb3V0ID0gMjAgKiAxMDAwO1xuY29uc3QgcmVmcmVzaFRva2VuSW50ZXJ2YWwgPSByZWZyZXNoVG9rZW5MaWZldGltZSAvIDI7XG5cbmludGVyZmFjZSBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucyB7XG4gIHRva2VuOiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbklkPzogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbiAgLy8gQXR0YWNoZWQgdG8gYWxsIHJlcXVlc3RzIHRvIGlkZW50aWZ5IHJlcXVlc3RpbmcgYWdlbnQuXG4gIGJvdEFnZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBbYE5ldHdvcmtJbmZvcm1hdGlvbmAgQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTmV0d29ya19JbmZvcm1hdGlvbl9BUEkpLlxuICAgKiBXaGVuIHRoZSBgTmV0d29ya0luZm9ybWF0aW9uYCBkZXRlY3QgbmV0d29yayBjaGFuZ2VzIG9yIG9mZmxpbmUsIGl0IHdpbGwgZGlzY29ubmVjdCB0aGUgV2ViIFNvY2tldCBhbmQgcmVjb25uZWN0IGl0LlxuICAgKi9cbiAgbmV0d29ya0luZm9ybWF0aW9uPzogTmV0d29ya0luZm9ybWF0aW9uO1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKChzdHJlYW0gPSBzdHJlYW1zLnNoaWZ0KCkpKSB7XG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBhd2FpdCBzdHJlYW0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGRhdGFVcmkgPSAnZGF0YTp0ZXh0L3BsYWluO2Jhc2U2NCwnICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoKCkgPT4ge30pO1xuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKGEgPT4gdGhpcy5zdWJzY3JpYmVyLm5leHQoYSkpO1xuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZSA9IFtdO1xuICB9XG5cbiAgcHVibGljIGVuZCgpIHtcbiAgICB0aGlzLnN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlyZWN0TGluZVN0cmVhbWluZyBpbXBsZW1lbnRzIElCb3RDb25uZWN0aW9uIHtcbiAgcHVibGljIGNvbm5lY3Rpb25TdGF0dXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChDb25uZWN0aW9uU3RhdHVzLlVuaW5pdGlhbGl6ZWQpO1xuICBwdWJsaWMgYWN0aXZpdHkkOiBPYnNlcnZhYmxlPEFjdGl2aXR5PjtcblxuICBwcml2YXRlIGFjdGl2aXR5U3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgY29ubmVjdERlZmVycmVkOiBEZWZlcnJlZDx2b2lkPjtcbiAgcHJpdmF0ZSB0aGVTdHJlYW1IYW5kbGVyOiBTdHJlYW1IYW5kbGVyO1xuXG4gIHByaXZhdGUgZG9tYWluOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICBwcml2YXRlIHRva2VuOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RyZWFtQ29ubmVjdGlvbjogQkZTRS5XZWJTb2NrZXRDbGllbnQ7XG4gIHByaXZhdGUgcXVldWVBY3Rpdml0aWVzOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2JvdEFnZW50ID0gJyc7XG5cbiAgI25ldHdvcmtJbmZvcm1hdGlvbjogTmV0d29ya0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERpcmVjdExpbmVTdHJlYW1pbmdPcHRpb25zKSB7XG4gICAgLy8gUmVjdGlmaWVzIGBvcHRpb25zLm5ldHdvcmtJbmZvcm1hdGlvbmAuXG4gICAgY29uc3QgbmV0d29ya0luZm9ybWF0aW9uID0gb3B0aW9ucz8ubmV0d29ya0luZm9ybWF0aW9uO1xuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICh0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24udHlwZSA9PT0gJ3N0cmluZycpXG4gICAgKSB7XG4gICAgICB0aGlzLiNuZXR3b3JrSW5mb3JtYXRpb24gPSBuZXR3b3JrSW5mb3JtYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ2JvdGZyYW1ld29yay1kaXJlY3RsaW5lanM6IFwibmV0d29ya0luZm9ybWF0aW9uXCIgb3B0aW9uIHNwZWNpZmllZCBtdXN0IGJlIGEgYE5ldHdvcmtJbmZvcm1hdGlvbmAtbGlrZSBpbnN0YW5jZSBleHRlbmRpbmcgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2Ugd2l0aCBhIGB0eXBlYCBwcm9wZXJ0eSByZXR1cm5pbmcgYSBzdHJpbmcuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnRva2VuID0gb3B0aW9ucy50b2tlbjtcblxuICAgIHRoaXMucmVmcmVzaFRva2VuKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRXhwaXJlZFRva2VuKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZG9tYWluID0gb3B0aW9ucy5kb21haW47XG5cbiAgICBpZiAob3B0aW9ucy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IG9wdGlvbnMuY29udmVyc2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgdGhpcy5fYm90QWdlbnQgPSB0aGlzLmdldEJvdEFnZW50KG9wdGlvbnMuYm90QWdlbnQpO1xuXG4gICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZpdHkkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSA9PiB7XG4gICAgICB0aGlzLmFjdGl2aXR5U3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgICB0aGlzLnRoZVN0cmVhbUhhbmRsZXIgPSBuZXcgU3RyZWFtSGFuZGxlcihzdWJzY3JpYmVyLCB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLCAoKSA9PiB0aGlzLnF1ZXVlQWN0aXZpdGllcyk7XG5cbiAgICAgIC8vIFJlc29sdmluZyBjb25uZWN0RGVmZXJyZWQgd2lsbCBraWNrLW9mZiB0aGUgY29ubmVjdGlvbi5cbiAgICAgIHRoaXMuY29ubmVjdERlZmVycmVkLnJlc29sdmUoKTtcbiAgICB9KS5zaGFyZSgpO1xuXG4gICAgLy8gY29ubmVjdFdpdGhSZXRyeUFzeW5jKCkgd2lsbCBjcmVhdGUgdGhlIGNvbm5lY3REZWZlcnJlZCBvYmplY3QgcmVxdWlyZWQgaW4gYWN0aXZpdHkkLlxuICAgIHRoaXMuY29ubmVjdFdpdGhSZXRyeUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgcmVjb25uZWN0KHsgY29udmVyc2F0aW9uSWQsIHRva2VuIH06IENvbnZlcnNhdGlvbikge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBoYXMgZW5kZWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcblxuICAgIHRoaXMuY29ubmVjdERlZmVycmVkLnJlc29sdmUoKTtcbiAgfVxuXG4gIGVuZCgpIHtcbiAgICAvLyBPbmNlIGVuZCgpIGlzIGNhbGxlZCwgbm8gcmVjb25uZWN0aW9uIGNhbiBiZSBtYWRlLlxuICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbW9uSGVhZGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgICd4LW1zLWJvdC1hZ2VudCc6IHRoaXMuX2JvdEFnZW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Qm90QWdlbnQoY3VzdG9tQWdlbnQ6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgY2xpZW50QWdlbnQgPSAnZGlyZWN0bGluZVN0cmVhbWluZyc7XG5cbiAgICBpZiAoY3VzdG9tQWdlbnQpIHtcbiAgICAgIGNsaWVudEFnZW50ICs9IGA7ICR7Y3VzdG9tQWdlbnR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7RElSRUNUX0xJTkVfVkVSU0lPTn0gKCR7Y2xpZW50QWdlbnR9KWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUb2tlbihmaXJzdENhbGwgPSB0cnVlLCByZXRyeUNvdW50ID0gMCkge1xuICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG5cbiAgICBsZXQgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgd2hpbGUgKG51bWJlck9mQXR0ZW1wdHMgPCBNQVhfUkVUUllfQ09VTlQpIHtcbiAgICAgIG51bWJlck9mQXR0ZW1wdHMrKztcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCByZWZyZXNoVG9rZW5JbnRlcnZhbCkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5kb21haW59L3Rva2Vucy9yZWZyZXNoYCwgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogdGhpcy5jb21tb25IZWFkZXJzKCkgfSk7XG4gICAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgICBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICAgICAgICBjb25zdCB7IHRva2VuIH0gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAzIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmF0YWwgZXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdG9rZW46ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IGZhaWxlZDogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSB0aHJldyBhbiBleGNlcHRpb246ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKCdSZXRyaWVzIGV4aGF1c3RlZCcpO1xuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwb3N0QWN0aXZpdHkoYWN0aXZpdHk6IEFjdGl2aXR5KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC52YWx1ZSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCB8fFxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC52YWx1ZSA9PT0gQ29ubmVjdGlvblN0YXR1cy5GYWlsZWRUb0Nvbm5lY3RcbiAgICApIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KG5ldyBFcnJvcignQ29ubmVjdGlvbiBpcyBjbG9zZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2aXR5LnR5cGUgPT09ICdtZXNzYWdlJyAmJiBhY3Rpdml0eS5hdHRhY2htZW50cyAmJiBhY3Rpdml0eS5hdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcCQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyBzdWJzY3JpYmVyID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKFxuICAgICAgICAnUE9TVCcsXG4gICAgICAgICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLycgKyB0aGlzLmNvbnZlcnNhdGlvbklkICsgJy9hY3Rpdml0aWVzJ1xuICAgICAgKTtcbiAgICAgIHJlcXVlc3Quc2V0Qm9keShKU09OLnN0cmluZ2lmeShhY3Rpdml0eSkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1c0NvZGUgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKCdQb3N0QWN0aXZpdHkgcmV0dXJuZWQgJyArIHJlc3Auc3RhdHVzQ29kZSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mU3RyZWFtcyA9IHJlc3Auc3RyZWFtcy5sZW5ndGg7XG4gICAgICAgIGlmIChudW1iZXJPZlN0cmVhbXMgIT09IDEpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgb25lIHN0cmVhbSBidXQgZ290ICcgKyBudW1iZXJPZlN0cmVhbXMpO1xuICAgICAgICBjb25zdCBpZFN0cmluZyA9IGF3YWl0IHJlc3Auc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgeyBJZDogaWQgfSA9IEpTT04ucGFyc2UoaWRTdHJpbmcpO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldHdvcmsgaXNzdWUgdGhlbiBpdHMgaGFuZGxlZCBieVxuICAgICAgICAvLyB0aGUgZGlzY29ubmVjdGlvbkhhbmRsZXIuIEV2ZXJ5dGhpbmcgZWxzZSBjYW5cbiAgICAgICAgLy8gYmUgcmV0cmllZFxuICAgICAgICBjb25zb2xlLndhcm4oZSk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwJDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgYXR0YWNobWVudHMsIC4uLm1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMgfSA9IG1lc3NhZ2U7XG5cbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCBodHRwQ29udGVudExpc3QgPSBbXTtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBhdHRhY2htZW50cy5tYXAoYXN5bmMgYXR0YWNobWVudCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lZGlhID0gYXR0YWNobWVudCBhcyBNZWRpYTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobWVkaWEuY29udGVudFVybCk7XG4gICAgICAgICAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBhcnJheUJ1ZmZlcjogYXdhaXQgcmVzLmFycmF5QnVmZmVyKCksIG1lZGlhIH07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYXJyYXlCdWZmZXJzLmZvckVhY2goKHsgYXJyYXlCdWZmZXIsIG1lZGlhIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBodHRwQ29udGVudCA9IG5ldyBCRlNFLkh0dHBDb250ZW50KHsgdHlwZTogbWVkaWEuY29udGVudFR5cGUsIGNvbnRlbnRMZW5ndGg6IGJ1ZmZlci5sZW5ndGggfSwgc3RyZWFtKTtcbiAgICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5wdXNoKGh0dHBDb250ZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHVybCA9IGAvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25JZH0vdXNlcnMvJHttZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzLmZyb20uaWR9L3VwbG9hZGA7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BVVCcsIHVybCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZpdHlTdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICBhY3Rpdml0eVN0cmVhbS53cml0ZShKU09OLnN0cmluZ2lmeShtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzKSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgcmVxdWVzdC5hZGRTdHJlYW0oXG4gICAgICAgICAgICBuZXcgQkZTRS5IdHRwQ29udGVudChcbiAgICAgICAgICAgICAgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5hY3Rpdml0eScsIGNvbnRlbnRMZW5ndGg6IGFjdGl2aXR5U3RyZWFtLmxlbmd0aCB9LFxuICAgICAgICAgICAgICBhY3Rpdml0eVN0cmVhbVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaHR0cENvbnRlbnRMaXN0LmZvckVhY2goZSA9PiByZXF1ZXN0LmFkZFN0cmVhbShlKSk7XG5cbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgICAgaWYgKHJlc3Auc3RyZWFtcyAmJiByZXNwLnN0cmVhbXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcihgSW52YWxpZCBzdHJlYW0gY291bnQgJHtyZXNwLnN0cmVhbXMubGVuZ3RofWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBJZDogaWQgfSA9IGF3YWl0IHJlc3Auc3RyZWFtc1swXS5yZWFkQXNKc29uPHsgSWQ6IHN0cmluZyB9PigpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlkKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0VW50aWxPbmxpbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuc3Vic2NyaWJlKFxuICAgICAgICBjcyA9PiB7XG4gICAgICAgICAgaWYgKGNzID09PSBDb25uZWN0aW9uU3RhdHVzLk9ubGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGUgPT4gcmVqZWN0KGUpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0QXN5bmMoKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeaHR0cChzPyknKTtcblxuICAgIGlmICghcmUudGVzdCh0aGlzLmRvbWFpbikpIHtcbiAgICAgIHRocm93ICdEb21haW4gbXVzdCBiZWdpbiB3aXRoIGh0dHAgb3IgaHR0cHMnO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtcyA9IHsgdG9rZW46IHRoaXMudG9rZW4gfTtcblxuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICBwYXJhbXNbJ2NvbnZlcnNhdGlvbklkJ10gPSB0aGlzLmNvbnZlcnNhdGlvbklkO1xuICAgIH1cblxuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB1cmxTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykudG9TdHJpbmcoKTtcbiAgICBjb25zdCB3c1VybCA9IGAke3RoaXMuZG9tYWluLnJlcGxhY2UocmUsICd3cyQxJyl9L2NvbnZlcnNhdGlvbnMvY29ubmVjdD8ke3VybFNlYXJjaFBhcmFtc31gO1xuXG4gICAgLy8gVGhpcyBwcm9taXNlIHdpbGwgcmVzb2x2ZSB3aGVuIGl0IGlzIGRpc2Nvbm5lY3RlZC5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uID0gbmV3IFdlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24oe1xuICAgICAgICAgIGRpc2Nvbm5lY3Rpb25IYW5kbGVyOiByZXNvbHZlLFxuICAgICAgICAgIG5ldHdvcmtJbmZvcm1hdGlvbjogdGhpcy4jbmV0d29ya0luZm9ybWF0aW9uLFxuICAgICAgICAgIHJlcXVlc3RIYW5kbGVyOiB7XG4gICAgICAgICAgICBwcm9jZXNzUmVxdWVzdDogc3RyZWFtaW5nUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgIC8vIElmIGBzdHJlYW1Db25uZWN0aW9uYCBpcyBzdGlsbCBjdXJyZW50LCBhbGxvdyBjYWxsIHRvIGBwcm9jZXNzUmVxdWVzdCgpYCwgb3RoZXJ3aXNlLCBpZ25vcmUgY2FsbHMgdG8gYHByb2Nlc3NSZXF1ZXN0KClgLlxuICAgICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHpvbWJpZSBjb25uZWN0aW9ucyBmcm9tIHNlbmRpbmcgdXMgcmVxdWVzdHMuXG4gICAgICAgICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwcm9jZXNzIHN0cmVhbWluZyByZXF1ZXN0LCBgc3RyZWFtaW5nQ29ubmVjdGlvbmAgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZC4nKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZVN0cmVhbUhhbmRsZXIucHJvY2Vzc1JlcXVlc3Qoc3RyZWFtaW5nUmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cmw6IHdzVXJsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uY29ubmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQT1NUJywgJy92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMnKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25uZWN0aW9uIHJlc3BvbnNlIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0cmVhbXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCAxIHN0cmVhbSBidXQgZ290ICcgKyByZXNwb25zZS5zdHJlYW1zLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZVN0cmluZyA9IGF3YWl0IHJlc3BvbnNlLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHJpbmcpO1xuXG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG5cbiAgICAgICAgLy8gV2FpdCB1bnRpbCBETCBjb25zdW1lcnMgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gYmUgbm90aWZpZWRcbiAgICAgICAgLy8gb2YgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgLy8gVGhpcyBpcyBzcGVjaWZpYyB0byBSeEpTIGltcGxlbWVudGF0aW9uIG9mIG9ic2VydmFibGUsIHdoaWNoIGNhbGxpbmcgc3Vic2NyaWJlKCkgYWZ0ZXIgbmV4dCgpIHdpbGwgc3RpbGwgZ2V0IHRoZSB2YWx1ZS5cbiAgICAgICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcblxuICAgICAgICB0aGlzLnRoZVN0cmVhbUhhbmRsZXIuZmx1c2goKTtcbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pLmZpbmFsbHkoKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB7XG4gICAgLy8gVGhpcyBmb3ItbG9vcCB3aWxsIGJyZWFrIHdoZW4gc29tZW9uZSBjYWxsIGVuZCgpIGFuZCBpdCB3aWxsIHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkVuZGVkLlxuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzaWduYWwgYW5kIHdhaXQgZm9yIHNvbWVvbmUga2lja2luZyBvZmYgdGhlIGNvbm5lY3Rpb246XG4gICAgICAvLyAtIHN1YnNjcmliZSB0byBhY3Rpdml0eSQsIG9yO1xuICAgICAgLy8gLSByZXRyaWVzIGV4aGF1c3RlZCAoRmFpbGVkVG9Db25uZWN0KSwgdGhlbiwgc29tZW9uZSBjYWxsIHJlY29ubmVjdCgpXG4gICAgICBhd2FpdCAodGhpcy5jb25uZWN0RGVmZXJyZWQgPSBjcmVhdGVEZWZlcnJlZCgpKS5wcm9taXNlO1xuXG4gICAgICBsZXQgbnVtUmV0cmllcyA9IE1BWF9SRVRSWV9DT1VOVDtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgICAgIHdoaWxlIChudW1SZXRyaWVzID4gMCkge1xuICAgICAgICBudW1SZXRyaWVzLS07XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBwcm9taXNlIHdpbGwgcmVqZWN0L3Jlc29sdmUgd2hlbiBkaXNjb25uZWN0ZWQuXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QXN5bmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgc29tZW9uZSBjYWxsIGVuZCgpIHRvIGJyZWFrIHRoZSBjb25uZWN0aW9uLCB3ZSB3aWxsIG5ldmVyIGxpc3RlbiB0byBhbnkgcmVjb25uZWN0KCkuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoZSBsb29wIGluIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBicm9rZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2lnbmFsIENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyB0d2ljZSBvciBtb3JlIHdpdGhvdXQgYW4gYWN0dWFsIGNvbm5lY3Rpb24uXG4gICAgICAgIC8vIFN1YnNlcXVlbnQgcmV0cmllcyBzaG91bGQgYmUgdHJhbnNwYXJlbnQuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgIT09IENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZykge1xuICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBsYXN0ZWQgZm9yIG1vcmUgdGhhbiBhIG1pbnV0ZSwgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gaXMgZ29vZCwgd2hpY2ggbWVhbnM6XG4gICAgICAgIC8vIC0gd2Ugc2hvdWxkIHJlc2V0IHRoZSByZXRyeSBjb3VudGVyLCBhbmQ7XG4gICAgICAgIC8vIC0gd2Ugc2hvdWxkIHJlY29ubmVjdCBpbW1lZGlhdGVseS5cbiAgICAgICAgaWYgKDYwMDAwIDwgRGF0ZS5ub3coKSAtIHN0YXJ0KSB7XG4gICAgICAgICAgbnVtUmV0cmllcyA9IE1BWF9SRVRSWV9DT1VOVDtcbiAgICAgICAgfSBlbHNlIGlmIChudW1SZXRyaWVzID4gMCkge1xuICAgICAgICAgIC8vIFNsZWVwIG9ubHkgaWYgd2UgYXJlIGRvaW5nIHJldHJ5LiBPdGhlcndpc2UsIHdlIGFyZSBnb2luZyB0byBicmVhayB0aGUgbG9vcCBhbmQgc2lnbmFsIEZhaWxlZFRvQ29ubmVjdC5cbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgdGhpcy5nZXRSZXRyeURlbGF5KCkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBbVEVTVF0gTWFrZSBzdXJlIEZhaWxlZFRvQ29ubmVjdCBpcyByZXBvcnRlZCBpbW1lZGlhdGVseSBhZnRlciBsYXN0IGRpc2Nvbm5lY3Rpb24sIHNob3VsZCBiZSBubyBnZXRSZXRyeURlbGF5KCkuXG4gICAgICAvLyBGYWlsZWQgdG8gcmVjb25uZWN0IGFmdGVyIG11bHRpcGxlIHJldHJpZXMuXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5GYWlsZWRUb0Nvbm5lY3QpO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IE5vIGNvZGUgd2lsbCBoaXQgdGhpcyBsaW5lLlxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgZGVsYXkgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gIHByaXZhdGUgZ2V0UmV0cnlEZWxheSgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigzMDAwICsgTWF0aC5yYW5kb20oKSAqIDEyMDAwKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFBQSxnQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsSUFBQSxHQUFBQyx1QkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssZUFBQSxHQUFBQyxzQkFBQSxDQUFBTixPQUFBO0FBQ0EsSUFBQU8sV0FBQSxHQUFBRCxzQkFBQSxDQUFBTixPQUFB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
|