@cloudbase/realtime 1.2.3-alpha.0 → 1.8.2

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.
@@ -24,7 +24,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
24
24
  function verb(n) { return function (v) { return step([n, v]); }; }
25
25
  function step(op) {
26
26
  if (f) throw new TypeError("Generator is already executing.");
27
- while (_) try {
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
28
  if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
29
  if (y = 0, t) op = [op[0] & 2, t.value];
30
30
  switch (op[0]) {
@@ -47,7 +47,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
47
47
  };
48
48
  import { VirtualWebSocketClient } from './virtual-websocket-client';
49
49
  import { genRequestId } from './message';
50
- import { CLOSE_EVENT_CODE, CLOSE_EVENT_CODE_INFO, getWSCloseError } from './ws-event';
50
+ import { CLOSE_EVENT_CODE, CLOSE_EVENT_CODE_INFO, getWSCloseError, } from './ws-event';
51
51
  import { ERR_CODE, TimeoutError, RealtimeErrorMessageError, CloudSDKError } from './error';
52
52
  import { getWsClass, getRuntime } from './common';
53
53
  import { sleep } from './utils';
@@ -55,7 +55,7 @@ var WS_READY_STATE = {
55
55
  CONNECTING: 0,
56
56
  OPEN: 1,
57
57
  CLOSING: 2,
58
- CLOSED: 3
58
+ CLOSED: 3,
59
59
  };
60
60
  var MAX_RTT_OBSERVED = 3;
61
61
  var DEFAULT_EXPECTED_EVENT_WAIT_TIME = 5000;
@@ -130,14 +130,14 @@ var RealtimeWebSocketClient = (function () {
130
130
  return [2];
131
131
  }
132
132
  if (this._ws.readyState !== WS_READY_STATE.OPEN) {
133
- reject(new Error("ws readyState invalid: " + this._ws.readyState + ", can not send message"));
133
+ reject(new Error("ws readyState invalid: ".concat(this._ws.readyState, ", can not send message")));
134
134
  return [2];
135
135
  }
136
136
  if (opts.waitResponse) {
137
137
  this._wsResponseWait.set(opts.msg.requestId, {
138
138
  resolve: resolve,
139
139
  reject: reject,
140
- skipOnMessage: opts.skipOnMessage
140
+ skipOnMessage: opts.skipOnMessage,
141
141
  });
142
142
  }
143
143
  _a.label = 4;
@@ -147,7 +147,7 @@ var RealtimeWebSocketClient = (function () {
147
147
  case 5:
148
148
  _a.sent();
149
149
  if (!opts.waitResponse) {
150
- resolve();
150
+ resolve(undefined);
151
151
  }
152
152
  return [3, 7];
153
153
  case 6:
@@ -176,13 +176,11 @@ var RealtimeWebSocketClient = (function () {
176
176
  });
177
177
  };
178
178
  this.pauseClients = function (clients) {
179
- ;
180
179
  (clients || _this._virtualWSClient).forEach(function (client) {
181
180
  client.pause();
182
181
  });
183
182
  };
184
183
  this.resumeClients = function (clients) {
185
- ;
186
184
  (clients || _this._virtualWSClient).forEach(function (client) {
187
185
  client.resume();
188
186
  });
@@ -222,7 +220,7 @@ var RealtimeWebSocketClient = (function () {
222
220
  var url = wsSign_1.wsUrl || 'wss://tcb-ws.tencentcloudapi.com';
223
221
  var wsClass = getWsClass();
224
222
  _this._ws = wsClass ? new wsClass(url) : new WebSocket(url);
225
- success();
223
+ success(undefined);
226
224
  })];
227
225
  case 2:
228
226
  _a.sent();
@@ -262,7 +260,7 @@ var RealtimeWebSocketClient = (function () {
262
260
  if (reconnect) {
263
261
  this.closeAllClients(new CloudSDKError({
264
262
  errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECONNECT_WATCH_FAIL,
265
- errMsg: e_3
263
+ errMsg: e_3,
266
264
  }));
267
265
  }
268
266
  _a.label = 10;
@@ -298,158 +296,152 @@ var RealtimeWebSocketClient = (function () {
298
296
  });
299
297
  });
300
298
  };
301
- this.initWebSocketEvent = function () {
302
- return new Promise(function (resolve, reject) {
303
- if (!_this._ws) {
304
- throw new Error('can not initWebSocketEvent, ws not exists');
299
+ this.initWebSocketEvent = function () { return new Promise(function (resolve, reject) {
300
+ if (!_this._ws) {
301
+ throw new Error('can not initWebSocketEvent, ws not exists');
302
+ }
303
+ var wsOpened = false;
304
+ _this._ws.onopen = function (event) {
305
+ console.warn('[realtime] ws event: open', event);
306
+ wsOpened = true;
307
+ resolve();
308
+ };
309
+ _this._ws.onerror = function (event) {
310
+ _this._logins = new Map();
311
+ if (!wsOpened) {
312
+ console.error('[realtime] ws open failed with ws event: error', event);
313
+ reject(event);
314
+ }
315
+ else {
316
+ console.error('[realtime] ws event: error', event);
317
+ _this.clearHeartbeat();
318
+ _this._virtualWSClient.forEach(function (client) { return client.closeWithError(new CloudSDKError({
319
+ errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
320
+ errMsg: event,
321
+ })); });
305
322
  }
306
- var wsOpened = false;
307
- _this._ws.onopen = function (event) {
308
- console.warn('[realtime] ws event: open', event);
309
- wsOpened = true;
310
- resolve();
311
- };
312
- _this._ws.onerror = function (event) {
313
- _this._logins = new Map();
314
- if (!wsOpened) {
315
- console.error('[realtime] ws open failed with ws event: error', event);
316
- reject(event);
323
+ };
324
+ _this._ws.onclose = function (closeEvent) {
325
+ console.warn('[realtime] ws event: close', closeEvent);
326
+ _this._logins = new Map();
327
+ _this.clearHeartbeat();
328
+ switch (closeEvent.code) {
329
+ case CLOSE_EVENT_CODE.ReconnectWebSocket: {
330
+ break;
317
331
  }
318
- else {
319
- console.error('[realtime] ws event: error', event);
320
- _this.clearHeartbeat();
321
- _this._virtualWSClient.forEach(function (client) {
322
- return client.closeWithError(new CloudSDKError({
323
- errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
324
- errMsg: event
325
- }));
326
- });
332
+ case CLOSE_EVENT_CODE.NoRealtimeListeners: {
333
+ break;
327
334
  }
328
- };
329
- _this._ws.onclose = function (closeEvent) {
330
- console.warn('[realtime] ws event: close', closeEvent);
331
- _this._logins = new Map();
332
- _this.clearHeartbeat();
333
- switch (closeEvent.code) {
334
- case CLOSE_EVENT_CODE.ReconnectWebSocket: {
335
- break;
335
+ case CLOSE_EVENT_CODE.HeartbeatPingError:
336
+ case CLOSE_EVENT_CODE.HeartbeatPongTimeoutError:
337
+ case CLOSE_EVENT_CODE.NormalClosure:
338
+ case CLOSE_EVENT_CODE.AbnormalClosure: {
339
+ if (_this._maxReconnect > 0) {
340
+ _this.initWebSocketConnection(true, _this._maxReconnect);
336
341
  }
337
- case CLOSE_EVENT_CODE.NoRealtimeListeners: {
338
- break;
342
+ else {
343
+ _this.closeAllClients(getWSCloseError(closeEvent.code));
339
344
  }
340
- case CLOSE_EVENT_CODE.HeartbeatPingError:
341
- case CLOSE_EVENT_CODE.HeartbeatPongTimeoutError:
342
- case CLOSE_EVENT_CODE.NormalClosure:
343
- case CLOSE_EVENT_CODE.AbnormalClosure: {
344
- if (_this._maxReconnect > 0) {
345
- _this.initWebSocketConnection(true, _this._maxReconnect);
346
- }
347
- else {
348
- _this.closeAllClients(getWSCloseError(closeEvent.code));
349
- }
350
- break;
345
+ break;
346
+ }
347
+ case CLOSE_EVENT_CODE.NoAuthentication: {
348
+ _this.closeAllClients(getWSCloseError(closeEvent.code, closeEvent.reason));
349
+ break;
350
+ }
351
+ default: {
352
+ if (_this._maxReconnect > 0) {
353
+ _this.initWebSocketConnection(true, _this._maxReconnect);
351
354
  }
352
- case CLOSE_EVENT_CODE.NoAuthentication: {
353
- _this.closeAllClients(getWSCloseError(closeEvent.code, closeEvent.reason));
354
- break;
355
+ else {
356
+ _this.closeAllClients(getWSCloseError(closeEvent.code));
355
357
  }
356
- default: {
357
- if (_this._maxReconnect > 0) {
358
- _this.initWebSocketConnection(true, _this._maxReconnect);
359
- }
360
- else {
361
- _this.closeAllClients(getWSCloseError(closeEvent.code));
362
- }
358
+ }
359
+ }
360
+ };
361
+ _this._ws.onmessage = function (res) {
362
+ var rawMsg = res.data;
363
+ _this.heartbeat();
364
+ var msg;
365
+ try {
366
+ msg = JSON.parse(rawMsg);
367
+ }
368
+ catch (e) {
369
+ throw new Error("[realtime] onMessage parse res.data error: ".concat(e));
370
+ }
371
+ if (msg.msgType === 'ERROR') {
372
+ var virtualWatch_1 = null;
373
+ _this._virtualWSClient.forEach(function (item) {
374
+ if (item.watchId === msg.watchId) {
375
+ virtualWatch_1 = item;
363
376
  }
377
+ });
378
+ if (virtualWatch_1) {
379
+ virtualWatch_1.listener.onError(msg);
364
380
  }
365
- };
366
- _this._ws.onmessage = function (res) {
367
- var rawMsg = res.data;
368
- _this.heartbeat();
369
- var msg;
381
+ }
382
+ var responseWaitSpec = _this._wsResponseWait.get(msg.requestId);
383
+ if (responseWaitSpec) {
370
384
  try {
371
- msg = JSON.parse(rawMsg);
385
+ if (msg.msgType === 'ERROR') {
386
+ responseWaitSpec.reject(new RealtimeErrorMessageError(msg));
387
+ }
388
+ else {
389
+ responseWaitSpec.resolve(msg);
390
+ }
372
391
  }
373
392
  catch (e) {
374
- throw new Error("[realtime] onMessage parse res.data error: " + e);
393
+ console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
375
394
  }
376
- if (msg.msgType === 'ERROR') {
377
- var virtualWatch_1 = null;
378
- _this._virtualWSClient.forEach(function (item) {
379
- if (item.watchId === msg.watchId) {
380
- virtualWatch_1 = item;
381
- }
382
- });
383
- if (virtualWatch_1) {
384
- virtualWatch_1.listener.onError(msg);
385
- }
395
+ finally {
396
+ _this._wsResponseWait.delete(msg.requestId);
386
397
  }
387
- var responseWaitSpec = _this._wsResponseWait.get(msg.requestId);
388
- if (responseWaitSpec) {
389
- try {
390
- if (msg.msgType === 'ERROR') {
391
- responseWaitSpec.reject(new RealtimeErrorMessageError(msg));
392
- }
393
- else {
394
- responseWaitSpec.resolve(msg);
395
- }
396
- }
397
- catch (e) {
398
- console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
399
- }
400
- finally {
401
- _this._wsResponseWait.delete(msg.requestId);
402
- }
403
- if (responseWaitSpec.skipOnMessage) {
398
+ if (responseWaitSpec.skipOnMessage) {
399
+ return;
400
+ }
401
+ }
402
+ if (msg.msgType === 'PONG') {
403
+ if (_this._lastPingSendTS) {
404
+ var rtt = Date.now() - _this._lastPingSendTS;
405
+ if (rtt > DEFAULT_UNTRUSTED_RTT_THRESHOLD) {
406
+ console.warn("[realtime] untrusted rtt observed: ".concat(rtt));
404
407
  return;
405
408
  }
409
+ if (_this._rttObserved.length >= MAX_RTT_OBSERVED) {
410
+ _this._rttObserved.splice(0, _this._rttObserved.length - MAX_RTT_OBSERVED + 1);
411
+ }
412
+ _this._rttObserved.push(rtt);
406
413
  }
407
- if (msg.msgType === 'PONG') {
408
- if (_this._lastPingSendTS) {
409
- var rtt = Date.now() - _this._lastPingSendTS;
410
- if (rtt > DEFAULT_UNTRUSTED_RTT_THRESHOLD) {
411
- console.warn("[realtime] untrusted rtt observed: " + rtt);
412
- return;
413
- }
414
- if (_this._rttObserved.length >= MAX_RTT_OBSERVED) {
415
- _this._rttObserved.splice(0, _this._rttObserved.length - MAX_RTT_OBSERVED + 1);
414
+ return;
415
+ }
416
+ var client = msg.watchId && _this._watchIdClientMap.get(msg.watchId);
417
+ if (client) {
418
+ client.onMessage(msg);
419
+ }
420
+ else {
421
+ console.error("[realtime] no realtime listener found responsible for watchId ".concat(msg.watchId, ": "), msg);
422
+ switch (msg.msgType) {
423
+ case 'INIT_EVENT':
424
+ case 'NEXT_EVENT':
425
+ case 'CHECK_EVENT': {
426
+ client = _this._queryIdClientMap.get(msg.msgData.queryID);
427
+ if (client) {
428
+ client.onMessage(msg);
416
429
  }
417
- _this._rttObserved.push(rtt);
430
+ break;
418
431
  }
419
- return;
420
- }
421
- var client = msg.watchId && _this._watchIdClientMap.get(msg.watchId);
422
- if (client) {
423
- client.onMessage(msg);
424
- }
425
- else {
426
- console.error("[realtime] no realtime listener found responsible for watchId " + msg.watchId + ": ", msg);
427
- switch (msg.msgType) {
428
- case 'INIT_EVENT':
429
- case 'NEXT_EVENT':
430
- case 'CHECK_EVENT': {
431
- client = _this._queryIdClientMap.get(msg.msgData.queryID);
432
- if (client) {
433
- client.onMessage(msg);
434
- }
432
+ default: {
433
+ for (var _i = 0, _a = Array.from(_this._watchIdClientMap.entries()); _i < _a.length; _i++) {
434
+ var _b = _a[_i], client_1 = _b[1];
435
+ client_1.onMessage(msg);
435
436
  break;
436
437
  }
437
- default: {
438
- for (var _i = 0, _a = Array.from(_this._watchIdClientMap.entries()); _i < _a.length; _i++) {
439
- var _b = _a[_i], client_1 = _b[1];
440
- client_1.onMessage(msg);
441
- break;
442
- }
443
- }
444
438
  }
445
439
  }
446
- };
447
- _this.heartbeat();
448
- });
449
- };
450
- this.isWSConnected = function () {
451
- return Boolean(_this._ws && _this._ws.readyState === WS_READY_STATE.OPEN);
452
- };
440
+ }
441
+ };
442
+ _this.heartbeat();
443
+ }); };
444
+ this.isWSConnected = function () { return Boolean(_this._ws && _this._ws.readyState === WS_READY_STATE.OPEN); };
453
445
  this.onceWSConnected = function () { return __awaiter(_this, void 0, void 0, function () {
454
446
  var _this = this;
455
447
  return __generator(this, function (_a) {
@@ -462,7 +454,7 @@ var RealtimeWebSocketClient = (function () {
462
454
  return [2, new Promise(function (resolve, reject) {
463
455
  _this._wsReadySubsribers.push({
464
456
  resolve: resolve,
465
- reject: reject
457
+ reject: reject,
466
458
  });
467
459
  })];
468
460
  });
@@ -480,7 +472,7 @@ var RealtimeWebSocketClient = (function () {
480
472
  if (loginInfo_1.loggedIn && loginInfo_1.loginResult) {
481
473
  return [2, loginInfo_1.loginResult];
482
474
  }
483
- else if (loginInfo_1.loggingInPromise) {
475
+ if (loginInfo_1.loggingInPromise) {
484
476
  return [2, loginInfo_1.loggingInPromise];
485
477
  }
486
478
  }
@@ -506,7 +498,7 @@ var RealtimeWebSocketClient = (function () {
506
498
  accessToken: '',
507
499
  referrer: 'web',
508
500
  sdkVersion: '',
509
- dataVersion: ''
501
+ dataVersion: '',
510
502
  };
511
503
  loginMsg = {
512
504
  watchId: undefined,
@@ -516,24 +508,24 @@ var RealtimeWebSocketClient = (function () {
516
508
  exMsgData: {
517
509
  runtime: getRuntime(),
518
510
  signStr: wsSign.signStr,
519
- secretVersion: wsSign.secretVersion
520
- }
511
+ secretVersion: wsSign.secretVersion,
512
+ },
521
513
  };
522
514
  return [4, this.send({
523
515
  msg: loginMsg,
524
516
  waitResponse: true,
525
517
  skipOnMessage: true,
526
- timeout: DEFAULT_LOGIN_TIMEOUT
518
+ timeout: DEFAULT_LOGIN_TIMEOUT,
527
519
  })];
528
520
  case 2:
529
521
  loginResMsg = _a.sent();
530
522
  if (!loginResMsg.msgData.code) {
531
523
  resolve({
532
- envId: wsSign.envId
524
+ envId: wsSign.envId,
533
525
  });
534
526
  }
535
527
  else {
536
- reject(new Error(loginResMsg.msgData.code + " " + loginResMsg.msgData.message));
528
+ reject(new Error("".concat(loginResMsg.msgData.code, " ").concat(loginResMsg.msgData.message)));
537
529
  }
538
530
  return [3, 4];
539
531
  case 3:
@@ -555,7 +547,7 @@ var RealtimeWebSocketClient = (function () {
555
547
  loginInfo = {
556
548
  loggedIn: false,
557
549
  loggingInPromise: promise,
558
- loginStartTS: loginStartTS
550
+ loginStartTS: loginStartTS,
559
551
  };
560
552
  this._logins.set(envId || '', loginInfo);
561
553
  }
@@ -566,25 +558,23 @@ var RealtimeWebSocketClient = (function () {
566
558
  case 2:
567
559
  loginResult = _a.sent();
568
560
  curLoginInfo = envId && this._logins.get(envId);
569
- if (curLoginInfo &&
570
- curLoginInfo === loginInfo &&
571
- curLoginInfo.loginStartTS === loginStartTS) {
561
+ if (curLoginInfo
562
+ && curLoginInfo === loginInfo
563
+ && curLoginInfo.loginStartTS === loginStartTS) {
572
564
  loginInfo.loggedIn = true;
573
565
  loginInfo.loggingInPromise = undefined;
574
566
  loginInfo.loginStartTS = undefined;
575
567
  loginInfo.loginResult = loginResult;
576
568
  return [2, loginResult];
577
569
  }
578
- else if (curLoginInfo) {
570
+ if (curLoginInfo) {
579
571
  if (curLoginInfo.loggedIn && curLoginInfo.loginResult) {
580
572
  return [2, curLoginInfo.loginResult];
581
573
  }
582
- else if (curLoginInfo.loggingInPromise) {
574
+ if (curLoginInfo.loggingInPromise) {
583
575
  return [2, curLoginInfo.loggingInPromise];
584
576
  }
585
- else {
586
- throw new Error('ws unexpected login info');
587
- }
577
+ throw new Error('ws unexpected login info');
588
578
  }
589
579
  else {
590
580
  throw new Error('ws login info reset');
@@ -614,7 +604,7 @@ var RealtimeWebSocketClient = (function () {
614
604
  case 1:
615
605
  res = _b.sent();
616
606
  if (res.code) {
617
- throw new Error("[tcb-js-sdk] \u83B7\u53D6\u5B9E\u65F6\u6570\u636E\u63A8\u9001\u767B\u5F55\u7968\u636E\u5931\u8D25: " + res.code);
607
+ throw new Error("[tcb-js-sdk] \u83B7\u53D6\u5B9E\u65F6\u6570\u636E\u63A8\u9001\u767B\u5F55\u7968\u636E\u5931\u8D25: ".concat(res.code));
618
608
  }
619
609
  if (res.data) {
620
610
  _a = res.data, signStr = _a.signStr, wsUrl = _a.wsUrl, secretVersion = _a.secretVersion, envId = _a.envId;
@@ -623,13 +613,10 @@ var RealtimeWebSocketClient = (function () {
623
613
  wsUrl: wsUrl,
624
614
  secretVersion: secretVersion,
625
615
  envId: envId,
626
- expiredTs: expiredTs
616
+ expiredTs: expiredTs,
627
617
  }];
628
618
  }
629
- else {
630
- throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
631
- }
632
- return [2];
619
+ throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
633
620
  }
634
621
  });
635
622
  }); };
@@ -637,9 +624,9 @@ var RealtimeWebSocketClient = (function () {
637
624
  if (!_this._rttObserved.length) {
638
625
  return DEFAULT_EXPECTED_EVENT_WAIT_TIME;
639
626
  }
640
- return ((_this._rttObserved.reduce(function (acc, cur) { return acc + cur; }) /
641
- _this._rttObserved.length) *
642
- 1.5);
627
+ return ((_this._rttObserved.reduce(function (acc, cur) { return acc + cur; })
628
+ / _this._rttObserved.length)
629
+ * 1.5);
643
630
  };
644
631
  this.ping = function () { return __awaiter(_this, void 0, void 0, function () {
645
632
  var msg;
@@ -650,10 +637,10 @@ var RealtimeWebSocketClient = (function () {
650
637
  watchId: undefined,
651
638
  requestId: genRequestId(),
652
639
  msgType: 'PING',
653
- msgData: null
640
+ msgData: null,
654
641
  };
655
642
  return [4, this.send({
656
- msg: msg
643
+ msg: msg,
657
644
  })];
658
645
  case 1:
659
646
  _a.sent();
@@ -675,8 +662,7 @@ var RealtimeWebSocketClient = (function () {
675
662
  }
676
663
  };
677
664
  this._maxReconnect = options.maxReconnect || DEFAULT_MAX_RECONNECT;
678
- this._reconnectInterval =
679
- options.reconnectInterval || DEFAULT_WS_RECONNECT_INTERVAL;
665
+ this._reconnectInterval = options.reconnectInterval || DEFAULT_WS_RECONNECT_INTERVAL;
680
666
  this._context = options.context;
681
667
  }
682
668
  RealtimeWebSocketClient.prototype.clearHeartbeat = function () {
@@ -746,4 +732,4 @@ var RealtimeWebSocketClient = (function () {
746
732
  return RealtimeWebSocketClient;
747
733
  }());
748
734
  export { RealtimeWebSocketClient };
749
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQWN4QyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2hCLE1BQU0sWUFBWSxDQUFBO0FBRW5CLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixFQUFDLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN6RixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBNEQvQixJQUFNLGNBQWMsR0FBRztJQUNyQixVQUFVLEVBQUUsQ0FBQztJQUNiLElBQUksRUFBRSxDQUFDO0lBQ1AsT0FBTyxFQUFFLENBQUM7SUFDVixNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUE7QUFFRCxJQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtBQUMxQixJQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQTtBQUM3QyxJQUFNLCtCQUErQixHQUFHLEtBQUssQ0FBQTtBQUM3QyxJQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQTtBQUMvQixJQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQTtBQUUzQyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUVsQztJQStCRSxpQ0FBWSxPQUFtRDtRQUEvRCxpQkFN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QUFFLENBQUE7d0JBQ2pDLFdBQU0sSUFBSSxDQUFDLElBQUksRUFBRSxFQUFBOzt3QkFBakIsU0FBaUIsQ0FBQTt3QkFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUE7d0JBR3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDOzRCQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7NEJBQy9CLElBQUksS0FBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsRUFBRTtnQ0FDbEQsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO2dDQUNsQixLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBOzZCQUNyQjtpQ0FBTTtnQ0FFTCxLQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUE7NkJBQ25DO3dCQUNILENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBOzs7O3dCQUVuRCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsMkJBQTJCLEVBQUU7NEJBQ2xELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTs0QkFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO3lCQUNqQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUE7eUJBQ2hEOzs7OzthQUVKLEVBQ0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUM3RCxDQUFBO0lBQ0gsQ0FBQztJQStCSCw4QkFBQztBQUFELENBQUMsQUEzM0JELElBMjNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQgfSBmcm9tICcuL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudCdcbmltcG9ydCB7IGdlblJlcXVlc3RJZCB9IGZyb20gJy4vbWVzc2FnZSdcbmltcG9ydCB7XG4gIElEYXRhYmFzZVNlcnZpY2VDb250ZXh0LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2RhdGFiYXNlJ1xuaW1wb3J0IHtcbiAgSVdhdGNoT3B0aW9ucyxcbiAgREJSZWFsdGltZUxpc3RlbmVyLFxuICBJUmVxdWVzdE1lc3NhZ2UsXG4gIElSZXNwb25zZU1lc3NhZ2UsXG4gIElSZXF1ZXN0TWVzc2FnZVBpbmdNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YVxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlYWx0aW1lJ1xuaW1wb3J0IHtcbiAgQ0xPU0VfRVZFTlRfQ09ERSxcbiAgQ0xPU0VfRVZFTlRfQ09ERV9JTkZPLFxuICBnZXRXU0Nsb3NlRXJyb3Jcbn0gZnJvbSAnLi93cy1ldmVudCdcblxuaW1wb3J0IHsgRVJSX0NPREUsIFRpbWVvdXRFcnJvciwgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcixDbG91ZFNES0Vycm9yIH0gZnJvbSAnLi9lcnJvcidcbmltcG9ydCB7IGdldFdzQ2xhc3MsIGdldFJ1bnRpbWUgfSBmcm9tICcuL2NvbW1vbidcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGludGVyZmFjZSBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBtYXhSZWNvbm5lY3Q/OiBudW1iZXJcbiAgcmVjb25uZWN0SW50ZXJ2YWw/OiBudW1iZXJcbiAgY29udGV4dDogSURhdGFiYXNlU2VydmljZUNvbnRleHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2lnbmF0dXJlIHtcbiAgZW52SWQ6IHN0cmluZ1xuICBzZWNyZXRWZXJzaW9uOiBudW1iZXJcbiAgc2lnblN0cjogc3RyaW5nXG4gIHdzVXJsOiBzdHJpbmdcbiAgZXhwaXJlVFM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMb2dpbkluZm8ge1xuICBsb2dnZWRJbjogYm9vbGVhblxuICBsb2dnaW5nSW5Qcm9taXNlPzogUHJvbWlzZTxJTG9naW5SZXN1bHQ+XG4gIGxvZ2luU3RhcnRUUz86IG51bWJlclxuICBsb2dpblJlc3VsdD86IElMb2dpblJlc3VsdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMb2dpblJlc3VsdCB7XG4gIGVudklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV1NTZW5kT3B0aW9ucyB7XG4gIG1zZzogSVJlcXVlc3RNZXNzYWdlXG4gIHdhaXRSZXNwb25zZT86IGJvb2xlYW5cbiAgLy8gd2hlbiB3YWl0UmVzcG9uc2UgaXMgc2V0IHRvIHRydWUsIGlmIHNraXBPbk1lc3NhZ2UgaXMgdHJ1ZSwgZ2VuZXJhbCBvbk1lc3NhZ2UgaGFuZGxlciB3aWxsIGJlIHNraXBwZWRcbiAgc2tpcE9uTWVzc2FnZT86IGJvb2xlYW5cbiAgdGltZW91dD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXU1dhdGNoT3B0aW9ucyBleHRlbmRzIElXYXRjaE9wdGlvbnMge1xuICBlbnZJZD86IHN0cmluZ1xuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4gIHF1ZXJ5OiBzdHJpbmdcbiAgbGltaXQ/OiBudW1iZXJcbiAgb3JkZXJCeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuaW50ZXJmYWNlIElSZXNvbHZlUmVqZWN0IHtcbiAgcmVzb2x2ZTogKHZhbHVlPzogYW55IHwgUHJvbWlzZUxpa2U8YW55PiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIElSZXNwb25zZVdhaXRTcGVjIGV4dGVuZHMgSVJlc29sdmVSZWplY3Qge1xuICBza2lwT25NZXNzYWdlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSVdzU2lnbiB7XG4gIHNpZ25TdHI6IHN0cmluZyxcbiAgd3NVcmw6IHN0cmluZyxcbiAgc2VjcmV0VmVyc2lvbjogc3RyaW5nXG4gIGVudklkOiBzdHJpbmdcbiAgZXhwaXJlZFRzOiBudW1iZXJcbn1cblxuY29uc3QgV1NfUkVBRFlfU1RBVEUgPSB7XG4gIENPTk5FQ1RJTkc6IDAsXG4gIE9QRU46IDEsXG4gIENMT1NJTkc6IDIsXG4gIENMT1NFRDogM1xufVxuXG5jb25zdCBNQVhfUlRUX09CU0VSVkVEID0gM1xuY29uc3QgREVGQVVMVF9FWFBFQ1RFRF9FVkVOVF9XQUlUX1RJTUUgPSA1MDAwXG5jb25zdCBERUZBVUxUX1VOVFJVU1RFRF9SVFRfVEhSRVNIT0xEID0gMTAwMDBcbmNvbnN0IERFRkFVTFRfTUFYX1JFQ09OTkVDVCA9IDVcbmNvbnN0IERFRkFVTFRfV1NfUkVDT05ORUNUX0lOVEVSVkFMID0gMTAwMDBcbi8vIGNvbnN0IERFRkFVTFRfV1NfUkVDT05ORUNUX01BWF9WQUxJRF9JTlRFUlZBTCA9IDMgKiA2MCAqIDEwMDBcbmNvbnN0IERFRkFVTFRfUElOR19GQUlMX1RPTEVSQU5DRSA9IDJcbmNvbnN0IERFRkFVTFRfUE9OR19NSVNTX1RPTEVSQU5DRSA9IDJcbmNvbnN0IERFRkFVTFRfTE9HSU5fVElNRU9VVCA9IDUwMDBcblxuZXhwb3J0IGNsYXNzIFJlYWx0aW1lV2ViU29ja2V0Q2xpZW50IHtcbiAgcHJpdmF0ZSBfdmlydHVhbFdTQ2xpZW50OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4gPSBuZXcgU2V0KClcbiAgLy8gYWZ0ZXIgbGlzdGVuZXIgaW5pdFdhdGNoLCB0aGUgbGlzdGVuZXIgaGFzIHRoZSBxdWVyeUlEIGFuZCBjYW4gc3RvcmUgaXQgaGVyZVxuICBwcml2YXRlIF9xdWVyeUlkQ2xpZW50TWFwOiBNYXA8c3RyaW5nLCBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIF93YXRjaElkQ2xpZW50TWFwOiBNYXA8c3RyaW5nLCBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIF9tYXhSZWNvbm5lY3Q6IG51bWJlclxuICAvLyBwcml2YXRlIF9hdmFpbGFibGVSZXRyaWVzOiBudW1iZXJcbiAgcHJpdmF0ZSBfcmVjb25uZWN0SW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIF9jb250ZXh0OiBJRGF0YWJhc2VTZXJ2aWNlQ29udGV4dFxuICAvLyBwcml2YXRlIF93cz86IFdYTlMuU29ja2V0LklTb2NrZXRUYXNrXG4gIHByaXZhdGUgX3dzPzogYW55XG4gIHByaXZhdGUgX2xhc3RQaW5nU2VuZFRTPzogbnVtYmVyXG4gIHByaXZhdGUgX3BpbmdGYWlsZWQgPSAwXG4gIHByaXZhdGUgX3BvbmdNaXNzZWQgPSAwXG4gIHByaXZhdGUgX3BpbmdUaW1lb3V0SWQ/OiBudW1iZXJcbiAgcHJpdmF0ZSBfcG9uZ1RpbWVvdXRJZD86IG51bWJlclxuICBwcml2YXRlIF9sb2dpbnM6IE1hcDxzdHJpbmcgLyogZW52SWQgKi8sIElMb2dpbkluZm8+ID0gbmV3IE1hcCgpXG4gIC8vIHByaXZhdGUgX2xvZ2luSW5mbzogSUxvZ2luSW5mb1xuICAvLyBwcml2YXRlIF9zaWduYXR1cmVzOiBNYXA8c3RyaW5nIC8qIGVudklkICovLCBJU2lnbmF0dXJlPiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIF93c0luaXRQcm9taXNlPzogUHJvbWlzZTx2b2lkPlxuICBwcml2YXRlIF93c1JlYWR5U3Vic3JpYmVyczogSVJlc29sdmVSZWplY3RbXSA9IFtdXG4gIHByaXZhdGUgX3dzUmVzcG9uc2VXYWl0OiBNYXA8XG4gICAgc3RyaW5nIC8qIHJlcXVlc3RJZCAqLyxcbiAgICBJUmVzcG9uc2VXYWl0U3BlY1xuICA+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX3J0dE9ic2VydmVkOiBudW1iZXJbXSA9IFtdXG4gIHByaXZhdGUgX3JlY29ubmVjdFN0YXRlOiBib29sZWFuXG4gIC8vIG9idGFpbmVkIGZyb20gdGhlIGZpcnN0IGdldFNpZ25hdHVyZSB3aXRoIG5vIGVudklkIHByb3ZpZGVkXG4gIC8vIHByaXZhdGUgX2RlZmF1bHRFbnZJZD86IHN0cmluZ1xuICBwcml2YXRlIF93c1NpZ246IElXc1NpZ25cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLl9tYXhSZWNvbm5lY3QgPSBvcHRpb25zLm1heFJlY29ubmVjdCB8fCBERUZBVUxUX01BWF9SRUNPTk5FQ1RcbiAgICAvLyB0aGlzLl9hdmFpbGFibGVSZXRyaWVzID0gdGhpcy5fbWF4UmVjb25uZWN0XG4gICAgdGhpcy5fcmVjb25uZWN0SW50ZXJ2YWwgPVxuICAgICAgb3B0aW9ucy5yZWNvbm5lY3RJbnRlcnZhbCB8fCBERUZBVUxUX1dTX1JFQ09OTkVDVF9JTlRFUlZBTFxuICAgIHRoaXMuX2NvbnRleHQgPSBvcHRpb25zLmNvbnRleHRcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0KCkge1xuICAgIHRoaXMuX3BpbmdUaW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRoaXMuX3BpbmdUaW1lb3V0SWQpXG4gICAgdGhpcy5fcG9uZ1RpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fcG9uZ1RpbWVvdXRJZClcbiAgfVxuXG4gIHNlbmQgPSBhc3luYyA8VCA9IGFueT4ob3B0czogSVdTU2VuZE9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+XG4gICAgbmV3IFByb21pc2U8VD4oYXN5bmMgKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgdGltZW91dElkOiBudW1iZXJcbiAgICAgIGxldCBfaGFzUmVzb2x2ZWQgPSBmYWxzZVxuICAgICAgbGV0IF9oYXNSZWplY3RlZCA9IGZhbHNlXG5cbiAgICAgIGNvbnN0IHJlc29sdmU6IHR5cGVvZiBfcmVzb2x2ZSA9IChcbiAgICAgICAgdmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCB1bmRlZmluZWRcbiAgICAgICkgPT4ge1xuICAgICAgICBfaGFzUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIHRpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICBfcmVzb2x2ZSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVqZWN0OiB0eXBlb2YgX3JlamVjdCA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIF9oYXNSZWplY3RlZCA9IHRydWVcbiAgICAgICAgdGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIF9yZWplY3QoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIV9oYXNSZXNvbHZlZCB8fCAhX2hhc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAvLyB3YWl0IGFub3RoZXIgaW1tZWRpYXRlIHRpbWVvdXQgdG8gYWxsb3cgdGhlIHN1Y2Nlc3MvZmFpbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGlmIHdzIGhhcyBhbHJlYWR5IGdvdCB0aGUgcmVzdWx0LFxuICAgICAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlIHRoZSB0aW1lciBpcyByZWdpc3RlcmVkIGJlZm9yZSB3cy5zZW5kXG4gICAgICAgICAgICBhd2FpdCBzbGVlcCgwKVxuICAgICAgICAgICAgaWYgKCFfaGFzUmVzb2x2ZWQgfHwgIV9oYXNSZWplY3RlZCkge1xuICAgICAgICAgICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcignd3NjbGllbnQuc2VuZCB0aW1lZG91dCcpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0cy50aW1lb3V0KVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiAodGhpcy5fY29udGV4dC5kZWJ1Zykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSB3cyBzZW5kICgke25ldyBEYXRlKCl9KTogYCwgb3B0cylcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtyZWFsdGltZV0gd3Mgc2VuZCAke1xuICAgICAgICAvLyAgICAgb3B0cy5tc2cubXNnVHlwZVxuICAgICAgICAvLyAgIH0gKCR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpfSk6IGAsXG4gICAgICAgIC8vICAgb3B0c1xuICAgICAgICAvLyApXG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAodGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdpbnZhbGlkIHN0YXRlOiB3cyBjb25uZWN0aW9uIG5vdCBleGlzdHMsIGNhbiBub3Qgc2VuZCBtZXNzYWdlJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl93cy5yZWFkeVN0YXRlICE9PSBXU19SRUFEWV9TVEFURS5PUEVOKSB7XG4gICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgd3MgcmVhZHlTdGF0ZSBpbnZhbGlkOiAke3RoaXMuX3dzLnJlYWR5U3RhdGV9LCBjYW4gbm90IHNlbmQgbWVzc2FnZWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5zZXQob3B0cy5tc2cucmVxdWVzdElkLCB7XG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogb3B0cy5za2lwT25NZXNzYWdlXG4gICAgICAgICAgfSBhcyBJUmVzcG9uc2VXYWl0U3BlYylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZW5kIG1zZzonLCBvcHRzLm1zZylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93cy5zZW5kKEpTT04uc3RyaW5naWZ5KG9wdHMubXNnKSlcbiAgICAgICAgICBpZiAoIW9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICBpZiAob3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5fd3NSZXNwb25zZVdhaXQuZGVsZXRlKG9wdHMubXNnLnJlcXVlc3RJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5fd3Muc2VuZChKU09OLnN0cmluZ2lmeShvcHRzLm1zZyksIGVyciA9PiB7XG4gICAgICAgIC8vICAgaWYgKGVycikge1xuICAgICAgICAvLyAgICAgcmVqZWN0KGVycilcbiAgICAgICAgLy8gICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgIC8vICAgfVxuXG4gICAgICAgIC8vICAgaWYgKCFvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgcmVzb2x2ZSgpXG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9KVxuXG4gICAgICAgIC8vIHRoaXMuX3dzLnNlbmQoe1xuICAgICAgICAvLyAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KG9wdHMubXNnKSxcbiAgICAgICAgLy8gICBzdWNjZXNzOiByZXMgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKCFvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgICByZXNvbHZlKHJlcylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGZhaWw6IGUgPT4ge1xuICAgICAgICAvLyAgICAgcmVqZWN0KGUpXG4gICAgICAgIC8vICAgICBpZiAob3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgLy8gICAgICAgdGhpcy5fd3NSZXNwb25zZVdhaXQuZGVsZXRlKG9wdHMubXNnLnJlcXVlc3RJZClcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH0pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgY2xvc2UoY29kZTogQ0xPU0VfRVZFTlRfQ09ERSkge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuXG4gICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICB0aGlzLl93cy5jbG9zZShjb2RlLCBDTE9TRV9FVkVOVF9DT0RFX0lORk9bY29kZV0ubmFtZSlcbiAgICAgIHRoaXMuX3dzID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgY2xvc2VBbGxDbGllbnRzID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgY2xpZW50LmNsb3NlV2l0aEVycm9yKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICBwYXVzZUNsaWVudHMgPSAoY2xpZW50cz86IFNldDxWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PikgPT4ge1xuICAgIDsoY2xpZW50cyB8fCB0aGlzLl92aXJ0dWFsV1NDbGllbnQpLmZvckVhY2goY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5wYXVzZSgpXG4gICAgfSlcbiAgfVxuXG4gIHJlc3VtZUNsaWVudHMgPSAoY2xpZW50cz86IFNldDxWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PikgPT4ge1xuICAgIDsoY2xpZW50cyB8fCB0aGlzLl92aXJ0dWFsV1NDbGllbnQpLmZvckVhY2goY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5yZXN1bWUoKVxuICAgIH0pXG4gIH1cblxuICB3YXRjaChvcHRpb25zOiBJV1NXYXRjaE9wdGlvbnMpOiBEQlJlYWx0aW1lTGlzdGVuZXIge1xuICAgIGlmICghdGhpcy5fd3MgJiYgIXRoaXMuX3dzSW5pdFByb21pc2UpIHtcbiAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24oZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdmlydHVhbENsaWVudCA9IG5ldyBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50KHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzZW5kOiB0aGlzLnNlbmQsXG4gICAgICBsb2dpbjogdGhpcy53ZWJMb2dpbixcbiAgICAgIGlzV1NDb25uZWN0ZWQ6IHRoaXMuaXNXU0Nvbm5lY3RlZCxcbiAgICAgIG9uY2VXU0Nvbm5lY3RlZDogdGhpcy5vbmNlV1NDb25uZWN0ZWQsXG4gICAgICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgsXG4gICAgICBvbldhdGNoU3RhcnQ6IHRoaXMub25XYXRjaFN0YXJ0LFxuICAgICAgb25XYXRjaENsb3NlOiB0aGlzLm9uV2F0Y2hDbG9zZSxcbiAgICAgIGRlYnVnOiB0cnVlXG4gICAgfSlcbiAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuYWRkKHZpcnR1YWxDbGllbnQpXG4gICAgdGhpcy5fd2F0Y2hJZENsaWVudE1hcC5zZXQodmlydHVhbENsaWVudC53YXRjaElkLCB2aXJ0dWFsQ2xpZW50KVxuICAgIHJldHVybiB2aXJ0dWFsQ2xpZW50Lmxpc3RlbmVyXG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHJlY29ubmVjdDogYm9vbGVhbixcbiAgICBhdmFpbGFibGVSZXRyaWVzOiBudW1iZXIgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8g5b2T5YmN5aSE5LqO5q2j5Zyo6YeN6L+e5Lit55qE54q25oCBXG4gICAgaWYgKHJlY29ubmVjdCAmJiB0aGlzLl9yZWNvbm5lY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuIC8vIOW/veeVpVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMuX3JlY29ubmVjdFN0YXRlID0gdHJ1ZSAvLyDph43ov57nirbmgIHlvIDlp4tcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgLy8gdGhlcmUgYWxyZWFkeSBleGlzdHMgYSB3ZWJzb2NrZXQgaW5pdGlhdGlvbiwganVzdCB3YWl0IGZvciBpdFxuICAgICAgcmV0dXJuIHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICB9XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGBbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHJlY29ubmVjdCAke3JlY29ubmVjdH0gYXZhaWxhYmxlUmV0cmllcyAke2F2YWlsYWJsZVJldHJpZXN9YFxuICAgIC8vIClcbiAgICAvLyB9XG5cbiAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICB0aGlzLnBhdXNlQ2xpZW50cygpXG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZShDTE9TRV9FVkVOVF9DT0RFLlJlY29ubmVjdFdlYlNvY2tldClcblxuICAgIHRoaXMuX3dzSW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gc3RhcnQgdGhyb3dFcnJvcklmTmV0d29ya09mZmxpbmUnXG4gICAgICAgIC8vIClcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIOaaguS4jeajgOafpee9kee7nOaAgVxuICAgICAgICAvLyBhd2FpdCB0aHJvd0Vycm9ySWZOZXR3b3JrT2ZmbGluZSgpXG5cbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHN0YXJ0IGdldFNpZ25hdHVyZScpXG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0aGlzLmdldFNpZ25hdHVyZSgpXG4gICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gZ2V0U2lnbmF0dXJlIHN1Y2Nlc3MnKVxuICAgICAgICAvLyBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBzdGFydCBjb25uZWN0U29ja2V0JylcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgIC8vIHRoaXMuX3dzID0gZ2V0U0RLKHRoaXMuX2NvbnRleHQuaWRlbnRpZmllcnMpXG4gICAgICAgICAgLy8gICAuX3NvY2tldFNraXBDaGVja0RvbWFpbkZhY3RvcnkoKVxuICAgICAgICAgIC8vICAgLmNvbm5lY3RTb2NrZXQoe1xuICAgICAgICAgIC8vICAgICB1cmw6IHNpZ25hdHVyZS53c1VybCxcbiAgICAgICAgICAvLyAgICAgaGVhZGVyOiB7XG4gICAgICAgICAgLy8gICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAvLyAgICAgc3VjY2VzczogKCkgPT4gc3VjY2VzcygpLFxuICAgICAgICAgIC8vICAgICBmYWlsXG4gICAgICAgICAgLy8gICB9KVxuXG4gICAgICAgICAgY29uc3QgdXJsID0gd3NTaWduLndzVXJsIHx8ICd3c3M6Ly90Y2Itd3MudGVuY2VudGNsb3VkYXBpLmNvbSc7XG4gICAgICAgICAgY29uc3Qgd3NDbGFzcyA9IGdldFdzQ2xhc3MoKTtcbiAgICAgICAgICB0aGlzLl93cyA9IHdzQ2xhc3MgPyBuZXcgd3NDbGFzcyh1cmwpIDogbmV3IFdlYlNvY2tldCh1cmwpXG4gICAgICAgICAgc3VjY2VzcygpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYodGhpcy5fd3MuY29ubmVjdCl7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd3MuY29ubmVjdCgpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gY29ubmVjdFNvY2tldCBzdWNjZXNzZnVsbHkgZmlyZWQnXG4gICAgICAgIC8vIClcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdFdlYlNvY2tldEV2ZW50KClcbiAgICAgICAgcmVzb2x2ZSgpXG5cbiAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgIHRoaXMucmVzdW1lQ2xpZW50cygpXG4gICAgICAgICAgdGhpcy5fcmVjb25uZWN0U3RhdGUgPSBmYWxzZSAvLyDph43ov57nirbmgIHnu5PmnZ9cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0IGZhaWwnLCBlKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyBhbiBvcHRpbWl6YXRpb24sIGluIGNhc2Ugb2YgbmV0d29yayBvZmZsaW5lLCB3ZSBkb24ndCBuZWVkIHRvIHN0dWJib3JubHkgc2xlZXAgZm9yIHNvbWV0aW1lLFxuICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV0d29yayB0byBiZSBiYWNrIG9ubGluZSwgdGhpcyBlbnN1cmVzIG1pbmltdW0gZG93bnRpbWVcbiAgICAgICAgICAvLyBjb25zdCB7IGlzQ29ubmVjdGVkIH0gPSBhd2FpdCBnZXROZXR3b3JrU3RhdHVzKClcbiAgICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZCA9IHRydWVcblxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gd2FpdGluZyBmb3IgbmV0d29yayBvbmxpbmUnXG4gICAgICAgICAgLy8gKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIC8vIGF1dG8gd2FpdCB1bnRpbCBuZXR3b3JrIG9ubGluZSwgY2F1c2UnIGl0IHdvdWxkIGJlIG1lYW5pbmdsZXNzIHRvIHJlY29ubmVjdCB3aGlsZSBuZXR3b3JrIGlzIG9mZmxpbmVcblxuICAgICAgICAgIC8vIGF3YWl0IG9uY2VOZXR3b3JrT25saW5lKClcblxuICAgICAgICAgIC8vIENPTVBBVElCSUxJVFk6IHdhaXQgZm9yIGlkZSBzdGF0ZSB1cGRhdGVcbiAgICAgICAgICAvLyBpZiAoaXNEZXZUb29scygpKSB7XG4gICAgICAgICAgLy8gICBhd2FpdCBzbGVlcCgwKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIG5ldHdvcmsgb25saW5lJylcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICB0aGlzLl93c0luaXRQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHNsZWVwICR7dGhpcy5fcmVjb25uZWN0SW50ZXJ2YWx9bXNgXG4gICAgICAgICAgICAvLyApXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBhd2FpdCBzbGVlcCh0aGlzLl9yZWNvbm5lY3RJbnRlcnZhbClcbiAgICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVjb25uZWN0U3RhdGUgPSBmYWxzZSAvLyDph43ov57lvILluLjkuZ/nrpfph43ov57nirbmgIHnu5PmnZ9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24ocmVjb25uZWN0LCBhdmFpbGFibGVSZXRyaWVzIC0gMSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGUpXG5cbiAgICAgICAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhcbiAgICAgICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUNPTk5FQ1RfV0FUQ0hfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIGxldCBzdWNjZXNzID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93c0luaXRQcm9taXNlXG4gICAgICAvLyBzdWNjZXNzID0gdHJ1ZVxuICAgICAgdGhpcy5fd3NSZWFkeVN1YnNyaWJlcnMuZm9yRWFjaCgoeyByZXNvbHZlIH0pID0+IHJlc29sdmUoKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlamVjdCB9KSA9PiByZWplY3QoKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fd3NJbml0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5fd3NSZWFkeVN1YnNyaWJlcnMgPSBbXVxuICAgIH1cblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYFtyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWBcbiAgICAvLyApXG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0V2ViU29ja2V0RXZlbnQgPSAoKSA9PlxuICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5fd3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IGluaXRXZWJTb2NrZXRFdmVudCwgd3Mgbm90IGV4aXN0cycpXG4gICAgICB9XG5cbiAgICAgIGxldCB3c09wZW5lZCA9IGZhbHNlXG5cbiAgICAgIHRoaXMuX3dzLm9ub3BlbiA9IGV2ZW50ID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25PcGVuKCgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub24oXCJvcGVuXCIsICgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IG9wZW4nLCBldmVudClcbiAgICAgICAgd3NPcGVuZWQgPSB0cnVlXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl93cy5vbmVycm9yID0gZXZlbnQgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcImVycm9yXCIsIGVycm9yID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25FcnJvcihlcnJvciA9PiB7XG4gICAgICAgIC8vIGFsbCBsb2dpbnMgYXJlIGludmFsaWQgYWZ0ZXIgZGlzY29ubmVjdGlvblxuICAgICAgICB0aGlzLl9sb2dpbnMgPSBuZXcgTWFwKClcblxuICAgICAgICAvLyBlcnJvcuWGmei/m2ZpbGVcblxuICAgICAgICBpZiAoIXdzT3BlbmVkKSB7XG4gICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZV0gd3Mgb3BlbiBmYWlsZWQgd2l0aCB3cyBldmVudDogZXJyb3InLCBldmVudClcbiAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAvLyAgIGAke1xuICAgICAgICAgIC8vICAgICB0aGlzLnNwZWNpYWxOdW1iZXJcbiAgICAgICAgICAvLyAgIH0gW3JlYWx0aW1lXSB3cyBvcGVuIGZhaWxlZCB3aXRoIHdzIGV2ZW50OiBlcnJvciAke2Vycm9yfSBcXG5gXG4gICAgICAgICAgLy8gKVxuXG4gICAgICAgICAgcmVqZWN0KGV2ZW50KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMuX2NvbnRleHQuZGVidWcgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIHdzIGV2ZW50OiBlcnJvcicsIGV2ZW50KVxuXG4gICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgLy8gICBgJHt0aGlzLnNwZWNpYWxOdW1iZXJ9IFtyZWFsdGltZV0gd3MgZXZlbnQ6IGVycm9yICR7ZXJyb3J9IFxcbmBcbiAgICAgICAgICAvLyApXG5cbiAgICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAgICAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuZm9yRWFjaChjbGllbnQgPT5cbiAgICAgICAgICAgIGNsaWVudC5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9XRUJTT0NLRVRfQ09OTkVDVElPTl9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZXJyTXNnOiBldmVudFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiByZWNvbm5lY3RcbiAgICAgIHRoaXMuX3dzLm9uY2xvc2UgPSBjbG9zZUV2ZW50ID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub24oXCJjbG9zZVwiLCAoY2xvc2VFdmVudCwgY2xvc2VyZWFzb24pID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25DbG9zZShjbG9zZUV2ZW50ID0+IHtcbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogY2xvc2UnLCBjbG9zZUV2ZW50KVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgIC8vICAgXCJ3c2Nsb3NlLnR4dFwiLFxuICAgICAgICAvLyAgIGAke1xuICAgICAgICAvLyAgICAgdGhpcy5zcGVjaWFsTnVtYmVyXG4gICAgICAgIC8vICAgfSBbcmVhbHRpbWVdIHdzIGV2ZW50OiBjbG9zZSAke2Nsb3NlRXZlbnR9ICR7Y2xvc2VyZWFzb259IFxcbmBcbiAgICAgICAgLy8gKVxuXG4gICAgICAgIC8vIGFsbCBsb2dpbnMgYXJlIGludmFsaWQgYWZ0ZXIgZGlzY29ubmVjdGlvblxuICAgICAgICB0aGlzLl9sb2dpbnMgPSBuZXcgTWFwKClcblxuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAgICAgc3dpdGNoIChjbG9zZUV2ZW50LmNvZGUpIHtcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuUmVjb25uZWN0V2ViU29ja2V0OiB7XG4gICAgICAgICAgICAvLyBqdXN0IGlnbm9yZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLk5vUmVhbHRpbWVMaXN0ZW5lcnM6IHtcbiAgICAgICAgICAgIC8vIHF1aXRcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQ0xPU0VfRVZFTlRfQ09ERS5IZWFydGJlYXRQaW5nRXJyb3I6XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLkhlYXJ0YmVhdFBvbmdUaW1lb3V0RXJyb3I6XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLk5vcm1hbENsb3N1cmU6XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLkFibm9ybWFsQ2xvc3VyZToge1xuICAgICAgICAgICAgLy8gTm9ybWFsIENsb3N1cmUgYW5kIEFibm9ybWFsIENsb3N1cmU6XG4gICAgICAgICAgICAvLyAgIGV4cGVjdGVkIGNsb3N1cmUsIG1vc3QgbGlrZWx5IGRpc3BhdGNoZWQgYnkgd2VjaGF0IGNsaWVudCxcbiAgICAgICAgICAgIC8vICAgc2luY2UgdGhpcyBpcyB0aGUgc3RhdHVzIGNvZGUgZGlzcGF0Y2hlZCBpbiBjYXNlIG9mIG5ldHdvcmsgZmFpbHVyZSxcbiAgICAgICAgICAgIC8vICAgd2Ugc2hvdWxkIHJldHJ5XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXhSZWNvbm5lY3QgPiAwKSB7XG4gICAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUsIHRoaXMuX21heFJlY29ubmVjdClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLk5vQXV0aGVudGljYXRpb246IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKFxuICAgICAgICAgICAgICBnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlLCBjbG9zZUV2ZW50LnJlYXNvbilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZXRyeSBieSBkZWZhdWx0XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF4UmVjb25uZWN0ID4gMCkge1xuICAgICAgICAgICAgICAvLyBpZiAodGhpcy5fYXZhaWxhYmxlUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbih0cnVlLCB0aGlzLl9tYXhSZWNvbm5lY3QpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgW3JlYWx0aW1lXSB1bnJlY29nbml6ZSB3cyBjbG9zZSBldmVudGAsIGNsb3NlRXZlbnQpXG4gICAgICAgICAgICAvLyB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fd3Mub25tZXNzYWdlID0gcmVzID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub24oXCJtZXNzYWdlXCIsIHJlcyA9PiB7XG4gICAgICAgIC8vIHRoaXMuX3dzLm9uTWVzc2FnZShyZXMgPT4ge1xuICAgICAgICAvLyBjb25zdCByYXdNc2cgPSByZXMuZGF0YVxuICAgICAgICBjb25zdCByYXdNc2cgPSByZXMuZGF0YVxuXG4gICAgICAgIC8vIHJlc2V0ICYgcmVzdGFydCBoZWFydGJlYXRcbiAgICAgICAgdGhpcy5oZWFydGJlYXQoKVxuXG4gICAgICAgIGxldCBtc2c6IElSZXNwb25zZU1lc3NhZ2VcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG1zZyA9IEpTT04ucGFyc2UocmF3TXNnIGFzIHN0cmluZylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3JlYWx0aW1lXSBvbk1lc3NhZ2UgcGFyc2UgcmVzLmRhdGEgZXJyb3I6ICR7ZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtyZWFsdGltZV0gb25NZXNzYWdlICR7XG4gICAgICAgIC8vICAgICBtc2cubXNnVHlwZVxuICAgICAgICAvLyAgIH0gKCR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpfSlgLFxuICAgICAgICAvLyAgIG1zZ1xuICAgICAgICAvLyApXG5cbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlID09PSAnRVJST1InKSB7XG4gICAgICAgICAgLy8g5om+5Yiw5b2T5YmN55uR5ZCs77yM5bm25bCGZXJyb3Lov5Tlm55cbiAgICAgICAgICBsZXQgdmlydHVhbFdhdGNoID0gbnVsbFxuICAgICAgICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ud2F0Y2hJZCA9PT0gbXNnLndhdGNoSWQpIHtcbiAgICAgICAgICAgICAgdmlydHVhbFdhdGNoID0gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAodmlydHVhbFdhdGNoKSB7XG4gICAgICAgICAgICB2aXJ0dWFsV2F0Y2gubGlzdGVuZXIub25FcnJvcihtc2cpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VXYWl0U3BlYyA9IHRoaXMuX3dzUmVzcG9uc2VXYWl0LmdldChtc2cucmVxdWVzdElkKVxuICAgICAgICBpZiAocmVzcG9uc2VXYWl0U3BlYykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZWplY3QobmV3IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IobXNnKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlV2FpdFNwZWMucmVzb2x2ZShtc2cpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgJ3dzIG9uTWVzc2FnZSByZXNwb25zZVdhaXRTcGVjLnJlc29sdmUobXNnKSBlcnJvcmVkOicsXG4gICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fd3NSZXNwb25zZVdhaXQuZGVsZXRlKG1zZy5yZXF1ZXN0SWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXNwb25zZVdhaXRTcGVjLnNraXBPbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ1BPTkcnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RQaW5nU2VuZFRTKSB7XG4gICAgICAgICAgICBjb25zdCBydHQgPSBEYXRlLm5vdygpIC0gdGhpcy5fbGFzdFBpbmdTZW5kVFNcbiAgICAgICAgICAgIGlmIChydHQgPiBERUZBVUxUX1VOVFJVU1RFRF9SVFRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgIC8vIHRoaXMuX2NvbnRleHQuZGVidWcgJiZcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIHVudHJ1c3RlZCBydHQgb2JzZXJ2ZWQ6ICR7cnR0fWApXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3J0dE9ic2VydmVkLmxlbmd0aCA+PSBNQVhfUlRUX09CU0VSVkVEKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLnNwbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLmxlbmd0aCAtIE1BWF9SVFRfT0JTRVJWRUQgKyAxXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLnB1c2gocnR0KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbGllbnQgPSBtc2cud2F0Y2hJZCAmJiB0aGlzLl93YXRjaElkQ2xpZW50TWFwLmdldChtc2cud2F0Y2hJZClcbiAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRPRE8sIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGRvbmUgZm9yIHNlcnZlclxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW3JlYWx0aW1lXSBubyByZWFsdGltZSBsaXN0ZW5lciBmb3VuZCByZXNwb25zaWJsZSBmb3Igd2F0Y2hJZCAke21zZy53YXRjaElkfTogYCxcbiAgICAgICAgICAgIG1zZ1xuICAgICAgICAgIClcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSU5JVF9FVkVOVCc6XG4gICAgICAgICAgICBjYXNlICdORVhUX0VWRU5UJzpcbiAgICAgICAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICAgICAgICBjbGllbnQgPSB0aGlzLl9xdWVyeUlkQ2xpZW50TWFwLmdldChtc2cubXNnRGF0YS5xdWVyeUlEKVxuICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpZW50Lm9uTWVzc2FnZShtc2cpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbLGNsaWVudF0gb2YgQXJyYXkuZnJvbSh0aGlzLl93YXRjaElkQ2xpZW50TWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnd2F0Y2hpZCoqKioqJywgd2F0Y2hJZClcbiAgICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgICB9KVxuXG4gIHByaXZhdGUgaXNXU0Nvbm5lY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl93cyAmJiB0aGlzLl93cy5yZWFkeVN0YXRlID09PSBXU19SRUFEWV9TVEFURS5PUEVOKVxuICB9XG5cbiAgcHJpdmF0ZSBvbmNlV1NDb25uZWN0ZWQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fd3NSZWFkeVN1YnNyaWJlcnMucHVzaCh7XG4gICAgICAgIHJlc29sdmUsXG4gICAgICAgIHJlamVjdFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSB3ZWJMb2dpbiA9IGFzeW5jIChcbiAgICBlbnZJZD86IHN0cmluZyxcbiAgICByZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPGFueT4gPT4ge1xuICAgIGlmICghcmVmcmVzaCkge1xuICAgICAgLy8gbGV0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2luSW5mb1xuICAgICAgaWYgKGVudklkKSB7XG4gICAgICAgIGNvbnN0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2lucy5nZXQoZW52SWQpXG4gICAgICAgIGlmIChsb2dpbkluZm8pIHtcbiAgICAgICAgICBpZiAobG9naW5JbmZvLmxvZ2dlZEluICYmIGxvZ2luSW5mby5sb2dpblJlc3VsdCkge1xuICAgICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBsb2dpbjogYWxyZWFkeSBsb2dnZWQgaW4nKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIGxvZ2luSW5mby5sb2dpblJlc3VsdFxuICAgICAgICAgIH0gZWxzZSBpZiAobG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW1wdHlFbnZMb2dpbkluZm8gPSB0aGlzLl9sb2dpbnMuZ2V0KCcnKVxuICAgICAgICBpZiAoZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm4gZW1wdHlFbnZMb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGxvZ2luOiBsb2dnaW5nIGluJylcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxJTG9naW5SZXN1bHQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmF0dXJlKGVudklkLCByZWZyZXNoKVxuXG4gICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAvLyBjb25zdCB3eFZlcnNpb24gPSBnZXRXWFZlcnNpb24oKVxuICAgICAgICBjb25zdCBtc2dEYXRhOiBJUmVxdWVzdE1lc3NhZ2VMb2dpbkRhdGEgPSB7XG4gICAgICAgICAgZW52SWQ6IHdzU2lnbi5lbnZJZCB8fCAnJyxcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJycsIC8vIOW3suW6n+W8g+Wtl+autVxuICAgICAgICAgIC8vIHNpZ25TdHI6IHNpZ25hdHVyZS5zaWduU3RyLFxuICAgICAgICAgIC8vIHNlY3JldFZlcnNpb246IHNpZ25hdHVyZS5zZWNyZXRWZXJzaW9uLFxuICAgICAgICAgIHJlZmVycmVyOiAnd2ViJyxcbiAgICAgICAgICBzZGtWZXJzaW9uOiAnJyxcbiAgICAgICAgICBkYXRhVmVyc2lvbjogJydcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2dpbk1zZzogSVJlcXVlc3RNZXNzYWdlTG9naW5Nc2cgPSB7XG4gICAgICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgbXNnVHlwZTogJ0xPR0lOJyxcbiAgICAgICAgICBtc2dEYXRhLFxuICAgICAgICAgIGV4TXNnRGF0YToge1xuICAgICAgICAgICAgcnVudGltZTogZ2V0UnVudGltZSgpLFxuICAgICAgICAgICAgc2lnblN0cjogd3NTaWduLnNpZ25TdHIsXG4gICAgICAgICAgICBzZWNyZXRWZXJzaW9uOiB3c1NpZ24uc2VjcmV0VmVyc2lvblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2dpblJlc01zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2c+KHtcbiAgICAgICAgICBtc2c6IGxvZ2luTXNnLFxuICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBza2lwT25NZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIHRpbWVvdXQ6IERFRkFVTFRfTE9HSU5fVElNRU9VVFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICghbG9naW5SZXNNc2cubXNnRGF0YS5jb2RlKSB7XG4gICAgICAgICAgLy8gbG9naW4gc3VjY2Vzc1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgZW52SWQ6IHdzU2lnbi5lbnZJZFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbG9naW4gZmFpbGVkXG4gICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHtsb2dpblJlc01zZy5tc2dEYXRhLmNvZGV9ICR7bG9naW5SZXNNc2cubXNnRGF0YS5tZXNzYWdlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIGxldCBsb2dpbkluZm8gPSB0aGlzLl9sb2dpbkluZm9cbiAgICBsZXQgbG9naW5JbmZvID0gZW52SWQgJiYgdGhpcy5fbG9naW5zLmdldChlbnZJZClcblxuICAgIGNvbnN0IGxvZ2luU3RhcnRUUyA9IERhdGUubm93KClcblxuICAgIGlmIChsb2dpbkluZm8pIHtcbiAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHByb21pc2VcbiAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSBsb2dpblN0YXJ0VFNcbiAgICB9IGVsc2Uge1xuICAgICAgbG9naW5JbmZvID0ge1xuICAgICAgICBsb2dnZWRJbjogZmFsc2UsXG4gICAgICAgIGxvZ2dpbmdJblByb21pc2U6IHByb21pc2UsXG4gICAgICAgIGxvZ2luU3RhcnRUU1xuICAgICAgfVxuICAgICAgLy8gdGhpcy5fbG9naW5JbmZvID0gbG9naW5JbmZvXG4gICAgICB0aGlzLl9sb2dpbnMuc2V0KGVudklkIHx8ICcnLCBsb2dpbkluZm8pXG4gICAgfVxuXG4gICAgLy8gdHJ5IHtcbiAgICAvLyAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgcHJvbWlzZVxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2dlZEluID0gdHJ1ZVxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblJlc3VsdCA9IGxvZ2luUmVzdWx0XG4gICAgLy8gICByZXR1cm4gbG9naW5SZXN1bHRcbiAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZVxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblJlc3VsdCA9IHVuZGVmaW5lZFxuICAgIC8vICAgdGhyb3cgZVxuICAgIC8vIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IHByb21pc2VcbiAgICAgIGNvbnN0IGN1ckxvZ2luSW5mbyA9IGVudklkICYmIHRoaXMuX2xvZ2lucy5nZXQoZW52SWQpXG4gICAgICBpZiAoXG4gICAgICAgIGN1ckxvZ2luSW5mbyAmJlxuICAgICAgICBjdXJMb2dpbkluZm8gPT09IGxvZ2luSW5mbyAmJlxuICAgICAgICBjdXJMb2dpbkluZm8ubG9naW5TdGFydFRTID09PSBsb2dpblN0YXJ0VFNcbiAgICAgICkge1xuICAgICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlXG4gICAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHRcbiAgICAgICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gICAgICB9IGVsc2UgaWYgKGN1ckxvZ2luSW5mbykge1xuICAgICAgICBpZiAoY3VyTG9naW5JbmZvLmxvZ2dlZEluICYmIGN1ckxvZ2luSW5mby5sb2dpblJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBjdXJMb2dpbkluZm8ubG9naW5SZXN1bHRcbiAgICAgICAgfSBlbHNlIGlmIChjdXJMb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiBjdXJMb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd3MgdW5leHBlY3RlZCBsb2dpbiBpbmZvJylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cyBsb2dpbiBpbmZvIHJlc2V0JylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZVxuICAgICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAgIGxvZ2luSW5mby5sb2dpblJlc3VsdCA9IHVuZGVmaW5lZFxuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V3NTaWduID0gYXN5bmMgKCk6IFByb21pc2U8SVdzU2lnbj4gPT4ge1xuICAgIGlmICh0aGlzLl93c1NpZ24gJiYgdGhpcy5fd3NTaWduLmV4cGlyZWRUcyA+IERhdGUubm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl93c1NpZ25cbiAgICB9XG4gICAgY29uc3QgZXhwaXJlZFRzID0gRGF0ZS5ub3coKSArIDYwMDAwXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fY29udGV4dC5hcHBDb25maWcucmVxdWVzdC5zZW5kKCdhdXRoLndzV2ViU2lnbicsIHtydW50aW1lOiBnZXRSdW50aW1lKCl9KVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFt0Y2ItanMtc2RrXSDojrflj5blrp7ml7bmlbDmja7mjqjpgIHnmbvlvZXnpajmja7lpLHotKU6ICR7cmVzLmNvZGV9YClcbiAgICB9XG5cbiAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgIGNvbnN0IHtzaWduU3RyLCB3c1VybCwgc2VjcmV0VmVyc2lvbiwgZW52SWR9ID0gcmVzLmRhdGFcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNpZ25TdHIsXG4gICAgICAgIHdzVXJsLFxuICAgICAgICBzZWNyZXRWZXJzaW9uLFxuICAgICAgICBlbnZJZCxcbiAgICAgICAgZXhwaXJlZFRzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pScpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gREVGQVVMVF9FWFBFQ1RFRF9FVkVOVF9XQUlUX1RJTUVcbiAgICB9XG5cbiAgICAvLyAxLjUgKiBSVFRcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuX3J0dE9ic2VydmVkLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1cikgL1xuICAgICAgICB0aGlzLl9ydHRPYnNlcnZlZC5sZW5ndGgpICpcbiAgICAgIDEuNVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgaGVhcnRiZWF0KGltbWVkaWF0ZT86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5fcGluZ1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl93cyB8fCB0aGlzLl93cy5yZWFkeVN0YXRlICE9PSBXU19SRUFEWV9TVEFURS5PUEVOKSB7XG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHBpbmdcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2xhc3RQaW5nU2VuZFRTID0gRGF0ZS5ub3coKVxuICAgICAgICAgIGF3YWl0IHRoaXMucGluZygpXG4gICAgICAgICAgdGhpcy5fcGluZ0ZhaWxlZCA9IDBcblxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLl9wb25nVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdwb25nIHRpbWVkIG91dCcpXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9uZ01pc3NlZCA8IERFRkFVTFRfUE9OR19NSVNTX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICB0aGlzLl9wb25nTWlzc2VkKytcbiAgICAgICAgICAgICAgdGhpcy5oZWFydGJlYXQodHJ1ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGxvZ2ljYWwgcGVyY2VpdmVkIGNvbm5lY3Rpb24gbG9zdCwgZXZlbiB0aG91Z2ggd2Vic29ja2V0IGRpZCBub3QgcmVjZWl2ZSBlcnJvciBvciBjbG9zZSBldmVudFxuICAgICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQb25nV2FpdFRpbWVvdXQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fcGluZ0ZhaWxlZCA8IERFRkFVTFRfUElOR19GQUlMX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgdGhpcy5fcGluZ0ZhaWxlZCsrXG4gICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdCgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoQ0xPU0VfRVZFTlRfQ09ERS5IZWFydGJlYXRQaW5nRXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlID8gMCA6IHRoaXMuX2NvbnRleHQuYXBwQ29uZmlnLnJlYWx0aW1lUGluZ0ludGVydmFsXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBwaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1zZzogSVJlcXVlc3RNZXNzYWdlUGluZ01zZyA9IHtcbiAgICAgIHdhdGNoSWQ6IHVuZGVmaW5lZCxcbiAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICBtc2dUeXBlOiAnUElORycsXG4gICAgICBtc2dEYXRhOiBudWxsXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICBtc2dcbiAgICB9KVxuICAgIC8vIGNvbnNvbGUubG9nKCdwaW5nIHNlbnQnKVxuICB9XG5cbiAgcHJpdmF0ZSBvbldhdGNoU3RhcnQgPSAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLl9xdWVyeUlkQ2xpZW50TWFwLnNldChxdWVyeUlELCBjbGllbnQpXG4gIH1cblxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZSA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChxdWVyeUlEKSB7XG4gICAgICB0aGlzLl9xdWVyeUlkQ2xpZW50TWFwLmRlbGV0ZShxdWVyeUlEKVxuICAgIH1cbiAgICB0aGlzLl93YXRjaElkQ2xpZW50TWFwLmRlbGV0ZShjbGllbnQud2F0Y2hJZClcbiAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuZGVsZXRlKGNsaWVudClcblxuICAgIGlmICghdGhpcy5fdmlydHVhbFdTQ2xpZW50LnNpemUpIHtcbiAgICAgIC8vIG5vIG1vcmUgZXhpc3Rpbmcgd2F0Y2gsIHdlIHNob3VsZCByZWxlYXNlIHRoZSB3ZWJzb2NrZXQgY29ubmVjdGlvblxuICAgICAgdGhpcy5jbG9zZShDTE9TRV9FVkVOVF9DT0RFLk5vUmVhbHRpbWVMaXN0ZW5lcnMpXG4gICAgfVxuICB9XG59XG4iXX0=
735
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQWN6QyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixlQUFlLEdBQ2hCLE1BQU0sWUFBWSxDQUFDO0FBRXBCLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBNERoQyxJQUFNLGNBQWMsR0FBRztJQUNyQixVQUFVLEVBQUUsQ0FBQztJQUNiLElBQUksRUFBRSxDQUFDO0lBQ1AsT0FBTyxFQUFFLENBQUM7SUFDVixNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUM7QUFFRixJQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQztBQUM5QyxJQUFNLCtCQUErQixHQUFHLEtBQUssQ0FBQztBQUM5QyxJQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUNoQyxJQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUU1QyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQztBQUN0QyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQztBQUN0QyxJQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztBQUVuQztJQStCRSxpQ0FBWSxPQUFtRDtRQUEvRCxpQkFL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V0FBTSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUE7O3dCQUFqQixTQUFpQixDQUFDO3dCQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQzt3QkFHckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7NEJBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs0QkFDaEMsSUFBSSxLQUFJLENBQUMsV0FBVyxHQUFHLDJCQUEyQixFQUFFO2dDQUNsRCxLQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0NBQ25CLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7NkJBQ3RCO2lDQUFNO2dDQUVMLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzs2QkFDcEM7d0JBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Ozs7d0JBRXBELElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsRUFBRTs0QkFDbEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7eUJBQ2xCOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt5QkFDakQ7Ozs7O2FBRUosRUFDRCxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQzdELENBQUM7SUFDSixDQUFDO0lBK0JILDhCQUFDO0FBQUQsQ0FBQyxBQTkxQkQsSUE4MUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGx1c3BsdXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXMgKi9cbmltcG9ydCB7IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQgfSBmcm9tICcuL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudCc7XG5pbXBvcnQgeyBnZW5SZXF1ZXN0SWQgfSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgSURhdGFiYXNlU2VydmljZUNvbnRleHQsXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvZGF0YWJhc2UnO1xuaW1wb3J0IHtcbiAgSVdhdGNoT3B0aW9ucyxcbiAgREJSZWFsdGltZUxpc3RlbmVyLFxuICBJUmVxdWVzdE1lc3NhZ2UsXG4gIElSZXNwb25zZU1lc3NhZ2UsXG4gIElSZXF1ZXN0TWVzc2FnZVBpbmdNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZWFsdGltZSc7XG5pbXBvcnQge1xuICBDTE9TRV9FVkVOVF9DT0RFLFxuICBDTE9TRV9FVkVOVF9DT0RFX0lORk8sXG4gIGdldFdTQ2xvc2VFcnJvcixcbn0gZnJvbSAnLi93cy1ldmVudCc7XG5cbmltcG9ydCB7IEVSUl9DT0RFLCBUaW1lb3V0RXJyb3IsIFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IsIENsb3VkU0RLRXJyb3IgfSBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7IGdldFdzQ2xhc3MsIGdldFJ1bnRpbWUgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWFsdGltZVdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIG1heFJlY29ubmVjdD86IG51bWJlclxuICByZWNvbm5lY3RJbnRlcnZhbD86IG51bWJlclxuICBjb250ZXh0OiBJRGF0YWJhc2VTZXJ2aWNlQ29udGV4dFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTaWduYXR1cmUge1xuICBlbnZJZDogc3RyaW5nXG4gIHNlY3JldFZlcnNpb246IG51bWJlclxuICBzaWduU3RyOiBzdHJpbmdcbiAgd3NVcmw6IHN0cmluZ1xuICBleHBpcmVUUzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2luSW5mbyB7XG4gIGxvZ2dlZEluOiBib29sZWFuXG4gIGxvZ2dpbmdJblByb21pc2U/OiBQcm9taXNlPElMb2dpblJlc3VsdD5cbiAgbG9naW5TdGFydFRTPzogbnVtYmVyXG4gIGxvZ2luUmVzdWx0PzogSUxvZ2luUmVzdWx0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2luUmVzdWx0IHtcbiAgZW52SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXU1NlbmRPcHRpb25zIHtcbiAgbXNnOiBJUmVxdWVzdE1lc3NhZ2VcbiAgd2FpdFJlc3BvbnNlPzogYm9vbGVhblxuICAvLyB3aGVuIHdhaXRSZXNwb25zZSBpcyBzZXQgdG8gdHJ1ZSwgaWYgc2tpcE9uTWVzc2FnZSBpcyB0cnVlLCBnZW5lcmFsIG9uTWVzc2FnZSBoYW5kbGVyIHdpbGwgYmUgc2tpcHBlZFxuICBza2lwT25NZXNzYWdlPzogYm9vbGVhblxuICB0aW1lb3V0PzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdTV2F0Y2hPcHRpb25zIGV4dGVuZHMgSVdhdGNoT3B0aW9ucyB7XG4gIGVudklkPzogc3RyaW5nXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbiAgcXVlcnk6IHN0cmluZ1xuICBsaW1pdD86IG51bWJlclxuICBvcmRlckJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG5pbnRlcmZhY2UgSVJlc29sdmVSZWplY3Qge1xuICByZXNvbHZlOiAodmFsdWU/OiBhbnkgfCBQcm9taXNlTGlrZTxhbnk+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgSVJlc3BvbnNlV2FpdFNwZWMgZXh0ZW5kcyBJUmVzb2x2ZVJlamVjdCB7XG4gIHNraXBPbk1lc3NhZ2U/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBJV3NTaWduIHtcbiAgc2lnblN0cjogc3RyaW5nLFxuICB3c1VybDogc3RyaW5nLFxuICBzZWNyZXRWZXJzaW9uOiBzdHJpbmdcbiAgZW52SWQ6IHN0cmluZ1xuICBleHBpcmVkVHM6IG51bWJlclxufVxuXG5jb25zdCBXU19SRUFEWV9TVEFURSA9IHtcbiAgQ09OTkVDVElORzogMCxcbiAgT1BFTjogMSxcbiAgQ0xPU0lORzogMixcbiAgQ0xPU0VEOiAzLFxufTtcblxuY29uc3QgTUFYX1JUVF9PQlNFUlZFRCA9IDM7XG5jb25zdCBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRSA9IDUwMDA7XG5jb25zdCBERUZBVUxUX1VOVFJVU1RFRF9SVFRfVEhSRVNIT0xEID0gMTAwMDA7XG5jb25zdCBERUZBVUxUX01BWF9SRUNPTk5FQ1QgPSA1O1xuY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfSU5URVJWQUwgPSAxMDAwMDtcbi8vIGNvbnN0IERFRkFVTFRfV1NfUkVDT05ORUNUX01BWF9WQUxJRF9JTlRFUlZBTCA9IDMgKiA2MCAqIDEwMDBcbmNvbnN0IERFRkFVTFRfUElOR19GQUlMX1RPTEVSQU5DRSA9IDI7XG5jb25zdCBERUZBVUxUX1BPTkdfTUlTU19UT0xFUkFOQ0UgPSAyO1xuY29uc3QgREVGQVVMVF9MT0dJTl9USU1FT1VUID0gNTAwMDtcblxuZXhwb3J0IGNsYXNzIFJlYWx0aW1lV2ViU29ja2V0Q2xpZW50IHtcbiAgcHJpdmF0ZSBfdmlydHVhbFdTQ2xpZW50OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4gPSBuZXcgU2V0KCk7XG4gIC8vIGFmdGVyIGxpc3RlbmVyIGluaXRXYXRjaCwgdGhlIGxpc3RlbmVyIGhhcyB0aGUgcXVlcnlJRCBhbmQgY2FuIHN0b3JlIGl0IGhlcmVcbiAgcHJpdmF0ZSBfcXVlcnlJZENsaWVudE1hcDogTWFwPHN0cmluZywgVmlydHVhbFdlYlNvY2tldENsaWVudD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3dhdGNoSWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9tYXhSZWNvbm5lY3Q6IG51bWJlcjtcbiAgLy8gcHJpdmF0ZSBfYXZhaWxhYmxlUmV0cmllczogbnVtYmVyXG4gIHByaXZhdGUgX3JlY29ubmVjdEludGVydmFsOiBudW1iZXI7XG4gIHByaXZhdGUgX2NvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0O1xuICAvLyBwcml2YXRlIF93cz86IFdYTlMuU29ja2V0LklTb2NrZXRUYXNrXG4gIHByaXZhdGUgX3dzPzogYW55O1xuICBwcml2YXRlIF9sYXN0UGluZ1NlbmRUUz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfcGluZ0ZhaWxlZCA9IDA7XG4gIHByaXZhdGUgX3BvbmdNaXNzZWQgPSAwO1xuICBwcml2YXRlIF9waW5nVGltZW91dElkPzogbnVtYmVyO1xuICBwcml2YXRlIF9wb25nVGltZW91dElkPzogbnVtYmVyO1xuICBwcml2YXRlIF9sb2dpbnM6IE1hcDxzdHJpbmcgLyogZW52SWQgKi8sIElMb2dpbkluZm8+ID0gbmV3IE1hcCgpO1xuICAvLyBwcml2YXRlIF9sb2dpbkluZm86IElMb2dpbkluZm9cbiAgLy8gcHJpdmF0ZSBfc2lnbmF0dXJlczogTWFwPHN0cmluZyAvKiBlbnZJZCAqLywgSVNpZ25hdHVyZT4gPSBuZXcgTWFwKClcbiAgcHJpdmF0ZSBfd3NJbml0UHJvbWlzZT86IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgX3dzUmVhZHlTdWJzcmliZXJzOiBJUmVzb2x2ZVJlamVjdFtdID0gW107XG4gIHByaXZhdGUgX3dzUmVzcG9uc2VXYWl0OiBNYXA8XG4gIHN0cmluZyAvKiByZXF1ZXN0SWQgKi8sXG4gIElSZXNwb25zZVdhaXRTcGVjXG4gID4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3J0dE9ic2VydmVkOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIF9yZWNvbm5lY3RTdGF0ZTogYm9vbGVhbjtcbiAgLy8gb2J0YWluZWQgZnJvbSB0aGUgZmlyc3QgZ2V0U2lnbmF0dXJlIHdpdGggbm8gZW52SWQgcHJvdmlkZWRcbiAgLy8gcHJpdmF0ZSBfZGVmYXVsdEVudklkPzogc3RyaW5nXG4gIHByaXZhdGUgX3dzU2lnbjogSVdzU2lnbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLl9tYXhSZWNvbm5lY3QgPSBvcHRpb25zLm1heFJlY29ubmVjdCB8fCBERUZBVUxUX01BWF9SRUNPTk5FQ1Q7XG4gICAgLy8gdGhpcy5fYXZhaWxhYmxlUmV0cmllcyA9IHRoaXMuX21heFJlY29ubmVjdFxuICAgIHRoaXMuX3JlY29ubmVjdEludGVydmFsID0gICAgICBvcHRpb25zLnJlY29ubmVjdEludGVydmFsIHx8IERFRkFVTFRfV1NfUkVDT05ORUNUX0lOVEVSVkFMO1xuICAgIHRoaXMuX2NvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gIH1cblxuICBjbGVhckhlYXJ0YmVhdCgpIHtcbiAgICB0aGlzLl9waW5nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLl9waW5nVGltZW91dElkKTtcbiAgICB0aGlzLl9wb25nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLl9wb25nVGltZW91dElkKTtcbiAgfVxuXG4gIHNlbmQgPSBhc3luYyA8VCA9IGFueT4ob3B0czogSVdTU2VuZE9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IG5ldyBQcm9taXNlPFQ+KGFzeW5jIChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlcjtcbiAgICBsZXQgX2hhc1Jlc29sdmVkID0gZmFsc2U7XG4gICAgbGV0IF9oYXNSZWplY3RlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgcmVzb2x2ZTogdHlwZW9mIF9yZXNvbHZlID0gKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBfaGFzUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgdGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgX3Jlc29sdmUodmFsdWUpO1xuICAgIH07XG5cbiAgICBjb25zdCByZWplY3Q6IHR5cGVvZiBfcmVqZWN0ID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIF9oYXNSZWplY3RlZCA9IHRydWU7XG4gICAgICB0aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICBfcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuXG4gICAgaWYgKG9wdHMudGltZW91dCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghX2hhc1Jlc29sdmVkIHx8ICFfaGFzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAvLyB3YWl0IGFub3RoZXIgaW1tZWRpYXRlIHRpbWVvdXQgdG8gYWxsb3cgdGhlIHN1Y2Nlc3MvZmFpbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGlmIHdzIGhhcyBhbHJlYWR5IGdvdCB0aGUgcmVzdWx0LFxuICAgICAgICAgIC8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgdGltZXIgaXMgcmVnaXN0ZXJlZCBiZWZvcmUgd3Muc2VuZFxuICAgICAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgICAgIGlmICghX2hhc1Jlc29sdmVkIHx8ICFfaGFzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCd3c2NsaWVudC5zZW5kIHRpbWVkb3V0JykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb3B0cy50aW1lb3V0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gaWYgKHRoaXMuX2NvbnRleHQuZGVidWcpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIHdzIHNlbmQgKCR7bmV3IERhdGUoKX0pOiBgLCBvcHRzKVxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbcmVhbHRpbWVdIHdzIHNlbmQgJHtcbiAgICAgIC8vICAgICBvcHRzLm1zZy5tc2dUeXBlXG4gICAgICAvLyAgIH0gKCR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpfSk6IGAsXG4gICAgICAvLyAgIG9wdHNcbiAgICAgIC8vIClcbiAgICAgIC8vIH1cblxuICAgICAgaWYgKHRoaXMuX3dzSW5pdFByb21pc2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd3NJbml0UHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl93cykge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdpbnZhbGlkIHN0YXRlOiB3cyBjb25uZWN0aW9uIG5vdCBleGlzdHMsIGNhbiBub3Qgc2VuZCBtZXNzYWdlJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl93cy5yZWFkeVN0YXRlICE9PSBXU19SRUFEWV9TVEFURS5PUEVOKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHdzIHJlYWR5U3RhdGUgaW52YWxpZDogJHt0aGlzLl93cy5yZWFkeVN0YXRlfSwgY2FuIG5vdCBzZW5kIG1lc3NhZ2VgKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX3dzUmVzcG9uc2VXYWl0LnNldChvcHRzLm1zZy5yZXF1ZXN0SWQsIHtcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBza2lwT25NZXNzYWdlOiBvcHRzLnNraXBPbk1lc3NhZ2UsXG4gICAgICAgIH0gYXMgSVJlc3BvbnNlV2FpdFNwZWMpO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZygnc2VuZCBtc2c6Jywgb3B0cy5tc2cpXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl93cy5zZW5kKEpTT04uc3RyaW5naWZ5KG9wdHMubXNnKSk7XG4gICAgICAgIGlmICghb3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgaWYgKG9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHRoaXMuX3dzLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpLCBlcnIgPT4ge1xuICAgICAgLy8gICBpZiAoZXJyKSB7XG4gICAgICAvLyAgICAgcmVqZWN0KGVycilcbiAgICAgIC8vICAgICBpZiAob3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgIC8vICAgICAgIHRoaXMuX3dzUmVzcG9uc2VXYWl0LmRlbGV0ZShvcHRzLm1zZy5yZXF1ZXN0SWQpXG4gICAgICAvLyAgICAgfVxuICAgICAgLy8gICAgIHJldHVyblxuICAgICAgLy8gICB9XG5cbiAgICAgIC8vICAgaWYgKCFvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgLy8gICAgIHJlc29sdmUoKVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9KVxuXG4gICAgICAvLyB0aGlzLl93cy5zZW5kKHtcbiAgICAgIC8vICAgZGF0YTogSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpLFxuICAgICAgLy8gICBzdWNjZXNzOiByZXMgPT4ge1xuICAgICAgLy8gICAgIGlmICghb3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgIC8vICAgICAgIHJlc29sdmUocmVzKVxuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgfSxcbiAgICAgIC8vICAgZmFpbDogZSA9PiB7XG4gICAgICAvLyAgICAgcmVqZWN0KGUpXG4gICAgICAvLyAgICAgaWYgKG9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAvLyAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKVxuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QoZSk7XG4gICAgfVxuICB9KTtcblxuICBjbG9zZShjb2RlOiBDTE9TRV9FVkVOVF9DT0RFKSB7XG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdCgpO1xuXG4gICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICB0aGlzLl93cy5jbG9zZShjb2RlLCBDTE9TRV9FVkVOVF9DT0RFX0lORk9bY29kZV0ubmFtZSk7XG4gICAgICB0aGlzLl93cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBjbG9zZUFsbENsaWVudHMgPSAoZXJyb3I6IGFueSkgPT4ge1xuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC5jbG9zZVdpdGhFcnJvcihlcnJvcik7XG4gICAgfSk7XG4gIH07XG5cbiAgcGF1c2VDbGllbnRzID0gKGNsaWVudHM/OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4pID0+IHtcbiAgICAoY2xpZW50cyB8fCB0aGlzLl92aXJ0dWFsV1NDbGllbnQpLmZvckVhY2goKGNsaWVudCkgPT4ge1xuICAgICAgY2xpZW50LnBhdXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmVzdW1lQ2xpZW50cyA9IChjbGllbnRzPzogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+KSA9PiB7XG4gICAgKGNsaWVudHMgfHwgdGhpcy5fdmlydHVhbFdTQ2xpZW50KS5mb3JFYWNoKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC5yZXN1bWUoKTtcbiAgICB9KTtcbiAgfTtcblxuICB3YXRjaChvcHRpb25zOiBJV1NXYXRjaE9wdGlvbnMpOiBEQlJlYWx0aW1lTGlzdGVuZXIge1xuICAgIGlmICghdGhpcy5fd3MgJiYgIXRoaXMuX3dzSW5pdFByb21pc2UpIHtcbiAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24oZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHZpcnR1YWxDbGllbnQgPSBuZXcgVmlydHVhbFdlYlNvY2tldENsaWVudCh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc2VuZDogdGhpcy5zZW5kLFxuICAgICAgbG9naW46IHRoaXMud2ViTG9naW4sXG4gICAgICBpc1dTQ29ubmVjdGVkOiB0aGlzLmlzV1NDb25uZWN0ZWQsXG4gICAgICBvbmNlV1NDb25uZWN0ZWQ6IHRoaXMub25jZVdTQ29ubmVjdGVkLFxuICAgICAgZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aDogdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoLFxuICAgICAgb25XYXRjaFN0YXJ0OiB0aGlzLm9uV2F0Y2hTdGFydCxcbiAgICAgIG9uV2F0Y2hDbG9zZTogdGhpcy5vbldhdGNoQ2xvc2UsXG4gICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuYWRkKHZpcnR1YWxDbGllbnQpO1xuICAgIHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuc2V0KHZpcnR1YWxDbGllbnQud2F0Y2hJZCwgdmlydHVhbENsaWVudCk7XG4gICAgcmV0dXJuIHZpcnR1YWxDbGllbnQubGlzdGVuZXI7XG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHJlY29ubmVjdDogYm9vbGVhbixcbiAgICBhdmFpbGFibGVSZXRyaWVzOiBudW1iZXIgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8g5b2T5YmN5aSE5LqO5q2j5Zyo6YeN6L+e5Lit55qE54q25oCBXG4gICAgaWYgKHJlY29ubmVjdCAmJiB0aGlzLl9yZWNvbm5lY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuOyAvLyDlv73nlaVcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICB0aGlzLl9yZWNvbm5lY3RTdGF0ZSA9IHRydWU7IC8vIOmHjei/nueKtuaAgeW8gOWni1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93c0luaXRQcm9taXNlKSB7XG4gICAgICAvLyB0aGVyZSBhbHJlYWR5IGV4aXN0cyBhIHdlYnNvY2tldCBpbml0aWF0aW9uLCBqdXN0IHdhaXQgZm9yIGl0XG4gICAgICByZXR1cm4gdGhpcy5fd3NJbml0UHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGBbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHJlY29ubmVjdCAke3JlY29ubmVjdH0gYXZhaWxhYmxlUmV0cmllcyAke2F2YWlsYWJsZVJldHJpZXN9YFxuICAgIC8vIClcbiAgICAvLyB9XG5cbiAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICB0aGlzLnBhdXNlQ2xpZW50cygpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2UoQ0xPU0VfRVZFTlRfQ09ERS5SZWNvbm5lY3RXZWJTb2NrZXQpO1xuXG4gICAgdGhpcy5fd3NJbml0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBzdGFydCB0aHJvd0Vycm9ySWZOZXR3b3JrT2ZmbGluZSdcbiAgICAgICAgLy8gKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8g5pqC5LiN5qOA5p+l572R57uc5oCBXG4gICAgICAgIC8vIGF3YWl0IHRocm93RXJyb3JJZk5ldHdvcmtPZmZsaW5lKClcblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gc3RhcnQgZ2V0U2lnbmF0dXJlJylcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmF0dXJlKClcbiAgICAgICAgY29uc3Qgd3NTaWduID0gYXdhaXQgdGhpcy5nZXRXc1NpZ24oKTtcblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gZ2V0U2lnbmF0dXJlIHN1Y2Nlc3MnKVxuICAgICAgICAvLyBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBzdGFydCBjb25uZWN0U29ja2V0JylcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChzdWNjZXNzKSA9PiB7XG4gICAgICAgICAgLy8gdGhpcy5fd3MgPSBnZXRTREsodGhpcy5fY29udGV4dC5pZGVudGlmaWVycylcbiAgICAgICAgICAvLyAgIC5fc29ja2V0U2tpcENoZWNrRG9tYWluRmFjdG9yeSgpXG4gICAgICAgICAgLy8gICAuY29ubmVjdFNvY2tldCh7XG4gICAgICAgICAgLy8gICAgIHVybDogc2lnbmF0dXJlLndzVXJsLFxuICAgICAgICAgIC8vICAgICBoZWFkZXI6IHtcbiAgICAgICAgICAvLyAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgIC8vICAgICBzdWNjZXNzOiAoKSA9PiBzdWNjZXNzKCksXG4gICAgICAgICAgLy8gICAgIGZhaWxcbiAgICAgICAgICAvLyAgIH0pXG5cbiAgICAgICAgICBjb25zdCB1cmwgPSB3c1NpZ24ud3NVcmwgfHwgJ3dzczovL3RjYi13cy50ZW5jZW50Y2xvdWRhcGkuY29tJztcbiAgICAgICAgICBjb25zdCB3c0NsYXNzID0gZ2V0V3NDbGFzcygpO1xuICAgICAgICAgIHRoaXMuX3dzID0gd3NDbGFzcyA/IG5ldyB3c0NsYXNzKHVybCkgOiBuZXcgV2ViU29ja2V0KHVybCk7XG4gICAgICAgICAgc3VjY2Vzcyh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5fd3MuY29ubmVjdCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dzLmNvbm5lY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0U29ja2V0IHN1Y2Nlc3NmdWxseSBmaXJlZCdcbiAgICAgICAgLy8gKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0V2ViU29ja2V0RXZlbnQoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICB0aGlzLnJlc3VtZUNsaWVudHMoKTtcbiAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RTdGF0ZSA9IGZhbHNlOyAvLyDph43ov57nirbmgIHnu5PmnZ9cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0IGZhaWwnLCBlKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChhdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgIC8vIHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uLCBpbiBjYXNlIG9mIG5ldHdvcmsgb2ZmbGluZSwgd2UgZG9uJ3QgbmVlZCB0byBzdHViYm9ybmx5IHNsZWVwIGZvciBzb21ldGltZSxcbiAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5ldHdvcmsgdG8gYmUgYmFjayBvbmxpbmUsIHRoaXMgZW5zdXJlcyBtaW5pbXVtIGRvd250aW1lXG4gICAgICAgICAgLy8gY29uc3QgeyBpc0Nvbm5lY3RlZCB9ID0gYXdhaXQgZ2V0TmV0d29ya1N0YXR1cygpXG4gICAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiB3YWl0aW5nIGZvciBuZXR3b3JrIG9ubGluZSdcbiAgICAgICAgICAvLyApXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgLy8gYXV0byB3YWl0IHVudGlsIG5ldHdvcmsgb25saW5lLCBjYXVzZScgaXQgd291bGQgYmUgbWVhbmluZ2xlc3MgdG8gcmVjb25uZWN0IHdoaWxlIG5ldHdvcmsgaXMgb2ZmbGluZVxuXG4gICAgICAgICAgLy8gYXdhaXQgb25jZU5ldHdvcmtPbmxpbmUoKVxuXG4gICAgICAgICAgLy8gQ09NUEFUSUJJTElUWTogd2FpdCBmb3IgaWRlIHN0YXRlIHVwZGF0ZVxuICAgICAgICAgIC8vIGlmIChpc0RldlRvb2xzKCkpIHtcbiAgICAgICAgICAvLyAgIGF3YWl0IHNsZWVwKDApXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gbmV0d29yayBvbmxpbmUnKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIHRoaXMuX3dzSW5pdFByb21pc2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHNsZWVwICR7dGhpcy5fcmVjb25uZWN0SW50ZXJ2YWx9bXNgXG4gICAgICAgICAgICAvLyApXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBhd2FpdCBzbGVlcCh0aGlzLl9yZWNvbm5lY3RJbnRlcnZhbCk7XG4gICAgICAgICAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlY29ubmVjdFN0YXRlID0gZmFsc2U7IC8vIOmHjei/nuW8guW4uOS5n+eul+mHjei/nueKtuaAgee7k+adn1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUodGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbihyZWNvbm5lY3QsIGF2YWlsYWJsZVJldHJpZXMgLSAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuXG4gICAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfUkVDT05ORUNUX1dBVENIX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICBlcnJNc2c6IGUsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBsZXQgc3VjY2VzcyA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd3NJbml0UHJvbWlzZTtcbiAgICAgIC8vIHN1Y2Nlc3MgPSB0cnVlXG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlc29sdmUgfSkgPT4gcmVzb2x2ZSgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlamVjdCB9KSA9PiByZWplY3QoKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3dzSW5pdFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycyA9IFtdO1xuICAgIH1cblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYFtyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWBcbiAgICAvLyApXG4gICAgLy8gfVxuICB9O1xuXG4gIHByaXZhdGUgaW5pdFdlYlNvY2tldEV2ZW50ID0gKCkgPT4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmICghdGhpcy5fd3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBpbml0V2ViU29ja2V0RXZlbnQsIHdzIG5vdCBleGlzdHMnKTtcbiAgICB9XG5cbiAgICBsZXQgd3NPcGVuZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX3dzLm9ub3BlbiA9IChldmVudCkgPT4ge1xuICAgICAgLy8gdGhpcy5fd3Mub25PcGVuKCgpID0+IHtcbiAgICAgIC8vIHRoaXMuX3dzLm9uKFwib3BlblwiLCAoKSA9PiB7XG4gICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IG9wZW4nLCBldmVudCk7XG4gICAgICB3c09wZW5lZCA9IHRydWU7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcblxuICAgIHRoaXMuX3dzLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgIC8vIHRoaXMuX3dzLm9uKFwiZXJyb3JcIiwgZXJyb3IgPT4ge1xuICAgICAgLy8gdGhpcy5fd3Mub25FcnJvcihlcnJvciA9PiB7XG4gICAgICAvLyBhbGwgbG9naW5zIGFyZSBpbnZhbGlkIGFmdGVyIGRpc2Nvbm5lY3Rpb25cbiAgICAgIHRoaXMuX2xvZ2lucyA9IG5ldyBNYXAoKTtcblxuICAgICAgLy8gZXJyb3Llhpnov5tmaWxlXG5cbiAgICAgIGlmICghd3NPcGVuZWQpIHtcbiAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIHdzIG9wZW4gZmFpbGVkIHdpdGggd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpO1xuICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgIC8vICAgYCR7XG4gICAgICAgIC8vICAgICB0aGlzLnNwZWNpYWxOdW1iZXJcbiAgICAgICAgLy8gICB9IFtyZWFsdGltZV0gd3Mgb3BlbiBmYWlsZWQgd2l0aCB3cyBldmVudDogZXJyb3IgJHtlcnJvcn0gXFxuYFxuICAgICAgICAvLyApXG5cbiAgICAgICAgcmVqZWN0KGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMuX2NvbnRleHQuZGVidWcgJiZcbiAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSB3cyBldmVudDogZXJyb3InLCBldmVudCk7XG5cbiAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAvLyAgIGAke3RoaXMuc3BlY2lhbE51bWJlcn0gW3JlYWx0aW1lXSB3cyBldmVudDogZXJyb3IgJHtlcnJvcn0gXFxuYFxuICAgICAgICAvLyApXG5cbiAgICAgICAgdGhpcy5jbGVhckhlYXJ0YmVhdCgpO1xuICAgICAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuZm9yRWFjaChjbGllbnQgPT4gY2xpZW50LmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfV0VCU09DS0VUX0NPTk5FQ1RJT05fRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgIGVyck1zZzogZXZlbnQsXG4gICAgICAgIH0pKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFRPRE86IHJlY29ubmVjdFxuICAgIHRoaXMuX3dzLm9uY2xvc2UgPSAoY2xvc2VFdmVudCkgPT4ge1xuICAgICAgLy8gdGhpcy5fd3Mub24oXCJjbG9zZVwiLCAoY2xvc2VFdmVudCwgY2xvc2VyZWFzb24pID0+IHtcbiAgICAgIC8vIHRoaXMuX3dzLm9uQ2xvc2UoY2xvc2VFdmVudCA9PiB7XG4gICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogY2xvc2UnLCBjbG9zZUV2ZW50KTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAvLyAgIFwid3NjbG9zZS50eHRcIixcbiAgICAgIC8vICAgYCR7XG4gICAgICAvLyAgICAgdGhpcy5zcGVjaWFsTnVtYmVyXG4gICAgICAvLyAgIH0gW3JlYWx0aW1lXSB3cyBldmVudDogY2xvc2UgJHtjbG9zZUV2ZW50fSAke2Nsb3NlcmVhc29ufSBcXG5gXG4gICAgICAvLyApXG5cbiAgICAgIC8vIGFsbCBsb2dpbnMgYXJlIGludmFsaWQgYWZ0ZXIgZGlzY29ubmVjdGlvblxuICAgICAgdGhpcy5fbG9naW5zID0gbmV3IE1hcCgpO1xuXG4gICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KCk7XG4gICAgICBzd2l0Y2ggKGNsb3NlRXZlbnQuY29kZSkge1xuICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuUmVjb25uZWN0V2ViU29ja2V0OiB7XG4gICAgICAgICAgLy8ganVzdCBpZ25vcmVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9SZWFsdGltZUxpc3RlbmVyczoge1xuICAgICAgICAgIC8vIHF1aXRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuSGVhcnRiZWF0UGluZ0Vycm9yOlxuICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuSGVhcnRiZWF0UG9uZ1RpbWVvdXRFcnJvcjpcbiAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLk5vcm1hbENsb3N1cmU6XG4gICAgICAgIGNhc2UgQ0xPU0VfRVZFTlRfQ09ERS5BYm5vcm1hbENsb3N1cmU6IHtcbiAgICAgICAgICAvLyBOb3JtYWwgQ2xvc3VyZSBhbmQgQWJub3JtYWwgQ2xvc3VyZTpcbiAgICAgICAgICAvLyAgIGV4cGVjdGVkIGNsb3N1cmUsIG1vc3QgbGlrZWx5IGRpc3BhdGNoZWQgYnkgd2VjaGF0IGNsaWVudCxcbiAgICAgICAgICAvLyAgIHNpbmNlIHRoaXMgaXMgdGhlIHN0YXR1cyBjb2RlIGRpc3BhdGNoZWQgaW4gY2FzZSBvZiBuZXR3b3JrIGZhaWx1cmUsXG4gICAgICAgICAgLy8gICB3ZSBzaG91bGQgcmV0cnlcblxuICAgICAgICAgIGlmICh0aGlzLl9tYXhSZWNvbm5lY3QgPiAwKSB7XG4gICAgICAgICAgICAvLyBpZiAodGhpcy5fYXZhaWxhYmxlUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSwgdGhpcy5fbWF4UmVjb25uZWN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9BdXRoZW50aWNhdGlvbjoge1xuICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUsIGNsb3NlRXZlbnQucmVhc29uKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIHdlIHNob3VsZCByZXRyeSBieSBkZWZhdWx0XG4gICAgICAgICAgaWYgKHRoaXMuX21heFJlY29ubmVjdCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbih0cnVlLCB0aGlzLl9tYXhSZWNvbm5lY3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgW3JlYWx0aW1lXSB1bnJlY29nbml6ZSB3cyBjbG9zZSBldmVudGAsIGNsb3NlRXZlbnQpXG4gICAgICAgICAgLy8gdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fd3Mub25tZXNzYWdlID0gKHJlcykgPT4ge1xuICAgICAgLy8gdGhpcy5fd3Mub24oXCJtZXNzYWdlXCIsIHJlcyA9PiB7XG4gICAgICAvLyB0aGlzLl93cy5vbk1lc3NhZ2UocmVzID0+IHtcbiAgICAgIC8vIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG4gICAgICBjb25zdCByYXdNc2cgPSByZXMuZGF0YTtcblxuICAgICAgLy8gcmVzZXQgJiByZXN0YXJ0IGhlYXJ0YmVhdFxuICAgICAgdGhpcy5oZWFydGJlYXQoKTtcblxuICAgICAgbGV0IG1zZzogSVJlc3BvbnNlTWVzc2FnZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbXNnID0gSlNPTi5wYXJzZShyYXdNc2cgYXMgc3RyaW5nKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbcmVhbHRpbWVdIG9uTWVzc2FnZSBwYXJzZSByZXMuZGF0YSBlcnJvcjogJHtlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtyZWFsdGltZV0gb25NZXNzYWdlICR7XG4gICAgICAvLyAgICAgbXNnLm1zZ1R5cGVcbiAgICAgIC8vICAgfSAoJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9KWAsXG4gICAgICAvLyAgIG1zZ1xuICAgICAgLy8gKVxuXG4gICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgLy8g5om+5Yiw5b2T5YmN55uR5ZCs77yM5bm25bCGZXJyb3Lov5Tlm55cbiAgICAgICAgbGV0IHZpcnR1YWxXYXRjaCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0ud2F0Y2hJZCA9PT0gbXNnLndhdGNoSWQpIHtcbiAgICAgICAgICAgIHZpcnR1YWxXYXRjaCA9IGl0ZW07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodmlydHVhbFdhdGNoKSB7XG4gICAgICAgICAgdmlydHVhbFdhdGNoLmxpc3RlbmVyLm9uRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZVdhaXRTcGVjID0gdGhpcy5fd3NSZXNwb25zZVdhaXQuZ2V0KG1zZy5yZXF1ZXN0SWQpO1xuICAgICAgaWYgKHJlc3BvbnNlV2FpdFNwZWMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlV2FpdFNwZWMucmVqZWN0KG5ldyBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKG1zZykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZVdhaXRTcGVjLnJlc29sdmUobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICd3cyBvbk1lc3NhZ2UgcmVzcG9uc2VXYWl0U3BlYy5yZXNvbHZlKG1zZykgZXJyb3JlZDonLFxuICAgICAgICAgICAgZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5fd3NSZXNwb25zZVdhaXQuZGVsZXRlKG1zZy5yZXF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZVdhaXRTcGVjLnNraXBPbk1lc3NhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1zZy5tc2dUeXBlID09PSAnUE9ORycpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RQaW5nU2VuZFRTKSB7XG4gICAgICAgICAgY29uc3QgcnR0ID0gRGF0ZS5ub3coKSAtIHRoaXMuX2xhc3RQaW5nU2VuZFRTO1xuICAgICAgICAgIGlmIChydHQgPiBERUZBVUxUX1VOVFJVU1RFRF9SVFRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtyZWFsdGltZV0gdW50cnVzdGVkIHJ0dCBvYnNlcnZlZDogJHtydHR9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9ydHRPYnNlcnZlZC5sZW5ndGggPj0gTUFYX1JUVF9PQlNFUlZFRCkge1xuICAgICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQuc3BsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0aGlzLl9ydHRPYnNlcnZlZC5sZW5ndGggLSBNQVhfUlRUX09CU0VSVkVEICsgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQucHVzaChydHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGNsaWVudCA9IG1zZy53YXRjaElkICYmIHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuZ2V0KG1zZy53YXRjaElkKTtcbiAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgY2xpZW50Lm9uTWVzc2FnZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETywgdGhpcyBpcyBhIHRlbXBvcmFyeSBmaXggZG9uZSBmb3Igc2VydmVyXG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBbcmVhbHRpbWVdIG5vIHJlYWx0aW1lIGxpc3RlbmVyIGZvdW5kIHJlc3BvbnNpYmxlIGZvciB3YXRjaElkICR7bXNnLndhdGNoSWR9OiBgLFxuICAgICAgICAgIG1zZ1xuICAgICAgICApO1xuICAgICAgICAvLyB9XG4gICAgICAgIHN3aXRjaCAobXNnLm1zZ1R5cGUpIHtcbiAgICAgICAgICBjYXNlICdJTklUX0VWRU5UJzpcbiAgICAgICAgICBjYXNlICdORVhUX0VWRU5UJzpcbiAgICAgICAgICBjYXNlICdDSEVDS19FVkVOVCc6IHtcbiAgICAgICAgICAgIGNsaWVudCA9IHRoaXMuX3F1ZXJ5SWRDbGllbnRNYXAuZ2V0KG1zZy5tc2dEYXRhLnF1ZXJ5SUQpO1xuICAgICAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbLGNsaWVudF0gb2YgQXJyYXkuZnJvbSh0aGlzLl93YXRjaElkQ2xpZW50TWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3dhdGNoaWQqKioqKicsIHdhdGNoSWQpXG4gICAgICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaGVhcnRiZWF0KCk7XG4gIH0pO1xuXG4gIHByaXZhdGUgaXNXU0Nvbm5lY3RlZCA9ICgpOiBib29sZWFuID0+IEJvb2xlYW4odGhpcy5fd3MgJiYgdGhpcy5fd3MucmVhZHlTdGF0ZSA9PT0gV1NfUkVBRFlfU1RBVEUuT1BFTik7XG5cbiAgcHJpdmF0ZSBvbmNlV1NDb25uZWN0ZWQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dzSW5pdFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl93c0luaXRQcm9taXNlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5wdXNoKHtcbiAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgcmVqZWN0LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSB3ZWJMb2dpbiA9IGFzeW5jIChcbiAgICBlbnZJZD86IHN0cmluZyxcbiAgICByZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPGFueT4gPT4ge1xuICAgIGlmICghcmVmcmVzaCkge1xuICAgICAgLy8gbGV0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2luSW5mb1xuICAgICAgaWYgKGVudklkKSB7XG4gICAgICAgIGNvbnN0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2lucy5nZXQoZW52SWQpO1xuICAgICAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICAgICAgaWYgKGxvZ2luSW5mby5sb2dnZWRJbiAmJiBsb2dpbkluZm8ubG9naW5SZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gbG9naW46IGFscmVhZHkgbG9nZ2VkIGluJylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiBsb2dpbkluZm8ubG9naW5SZXN1bHQ7XG4gICAgICAgICAgfSBpZiAobG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVtcHR5RW52TG9naW5JbmZvID0gdGhpcy5fbG9naW5zLmdldCgnJyk7XG4gICAgICAgIGlmIChlbXB0eUVudkxvZ2luSW5mbz8ubG9nZ2luZ0luUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiBlbXB0eUVudkxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGxvZ2luOiBsb2dnaW5nIGluJylcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxJTG9naW5SZXN1bHQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmF0dXJlKGVudklkLCByZWZyZXNoKVxuXG4gICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKCk7XG5cbiAgICAgICAgLy8gY29uc3Qgd3hWZXJzaW9uID0gZ2V0V1hWZXJzaW9uKClcbiAgICAgICAgY29uc3QgbXNnRGF0YTogSVJlcXVlc3RNZXNzYWdlTG9naW5EYXRhID0ge1xuICAgICAgICAgIGVudklkOiB3c1NpZ24uZW52SWQgfHwgJycsXG4gICAgICAgICAgYWNjZXNzVG9rZW46ICcnLCAvLyDlt7Llup/lvIPlrZfmrrVcbiAgICAgICAgICAvLyBzaWduU3RyOiBzaWduYXR1cmUuc2lnblN0cixcbiAgICAgICAgICAvLyBzZWNyZXRWZXJzaW9uOiBzaWduYXR1cmUuc2VjcmV0VmVyc2lvbixcbiAgICAgICAgICByZWZlcnJlcjogJ3dlYicsXG4gICAgICAgICAgc2RrVmVyc2lvbjogJycsXG4gICAgICAgICAgZGF0YVZlcnNpb246ICcnLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsb2dpbk1zZzogSVJlcXVlc3RNZXNzYWdlTG9naW5Nc2cgPSB7XG4gICAgICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgbXNnVHlwZTogJ0xPR0lOJyxcbiAgICAgICAgICBtc2dEYXRhLFxuICAgICAgICAgIGV4TXNnRGF0YToge1xuICAgICAgICAgICAgcnVudGltZTogZ2V0UnVudGltZSgpLFxuICAgICAgICAgICAgc2lnblN0cjogd3NTaWduLnNpZ25TdHIsXG4gICAgICAgICAgICBzZWNyZXRWZXJzaW9uOiB3c1NpZ24uc2VjcmV0VmVyc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsb2dpblJlc01zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2c+KHtcbiAgICAgICAgICBtc2c6IGxvZ2luTXNnLFxuICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBza2lwT25NZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIHRpbWVvdXQ6IERFRkFVTFRfTE9HSU5fVElNRU9VVCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFsb2dpblJlc01zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgICAvLyBsb2dpbiBzdWNjZXNzXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBlbnZJZDogd3NTaWduLmVudklkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGxvZ2luIGZhaWxlZFxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7bG9naW5SZXNNc2cubXNnRGF0YS5jb2RlfSAke2xvZ2luUmVzTXNnLm1zZ0RhdGEubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gbGV0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2luSW5mb1xuICAgIGxldCBsb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLl9sb2dpbnMuZ2V0KGVudklkKTtcblxuICAgIGNvbnN0IGxvZ2luU3RhcnRUUyA9IERhdGUubm93KCk7XG5cbiAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZTtcbiAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gcHJvbWlzZTtcbiAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSBsb2dpblN0YXJ0VFM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2luSW5mbyA9IHtcbiAgICAgICAgbG9nZ2VkSW46IGZhbHNlLFxuICAgICAgICBsb2dnaW5nSW5Qcm9taXNlOiBwcm9taXNlLFxuICAgICAgICBsb2dpblN0YXJ0VFMsXG4gICAgICB9O1xuICAgICAgLy8gdGhpcy5fbG9naW5JbmZvID0gbG9naW5JbmZvXG4gICAgICB0aGlzLl9sb2dpbnMuc2V0KGVudklkIHx8ICcnLCBsb2dpbkluZm8pO1xuICAgIH1cblxuICAgIC8vIHRyeSB7XG4gICAgLy8gICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IHByb21pc2VcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IHRydWVcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgLy8gICBsb2dpbkluZm8ubG9naW5TdGFydFRTID0gdW5kZWZpbmVkXG4gICAgLy8gICBsb2dpbkluZm8ubG9naW5SZXN1bHQgPSBsb2dpblJlc3VsdFxuICAgIC8vICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gICAgLy8gfSBjYXRjaCAoZSkge1xuICAgIC8vICAgbG9naW5JbmZvLmxvZ2dlZEluID0gZmFsc2VcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgLy8gICBsb2dpbkluZm8ubG9naW5TdGFydFRTID0gdW5kZWZpbmVkXG4gICAgLy8gICBsb2dpbkluZm8ubG9naW5SZXN1bHQgPSB1bmRlZmluZWRcbiAgICAvLyAgIHRocm93IGVcbiAgICAvLyB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgY29uc3QgY3VyTG9naW5JbmZvID0gZW52SWQgJiYgdGhpcy5fbG9naW5zLmdldChlbnZJZCk7XG4gICAgICBpZiAoXG4gICAgICAgIGN1ckxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8gPT09IGxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8ubG9naW5TdGFydFRTID09PSBsb2dpblN0YXJ0VFNcbiAgICAgICkge1xuICAgICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlO1xuICAgICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHQ7XG4gICAgICAgIHJldHVybiBsb2dpblJlc3VsdDtcbiAgICAgIH0gaWYgKGN1ckxvZ2luSW5mbykge1xuICAgICAgICBpZiAoY3VyTG9naW5JbmZvLmxvZ2dlZEluICYmIGN1ckxvZ2luSW5mby5sb2dpblJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBjdXJMb2dpbkluZm8ubG9naW5SZXN1bHQ7XG4gICAgICAgIH0gaWYgKGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd3MgdW5leHBlY3RlZCBsb2dpbiBpbmZvJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIGxvZ2luIGluZm8gcmVzZXQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZTtcbiAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZDtcbiAgICAgIGxvZ2luSW5mby5sb2dpblJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgZ2V0V3NTaWduID0gYXN5bmMgKCk6IFByb21pc2U8SVdzU2lnbj4gPT4ge1xuICAgIGlmICh0aGlzLl93c1NpZ24gJiYgdGhpcy5fd3NTaWduLmV4cGlyZWRUcyA+IERhdGUubm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl93c1NpZ247XG4gICAgfVxuICAgIGNvbnN0IGV4cGlyZWRUcyA9IERhdGUubm93KCkgKyA2MDAwMDtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9jb250ZXh0LmFwcENvbmZpZy5yZXF1ZXN0LnNlbmQoJ2F1dGgud3NXZWJTaWduJywgeyBydW50aW1lOiBnZXRSdW50aW1lKCkgfSk7XG5cbiAgICBpZiAocmVzLmNvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pTogJHtyZXMuY29kZX1gKTtcbiAgICB9XG5cbiAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgIGNvbnN0IHsgc2lnblN0ciwgd3NVcmwsIHNlY3JldFZlcnNpb24sIGVudklkIH0gPSByZXMuZGF0YTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNpZ25TdHIsXG4gICAgICAgIHdzVXJsLFxuICAgICAgICBzZWNyZXRWZXJzaW9uLFxuICAgICAgICBlbnZJZCxcbiAgICAgICAgZXhwaXJlZFRzLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbdGNiLWpzLXNka10g6I635Y+W5a6e5pe25pWw5o2u5o6o6YCB55m75b2V56Wo5o2u5aSx6LSlJyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gREVGQVVMVF9FWFBFQ1RFRF9FVkVOVF9XQUlUX1RJTUU7XG4gICAgfVxuXG4gICAgLy8gMS41ICogUlRUXG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLl9ydHRPYnNlcnZlZC5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKyBjdXIpXG4gICAgICAgIC8gdGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoKVxuICAgICAgKiAxLjVcbiAgICApO1xuICB9O1xuXG4gIHByaXZhdGUgaGVhcnRiZWF0KGltbWVkaWF0ZT86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNsZWFySGVhcnRiZWF0KCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuX3BpbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghdGhpcy5fd3MgfHwgdGhpcy5fd3MucmVhZHlTdGF0ZSAhPT0gV1NfUkVBRFlfU1RBVEUuT1BFTikge1xuICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBwaW5nXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fbGFzdFBpbmdTZW5kVFMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGluZygpO1xuICAgICAgICAgIHRoaXMuX3BpbmdGYWlsZWQgPSAwO1xuXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHRoaXMuX3BvbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3BvbmcgdGltZWQgb3V0Jyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fcG9uZ01pc3NlZCA8IERFRkFVTFRfUE9OR19NSVNTX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICB0aGlzLl9wb25nTWlzc2VkKys7XG4gICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0KHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbG9naWNhbCBwZXJjZWl2ZWQgY29ubmVjdGlvbiBsb3N0LCBldmVuIHRob3VnaCB3ZWJzb2NrZXQgZGlkIG5vdCByZWNlaXZlIGVycm9yIG9yIGNsb3NlIGV2ZW50XG4gICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQb25nV2FpdFRpbWVvdXQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3BpbmdGYWlsZWQgPCBERUZBVUxUX1BJTkdfRkFJTF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHRoaXMuX3BpbmdGYWlsZWQrKztcbiAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoQ0xPU0VfRVZFTlRfQ09ERS5IZWFydGJlYXRQaW5nRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGltbWVkaWF0ZSA/IDAgOiB0aGlzLl9jb250ZXh0LmFwcENvbmZpZy5yZWFsdGltZVBpbmdJbnRlcnZhbFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHBpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbXNnOiBJUmVxdWVzdE1lc3NhZ2VQaW5nTXNnID0ge1xuICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgIG1zZ1R5cGU6ICdQSU5HJyxcbiAgICAgIG1zZ0RhdGE6IG51bGwsXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgbXNnLFxuICAgIH0pO1xuICAgIC8vIGNvbnNvbGUubG9nKCdwaW5nIHNlbnQnKVxuICB9O1xuXG4gIHByaXZhdGUgb25XYXRjaFN0YXJ0ID0gKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB7XG4gICAgdGhpcy5fcXVlcnlJZENsaWVudE1hcC5zZXQocXVlcnlJRCwgY2xpZW50KTtcbiAgfTtcblxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZSA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChxdWVyeUlEKSB7XG4gICAgICB0aGlzLl9xdWVyeUlkQ2xpZW50TWFwLmRlbGV0ZShxdWVyeUlEKTtcbiAgICB9XG4gICAgdGhpcy5fd2F0Y2hJZENsaWVudE1hcC5kZWxldGUoY2xpZW50LndhdGNoSWQpO1xuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5kZWxldGUoY2xpZW50KTtcblxuICAgIGlmICghdGhpcy5fdmlydHVhbFdTQ2xpZW50LnNpemUpIHtcbiAgICAgIC8vIG5vIG1vcmUgZXhpc3Rpbmcgd2F0Y2gsIHdlIHNob3VsZCByZWxlYXNlIHRoZSB3ZWJzb2NrZXQgY29ubmVjdGlvblxuICAgICAgdGhpcy5jbG9zZShDTE9TRV9FVkVOVF9DT0RFLk5vUmVhbHRpbWVMaXN0ZW5lcnMpO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==