mftsccs-node 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.js CHANGED
@@ -4241,6 +4241,7 @@ class FilterSearch {
4241
4241
  this.search = "";
4242
4242
  this.logicoperator = "=";
4243
4243
  this.index = 0;
4244
+ this.composition = true;
4244
4245
  }
4245
4246
  }
4246
4247
 
@@ -6071,6 +6072,7 @@ class SearchQuery {
6071
6072
  this.textSearch = "";
6072
6073
  this.logic = "or";
6073
6074
  this.reverse = false;
6075
+ this.doFilter = false;
6074
6076
  this.filterSearches = [];
6075
6077
  this.selectors = [];
6076
6078
  }
@@ -6391,6 +6393,8 @@ __webpack_require__.r(__webpack_exports__);
6391
6393
  /* harmony export */ });
6392
6394
  /* harmony import */ var _UserNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./UserNode */ "./src/DataStructures/User/UserNode.ts");
6393
6395
  /* harmony import */ var _IdentifierFlags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../IdentifierFlags */ "./src/DataStructures/IdentifierFlags.ts");
6396
+ /* harmony import */ var _Local_LConnection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Local/LConnection */ "./src/DataStructures/Local/LConnection.ts");
6397
+ /* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../app */ "./src/app.ts");
6394
6398
  var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
6395
6399
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6396
6400
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -6402,6 +6406,8 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume
6402
6406
  };
6403
6407
 
6404
6408
 
6409
+
6410
+
6405
6411
  class UserBinaryTree {
6406
6412
  static compositeKey(userId, sessionId) {
6407
6413
  let userHex = ('0000' + userId.toString(16).toUpperCase()).slice(-4);
@@ -6438,7 +6444,14 @@ class UserBinaryTree {
6438
6444
  ;
6439
6445
  static addConceptToTree(concept, userId, sessionId = 999) {
6440
6446
  let key = this.compositeKey(userId, sessionId);
6441
- var node = new _UserNode__WEBPACK_IMPORTED_MODULE_0__.UserNode(key, concept, null, null);
6447
+ let FakeConnection = new _Local_LConnection__WEBPACK_IMPORTED_MODULE_2__.LConnection(0, 0, 0, 0, 0, 0);
6448
+ var node = new _UserNode__WEBPACK_IMPORTED_MODULE_0__.UserNode(key, concept, FakeConnection, null, null);
6449
+ this.addNodeToTree(node);
6450
+ }
6451
+ static addConnectionToTree(connection, userId, sessionId = 999) {
6452
+ let key = this.compositeKey(userId, sessionId);
6453
+ let FakeConcept = (0,_app__WEBPACK_IMPORTED_MODULE_3__.CreateDefaultLConcept)();
6454
+ var node = new _UserNode__WEBPACK_IMPORTED_MODULE_0__.UserNode(key, FakeConcept, connection, null, null);
6442
6455
  this.addNodeToTree(node);
6443
6456
  }
6444
6457
  static getNodeFromTree(userId, sessionId) {
@@ -6488,11 +6501,17 @@ __webpack_require__.r(__webpack_exports__);
6488
6501
  /* harmony export */ UserNode: () => (/* binding */ UserNode)
6489
6502
  /* harmony export */ });
6490
6503
  class UserNode {
6491
- constructor(key, value, leftNode, rightNode) {
6504
+ constructor(key, value, connectionValue, leftNode, rightNode) {
6505
+ this.connectionValue = [];
6492
6506
  this.value = [];
6493
6507
  this.height = 1;
6494
6508
  this.key = key;
6495
- this.value.push(value);
6509
+ if (value.id > 0) {
6510
+ this.value.push(value);
6511
+ }
6512
+ if (connectionValue.id > 0) {
6513
+ this.connectionValue.push(connectionValue);
6514
+ }
6496
6515
  this.leftNode = leftNode;
6497
6516
  this.rightNode = rightNode;
6498
6517
  }
@@ -6511,6 +6530,7 @@ class UserNode {
6511
6530
  }
6512
6531
  else {
6513
6532
  node.value.push(...passedNode.value);
6533
+ node.connectionValue.push(...passedNode.connectionValue);
6514
6534
  return node;
6515
6535
  }
6516
6536
  node.height = 1 + Math.max(this.getHeight(node.leftNode), this.getHeight(node.rightNode));
@@ -10709,10 +10729,13 @@ function UpdateComposition(patcherStructure) {
10709
10729
  __webpack_require__.r(__webpack_exports__);
10710
10730
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10711
10731
  /* harmony export */ AddGhostConcept: () => (/* binding */ AddGhostConcept),
10732
+ /* harmony export */ AddGhostConnection: () => (/* binding */ AddGhostConnection),
10733
+ /* harmony export */ GetUserGhostConnectionId: () => (/* binding */ GetUserGhostConnectionId),
10712
10734
  /* harmony export */ GetUserGhostId: () => (/* binding */ GetUserGhostId)
10713
10735
  /* harmony export */ });
10714
10736
  /* harmony import */ var _Services_Local_CreateDefaultLConcept__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../Services/Local/CreateDefaultLConcept */ "./src/Services/Local/CreateDefaultLConcept.ts");
10715
10737
  /* harmony import */ var _DataStructures_User_UserBinaryTree__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../DataStructures/User/UserBinaryTree */ "./src/DataStructures/User/UserBinaryTree.ts");
10738
+ /* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app */ "./src/app.ts");
10716
10739
  var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
10717
10740
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10718
10741
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -10724,10 +10747,10 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume
10724
10747
  };
10725
10748
 
10726
10749
 
10750
+
10727
10751
  function GetUserGhostId(userId, ghostId, sessionId = 999) {
10728
10752
  return __awaiter(this, void 0, void 0, function* () {
10729
10753
  let userNode = yield _DataStructures_User_UserBinaryTree__WEBPACK_IMPORTED_MODULE_1__.UserBinaryTree.getNodeFromTree(userId, sessionId);
10730
- console.log("this is the ghost id", userId, sessionId);
10731
10754
  let realConcept = (0,_Services_Local_CreateDefaultLConcept__WEBPACK_IMPORTED_MODULE_0__.CreateDefaultLConcept)();
10732
10755
  if (userNode) {
10733
10756
  for (let i = 0; i < userNode.value.length; i++) {
@@ -10740,11 +10763,29 @@ function GetUserGhostId(userId, ghostId, sessionId = 999) {
10740
10763
  return realConcept;
10741
10764
  });
10742
10765
  }
10766
+ function GetUserGhostConnectionId(userId, ghostId, sessionId = 999) {
10767
+ return __awaiter(this, void 0, void 0, function* () {
10768
+ let userNode = yield _DataStructures_User_UserBinaryTree__WEBPACK_IMPORTED_MODULE_1__.UserBinaryTree.getNodeFromTree(userId, sessionId);
10769
+ let realConnection = new _app__WEBPACK_IMPORTED_MODULE_2__.LConnection(0, 0, 0, 0, 0, 0);
10770
+ if (userNode) {
10771
+ for (let i = 0; i < userNode.connectionValue.length; i++) {
10772
+ let testConnection = userNode.connectionValue[i];
10773
+ if (testConnection.ghostId == ghostId) {
10774
+ realConnection = testConnection;
10775
+ }
10776
+ }
10777
+ }
10778
+ return realConnection;
10779
+ });
10780
+ }
10743
10781
  function AddGhostConcept(concept, userId, sessionId = 999) {
10744
10782
  return __awaiter(this, void 0, void 0, function* () {
10745
- console.log("adding this to ghost id", userId, sessionId);
10746
10783
  _DataStructures_User_UserBinaryTree__WEBPACK_IMPORTED_MODULE_1__.UserBinaryTree.addConceptToTree(concept, userId, sessionId);
10747
- console.log("this is the added node", _DataStructures_User_UserBinaryTree__WEBPACK_IMPORTED_MODULE_1__.UserBinaryTree.root);
10784
+ });
10785
+ }
10786
+ function AddGhostConnection(connection, userId, sessionId = 999) {
10787
+ return __awaiter(this, void 0, void 0, function* () {
10788
+ _DataStructures_User_UserBinaryTree__WEBPACK_IMPORTED_MODULE_1__.UserBinaryTree.addConnectionToTree(connection, userId, sessionId);
10748
10789
  });
10749
10790
  }
10750
10791
 
@@ -10823,6 +10864,7 @@ function ViewInternalData(ids) {
10823
10864
  __webpack_require__.r(__webpack_exports__);
10824
10865
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10825
10866
  /* harmony export */ AddGhostConcept: () => (/* reexport safe */ _Services_User_UserTranslation__WEBPACK_IMPORTED_MODULE_48__.AddGhostConcept),
10867
+ /* harmony export */ AddGhostConnection: () => (/* reexport safe */ _Services_User_UserTranslation__WEBPACK_IMPORTED_MODULE_48__.AddGhostConnection),
10826
10868
  /* harmony export */ BaseUrl: () => (/* reexport safe */ _DataStructures_BaseUrl__WEBPACK_IMPORTED_MODULE_74__.BaseUrl),
10827
10869
  /* harmony export */ BinaryTree: () => (/* reexport safe */ _DataStructures_BinaryTree__WEBPACK_IMPORTED_MODULE_61__.BinaryTree),
10828
10870
  /* harmony export */ Composition: () => (/* reexport safe */ _DataStructures_Composition_Composition__WEBPACK_IMPORTED_MODULE_65__.Composition),
@@ -10878,6 +10920,7 @@ __webpack_require__.r(__webpack_exports__);
10878
10920
  /* harmony export */ GetRelation: () => (/* reexport safe */ _Services_GetRelation__WEBPACK_IMPORTED_MODULE_42__.GetRelation),
10879
10921
  /* harmony export */ GetRelationRaw: () => (/* reexport safe */ _Services_GetRelation__WEBPACK_IMPORTED_MODULE_42__.GetRelationRaw),
10880
10922
  /* harmony export */ GetTheConcept: () => (/* reexport safe */ _Services_GetTheConcept__WEBPACK_IMPORTED_MODULE_11__["default"]),
10923
+ /* harmony export */ GetUserGhostConnectionId: () => (/* reexport safe */ _Services_User_UserTranslation__WEBPACK_IMPORTED_MODULE_48__.GetUserGhostConnectionId),
10881
10924
  /* harmony export */ GetUserGhostId: () => (/* reexport safe */ _Services_User_UserTranslation__WEBPACK_IMPORTED_MODULE_48__.GetUserGhostId),
10882
10925
  /* harmony export */ LConcept: () => (/* reexport safe */ _DataStructures_Local_LConcept__WEBPACK_IMPORTED_MODULE_56__.LConcept),
10883
10926
  /* harmony export */ LConnection: () => (/* reexport safe */ _DataStructures_Local_LConnection__WEBPACK_IMPORTED_MODULE_57__.LConnection),
@@ -11175,4 +11218,4 @@ function init(url = "", aiurl = "", accessToken = "") {
11175
11218
  /******/
11176
11219
  /******/ })()
11177
11220
  ;
11178
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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Z0U7QUFDekQ7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx5RUFBcUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQ0FBZ0M7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwV0EsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ3FEO0FBQ0g7QUFDM0M7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQSxZQUFZLDZEQUFlO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwyREFBYztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsMEJBQTBCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywwQkFBMEI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xHQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDNEU7QUFDbEM7QUFDeUM7QUFDSjtBQUN4RTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUNBQWlDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxvRUFBZTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxvRUFBZTtBQUMzQixZQUFZLDRGQUFvQjtBQUNoQyxZQUFZLHdGQUFrQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNEZBQW9CO0FBQ2hDLFlBQVksd0ZBQWtCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrQkFBK0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUVBQWtCO0FBQzlCLFlBQVksNEZBQW9CO0FBQ2hDLFlBQVksd0ZBQWtCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNEZBQW9CO0FBQ25DO0FBQ0E7QUFDQSxlQUFlLHdGQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLCtCQUErQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLG1EQUFVO0FBQzdDLDZCQUE2Qiw0RkFBb0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsNkJBQTZCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix3RkFBa0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywwQkFBMEI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyw2QkFBNkI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNoSU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDUE87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDVk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCbUY7QUFDNUU7QUFDUDtBQUNBO0FBQ0Esb0JBQW9CLDRGQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDakJPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixNQUFNO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywwQkFBMEI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdDQUFnQztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1ZUEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE1BQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLDBCQUEwQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsMEJBQTBCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQ0FBZ0M7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3RoQk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1RBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUMyRTtBQUNwQjtBQUNoRDtBQUNQO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxtRUFBYztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsdUZBQXdCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQzlDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNQTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDZk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDVk87QUFDUDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNGTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ2RPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNOTztBQUNQO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDMEQ7QUFDYztBQUNNO0FBQ2pDO0FBQ0s7QUFDM0M7QUFDUDtBQUNBO0FBQ0Esd0JBQXdCLG1DQUFtQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQ0FBbUM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscUNBQXFDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFDQUFxQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1DQUFtQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscUNBQXFDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLG1DQUFtQztBQUMvRCxnQkFBZ0Isc0RBQVk7QUFDNUI7QUFDQSw0QkFBNEIscUNBQXFDO0FBQ2pFLGdCQUFnQiwyREFBYztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvRkFBbUI7QUFDbkM7QUFDQTtBQUNBLGtDQUFrQyxvQ0FBb0M7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMEZBQXNCO0FBQzVDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsbUNBQW1DO0FBQ25FLG9CQUFvQixvRUFBZTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxxQ0FBcUM7QUFDckUsb0JBQW9CLG9FQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNoSE87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixLQUFLO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDZE87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2RBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNzQztBQUNpQjtBQUNoRDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsWUFBWSw2REFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0NBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNqRk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUpBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUM0RDtBQUN0QjtBQUMvQjtBQUNQLFdBQVcsK0NBQU87QUFDbEI7QUFDTztBQUNQO0FBQ087QUFDUCwyQkFBMkIsb0VBQVc7QUFDdEM7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7QUNuQ0E7QUFDTztBQUNQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0YwRDtBQUNjO0FBQ2pFO0FBQ1AsdUJBQXVCLG9GQUFvQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix3QkFBd0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHdCQUF3QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCw4QkFBOEIsa0VBQVU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsOEJBQThCLGtFQUFVO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNITztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3BCZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTGtFO0FBQzNEO0FBQ1Asb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBO0FBQ0EsZ0JBQWdCLDBFQUFjO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQkFBb0IsMkJBQTJCO0FBQy9DO0FBQ0EsWUFBWSwwRUFBYztBQUMxQjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDZ0U7QUFDVztBQUNIO0FBQ3hFO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsbUVBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsbUVBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwyQkFBMkI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsbUVBQWE7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQscUVBQVk7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsbUVBQWE7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0ZBQW9CO0FBQ3RDLG9CQUFvQix3QkFBd0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbElBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNnRTtBQUMwQjtBQUMxQjtBQUNkO0FBQ0s7QUFDSjtBQUN3QjtBQUNvQjtBQUMvQjtBQUNoRTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvR0FBcUI7QUFDN0M7QUFDQSw0QkFBNEIscUVBQVk7QUFDeEM7QUFDQSx3Q0FBd0MsMkRBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxtR0FBOEI7QUFDM0U7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDJCQUEyQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwrREFBYztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0dBQXFCO0FBQzdDO0FBQ0EsNEJBQTRCLHFFQUFZO0FBQ3hDO0FBQ0Esd0NBQXdDLDJEQUFVO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsbUdBQThCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwyQkFBMkI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtEQUFjO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMseUVBQWlCO0FBQ3REO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdGQUFXO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLG9FQUFpQjtBQUM5QztBQUNBLFFBQVEsb0dBQXFCO0FBQzdCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlGQUFpRjtBQUN6RyxxQ0FBcUMscUVBQVk7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx5RUFBb0I7QUFDcEQ7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdMQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDK0Q7QUFDWTtBQUNaO0FBQ1U7QUFDekU7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMkVBQW9CO0FBQzlDO0FBQ0E7QUFDQSw4QkFBOEIsZ0ZBQVc7QUFDekM7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLG1FQUFzQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGtGQUFtQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxtRUFBc0I7QUFDbEU7QUFDQTtBQUNBLCtDQUErQyxrRkFBbUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pFQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDa0Y7QUFDeUM7QUFDOUM7QUFDdEU7QUFDUDtBQUNBLHNCQUFzQiwwREFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGtEQUFZO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQSw0QkFBNEIsOENBQVk7QUFDeEM7QUFDQSw0QkFBNEIsMkZBQTBCO0FBQ3REO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0EsNEJBQTRCLDhDQUFZO0FBQ3hDO0FBQ0EsNEJBQTRCLG9JQUF5QztBQUNyRTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JEcUU7QUFDTjtBQUNRO0FBQ2hFO0FBQ1AscUJBQXFCLG1GQUFxQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9CQUFvQiwyRUFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCw0QkFBNEIsMEVBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkNBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNtRTtBQUNOO0FBQzlDO0FBQ2Y7QUFDQTtBQUNBLGdDQUFnQywrRUFBMEI7QUFDMUQ7QUFDQSw0QkFBNEIsd0JBQXdCO0FBQ3BEO0FBQ0EsZ0JBQWdCLHFFQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFCQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDNkU7QUFDbkI7QUFDSjtBQUNRO0FBQ1k7QUFDaEI7QUFDZDtBQUNrQjtBQUN2RDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsbUVBQXNCO0FBQ3ZFLG9DQUFvQyxrRUFBVTtBQUM5QyxZQUFZLDhEQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLG1FQUFzQjtBQUM1RCxnQ0FBZ0Msa0VBQVU7QUFDMUMsUUFBUSw4REFBUTtBQUNoQjtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsbUVBQXNCO0FBQ3BFLHNDQUFzQyx5RkFBeUI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDJFQUFvQjtBQUMvQyx3QkFBd0Isd0JBQXdCO0FBQ2hELGtDQUFrQywwREFBYTtBQUMvQztBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsbUVBQXNCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsbUVBQXNCO0FBQ3ZELDRCQUE0Qix3QkFBd0I7QUFDcEQsZ0JBQWdCLHVFQUFvQjtBQUNwQztBQUNBO0FBQ0EsZ0NBQWdDLGtFQUFVO0FBQzFDLGNBQWMsOERBQVE7QUFDdEIsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELG1FQUFzQjtBQUN2RSxvQ0FBb0Msa0VBQVU7QUFDOUMsWUFBWSw4REFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxtRUFBc0I7QUFDNUQsa0NBQWtDLHVGQUEwQjtBQUM1RDtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7OztBQ2pJb0Q7QUFDN0M7QUFDUDtBQUNBO0FBQ0Esc0JBQXNCLDREQUFPO0FBQzdCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05BLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUM4RDtBQUNGO0FBQ0U7QUFDL0M7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDJFQUFvQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxtRUFBc0I7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsbUVBQXNCO0FBQ3BFO0FBQ0E7QUFDQSwwQkFBMEIseUVBQW1CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLG1FQUFzQjtBQUNoRTtBQUNBLHNCQUFzQix5RUFBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcERBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUN3RTtBQUNwQjtBQUNRO0FBQ047QUFDaEI7QUFDdkI7QUFDZjtBQUNBLHVCQUF1QixvRUFBVztBQUNsQztBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNERBQU87QUFDakM7QUFDQSxRQUFRLDhEQUFRO0FBQ2hCO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBLHVCQUF1QixvRUFBVztBQUNsQztBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNERBQU87QUFDakM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQSx1QkFBdUIsb0VBQVc7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDREQUFPO0FBQ2pDLFFBQVEsOENBQVk7QUFDcEIsUUFBUSxvRkFBbUI7QUFDM0I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRDBEO0FBQ0o7QUFDL0M7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGtFQUFVO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw4REFBUTtBQUNaO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JCQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDMEQ7QUFDWTtBQUNoQjtBQUMvQztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhFQUFxQjtBQUM1Qyw2QkFBNkIsa0VBQVU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsOERBQVE7QUFDaEI7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pDQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDdUQ7QUFDcUI7QUFDbEI7QUFDUTtBQUNQO0FBQ2Y7QUFDckM7QUFDUDtBQUNBLDRCQUE0QiwwREFBYTtBQUN6QyxjQUFjLGtFQUFVO0FBQ3hCO0FBQ0E7QUFDQSxjQUFjLDBFQUFjO0FBQzVCLGNBQWMsb0ZBQW1CO0FBQ2pDLFFBQVEsdUVBQWtCO0FBQzFCLFFBQVEsaUVBQWdCO0FBQ3hCLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQzZEO0FBQ3NDO0FBQ0o7QUFDcEM7QUFDTjtBQUM5QztBQUNQO0FBQ0EsK0JBQStCLGtFQUFpQjtBQUNoRCxRQUFRLG9FQUFtQjtBQUMzQixRQUFRLHVFQUFrQjtBQUMxQixRQUFRLDJHQUFvQjtBQUM1QixRQUFRLHVHQUFrQjtBQUMxQixLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0QkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ3VEO0FBQ2hEO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDJCQUEyQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtRUFBYztBQUNoQztBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDa0U7QUFDM0Q7QUFDUDtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRCx1Q0FBdUMsMEVBQWM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQytDO0FBQ3dDO0FBQzFCO0FBQ0s7QUFDM0Q7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxtR0FBOEI7QUFDdkU7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDJCQUEyQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixxRUFBWTtBQUN4QztBQUNBLHNDQUFzQywyREFBVTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLG1HQUE4QjtBQUN2RTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFFQUFZO0FBQ3hDO0FBQ0Esc0NBQXNDLDJEQUFVO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsMEVBQWM7QUFDN0M7QUFDQTtBQUNBLHdCQUF3QiwyQkFBMkI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUVBQVk7QUFDeEM7QUFDQSxzQ0FBc0MsMkRBQVU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiwwRUFBYztBQUM3QztBQUNBLHdCQUF3QiwyQkFBMkI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUVBQVk7QUFDeEM7QUFDQSxzQ0FBc0MsMkRBQVU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDBFQUFjO0FBQzdDO0FBQ0Esd0JBQXdCLDJCQUEyQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixxRUFBWTtBQUN4QztBQUNBLHNDQUFzQywyREFBVTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFFQUFZO0FBQ3hDO0FBQ0Esc0NBQXNDLDJEQUFVO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsbUdBQThCO0FBQ3ZFO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFFQUFZO0FBQ3hDO0FBQ0Esc0NBQXNDLDJEQUFVO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUVBQVk7QUFDeEM7QUFDQSxzQ0FBc0MsMkRBQVU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxxRUFBWTtBQUN0RDtBQUNBO0FBQ0EsOENBQThDLDJEQUFVO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDJCQUEyQjtBQUN2RDtBQUNBO0FBQ0EsMENBQTBDLHFFQUFZO0FBQ3REO0FBQ0Esa0RBQWtELDJEQUFVO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QscUVBQVk7QUFDbEU7QUFDQTtBQUNBLDBEQUEwRCwyREFBVTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFFQUFZO0FBQ3hDO0FBQ0Esc0NBQXNDLDJEQUFVO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMscUVBQVk7QUFDdEQ7QUFDQTtBQUNBLDhDQUE4QywyREFBVTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDJCQUEyQjtBQUN2RDtBQUNBO0FBQ0EsMENBQTBDLHFFQUFZO0FBQ3REO0FBQ0Esa0RBQWtELDJEQUFVO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QscUVBQVk7QUFDbEU7QUFDQTtBQUNBLDBEQUEwRCwyREFBVTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1VkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQytGO0FBQ2xDO0FBQ3JCO0FBQ3lDO0FBQ3NCO0FBQ1g7QUFDckY7QUFDUDtBQUNBLGNBQWMsMkdBQWtDO0FBQ2hEO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4Qyw2QkFBNkIseUVBQXdCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQSxjQUFjLDJHQUFrQztBQUNoRDtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEMsNkJBQTZCLCtFQUE4QjtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0EsbUNBQW1DLHlFQUFpQjtBQUNwRDtBQUNBLG1DQUFtQyxvSEFBeUM7QUFDNUUsUUFBUSw4RkFBaUM7QUFDekM7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDLDZCQUE2QiwrRUFBOEI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0Esd0JBQXdCLHdCQUF3QjtBQUNoRCxtQ0FBbUMsZ0RBQWM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHlFQUFpQjtBQUMvQjtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQSw2QkFBNkIsK0VBQThCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckVBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNtRTtBQUM0QjtBQUNsQztBQUMrQjtBQUNoQztBQUM1RDtBQUNBO0FBQ087QUFDUDtBQUNBLDRCQUE0QixrRUFBcUI7QUFDakQ7QUFDQTtBQUNBLGtCQUFrQiwrRUFBb0I7QUFDdEMsb0NBQW9DLHFFQUFZO0FBQ2hEO0FBQ0E7QUFDQSxvQ0FBb0Msd0JBQXdCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJHQUFrQztBQUNwRCxvQ0FBb0Msd0JBQXdCO0FBQzVEO0FBQ0EsZ0RBQWdELHlFQUF3QjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBLDRCQUE0QixrRUFBcUI7QUFDakQ7QUFDQTtBQUNBLGtCQUFrQiwrRUFBb0I7QUFDdEMsb0NBQW9DLHFFQUFZO0FBQ2hEO0FBQ0E7QUFDQSxvQ0FBb0Msd0JBQXdCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJHQUFrQztBQUNwRCxvQ0FBb0Msd0JBQXdCO0FBQzVEO0FBQ0EsZ0RBQWdELCtFQUE4QjtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRUEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQytFO0FBQ2xCO0FBQzlDO0FBQ2Y7QUFDQSw0QkFBNEIscUVBQVk7QUFDeEMsa0NBQWtDLGVBQWU7QUFDakQ7QUFDQSxrQkFBa0IsMkZBQTBCO0FBQzVDLDRCQUE0QixxRUFBWTtBQUN4QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBLDRCQUE0QixxRUFBWTtBQUN4QyxrQ0FBa0MsZUFBZTtBQUNqRDtBQUNBLGtCQUFrQiwyRkFBMEI7QUFDNUMsNEJBQTRCLHFFQUFZO0FBQ3hDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaENBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNxRDtBQUNhO0FBQzNEO0FBQ1A7QUFDQSwrQkFBK0IsMEVBQWM7QUFDN0M7QUFDQSx5Q0FBeUMsaUVBQWE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEJBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNrRTtBQUNnQjtBQUN4QjtBQUNTO0FBQzVEO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywrRUFBMEI7QUFDN0Q7QUFDQSw0QkFBNEIsMkJBQTJCO0FBQ3ZELGdCQUFnQiwwRUFBYztBQUM5QjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxzRUFBaUI7QUFDcEQ7QUFDQSw0QkFBNEIsMkJBQTJCO0FBQ3ZELGdCQUFnQiwwRkFBbUI7QUFDbkM7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkRBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNtRjtBQUNOO0FBQ0o7QUFDN0I7QUFDbUQ7QUFDeEY7QUFDUDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsMERBQWE7QUFDekM7QUFDQSx5Q0FBeUMsK0ZBQTRCO0FBQ3JFO0FBQ0E7QUFDQSwwQ0FBMEMseUZBQXlCO0FBQ25FO0FBQ0E7QUFDQSw0QkFBNEIsd0JBQXdCO0FBQ3BEO0FBQ0E7QUFDQSxrQkFBa0IsMkdBQWtDO0FBQ3BELDRCQUE0Qix3QkFBd0I7QUFDcEQ7QUFDQSxzQ0FBc0MsMERBQWE7QUFDbkQsMkNBQTJDLHNGQUFxQztBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDBEQUFhO0FBQ3pDO0FBQ0EseUNBQXlDLCtGQUE0QjtBQUNyRTtBQUNBO0FBQ0EsMENBQTBDLHlGQUF5QjtBQUNuRTtBQUNBO0FBQ0EsNEJBQTRCLHdCQUF3QjtBQUNwRDtBQUNBO0FBQ0EsNEJBQTRCLHdCQUF3QjtBQUNwRDtBQUNBLHNDQUFzQywwREFBYTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9EQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDcUc7QUFDSjtBQUNyRDtBQUNyQztBQUNQO0FBQ0EsZ0NBQWdDLGlIQUFxQztBQUNyRSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQSxnQ0FBZ0MsMERBQWE7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBLGdDQUFnQyw2R0FBbUM7QUFDbkUsd0JBQXdCLHdCQUF3QjtBQUNoRDtBQUNBO0FBQ0EsZ0NBQWdDLDBEQUFhO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkNBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUM2RTtBQUNKO0FBQzdCO0FBQ21EO0FBQ007QUFDOUY7QUFDUDtBQUNBO0FBQ0EsNEJBQTRCLDBEQUFhO0FBQ3pDLHlDQUF5QyxrSEFBZ0M7QUFDekU7QUFDQTtBQUNBLDBDQUEwQyx5RkFBeUI7QUFDbkU7QUFDQTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7QUFDQTtBQUNBLGtCQUFrQiwyR0FBa0M7QUFDcEQsNEJBQTRCLHdCQUF3QjtBQUNwRDtBQUNBLHNDQUFzQywwREFBYTtBQUNuRCwyQ0FBMkMsc0ZBQXFDO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0EsNEJBQTRCLDBEQUFhO0FBQ3pDLHlDQUF5QyxrSEFBZ0M7QUFDekU7QUFDQTtBQUNBLDBDQUEwQyx5RkFBeUI7QUFDbkU7QUFDQTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7QUFDQTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7QUFDQSxzQ0FBc0MsMERBQWE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzREEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQytDO0FBQ3VCO0FBQ1Q7QUFDQztBQUMvQztBQUNmO0FBQ0Esc0JBQXNCLDJFQUFvQjtBQUMxQztBQUNBLGlDQUFpQyxvREFBYztBQUMvQyxzQkFBc0Isa0VBQTRCO0FBQ2xEO0FBQ0E7QUFDQSx3QkFBd0IscUVBQVk7QUFDcEM7QUFDQSxzQ0FBc0MsMkRBQVU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MscUVBQVk7QUFDcEQ7QUFDQSxrREFBa0QsMkRBQVU7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDNkM7QUFDZTtBQUNOO0FBQ3FCO0FBQzVEO0FBQ2Y7QUFDQSw4QkFBOEIseUVBQW9CO0FBQ2xEO0FBQ0EsY0FBYyx5REFBUztBQUN2QjtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQSxRQUFRLDhEQUFRO0FBQ2hCLDhCQUE4QixvRUFBVyxDQUFDLDhEQUFRO0FBQ2xELFFBQVEsaUVBQVk7QUFDcEIsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0IrRDtBQUN4RDtBQUNQO0FBQ0E7QUFDQSxzQkFBc0Isb0VBQVE7QUFDOUI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDZ0Y7QUFDbkI7QUFDOUM7QUFDZjtBQUNBLGdDQUFnQyxzRUFBaUI7QUFDakQ7QUFDQSw0QkFBNEIsd0JBQXdCO0FBQ3BEO0FBQ0EsZ0JBQWdCLHFGQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkJBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUN1RTtBQUNEO0FBQ007QUFDckU7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG1GQUFxQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyx5RkFBMkI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMseUZBQTJCO0FBQ3pFO0FBQ0EsMEJBQTBCLG1GQUF3QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx5RkFBMkI7QUFDckU7QUFDQSxzQkFBc0IsbUZBQXdCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkRBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUMrRDtBQUNpQjtBQUNyQjtBQUM1QztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsb0VBQVE7QUFDbEM7QUFDQSxRQUFRLHFGQUFpQjtBQUN6QixRQUFRLG9FQUFlO0FBQ3ZCO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4QnFFO0FBQ2dCO0FBQzFCO0FBQ3BEO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QiwwRUFBVztBQUNwQztBQUNBLHlCQUF5QiwwRUFBVztBQUNwQztBQUNBO0FBQ0EsUUFBUSwwRkFBbUI7QUFDM0IsUUFBUSxvRUFBZTtBQUN2QjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ2dGO0FBQ087QUFDakI7QUFDL0Q7QUFDUDtBQUNBLDRCQUE0Qix1RUFBMEI7QUFDdEQ7QUFDQTtBQUNBLG9DQUFvQyxxRkFBaUI7QUFDckQsNEJBQTRCLHdCQUF3QjtBQUNwRCw0Q0FBNEMseUVBQW1CO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBLDRCQUE0Qix1RUFBMEI7QUFDdEQ7QUFDQTtBQUNBLG9DQUFvQyxxRkFBaUI7QUFDckQsNEJBQTRCLHdCQUF3QjtBQUNwRCw0Q0FBNEMsK0VBQXlCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2Q0EsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ2dGO0FBQ0s7QUFDOUU7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiwwRkFBbUI7QUFDbEQ7QUFDQTtBQUNBLHdCQUF3QiwyQkFBMkI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUZBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiwwRkFBbUI7QUFDbEQ7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFGQUFpQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFGQUFpQjtBQUM3QztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMscUZBQWlCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsMkJBQTJCO0FBQ3ZEO0FBQ0E7QUFDQSwwQ0FBMEMscUZBQWlCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxxRkFBaUI7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7O0FDN0dBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNnRjtBQUNqRTtBQUNmO0FBQ0EsNEJBQTRCLHFGQUFpQjtBQUM3QztBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDZ0Y7QUFDcEI7QUFDN0M7QUFDZjtBQUNBLGtDQUFrQyxxRkFBaUI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGtFQUFxQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDNEQ7QUFDSDtBQUN1QjtBQUN6RTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw2REFBdUI7QUFDakU7QUFDQSxzQ0FBc0Msa0VBQXFCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw2REFBdUI7QUFDakU7QUFDQSxzQ0FBc0Msa0VBQXFCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw2REFBdUI7QUFDakU7QUFDQSxnREFBZ0QscUZBQWlCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsa0VBQXFCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxREEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQzREO0FBQ1U7QUFDdkI7QUFDUztBQUN6QztBQUNmO0FBQ0E7QUFDQSxvQ0FBb0MsdUVBQTBCO0FBQzlEO0FBQ0E7QUFDQSwwQ0FBMEMsMkRBQVk7QUFDdEQ7QUFDQSx3Q0FBd0MsZ0VBQW1CO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGtFQUFxQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQ0EsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQzREO0FBQ3FFO0FBQ3ZDO0FBQzNDO0FBQ2M7QUFDSjtBQUNlO0FBQ0k7QUFDQTtBQUNxQztBQUNqSDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMkRBQXFCO0FBQy9DLDRCQUE0QiwyREFBcUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsbUdBQThCO0FBQ3pFO0FBQ0Esd0JBQXdCLG1DQUFtQztBQUMzRCxnQ0FBZ0MsK0ZBQWtDO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDJCQUEyQjtBQUNuRCxZQUFZLGlFQUFrQjtBQUM5QixZQUFZLGlFQUFrQjtBQUM5QixZQUFZLGlFQUFrQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xELHdDQUF3QywwREFBYTtBQUNyRDtBQUNBO0FBQ0EsOEJBQThCLHlGQUE0QjtBQUMxRDtBQUNBO0FBQ0EsZ0NBQWdDLHlGQUE0QjtBQUM1RDtBQUNBLDZCQUE2Qix5RkFBNEI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMkRBQXFCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHlGQUEyQjtBQUNwRSxzQkFBc0IscUZBQXlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx5RkFBMkI7QUFDcEU7QUFDQTtBQUNBLHFDQUFxQyx5RkFBaUM7QUFDdEU7QUFDQSw0QkFBNEIsNkJBQTZCO0FBQ3pEO0FBQ0EsZ0RBQWdELHNHQUE4QztBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDhEQUF3QjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQ0FBZ0M7QUFDeEQ7QUFDQTtBQUNBLFlBQVksdUVBQW9CO0FBQ2hDO0FBQ0EsUUFBUSw4REFBUTtBQUNoQixLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0dBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUMwRDtBQUNaO0FBQy9CO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGlFQUFvQjtBQUNoRSxzQkFBc0IsMkRBQWM7QUFDcEM7QUFDQTtBQUNBLDRDQUE0QyxpRUFBb0I7QUFDaEU7QUFDQTtBQUNBLDBDQUEwQywyREFBYztBQUN4RDtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsMkRBQWM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUNBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNzRTtBQUNSO0FBQy9DO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixzRUFBWTtBQUMzQywyQkFBMkIsa0ZBQWtCO0FBQzdDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNtRjtBQUNqQztBQUNuQztBQUNmO0FBQ0Esa0NBQWtDLCtGQUE0QjtBQUM5RDtBQUNBO0FBQ0Esa0NBQWtDLDZEQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ2lFO0FBQ2tCO0FBQ2hCO0FBQ2I7QUFDUDtBQUNlO0FBQ21CO0FBQ2xFO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMkVBQW9CO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQywyREFBcUI7QUFDL0Q7QUFDQSxzQ0FBc0MsNkRBQWdCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQywyREFBcUI7QUFDL0Q7QUFDQSxzQ0FBc0MsNkRBQWdCO0FBQ3REO0FBQ0EsbUNBQW1DLDhEQUFRO0FBQzNDLFlBQVksNkVBQWM7QUFDMUI7QUFDQTtBQUNBLDBDQUEwQywyREFBcUI7QUFDL0Q7QUFDQSxnREFBZ0QsK0ZBQTRCO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw0RUFBeUI7QUFDbkU7QUFDQSxnQkFBZ0IsK0VBQW9CLGdCQUFnQixTQUFTO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pGQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDK0M7QUFDZTtBQUNoQjtBQUN2QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMkVBQW9CO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLDJEQUFxQjtBQUMzRDtBQUNBLGtDQUFrQywyREFBYztBQUNoRDtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekNBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUMrRDtBQUNIO0FBQ1Y7QUFDSjtBQUN2QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxrRUFBcUI7QUFDekQ7QUFDQTtBQUNBLDBDQUEwQywyREFBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsNkRBQWdCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELDRFQUF5QjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7OztBQy9DdUQ7QUFDaEQ7QUFDUCxRQUFRLDREQUFPO0FBQ2YsUUFBUSw0REFBTztBQUNmO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTEEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ3VFO0FBQzFCO0FBQ3RDO0FBQ1A7QUFDQSx3Q0FBd0MsZ0ZBQWlCO0FBQ3pELHdCQUF3QixzREFBZ0I7QUFDeEM7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQytFO0FBQ2xCO0FBQzJCO0FBQ2pGO0FBQ1A7QUFDQTtBQUNBLHdDQUF3Qyx3RkFBcUI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG9HQUErQztBQUN4RTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0EsZ0NBQWdDLHVEQUFpQjtBQUNqRCx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLG1EQUFhO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsbURBQWE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0YwRTtBQUNuRTtBQUNQO0FBQ0E7QUFDQSxxQ0FBcUMsK0VBQVk7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsZ0JBQWdCLCtFQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ25CTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1pBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUN5RDtBQUNtRTtBQUM5QjtBQUNoQztBQUN5QjtBQUMzQztBQUNrQjtBQUNGO0FBQ0Y7QUFDSjtBQUNzQztBQUNwQjtBQUNhO0FBQ3JGO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiwyRUFBb0I7QUFDOUMsNEJBQTRCLDJFQUFvQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQywwREFBYTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLG1HQUE4QjtBQUN6RTtBQUNBO0FBQ0EscUNBQXFDLGlGQUFXO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDJCQUEyQjtBQUNuRCxZQUFZLGlFQUFrQjtBQUM5QixZQUFZLGlFQUFrQjtBQUM5QixZQUFZLGlFQUFrQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDBCQUEwQjtBQUNsRCx3Q0FBd0MsMERBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDJFQUFvQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxtRUFBc0I7QUFDL0Q7QUFDQTtBQUNBLHlDQUF5Qyx3RkFBZ0M7QUFDekU7QUFDQSxnQ0FBZ0MsNkJBQTZCO0FBQzdEO0FBQ0Esb0RBQW9ELHFHQUE2QztBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtR0FBNkI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLG1FQUFzQjtBQUMvRDtBQUNBLHlDQUF5Qyx3RkFBZ0M7QUFDekU7QUFDQSxnQ0FBZ0MsNkJBQTZCO0FBQzdEO0FBQ0Esb0RBQW9ELHFHQUE2QztBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMseUVBQW1CO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0NBQWdDO0FBQ3hEO0FBQ0EsWUFBWSxrRkFBd0I7QUFDcEM7QUFDQSxZQUFZLHVFQUFvQjtBQUNoQztBQUNBO0FBQ0Esd0JBQXdCLDZCQUE2QjtBQUNyRDtBQUNBLFlBQVksK0VBQXFCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFHQUFxQjtBQUM3QixRQUFRLDhEQUFRO0FBQ2hCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JKQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDcUY7QUFDVDtBQUNyRTtBQUNQO0FBQ0EsNkJBQTZCLCtFQUFjO0FBQzNDO0FBQ0EsMEJBQTBCLDRGQUFxQjtBQUMvQztBQUNBLDRCQUE0QiwyQkFBMkI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDQSxRQUFRLCtFQUFjO0FBQ3RCLDhDQUE4QywrRUFBYztBQUM1RCxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakNBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3Qiw0QkFBNEIsK0RBQStELGlCQUFpQjtBQUM1RztBQUNBLG9DQUFvQyxNQUFNLCtCQUErQixZQUFZO0FBQ3JGLG1DQUFtQyxNQUFNLG1DQUFtQyxZQUFZO0FBQ3hGLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUN5RTtBQUNmO0FBQ25EO0FBQ1A7QUFDQTtBQUNBLGdDQUFnQyxrRkFBbUI7QUFDbkQ7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsNkJBQTZCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9EQUFjO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG1EQUFhO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlDbUM7QUFDd0M7QUFDUjtBQUNaO0FBQ3NDO0FBQ3FCO0FBQzVCO0FBQ3FDO0FBQ3JCO0FBQ3ZCO0FBQ1E7QUFDdUQ7QUFDMUU7QUFDa0I7QUFDSztBQUNpQjtBQUNoQjtBQUNSO0FBQzNCO0FBQ2M7QUFDSjtBQUNDO0FBQ3VEO0FBQzlEO0FBQ007QUFDRztBQUNSO0FBQ0M7QUFDSjtBQUMrRTtBQUNwRjtBQUNNO0FBQ2tDO0FBQ2pEO0FBQytCO0FBQzNCO0FBQ0E7QUFDMkI7QUFDcEI7QUFDUztBQUNrRjtBQUN2RjtBQUNVO0FBQ0Q7QUFDTztBQUNrQjtBQUNmO0FBQ0k7QUFDRTtBQUNIO0FBQ2tCO0FBQ25CO0FBQ2U7QUFDNUI7QUFDaUI7QUFDWDtBQUNyQjtBQUNGO0FBQ1E7QUFDTTtBQUNSO0FBQ0c7QUFDSztBQUNSO0FBQ0U7QUFDVTtBQUNGO0FBQ0k7QUFDb0I7QUFDWjtBQUNUO0FBQ1Q7QUFDYTtBQUNrQjtBQUNEO0FBQ2hDO0FBQ1I7QUFDbUI7QUFDbkI7QUFDbkQ7QUFDQSxJQUFJLGdGQUFZO0FBQ2hCO0FBQ0E7QUFDQSxJQUFJLDZEQUFPO0FBQ1gsSUFBSSw2REFBTztBQUNYLHdDQUF3Qyw2REFBTztBQUMvQyxJQUFJLGdGQUFZO0FBQ2hCLElBQUksdUVBQWdCO0FBQ3BCO0FBQ0EsUUFBUSw4RUFBd0I7QUFDaEMsWUFBWSw0RUFBZTtBQUMzQixZQUFZLDRFQUFlO0FBQzNCLFlBQVksNEVBQWU7QUFDM0I7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRLDBGQUE2QjtBQUNyQyxZQUFZLDRFQUFlO0FBQzNCLFlBQVksNEVBQWU7QUFDM0IsWUFBWSw0RUFBZTtBQUMzQjtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVEsc0ZBQXVCO0FBQy9CLFlBQVksNEVBQWU7QUFDM0IsU0FBUztBQUNULFFBQVEsaUZBQWtCO0FBQzFCLFlBQVksNEVBQWU7QUFDM0IsWUFBWSw0RUFBZTtBQUMzQjtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDs7Ozs7OztVQ2pIQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7VUVOQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNoYXJhY3Rlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0NyZWF0ZS9DcmVhdGVUaGVDb25jZXB0QXBpLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNvbm5lY3Rpb25BcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlVGV4dERhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9EZWxldGVUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvRGVsZXRlVGhlQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0RlbGV0ZS9EZWxldGVDb25jZXB0SW5CYWNrZW5kLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0QWlEYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0QWxsQ29uY2VwdHNCeVR5cGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0Q29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldENvbmNlcHRCdWxrLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0Q29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldENvbm5lY3Rpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldFJlc2VydmVkQ29ubmVjdGlvbklkcy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldFJlc2VydmVkSWRzLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvTG9naW4udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9NYWtlVGhlTmFtZUluQmFja2VuZC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL01ha2VUaGVUeXBlQ29uY2VwdEFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL1JlY3Vyc2l2ZVNlYXJjaC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL1NlYXJjaENvbmNlcHQvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlEaXJlY3QudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9TZWFyY2gvU2VhcmNoLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvU2VhcmNoL1NlYXJjaEludGVybmFsQXBpLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvU2VhcmNoL1NlYXJjaExpbmtNdWx0aXBsZUFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL1NlYXJjaC9TZWFyY2hXaXRoTGlua2VyLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvU2Vzc2lvbi9DcmVhdGVTZXNzaW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvU2Vzc2lvbi9DcmVhdGVTZXNzaW9uVmlzaXQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9TaWduaW4udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9TaWdudXAudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9WaWV3L1ZpZXdJbnRlcm5hbERhdGFBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeUNoYXJhY3RlclRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeVR5cGVUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9DaGFyYWN0ZXJSZXBvc2l0b3J5LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25CaW5hcnlUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbk5vZGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uQmluYXJ5VHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvbk5vZGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25CaW5hcnlUcmVlL0Nvbm5lY3Rpb25UeXBlVHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0ZpbHRlclNlYXJjaC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvSWRlbnRpZmllckZsYWdzLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xOb2RlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbEJpbmFyeUNoYXJhY3RlclRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQmluYXJ5VHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxCaW5hcnlUeXBlVHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25jZXB0RGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTm9kZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvUGF0Y2hlclN0cnVjdHVyZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvUmVzZXJ2ZWRJZHMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1JldHVybmVyLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9TZWFyY2hRdWVyeS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2VhcmNoL1NlYXJjaFN0cnVjdHVyZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9TZXNzaW9uL1Nlc3Npb25EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9TZXR0aW5nRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9UaGVDaGFyYWN0ZXIudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1RoZVRleHRzLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Vc2VyL1VzZXJCaW5hcnlUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Vc2VyL1VzZXJOb2RlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhYmFzZS9Ob0luZGV4RGIudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFiYXNlL2luZGV4ZWRkYi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvSGVscGVycy9DaGVja0lmRXhpc3RzLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9IZWxwZXJzL1JlbW92ZUZyb21BcnJheS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvSGVscGVycy9VbmlxdWVJbnNlcnQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9CdWlsZENvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkNhY2hlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Db21wb3NpdGlvbi9DcmVhdGVDb21wb3NpdGlvbkNhY2hlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Db25jZXB0RmluZGluZy9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvQ29udmVyc2lvbi9Db252ZXJ0Q29uY2VwdHMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZUJpbmFyeVRyZWVGcm9tRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvRGVsZXRlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvRGVsZXRlQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvRmluZENvbmVjZXB0c0Zyb21Db25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9GaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa0luTWVtb3J5LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvR2V0Q29tcG9zaXRpb25CdWxrLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkxpc3QudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0dldENvbmNlcHRCeUNoYXJhY3Rlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvR2V0Q29ubmVjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0dldERhdGFGcm9tSW5kZXhEYi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvR2V0TGluay50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRSZWxhdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvR2V0VGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvSW5pdGlhbGl6ZVN5c3RlbS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTG9jYWwvQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTG9jYWwvQ3JlYXRlVGhlQ29uY2VwdExvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldENvbXBvc2l0aW9uTGlzdExvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9HZXRDb21wb3NpdGlvbkxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9HZXRDb25jZXB0QnlDaGFyYWN0ZXJMb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTG9jYWwvTWFrZVRoZUNvbmNlcHRMb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTG9jYWwvTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9NYWtlVGhlVHlwZUxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9VcGRhdGVDb21wb3NpdGlvbkxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9NYWtlVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9NYWtlVGhlQ2hhcmFjdGVyRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTWFrZVRoZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVUaW1lc3RhbXAudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVUeXBlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTXF0dC9wdWJsaXNoTWVzc2FnZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtJbnRlcm5hbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtNdWx0aXBsZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvU3BsaXRTdHJpbmdzLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9VcGRhdGVDb21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvVXNlci9Vc2VyVHJhbnNsYXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL1ZpZXcvVmlld0ludGVybmFsRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvYXBwLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL21mdHNjY3Mtbm9kZS93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENoYXJhY3RlclJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ2hhcmFjdGVyUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmV0dXJuZXIgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvUmV0dXJuZXJcIjtcbmltcG9ydCB7IFRoZUNoYXJhY3RlciB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9UaGVDaGFyYWN0ZXJcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ2hhcmFjdGVyKGNoYXJhY3RlckRhdGEpIHtcbiAgICB2YXIgY2hhcmFjdGVyRGF0YTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2hhcmFjdGVyRGF0YSA9IENoYXJhY3RlclJlcG9zaXRvcnkuR2V0Q2hhcmFjdGVyKGNoYXJhY3RlckRhdGEuZGF0YSk7XG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyRGF0YS5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlVGhlQ2hhcmFjdGVyRGF0YVVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNoYXJhY3RlckRhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFN0cmluZztcbiAgICAgICAgICAgICAgICB2YXIgc2F2aW5nQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3RlcihyZXN1bHQudXNlcklkLCBjaGFyYWN0ZXJEYXRhLmRhdGEsIDAsIDAsIDQsIDQsIDk5OSwgOTk5LCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgc2F2aW5nQ2hhcmFjdGVyLmlkID0gcmVzdWx0LmlkO1xuICAgICAgICAgICAgICAgIENoYXJhY3RlclJlcG9zaXRvcnkuQWRkQ2hhcmFjdGVyKHNhdmluZ0NoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5pbmdEYXRhID0gbmV3IFJldHVybmVyKGNoYXJhY3RlckRhdGEuaWQsIGNoYXJhY3RlckRhdGEudXNlcklkLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmluZ0RhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVhdGUgdGhlIGNoYXJhY3RlciBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjcmVhdGUgdGhlIGNoYXJhY3RlciB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29uY2VwdEFwaShjb25jZXB0RGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uY2VwdERhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFN0cmluZyA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFN0cmluZztcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbmNlcHQgYXBpIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29uY2VwdCBhcGkgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaShjb25uZWN0aW9uRGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICB2YXIganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShjb25uZWN0aW9uRGF0YSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlVGhlQ29ubmVjdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGpzb25EYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIENyZWF0ZSB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGV4dERhdGEodGV4dERhdGEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVUZXh0RGF0YVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHRleHREYXRhKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTdHJpbmcgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRTdHJpbmc7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlIHRoZSB0ZXh0IGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgdGV4dCB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEZWxldGVUaGVDb25jZXB0KGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1kYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQoXCJpZFwiLCBpZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5EZWxldGVDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBib2R5OiBmb3JtZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25jZXB0IGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb25jZXB0IHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERlbGV0ZVRoZUNvbm5lY3Rpb24oaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1kYXRhLmFwcGVuZChcImlkXCIsIGlkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkRlbGV0ZVRoZUNvbm5lY3Rpb25VcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGJvZHk6IGZvcm1kYXRhLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbm5lY3Rpb24gZXJyb3Igc3RhdHVzOiAnLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbm5lY3Rpb24gdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuZXhwb3J0IGZ1bmN0aW9uIFRyYXNoVGhlQ29uY2VwdChpZCwgdG9rZW4pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbXlIZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgICAgIG15SGVhZGVycy5hcHBlbmQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0b2tlbik7XG4gICAgICAgICAgICBjb25zdCBmb3JtZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9ybWRhdGEuYXBwZW5kKCdpZCcsIGlkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkRlbGV0ZUNvbmNlcHRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGJvZHk6IGZvcm1kYXRhLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVsZXRlIGNvbXBvc2l0aW9uIEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbXBvc2l0aW9uIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjb21wb3NpdGlvbiB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybCc7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YSc7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyJztcbmV4cG9ydCBmdW5jdGlvbiBHZXRBaURhdGEoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxBaURhdGEoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FpIEVycm9yIE1lc3NhZ2U6ICcsIFwiQ2Fubm90IGdldCByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vUHVyZ2F0b3J5RGF0YWJhc2VVcGRhdGVkKCk7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSB0aW1lIHRha2VuIGlzIFwiLCBlbGFwc2VkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FpIEVycm9yIE1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FpIEVycm9yIE1lc3NhZ2U6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbENvbmNlcHRzQnlUeXBlKHR5cGUsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdXJsZW5jb2RlZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwidHlwZVwiLCB0eXBlKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwidXNlcl9pZFwiLCB1c2VySWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0QWxsQ29uY2VwdHNCeVR5cGVVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiB1cmxlbmNvZGVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChyZXN1bHRbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0QWxsQ29uY2VwdHNCeVR5cGUgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldEFsbENvbmNlcHRzQnlUeXBlIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldEFsbENvbmNlcHRzQnlUeXBlIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhJztcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9DaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbic7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSAnLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlcic7XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGNvbXBvc2l0aW9uX2lkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoY29tcG9zaXRpb25faWQpO1xuICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbk9ubGluZShjb21wb3NpdGlvbl9pZCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG5ld0Nvbm5lY3Rpb25zU3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uT25saW5lKGNvbXBvc2l0aW9uX2lkKTtcbiAgICAgICAgICAgIHZhciBuZXdDb25uZWN0aW9ucyA9IG5ld0Nvbm5lY3Rpb25zU3RyaW5nO1xuICAgICAgICAgICAgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24obmV3Q29ubmVjdGlvbnMsIGNvbm5lY3Rpb25MaXN0KTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gbmV3Q29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbk9ubGluZShjb21wb3NpdGlvbl9pZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGBjb21wb3NpdGlvbl9pZD0ke2NvbXBvc2l0aW9uX2lkfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24ocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb24gb2YgY29tcG9zaXRpb24gZXJyb3IgOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb24gb2YgY29tcG9zaXRpb24gZXJyb3IgOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YSc7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEZpbmRDb25jZXB0c0Zyb21Db25uZWN0aW9ucyB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbmRDb25lY2VwdHNGcm9tQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrSW5NZW1vcnknO1xuaW1wb3J0IHsgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9DaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbic7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSAnLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlcic7XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhjb21wb3NpdGlvbl9pZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgY29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uX2lkcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBvbGRDb25uZWN0aW9uTGlzdCA9IHlpZWxkIEZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25zQnVsa0luTWVtb3J5KGNvbXBvc2l0aW9uX2lkcyk7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbk9ubGluZShjb21wb3NpdGlvbl9pZHMpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbihjb25uZWN0aW9uTGlzdCwgb2xkQ29ubmVjdGlvbkxpc3QpO1xuICAgICAgICB5aWVsZCBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uT25saW5lKGNvbXBvc2l0aW9uX2lkcyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb21wb3NpdGlvbl9pZHMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2gocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBjb25uZWN0aW9ucyBvZiBjb21wb3NpdGlvbiBidWxrIGVycm9yIG1lc3NhZ2U6ICcsIFwiQ2Fubm90IGdldCByZXNwb25zZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgY29ubmVjdGlvbnMgb2YgY29tcG9zaXRpb24gYnVsayBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb25zIG9mIGNvbXBvc2l0aW9uIGJ1bGsgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0KGNvbmNlcHRJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxMaW5rZXJDb25uZWN0aW9uT2ZDb25jZXB0VXJsKCkgKyBgP2NvbmNlcHRJZD0ke2NvbmNlcHRJZH1gLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29uY2VwdHMgZXJyb3JcIiwgXCJjYW5ub3QgZ2V0IHJlc3BvbmVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGxpbmtlciBjb25uZWN0aW9uIGZyb20gdGhlIGNvbmNlcHRzIGVycm9yOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGxpbmtlciBjb25uZWN0aW9uIGZyb20gdGhlIGNvbmNlcHRzIGVycm9yKFVuZXhwZWN0ZWQpOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0KGNvbmNlcHRJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0VXJsKCkgKyBgP2NvbmNlcHRJZD0ke2NvbmNlcHRJZH1gLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gVG8gdGhlIGNvbmNlcHRzIGVycm9yXCIsIFwiY2Fubm90IGdldCByZXNwb25lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBsaW5rZXIgY29ubmVjdGlvbiBUbyB0aGUgY29uY2VwdHMgZXJyb3I6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gVG8gdGhlIGNvbmNlcHRzIGVycm9yKFVuZXhwZWN0ZWQpOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0KGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFVzZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGxldCBpc05wYyA9IENvbmNlcHRzRGF0YS5HZXROcGMoaWQpO1xuICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgIT0gMCB8fCBpc05wYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25jZXB0VXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYGlkPSR7aWR9YFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkTnBjKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgdGhlIGNvbmNlcHQgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCB0aGUgY29uY2VwdCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgdGhlIGNvbmNlcHQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnVsayhjb25jZXB0SWRzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGJ1bGtDb25jZXB0RmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0VXNlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWxrQ29uY2VwdEZldGNoLnB1c2goY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1bGtDb25jZXB0RmV0Y2gubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShidWxrQ29uY2VwdEZldGNoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgQ29uY2VwdCBCdWxrIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29uY2VwdCBCdWxrICBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29uY2VwdCBCdWxrICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQnVsa0NvbmNlcHRHZXR0ZXJBcGkoYnVsa0NvbmNlcHRGZXRjaCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGlmIChidWxrQ29uY2VwdEZldGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG15SGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldENvbmNlcHRCdWxrVXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYnVsa0NvbmNlcHRGZXRjaCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHQgPSByZXN1bHRbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdidWxrIGNvbmNlcHQgZ2V0dGVyIGFwaSBlcnJvcjogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYnVsayBjb25jZXB0IGdldHRlciBhcGkgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKGNoYXJhY3RlclZhbHVlLCB0eXBlSWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlTG9jYWwoY2hhcmFjdGVyVmFsdWUsIHR5cGVJZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdCA9PSBudWxsIHx8IGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBqc29uID0ge1xuICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyX3ZhbHVlJzogYCR7Y2hhcmFjdGVyVmFsdWV9YCxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGVfaWQnOiB0eXBlSWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB0b1NlbmRKc29uID0gSlNPTi5zdHJpbmdpZnkoanNvbik7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZVVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHRvU2VuZEpzb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IHR5cGUgYW5kIGNoYXJhY3RlciBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgdHlwZSBhbmQgY2hhcmFjdGVyIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IHR5cGUgYW5kIGNoYXJhY3RlciB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY2hhcmFjdGVyX3ZhbHVlPSR7Y2hhcmFjdGVyVmFsdWV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgaW4gR2V0dGluZyBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSBFcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgY29uY2VwdCBieSBjaGFyYWN0ZXIgdmFsdWUgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIEdldHRpbmcgY29uY2VwdCBieSBjaGFyYWN0ZXIgdmFsdWUgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb24oaWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29ubmVjdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGBpZD0ke2lkfWBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHlpZWxkIHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IENvbm5lY3Rpb24gRXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25uZWN0aW9uIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25uZWN0aW9uIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMgfSBmcm9tIFwiLi4vU2VydmljZXMvRmluZENvbmVjZXB0c0Zyb21Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uQnVsayhjb25uZWN0aW9uSWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBidWxrQ29ubmVjdGlvbkZldGNoID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25JZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdFVzZSA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRVc2UuaWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWxrQ29ubmVjdGlvbkZldGNoLnB1c2goY29ubmVjdGlvbklkc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbmNlcHRVc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWxrQ29ubmVjdGlvbkZldGNoLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29ubmVjdGlvbkJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShidWxrQ29ubmVjdGlvbkZldGNoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGlvbiA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBDb25uZWN0aW9uIEJ1bGsgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IENvbm5lY3Rpb24gQnVsayBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29ubmVjdGlvbiBCdWxrIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQodHlwZUlkLCBvZlRoZUNvbmNlcHRJZCwgdXNlcklkLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciB1cmxlbmNvZGVkID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ0eXBlSWRcIiwgYCR7dHlwZUlkfWApO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJvZlRoZUNvbmNlcHRJZFwiLCBgJHtvZlRoZUNvbmNlcHRJZH1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwidXNlcklkXCIsIGAke3VzZXJJZH1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwiaW5wYWdlXCIsIGAke2lucGFnZX1gKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwicGFnZVwiLCBgJHtwYWdlfWApO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbENvbm5lY3Rpb25zT2ZDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogdXJsZW5jb2RlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9ICh5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0IGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0ICBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgY29ubmVjdGlvbiBvZiBjb25jZXB0IHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBSZXNlcnZlZENvbm5lY3Rpb25JZHMgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvUmVzZXJ2ZWRJZHNcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRzKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgUmVzZXJ2ZWRDb25uZWN0aW9uSWRzLkFkZElkKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXQgcmVzZXJ2ZWQgY29ubmVjdGlvbiBpZHMgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0IHJlc2VydmVkIGNvbm5lY3Rpb24gaWRzICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBSZXNlcnZlZElkcyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9SZXNlcnZlZElkc1wiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZXNlcnZlZElkcygpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldFJlc2VydmVkSWRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgUmVzZXJ2ZWRJZHMuQWRkSWQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dldCByZXNlcnZlZCBpZHMgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0IHJlc2VydmVkIGlkcyAgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBUb2tlblN0b3JhZ2UgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9TZWN1cml0eS9Ub2tlblN0b3JhZ2UnO1xuZXhwb3J0IGZ1bmN0aW9uIExvZ2luVG9CYWNrZW5kKGVtYWlsLCBwYXNzd29yZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0ge1xuICAgICAgICAgICAgICAgICdlbWFpbCc6IGVtYWlsLFxuICAgICAgICAgICAgICAgICdwYXNzd29yZCc6IHBhc3N3b3JkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIG15SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgICAgICBteUhlYWRlcnMuYXBwZW5kKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0T2JqZWN0ID0gSlNPTi5zdHJpbmdpZnkob2JqZWN0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5Mb2dpblVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RPYmplY3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICBUb2tlblN0b3JhZ2UuQmVhcmVyQWNjZXNzVG9rZW4gPSByZXN1bHQuZGF0YS50b2tlbjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInRoaXMgaXMgdGhlIHRva2VuXCIsIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdMb2dpbiB0c2NjcyBlcnJvciBtZXNzYWdlOiAnLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTG9naW4gdHNjY3MgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIExvZ2luIHRzY2NzICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBNYWtlVGhlTmFtZUluQmFja2VuZChuZXdDb25jZXB0SWQsIHJlZmVyZW50LCB0eXBlSWQsIHR5cGVVc2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICAnbmV3Q29uY2VwdElkJzogbmV3Q29uY2VwdElkLFxuICAgICAgICAgICAgICAgICdyZWZlcmVudCc6IHJlZmVyZW50LFxuICAgICAgICAgICAgICAgICd0eXBlSWQnOiB0eXBlSWQsXG4gICAgICAgICAgICAgICAgJ3R5cGVVc2VySWQnOiB0eXBlVXNlcklkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIG15SGVhZGVycyA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0T2JqZWN0ID0gSlNPTi5zdHJpbmdpZnkob2JqZWN0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZmV0Y2goQmFzZVVybC5NYWtlVGhlTmFtZUluQmFja2VuZFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RPYmplY3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbWFrZSB0aGUgbmFtZSBpbiBiYWNrZW5kIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21ha2UgdGhlIG5hbWUgaW4gYmFja2VuZCB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NvbmNlcHRGaW5kaW5nL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5XCI7XG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHR5cGUgY29uY3BldCBvZiBhIHBhc3NlZCBzdHJpbmdcbi8vIGlmIHRoZSB0ZXh0IGlzIFwidGhlX3BlcnNvblwiIHRoZW4gdGhlIGZ1bmN0aW9uIGZpbmRzIHRoZSByZWxhdGVkIGNvbmNlcHRcbmV4cG9ydCBmdW5jdGlvbiBNYWtlVGhlVHlwZUNvbmNlcHRBcGkodHlwZSwgdXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gY3JlYXRlICBhIGRlZmF1bHQgY29uY2VwdCB3aXRoIGFsbCBkZWZhdWx0aW5nIHRvIHplcm9cbiAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb25jZXB0IGJ5IGNoYXJhY3RlciBhbmQgY2F0ZWdvcnkgZnJvbSB0aGUgYXBpXG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkodHlwZSk7XG4gICAgICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwIHx8IGNvbmNlcHQudHlwZUlkID09IDQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLk1ha2VUaGVUeXBlQ29uY2VwdFVybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGB0eXBlPSR7dHlwZX1gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01ha2UgVGhlIFR5cGUgQ29uY2VwdCBBcGkgZXJyb3IgOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNYWtlIFRoZSBUeXBlIENvbmNlcHQgQXBpIGVycm9yIDogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TZWFyY2hRdWVyeVwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkIH0gZnJvbSBcIi4uL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uQnVsa1wiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gUmVjdXJzaXZlU2VhcmNoQXBpKGNvbXBvc2l0aW9uID0gMCwgbGlzdExpbmtlcnMgPSBbXSwgdGV4dFNlYXJjaCA9IFwiXCIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzZWFyY2hRdWVyeSA9IG5ldyBTZWFyY2hRdWVyeSgpO1xuICAgICAgICAgICAgc2VhcmNoUXVlcnkuY29tcG9zaXRpb24gPSBjb21wb3NpdGlvbjtcbiAgICAgICAgICAgIHNlYXJjaFF1ZXJ5Lmxpc3RMaW5rZXJzID0gbGlzdExpbmtlcnM7XG4gICAgICAgICAgICBzZWFyY2hRdWVyeS50ZXh0U2VhcmNoID0gdGV4dFNlYXJjaDtcbiAgICAgICAgICAgIHZhciByYXcgPSBKU09OLnN0cmluZ2lmeShzZWFyY2hRdWVyeSk7XG4gICAgICAgICAgICB2YXIgQ29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHZhciBteUhlYWRlcnMgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuUmVjdXJzaXZlU2VhcmNoVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBteUhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogcmF3XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdElkcyA9IHJlc3VsdC5jb21wb3NpdGlvbklkcztcbiAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSByZXN1bHQuaW50ZXJuYWxDb25uZWN0aW9ucztcbiAgICAgICAgICAgICAgICB2YXIgZXh0ZXJuYWxDb25uZWN0aW9ucyA9IHJlc3VsdC5leHRlcm5hbENvbm5lY3Rpb25zO1xuICAgICAgICAgICAgICAgIGNvbmNlcHRzID0geWllbGQgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkKGNvbmNlcHRJZHMsIGNvbm5lY3Rpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVjdXJzaXZlIHNlYXJjaCBlcnJvciBcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0cztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlY3Vyc2l2ZSBzZWFyY2ggZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVjdXJzaXZlIHNlYXJjaCB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4vLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdEFwaShjaGFyYWN0ZXJWYWx1ZSwgY2F0ZWdvcnlfaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlEaXJlY3RVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBgY2hhcmFjdGVyX3ZhbHVlPSR7Y2hhcmFjdGVyVmFsdWV9JmNhdGVnb3J5X2lkPSR7Y2F0ZWdvcnlfaWR9YCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgY2F0ZWdvcnkgYW5kIGNoYXJhY3RlciBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgVGhpcyBpcyB0aGUgY29uY2VwdCBieSBjYXRlZ29yeSBhbmQgY2hhcmFjdGVyIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IGNhdGVnb3J5IGFuZCBjaGFyYWN0ZXIgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaEFsbENvbmNlcHRzKHR5cGUsIHNlYXJjaCwgY29tcG9zaXRpb24sIHRva2VuLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCB0b2tlbik7XG4gICAgICAgIHZhciB1cmxlbmNvZGVkID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInR5cGVcIiwgdHlwZSk7XG4gICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwic2VhcmNoXCIsIHNlYXJjaCk7XG4gICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb24pO1xuICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcImlucGFnZVwiLCBpbnBhZ2UudG9TdHJpbmcoKSk7XG4gICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwicGFnZVwiLCBwYWdlLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBxdWVyeVVybCA9IEJhc2VVcmwuU2VhcmNoQ29tcG9zaXRpb25zVXJsKCkgKyBcIj9cIiArIHVybGVuY29kZWQudG9TdHJpbmcoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2gocXVlcnlVcmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbiB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoSW50ZXJuYWxBcGkoc2VhcmNoLCB0b2tlbiA9IFwiXCIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKFwiYXBwbGljYXRpb24vanNvblwiLCB0b2tlbik7XG4gICAgICAgIGxldCBxdWVyeVVybCA9IEJhc2VVcmwuU2VhcmNoSW50ZXJuYWxXaXRoQXV0aGVudGljYXRlZENjc1VybCgpO1xuICAgICAgICBxdWVyeVVybCA9IHF1ZXJ5VXJsICsgJz9jb21wb3NpdGlvbj0nICsgc2VhcmNoLmNvbXBvc2l0aW9uICsgJyZzZWFyY2g9JyArIHNlYXJjaC5zZWFyY2ggKyAnJmludGVybmFsQ29tcG9zaXRpb249JyArIHNlYXJjaC5pbnRlcm5hbENvbXBvc2l0aW9uICsgJyZ0eXBlPScgKyBzZWFyY2gudHlwZSArICcmaW5wYWdlPScgKyBzZWFyY2guaW5wYWdlICsgJyZwYWdlPScgKyBzZWFyY2gucGFnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2gocXVlcnlVcmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBpbnRlcm5hbCBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIGludGVybmFsIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbiB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoTGlua011bHRpcGxlQXBpKHNlYXJjaFF1ZXJ5LCB0b2tlbiA9IFwiXCIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKFwiYXBwbGljYXRpb24vanNvblwiLCB0b2tlbik7XG4gICAgICAgIGNvbnN0IHF1ZXJ5VXJsID0gQmFzZVVybC5TZWFyY2hMaW5rTXVsdGlwbGVBbGxBcGlVcmwoKTtcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaFF1ZXJ5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2gocXVlcnlVcmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBtdWx0aXBsZSBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIG11bHRpcGxlIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbiB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoV2l0aExpbmtlcihzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihcImFwcGxpY2F0aW9uL2pzb25cIiwgdG9rZW4pO1xuICAgICAgICBjb25zdCBxdWVyeVVybCA9IEJhc2VVcmwuU2VhcmNoTGlua011bHRpcGxlQWxsKCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShzZWFyY2hRdWVyeSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHF1ZXJ5VXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVTZXNzaW9uKHNlc3Npb25EYXRhKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkRhdGEpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkNyZWF0ZVNlc3Npb25JZCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgc2Vzc2lvbiBmYWlsZWRcIiwgeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBzZXNzaW9uIGZhaWxlZFwiLCBleCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVNlc3Npb25WaXNpdChzZXNzaW9uSWQsIHVybCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcihcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHVybGVuY29kZWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInNlc3Npb25JZFwiLCBzZXNzaW9uSWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInVybFwiLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkNyZWF0ZVNlc3Npb25WaXNpdFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IHVybGVuY29kZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgc2Vzc2lvbiB1cmwgZmFpbGVkXCIsIHlpZWxkIHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgc2Vzc2lvbiB1cmwgZmFpbGVkXCIsIGV4KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vYXBwXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTaWduaW4oc2lnbmluSW5mbykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGVtYWlsOiBzaWduaW5JbmZvLmVtYWlsLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHNpZ25pbkluZm8ucGFzc3dvcmQsXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbXlIZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgbXlIZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgY29uc3QgdXJsID0gQmFzZVVybC5Mb2dpblVybCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBteUhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogcmF3LFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU9iamVjdCA9IG91dHB1dCA9PT0gbnVsbCB8fCBvdXRwdXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG91dHB1dC5kYXRhO1xuICAgICAgICAgICAgICAgIGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFPYmplY3QsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdjYW5ub3QgYXV0aGVudGljYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZyZWVzY2hlbWFSZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2lnbiBpbiBhcGkgZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGZyZWVzY2hlbWFSZXM7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNpZ251cChzaWdudXBNb2RlbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHNpZ251cFJlc3BvbnNlID0geWllbGQgcG9zdERhdGEoQmFzZVVybC5TaWdudXBVcmwoKSwgc2lnbnVwTW9kZWwpO1xuICAgICAgICByZXR1cm4gc2lnbnVwUmVzcG9uc2U7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBwb3N0RGF0YSh1cmwgPSAnJywgZGF0YSA9IHt9KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICBtZXNzYWdlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgIH07XG4gICAgICAgIC8vIERlZmF1bHQgb3B0aW9ucyBhcmUgbWFya2VkIHdpdGggKlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywgLy8gKkdFVCwgUE9TVCwgUFVULCBERUxFVEUsIGV0Yy5cbiAgICAgICAgICAgICAgICBtb2RlOiAnY29ycycsIC8vIG5vLWNvcnMsICpjb3JzLCBzYW1lLW9yaWdpblxuICAgICAgICAgICAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLCAvLyAqZGVmYXVsdCwgbm8tY2FjaGUsIHJlbG9hZCwgZm9yY2UtY2FjaGUsIG9ubHktaWYtY2FjaGVkXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsIC8vIGluY2x1ZGUsICpzYW1lLW9yaWdpbiwgb21pdFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBtYW51YWwsICpmb2xsb3csIGVycm9yXG4gICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlcicsIC8vIG5vLXJlZmVycmVyLCAqbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUsIG9yaWdpbiwgb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLCBzYW1lLW9yaWdpbiwgc3RyaWN0LW9yaWdpbiwgc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiwgdW5zYWZlLXVybFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLCAvLyBib2R5IGRhdGEgdHlwZSBtdXN0IG1hdGNoIFwiQ29udGVudC1UeXBlXCIgaGVhZGVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG91dHB1dCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2Nhbm5vdCBjcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZnJlZXNjaGVtYVJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTaWdudXAgRXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZnJlZXNjaGVtYVJlcztcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ1bGsgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gVmlld0ludGVybmFsRGF0YUFwaShpZHMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuVmlld0ludGVybmFsRGF0YVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25EaWN0aW9uYXJ5ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0U3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0TGlzdCA9IGNvbmNlcHRTdHJpbmdbaV0uY29uY2VwdHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29uY2VwdFN0cmluZ1tpXS5jb25uZWN0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gY29uY2VwdFN0cmluZ1tpXS5pZDtcbiAgICAgICAgICAgICAgICAgICAgR2V0Q29uY2VwdEJ1bGsoY29uY2VwdExpc3QpO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uRGljdGlvbmFyeVtpZF0gPSBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25EaWN0aW9uYXJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJWaWV3IEludGVybmFsIERhdGEgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSB2aWV3IGludGVybmFsIGRhdGEgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIHZpZXcgaW50ZXJuYWwgZGF0YSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImV4cG9ydCBjbGFzcyBCYXNlVXJsIHtcbiAgICAvLyBzdGF0aWMgR2V0Q29uY2VwdFVybDpzdHJpbmcgPSB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0Q29uY2VwdCc7XG4gICAgc3RhdGljIEdldENvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0Q29uY2VwdCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1jb25uZWN0aW9uLWJ5LWlkJztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCdWxrVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jb25jZXB0X2J1bGsnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbkJ1bGtVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2Nvbm5lY3Rpb25fYnVsayc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25jZXB0c09mVXNlclVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2NvbmNlcHRzX29mX3VzZXInO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29ubmVjdGlvbnNPZlVzZXJVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25uZWN0aW9uc19vZl91c2VyJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvblVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2Nvbm5lY3Rpb25zX29mX2NvbXBvc2l0aW9uJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25uZWN0aW9uc19vZl9jb21wb3NpdGlvbl9idWxrJztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jb25jZXB0X2J5X2NoYXJhY3Rlcl92YWx1ZSc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jb25jZXB0X2J5X2NoYXJhY3Rlcl9hbmRfdHlwZSc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29uY2VwdF9ieV9jaGFyYWN0ZXJfYW5kX2NhdGVnb3J5JztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jb25jZXB0X2J5X2NoYXJhY3Rlcl9hbmRfY2F0ZWdvcnlfZGlyZWN0JztcbiAgICB9XG4gICAgc3RhdGljIEdldENoYXJhY3RlckJ5Q2hhcmFjdGVyVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jaGFyYWN0ZXJfYnlfY2hhcmFjdGVyJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbENvbmNlcHRzQnlUeXBlVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29uY2VwdHNfYnlfdHlwZSc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25uZWN0aW9uc09mQ29uY2VwdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtbGluay1jb25uZWN0aW9ucyc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxBaURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0LXByZWxvYWRlZC1jb25jZXB0cyc7XG4gICAgICAgIC8vIHJldHVybiB0aGlzLkFJX1VSTCArICcvYXBpL2dldF9yYW5rZWRfdHlwZV9pZD9pbnBhZ2U9MzAwJyB8fCBwcm9jZXNzLmVudi5BSV9VUkwgfHwgICdodHRwczovL2FpLmZyZWVzY2hlbWEuY29tL2FwaS9nZXRfcmFua2VkX3R5cGVfaWQ/aW5wYWdlPTMwMCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxQcmVmZXRjaENvbm5lY3Rpb25zVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29ubmVjdGlvbnNfb2ZfdXNlcj9pbnBhZ2U9NTAwJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbExpbmtlckNvbm5lY3Rpb25PZkNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0LWFsbC1saW5rZXJzLWZyb20tY29uY2VwdCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1hbGwtbGlua2Vycy10by1jb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIERlbGV0ZUNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZGVsZXRlX2NvbmNlcHQnO1xuICAgIH1cbiAgICBzdGF0aWMgUmVjdXJzaXZlU2VhcmNoVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL3JlY3Vyc2l2ZXNlYXJjaC1jb25jZXB0LWNvbm5lY3Rpb24nO1xuICAgIH1cbiAgICBzdGF0aWMgU2VhcmNoTGlua011bHRpcGxlQWxsQXBpVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL0Nvbm5lY3Rpb24vc2VhcmNoLWxpbmstbXVsdGlwbGUtYWxsLWNjcyc7XG4gICAgfVxuICAgIHN0YXRpYyBNYWtlVGhlTmFtZUluQmFja2VuZFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9tYWtlLW5hbWUtZnJvbS1mcm9udGVuZCc7XG4gICAgfVxuICAgIHN0YXRpYyBMb2dpblVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9hdXRoL2xvZ2luJztcbiAgICB9XG4gICAgc3RhdGljIFNpZ251cFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9hdXRoL3NpZ251cCc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb21wb3NpdGlvbkNvbm5lY3Rpb25CZXR3ZWVuVHdvQ29uY2VwdHNVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0LWNvbXBvc2l0aW9uLWNvbm5lY3Rpb24tYmV0d2Vlbi10d28tY29uY2VwdHMnO1xuICAgIH1cbiAgICBzdGF0aWMgU2VhcmNoQ29tcG9zaXRpb25zVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL3NlYXJjaC1jb21wb3NpdGlvbnMnO1xuICAgIH1cbiAgICBzdGF0aWMgU2VhcmNoTGlua011bHRpcGxlQWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL0Nvbm5lY3Rpb24vc2VhcmNoLWxpbmstbXVsdGlwbGUtYWxsJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVNlc3Npb25JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9jcmVhdGUtc2Vzc2lvbi1pZC1yZW1vdGUnO1xuICAgIH1cbiAgICBzdGF0aWMgQ3JlYXRlU2Vzc2lvblZpc2l0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2NyZWF0ZS1yZW1vdGUtc2Vzc2lvbi12aXNpdCc7XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vL0FwaSBmb3Igdmlld2luZyBpbnRlcm5hbCBkYXRhIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgc3RhdGljIFZpZXdJbnRlcm5hbERhdGFVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvdmlldy1hcGktaW50ZXJuYWwtZGF0YS1jY3MtaWQtYnVsayc7XG4gICAgfVxuICAgIHN0YXRpYyBTZWFyY2hJbnRlcm5hbFdpdGhBdXRoZW50aWNhdGVkQ2NzVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL3NlYXJjaC1jb21wb3NpdGlvbi1pbnRlcm5hbC1hdXRoZW50aWNhdGVkLWNjcyc7XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8gQVBJIEZvciBSZXNlcnZlZCBJZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgc3RhdGljIEdldFJlc2VydmVkSWRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X3Jlc2VydmVkX2lkcyc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRSZXNlcnZlZENvbm5lY3Rpb25JZFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfcmVzZXJ2ZWRfY29ubmVjdGlvbl9pZHMnO1xuICAgIH1cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy9BUEkgRm9yIENyZWF0aW5nIERhdGEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgQ3JlYXRlVGhlVGV4dERhdGFVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RleHRfZGF0YSc7XG4gICAgfVxuICAgIHN0YXRpYyBDcmVhdGVUaGVDaGFyYWN0ZXJEYXRhVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2NyZWF0ZV9jaGFyYWN0ZXJfZGF0YSc7XG4gICAgfVxuICAgIHN0YXRpYyBDcmVhdGVUaGVDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2NyZWF0ZV90aGVfY29uY2VwdCc7XG4gICAgfVxuICAgIHN0YXRpYyBDcmVhdGVUaGVDb25uZWN0aW9uVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2NyZWF0ZV90aGVfY29ubmVjdGlvbic7XG4gICAgfVxuICAgIHN0YXRpYyBDcmVhdGVUaGVDb25uZWN0aW9uTmV3VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2NyZWF0ZV90aGVfY29ubmVjdGlvbl9uZXcnO1xuICAgIH1cbiAgICBzdGF0aWMgTWFrZVRoZVR5cGVDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL21ha2VfdGhlX3R5cGVfY29uY2VwdCc7XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vL0FQSSBGT1IgRGVsZXRpbmcgQ29ubmVjdGlvbiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgc3RhdGljIERlbGV0ZVRoZUNvbm5lY3Rpb25VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZGVsZXRlX2Nvbm5lY3Rpb24nO1xuICAgIH1cbn1cbkJhc2VVcmwuQkFTRV9VUkwgPSBcImh0dHBzOi8vbG9jYWxob3N0OjcwNTMvXCI7XG5CYXNlVXJsLkFJX1VSTCA9IFwiaHR0cHM6Ly9haS5mcmVlc2NoZW1hLmNvbVwiO1xuQmFzZVVybC5NUVRUX1VSTCA9ICcxOTIuMTY4LjEuMjQ5JztcbkJhc2VVcmwuTk9ERV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo1MDAxLyc7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuL0lkZW50aWZpZXJGbGFnc1wiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL05vZGVcIjtcbmV4cG9ydCBjbGFzcyBCaW5hcnlDaGFyYWN0ZXJUcmVlIHtcbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0NoYXJhY3RlckxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChCaW5hcnlDaGFyYWN0ZXJUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhcmFjdGVyUm9vdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmFjdGVyUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhcmFjdGVyUm9vdCA9IHRoaXMuY2hhcmFjdGVyUm9vdC5hZGRDaGFyYWN0ZXJOb2RlKG5vZGUsIHRoaXMuY2hhcmFjdGVyUm9vdCwgdGhpcy5jaGFyYWN0ZXJSb290LmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZU5vZGVCeUNoYXJhY3RlcihjaGFyYWN0ZXIsIGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5jaGFyYWN0ZXJSb290LCBjaGFyYWN0ZXIsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3QuY291bnROb2RlQmVsb3codGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNoYXJhY3RlclJvb3QuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlVXBkYXRlZCh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgdGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUodmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldENoYXJhY3RlckFuZENhdGVnb3J5RnJvbVRyZWUodmFsdWUsIGNhdGVnb3J5SWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNoYXJhY3RlclJvb3QuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIHRoaXMuY2hhcmFjdGVyUm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRDaGFyYWN0ZXIoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290ID0gdGhpcy5jaGFyYWN0ZXJSb290LnJlbW92ZU5vZGUodGhpcy5jaGFyYWN0ZXJSb290LCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5CaW5hcnlDaGFyYWN0ZXJUcmVlLmNoYXJhY3RlclJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4vQmluYXJ5Q2hhcmFjdGVyVHJlZVwiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL05vZGVcIjtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuL0lkZW50aWZpZXJGbGFnc1wiO1xuZXhwb3J0IGNsYXNzIEJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNEYXRhTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KEJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuaWQsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICB2YXIgY2hhcmFjdGVyTm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuY2hhcmFjdGVyVmFsdWUsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICBCaW5hcnlDaGFyYWN0ZXJUcmVlLmFkZE5vZGVUb1RyZWUoY2hhcmFjdGVyTm9kZSk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5yb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZU5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5yZW1vdmVOb2RlKHRoaXMucm9vdCwgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNvdW50TnVtYmVyT2ZOb2RlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLnJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbkJpbmFyeVRyZWUucm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IE5vZGUgfSBmcm9tIFwiLi9Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQmluYXJ5VHlwZVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGVSb290ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZVJvb3QgPSB0aGlzLnR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMudHlwZVJvb3QsIHRoaXMudHlwZVJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgTm9kZShjb25jZXB0LnR5cGVJZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZVR5cGVDb25jZXB0KHR5cGVJZCwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZVJvb3QgPSB0aGlzLnR5cGVSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy50eXBlUm9vdCwgdHlwZUlkLCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICBpZiAodGhpcy50eXBlUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnR5cGVSb290LmdldEZyb21Ob2RlKGlkLCB0aGlzLnR5cGVSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWUodHlwZUlkKSB7XG4gICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgdmFyIGNvbmNlcHRzID0gW107XG4gICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChCaW5hcnlUeXBlVHJlZS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTm9kZS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1ByZXNlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29uY2VwdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VwdHNbal0uaWQgPT0gTm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNQcmVzZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0cztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNXaXRoQ2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gY2hhcmFjdGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoTm9kZS52YXJpYW50c1tpXS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFyaWFudHNbaV0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGVSb290KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlUm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLnR5cGVSb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5CaW5hcnlUeXBlVHJlZS50eXBlUm9vdCA9IG51bGw7XG4iLCJpbXBvcnQgeyBUaGVDaGFyYWN0ZXIgfSBmcm9tIFwiLi9UaGVDaGFyYWN0ZXJcIjtcbmV4cG9ydCBjbGFzcyBDaGFyYWN0ZXJSZXBvc2l0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjaGFyYWN0ZXIgUmVwb3NpdG9yeVwiO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICAgICAgICB0aGlzLmNoYXJhY3RlckRhdGFbY2hhcmFjdGVyLmlkXSA9IGNoYXJhY3RlcjtcbiAgICB9XG4gICAgc3RhdGljIEdldENoYXJhY3Rlcih2YWx1ZSkge1xuICAgICAgICB2YXIgdGhlQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3RlcigwLCBcIjBcIiwgMCwgMCwgMCwgMCwgMCwgMCwgXCIwXCIsIGZhbHNlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoYXJhY3RlckRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlckRhdGFbaV0uZGF0YSA9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoZUNoYXJhY3RlciA9IHRoaXMuY2hhcmFjdGVyRGF0YVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhlQ2hhcmFjdGVyO1xuICAgIH1cbn1cbkNoYXJhY3RlclJlcG9zaXRvcnkuY2hhcmFjdGVyRGF0YSA9IFtdO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyByZWN1cnNpdmVGZXRjaE5ldyB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0J1aWxkQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5pbXBvcnQgeyBwdWJsaXNoTWVzc2FnZSB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL01xdHQvcHVibGlzaE1lc3NhZ2UnO1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gd2UgY2FuIGJ1aWxkIGEgY29tcG9zaXRpb24gdXNpbmcgdGhpcyBjbGFzc1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICAgICAgdGhpcy5tYWluQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb25jZXB0cyA9IFtdO1xuICAgICAgICB0aGlzLnN1YmNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNhY2hlZCA9IHt9O1xuICAgIH1cbiAgICB1cGRhdGVDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW5Db25jZXB0LmlkID09IDApXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzW2ldLmlkID09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbkNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZpc2l0ZWRDb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jYWNoZWQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaE5ldyh0aGlzLmlkLCB0aGlzLmNvbm5lY3Rpb25zLCB0aGlzLmNvbmNlcHRzLCB0aGlzLnN1YmNvbXBvc2l0aW9ucywgdmlzaXRlZENvbmNlcHRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFVwZGF0ZUFjcm9zc0Rpc3RyaWJ1dGVkU3lzdGVtKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcHVibGlzaE1lc3NhZ2UoJ2NvbXBvc2l0aW9uVXBkYXRlJywgKF9hID0gdGhpcy5pZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIHB1Ymxpc2hpbmcgbWVzc2FnZScsIGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc1VwZGF0aW5nKCkge1xuICAgICAgICB0aGlzLlVwZGF0ZUFjcm9zc0Rpc3RyaWJ1dGVkU3lzdGVtKCk7XG4gICAgfVxuICAgIEdldERhdGFDYWNoZSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCBtYWluU3RyaW5nID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5tYWluQ29uY2VwdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnR5cGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IHRoaXMuY2FjaGVkO1xuICAgICAgICBjb25zdCBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IHRoaXMuaWQ7XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbXBvc2l0aW9uTm9kZSB9IGZyb20gJy4vQ29tcG9zaXRpb25Ob2RlJztcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbkJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbXBvc2l0aW9uVG9UcmVlKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQ29tcG9zaXRpb25Ob2RlKGNvbXBvc2l0aW9uLmlkLCBjb21wb3NpdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY291bnROb2RlQmVsb3codGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4vLyB0aGlzIGlzIGEgYmluYXJ5IHRyZWUgdG8gaG9sZCBjb21wb3NpdGlvbnMgaW4gaXRcbkNvbXBvc2l0aW9uQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsImltcG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4vQ29tcG9zaXRpb25CaW5hcnlUcmVlJztcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvbk5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIGxlZnROb2RlLCByaWdodE5vZGUpIHtcbiAgICAgICAgdGhpcy5leHBpcnlUaW1lID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDEwICogNjAgKiAxMDAwKTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgIH1cbiAgICBpc1ZhbGlkKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKERhdGUubm93KCkpO1xuICAgICAgICBpZiAodGhpcy5leHBpcnlUaW1lIDwgY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgIENvbXBvc2l0aW9uQmluYXJ5VHJlZS5yZW1vdmVOb2RlRnJvbVRyZWUodGhpcy5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzYXZlVG9DYWNoZShkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsdWUuY2FjaGVkID0gZGF0YTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgIGNvbnN0IFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpO1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9XG4gICAgICAgICAgICAxICtcbiAgICAgICAgICAgICAgICBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgY29uc3QgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1ZhbGlkKCk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBjb25zdCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgY29uc3QgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkgJiYgbm9kZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3VudE5vZGVCZWxvdyhyb290KSB7XG4gICAgICAgIGlmIChyb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVjdXJzaXZlIGNhbGwgdG8gbGVmdCBjaGlsZCBhbmQgcmlnaHQgY2hpbGQgYW5kXG4gICAgICAgIC8vIGFkZCB0aGUgcmVzdWx0IG9mIHRoZXNlIHdpdGggMSAoIDEgZm9yIGNvdW50aW5nIHRoZSByb290KVxuICAgICAgICByZXR1cm4gKDEgK1xuICAgICAgICAgICAgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LmxlZnROb2RlKSArXG4gICAgICAgICAgICB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QucmlnaHROb2RlKSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ29uY2VwdCB7XG4gICAgY29uc3RydWN0b3IoaWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIGNoYXJhY3RlclZhbHVlLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCBpc05ldyA9IGZhbHNlLCBlbnRyeVRpbWVTdGFtcCwgdXBkYXRlZFRpbWVTdGFtcCkge1xuICAgICAgICB0aGlzLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy50eXBlVXNlcklkID0gdHlwZVVzZXJJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlJZCA9IGNhdGVnb3J5SWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlVc2VySWQgPSBjYXRlZ29yeVVzZXJJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudElkID0gcmVmZXJlbnRJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudCA9IHJlZmVyZW50SWQ7XG4gICAgICAgIHRoaXMucmVmZXJlbnRVc2VySWQgPSByZWZlcmVudFVzZXJJZDtcbiAgICAgICAgdGhpcy5jaGFyYWN0ZXJWYWx1ZSA9IGAke2NoYXJhY3RlclZhbHVlfWA7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSBzZXNzaW9uVXNlcklkO1xuICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICB0aGlzLnR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgICAgIHRoaXMuZW50cnlUaW1lU3RhbXAgPSBlbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy51cGRhdGVkVGltZVN0YW1wID0gdXBkYXRlZFRpbWVTdGFtcDtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcyk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZUlkKTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IHJlbW92ZUZyb21EYXRhYmFzZSwgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uL0RhdGFiYXNlL05vSW5kZXhEYlwiO1xuaW1wb3J0IHsgQmluYXJ5VHJlZSB9IGZyb20gXCIuL0JpbmFyeVRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeUNoYXJhY3RlclRyZWUgfSBmcm9tIFwiLi9CaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBCaW5hcnlUeXBlVHJlZSB9IGZyb20gXCIuL0JpbmFyeVR5cGVUcmVlXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuZXhwb3J0IGNsYXNzIENvbmNlcHRzRGF0YSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiY29uY2VwdHNBcnJheVwiO1xuICAgIH1cbiAgICBzdGF0aWMgQ2hlY2tDb250YWlucyhjb25jZXB0KSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIEFkZE5wYyhpZCkge1xuICAgICAgICBpZiAoIXRoaXMuTlBDLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuTlBDLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5OUEMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuTlBDLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBHZXROcGMoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTlBDLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdFRvU3RvcmFnZShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29uY2VwdFwiLCBjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgLy92YXIgY29udGFpbnMgPSB0aGlzLkNoZWNrQ29udGFpbnMoY29uY2VwdCk7XG4gICAgICAgICAgICAvLyB0aGlzLmNvbmNlcHREaWN0aW9uYXJ5W2NvbmNlcHQuaWRdID0gY29uY2VwdDtcbiAgICAgICAgICAgIC8vICAgIGlmKGNvbnRhaW5zKXtcbiAgICAgICAgICAgIC8vICAgdGhpcy5SZW1vdmVDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0VG9NZW1vcnkoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIC8vdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbmNlcHQpO1xuICAgICAgICAgICAgLy8gdGhpcy5jb25jZXB0RGljdGlvbmFyeVtjb25jZXB0LmlkXSA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAvLyAgICBpZihjb250YWlucyl7XG4gICAgICAgICAgICAvLyAgIHRoaXMuUmVtb3ZlQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICBCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0VGVtcG9yYXJ5KGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbmNlcHQpO1xuICAgICAgICB0aGlzLmNvbmNlcHREaWN0aW9uYXJ5W2NvbmNlcHQuaWRdID0gY29uY2VwdDtcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZUNvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25jZXB0c0FycmF5LnB1c2goY29uY2VwdCk7XG4gICAgfVxuICAgIHN0YXRpYyBSZW1vdmVDb25jZXB0KGNvbmNlcHQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29uY2VwdFwiLCBjb25jZXB0LmlkKTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHQoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBteUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB5aWVsZCBCaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICBteUNvbmNlcHQgPSByZXR1cm5lZENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYobXlDb25jZXB0LmlkID09IDAgfHwgbXlDb25jZXB0ID09IG51bGwpe1xuICAgICAgICAgICAgLy8gICAgIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBpZCl7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBteUNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gbXlDb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldE5vZGVGcm9tVHJlZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBOb2RlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVXBkYXRlZChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldE5vZGVGcm9tVHJlZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBOb2RlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKGNoYXJhY3Rlcl92YWx1ZSwgdHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICAvL3ZhciBOb2RlID0gYXdhaXQgQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLHR5cGVJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgQmluYXJ5VHlwZVRyZWUuZ2V0VHlwZVZhcmlhbnRzV2l0aENoYXJhY3RlclZhbHVlKGNoYXJhY3Rlcl92YWx1ZSwgdHlwZUlkKTtcbiAgICAgICAgICAgIC8vIGlmKE5vZGUpe1xuICAgICAgICAgICAgLy8gICAgIGNvbmNlcHQgPSAgTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvdW5kIHRoZSBvdXRwdXRcIik7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coY29uY2VwdCk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKGNoYXJhY3Rlcl92YWx1ZSwgY2F0ZWdvcnlJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB5aWVsZCBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldENoYXJhY3RlckFuZENhdGVnb3J5RnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLCBjYXRlZ29yeUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0c0J5VHlwZUlkKHR5cGVJZCkge1xuICAgICAgICB2YXIgbXlDb25jZXB0O1xuICAgICAgICBsZXQgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgbXlDb25jZXB0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzQXJyYXlbaV0udHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5jb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUoXCJjb25jZXB0XCIsXCJ0eXBlSWRcIix0eXBlSWQpLnRoZW4oY29uY2VwdExpc3Q9PntcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwidGhpIHNpcyBteSBsaXN0XCIpO1xuICAgICAgICAvLyAgfSk7XG4gICAgICAgIC8vICAgdmFyIGRiQ29uY2VwdExpc3QgPSBhd2FpdCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZChcImNvbmNlcHRcIixcInR5cGVJZFwiLCB0eXBlSWQpO1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QpO1xuICAgICAgICAvLyAgIGlmKEFycmF5LmlzQXJyYXkoZGJDb25jZXB0TGlzdCkpe1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QpO1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGRiQ29uY2VwdExpc3QubGVuZ3RoKTtcbiAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPCBkYkNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiaGVyZSB0byBwdXNoIGZpcnN0c1wiKTtcbiAgICAgICAgLy8gICAgIHZhciBjb250YWluczogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgZm9yKHZhciBqPTA7IGo8IENvbmNlcHRMaXN0Lmxlbmd0aDsgaisrKXtcbiAgICAgICAgLy8gICAgICAgICBpZihkYkNvbmNlcHRMaXN0W2ldLmlkID09IENvbmNlcHRMaXN0W2pdLmlkKXtcbiAgICAgICAgLy8gICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiaGVyZSB0byBwdXNoXCIpO1xuICAgICAgICAvLyAgICAgaWYoIWNvbnRhaW5zKXtcbiAgICAgICAgLy8gICAgICAgICBDb25jZXB0TGlzdC5wdXNoKGRiQ29uY2VwdExpc3RbaV0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgY29uY2VwdCBsaXN0XCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhDb25jZXB0TGlzdCk7XG4gICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgQ29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgICAgIENvbmNlcHRMaXN0ID0geWllbGQgQmluYXJ5VHlwZVRyZWUuZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRCaW5hcnlDaGFyYWN0ZXJUcmVlKCkge1xuICAgICAgICByZXR1cm4gQmluYXJ5Q2hhcmFjdGVyVHJlZS5jaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cbn1cbkNvbmNlcHRzRGF0YS5jb25jZXB0c0FycmF5ID0gW107XG5Db25jZXB0c0RhdGEuTlBDID0gW107XG5Db25jZXB0c0RhdGEuY29uY2VwdERpY3Rpb25hcnkgPSBbXTtcbiIsImltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoaWQgPSAwLCBvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgb3JkZXJJZCwgb3JkZXJVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9VcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50eXBlID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm9mVGhlQ29uY2VwdElkID0gb2ZUaGVDb25jZXB0SWQ7XG4gICAgICAgIHRoaXMudG9UaGVDb25jZXB0SWQgPSB0b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy5PZlRoZUNvbmNlcHRVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHRoaXMuVG9UaGVDb25jZXB0VXNlcklkID0gdG9UaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy50eXBlSWQgPSB0eXBlSWQ7XG4gICAgICAgIHRoaXMuZ2hvc3RJZCA9IGlkO1xuICAgICAgICB0aGlzLnR5cGVVc2VySWQgPSB0eXBlVXNlcklkO1xuICAgICAgICB0aGlzLm9yZGVySWQgPSBvcmRlcklkO1xuICAgICAgICB0aGlzLm9yZGVyVXNlcklkID0gb3JkZXJVc2VySWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mb3JtYXRpb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudGVybWluYXRpb25EYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTeW5jVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm9kZSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9ucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbnJvb3QgPSB0aGlzLmNvbm5lY3Rpb25yb290LmFkZE5vZGUobm9kZSwgdGhpcy5jb25uZWN0aW9ucm9vdCwgdGhpcy5jb25uZWN0aW9ucm9vdC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgQ29ubmVjdGlvbk5vZGUoY29ubmVjdGlvbi5pZCwgY29ubmVjdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KENvbm5lY3Rpb25CaW5hcnlUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25yb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9ucm9vdCA9IHRoaXMuY29ubmVjdGlvbnJvb3QucmVtb3ZlTm9kZSh0aGlzLmNvbm5lY3Rpb25yb290LCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY29ubmVjdGlvbnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMuY29ubmVjdGlvbnJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkNvbm5lY3Rpb25CaW5hcnlUcmVlLmNvbm5lY3Rpb25yb290ID0gbnVsbDtcbiIsImV4cG9ydCBjbGFzcyBDb25uZWN0aW9uTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLnZhcmlhbnRzID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5sZWZ0Tm9kZSA9IGxlZnROb2RlO1xuICAgICAgICB0aGlzLnJpZ2h0Tm9kZSA9IHJpZ2h0Tm9kZTtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS50eXBlSWQgIT0gbm9kZS52YWx1ZS50eXBlSWQpIHtcbiAgICAgICAgICAgIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBub2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCA9PSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIG5vZGUudmFyaWFudHMucHVzaChwYXNzZWROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvL25vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5IDwgcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiKXtcbiAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmlnaHRSb3RhdGUoeSkge1xuICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgbGV0IHggPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgbGV0IHkgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0geDtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXR1cm4geTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0QmFsYW5jZUZhY3RvcihOKSB7XG4gICAgICAgIGlmIChOID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhlaWdodChOLmxlZnROb2RlKSAtIHRoaXMuZ2V0SGVpZ2h0KE4ucmlnaHROb2RlKTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGUoaWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZihwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApe1xuICAgICAgICAvLyAgICAgaWYocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBpZCApe1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAvLyAgICAgaWYobmV3Tm9kZSl7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLmxlZnROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vY29uZGl0aW9uIGlmIHRoZSBtYWluIG5vZGUgaXMgZXF1YWwgdG8gdGhlIHZhbHVlXG4gICAgICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBjb25jZXB0SWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBtYWluIG5vZGUgaXMgbm90IGVxdWFsIHRvIHRoZSBjaGVja2luZyB2YWx1ZSBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRJZCA9PSBwYXNzZWROb2RlLnZhcmlhbnRzW2ldLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXksIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbk9yZGVyU3VjY2Vzc29yKHJvb3QpIHtcbiAgICAgICAgd2hpbGUgKHJvb3QubGVmdE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdCA9IHJvb3QubGVmdE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm9kZSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25Ob2RlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblR5cGVUcmVlIHtcbiAgICBzdGF0aWMgYWRkTm9kZVRvVHJlZShub2RlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uVHlwZVJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVHlwZVJvb3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCA9IHRoaXMuY29ubmVjdGlvblR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMuY29ubmVjdGlvblR5cGVSb290LCB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uVHlwZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChDb25uZWN0aW9uVHlwZVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbikge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgQ29ubmVjdGlvbk5vZGUoY29ubmVjdGlvbi50eXBlSWQsIGNvbm5lY3Rpb24sIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVUeXBlQ29uY2VwdCh0eXBlSWQsIGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QgPSB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHRoaXMuY29ubmVjdGlvblR5cGVSb290LCB0eXBlSWQsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWUodHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucHVzaChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5nZXROb2RlRnJvbVRyZWUodHlwZUlkKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE5vZGUudmFsdWUudXNlcklkID09IHVzZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUgPT09IG51bGwgfHwgTm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoTm9kZS52YXJpYW50c1tpXS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5Db25uZWN0aW9uVHlwZVRyZWUuY29ubmVjdGlvblR5cGVSb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgcmVtb3ZlRnJvbURhdGFiYXNlLCBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4vQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkJpbmFyeVRyZWUgfSBmcm9tIFwiLi9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvblR5cGVUcmVlIH0gZnJvbSBcIi4vQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvblR5cGVUcmVlXCI7XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkRhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNvbm5lY3Rpb24gQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvblRvU3RvcmFnZShjb25uZWN0aW9uKSB7XG4gICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImNvbm5lY3Rpb25cIiwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgLy8gICAgdmFyIGNvbnRhaW5zID0gdGhpcy5DaGVja0NvbnRhaW5zKGNvbm5lY3Rpb24pO1xuICAgICAgICAvLyAgICAgaWYoY29udGFpbnMpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuUmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGlmKGNvbm5lY3Rpb24uaWQgIT0gMCB8fCBjb25uZWN0aW9uLmlzVGVtcCl7XG4gICAgICAgIC8vICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29ubmVjdGlvblwiLGNvbm5lY3Rpb24pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdGhpcy5jb25uZWN0aW9uQXJyYXkucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLmFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBDb25uZWN0aW9uVHlwZVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvblRvTWVtb3J5KGNvbm5lY3Rpb24pIHtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgQ29ubmVjdGlvbkJpbmFyeVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5hZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRUb0RpY3Rpb25hcnkoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25EaWN0aW9uYXJ5W2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICAvLyAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIC8vICAgICBpZih0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBjb25uZWN0aW9uLmlkKXtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbm5lY3Rpb25BcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgIT0gMCkge1xuICAgICAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZShjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5yZW1vdmVUeXBlQ29uY2VwdChjb25uZWN0aW9uLnR5cGVJZCwgY29ubmVjdGlvbi5pZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25UcmVlKCkge1xuICAgICAgICByZXR1cm4gQ29ubmVjdGlvbkJpbmFyeVRyZWUuY29ubmVjdGlvbnJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uVHlwZVRyZWUoKSB7XG4gICAgICAgIHJldHVybiBDb25uZWN0aW9uVHlwZVRyZWUuY29ubmVjdGlvblR5cGVSb290O1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgLy8gICAgdmFyICBteUNvbmNlcHQ6IENvbm5lY3Rpb258bnVsbDtcbiAgICAgICAgICAgIC8vICAgIG15Q29uY2VwdCA9IG51bGw7XG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBpPTA7IGk8dGhpcy5jb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBpZCl7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBteUNvbmNlcHQgPSB0aGlzLmNvbm5lY3Rpb25BcnJheVtpXTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbXlDb25jZXB0O1xuICAgICAgICAgICAgdmFyIG15Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB5aWVsZCBDb25uZWN0aW9uQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbmNlcHQgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlDb25uZWN0aW9uID0gcmV0dXJuZWRDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmKG15Q29uY2VwdC5pZCA9PSAwIHx8IG15Q29uY2VwdCA9PSBudWxsKXtcbiAgICAgICAgICAgIC8vICAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNvbmNlcHRzQXJyYXlbaV0uaWQgPT0gaWQpe1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgbXlDb25jZXB0ID0gdGhpcy5jb25jZXB0c0FycmF5W2ldO1xuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIG15Q29ubmVjdGlvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gW107XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHlpZWxkIENvbm5lY3Rpb25UeXBlVHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbm5lY3Rpb24gPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15Q29ubmVjdGlvbiA9IHJldHVybmVkQ29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChteUNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2gobm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZihteUNvbmNlcHQuaWQgPT0gMCB8fCBteUNvbmNlcHQgPT0gbnVsbCl7XG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBpPTA7IGk8dGhpcy5jb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYodGhpcy5jb25jZXB0c0FycmF5W2ldLmlkID09IGlkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG15Q29uY2VwdCA9IHRoaXMuY29uY2VwdHNBcnJheVtpXTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxufVxuQ29ubmVjdGlvbkRhdGEuY29ubmVjdGlvbkFycmF5ID0gW107XG5Db25uZWN0aW9uRGF0YS5jb25uZWN0aW9uRGljdGlvbmFyeSA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIEZpbHRlclNlYXJjaCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dpY29wZXJhdG9yID0gXCI9XCI7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBJZGVudGlmaWVyRmxhZ3Mge1xufVxuSWRlbnRpZmllckZsYWdzLmlzVHlwZUxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzQ2hhcmFjdGVyTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNEYXRhTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0xvY2FsQ2hhcmFjdGVyTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbFR5cGVMb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25Mb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25UeXBlTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENvbm5lY3Rpb25Mb2FkZWQgPSBmYWxzZTtcbiIsImV4cG9ydCBjbGFzcyBMQ29uY2VwdCB7XG4gICAgY29uc3RydWN0b3IoaWQsIHVzZXJJZCwgdHlwZUlkLCBjYXRlZ29yeUlkLCBhY2Nlc3NJZCwgY2hhcmFjdGVyVmFsdWUsIHR5cGVDaGFyYWN0ZXIsIGlzTmV3ID0gZmFsc2UsIGVudHJ5VGltZVN0YW1wLCB1cGRhdGVkVGltZVN0YW1wLCByZWZlcmVudElkKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlJZCA9IGNhdGVnb3J5SWQ7XG4gICAgICAgIHRoaXMuY2hhcmFjdGVyVmFsdWUgPSBjaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLnR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgICAgIHRoaXMudHlwZUNoYXJhY3RlciA9IHR5cGVDaGFyYWN0ZXI7XG4gICAgICAgIHRoaXMuZW50cnlUaW1lU3RhbXAgPSBlbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy51cGRhdGVkVGltZVN0YW1wID0gdXBkYXRlZFRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy5yZWZlcmVudElkID0gcmVmZXJlbnRJZDtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcyk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZUlkKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0XCI7XG5leHBvcnQgY2xhc3MgTENvbm5lY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKGlkID0gMCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQsIGFjY2Vzc0lkKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHlwZSA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMub2ZUaGVDb25jZXB0SWQgPSBvZlRoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy50b1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMub3JkZXJJZCA9IG9yZGVySWQ7XG4gICAgICAgIHRoaXMudHlwZUNoYXJhY3RlciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWNjZXNzSWQgPSBhY2Nlc3NJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudGVybWluYXRpb25EYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTeW5jVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIExOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKSB7XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLnR5cGVJZCAhPSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQgPT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICBub2RlLnZhcmlhbnRzLnB1c2gocGFzc2VkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiApe1xuICAgICAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsXCIpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJsZWZ0ICBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIpe1xuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVsc2UgaGVyZVwiLCBub2RlLCBwYXNzZWROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIgJiYgbm9kZS52YWx1ZS5pZCAhPSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZWlnaHQgaGVyZVwiLCBub2RlLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFsYW5jaW5nRmFjdG9yIGhlcmVcIiwgYmFsYW5jaW5nRmFjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAxIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAyIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAzIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZTQgXCIsIHJldHVybmVyLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIndoYXQgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDZcIiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJpZ2h0Um90YXRlKHkpIHtcbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIGxldCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0geTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh5LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgICBsZWZ0Um90YXRlKHgpIHtcbiAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgIGxldCB5ID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlKSB7XG4gICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlICYmIHR5cGVJZCA9PSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUudHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnZhcmlhbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKXtcbiAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gaWQgKXtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHZhciBuZXdOb2RlID0gcGFzc2VkTm9kZS52YXJpYW50c1swXTtcbiAgICAgICAgLy8gICAgIGlmKG5ld05vZGUpe1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IG5ld05vZGUuY3VycmVudE5vZGU7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cyA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YXJpYW50cztcbiAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBpbW1lZGlhdGVTdWNjZXNzb3IuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IHR5cGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL2NvbmRpdGlvbiBpZiB0aGUgbWFpbiBub2RlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gY29uY2VwdElkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IG5ld05vZGUua2V5O1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb25kaXRpb24gdGhhdCB0aGUgbWFpbiBub2RlIGlzIG5vdCBlcXVhbCB0byB0aGUgY2hlY2tpbmcgdmFsdWUgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXB0SWQgPT0gcGFzc2VkTm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5LCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLy4uL0lkZW50aWZpZXJGbGFnc1wiO1xuaW1wb3J0IHsgTE5vZGUgfSBmcm9tIFwiLi8uLi9Mb2NhbC9MTm9kZVwiO1xuZXhwb3J0IGNsYXNzIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZSB7XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENoYXJhY3RlckxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChMb2NhbEJpbmFyeUNoYXJhY3RlclRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5hZGRDaGFyYWN0ZXJOb2RlKG5vZGUsIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LCB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LmNoYXJhY3RlclZhbHVlLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2hhcmFjdGVyQW5kVHlwZUZyb21UcmVlKHZhbHVlLCB0eXBlSWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRUeXBlKGNoYXJhY3RlciwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5Mb2NhbENoYXJhY3RlclJvb3QsIGNoYXJhY3RlciwgaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdmFyIGNoYXJhY3Rlck5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUodmFsdWUsIHR5cGVJZCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgIH1cbiAgICBzdGF0aWMgcmVtb3ZlTm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LnJlbW92ZU5vZGUodGhpcy5yb290LCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkxvY2FsQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4vLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBMTm9kZSB9IGZyb20gXCIuL0xOb2RlXCI7XG5leHBvcnQgY2xhc3MgTG9jYWxCaW5hcnlUeXBlVHJlZSB7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxUeXBlUm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbFR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Mb2NhbFR5cGVSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbFR5cGVSb290ID0gdGhpcy5Mb2NhbFR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMuTG9jYWxUeXBlUm9vdCwgdGhpcy5Mb2NhbFR5cGVSb290LmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Mb2NhbFR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC50eXBlSWQsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVDb25jZXB0VHlwZSh0eXBlSWQsIGlkKSB7XG4gICAgICAgIGlmICh0aGlzLkxvY2FsVHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuTG9jYWxUeXBlUm9vdCA9IHRoaXMuTG9jYWxUeXBlUm9vdC5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHRoaXMuTG9jYWxUeXBlUm9vdCwgdHlwZUlkLCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICBpZiAodGhpcy5Mb2NhbFR5cGVSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuTG9jYWxUeXBlUm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5Mb2NhbFR5cGVSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkxvY2FsVHlwZVJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZSh0eXBlSWQpIHtcbiAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbFR5cGVMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlUeXBlVHJlZS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTm9kZS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkxvY2FsQmluYXJ5VHlwZVRyZWUuTG9jYWxUeXBlUm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IHN0b3JlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IExvY2FsQmluYXJ5VHJlZSB9IGZyb20gXCIuL0xvY2FsQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBMb2NhbEJpbmFyeVR5cGVUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlUeXBlVHJlZVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdFwiO1xuZXhwb3J0IGNsYXNzIExvY2FsQ29uY2VwdHNEYXRhIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjb25jZXB0c0FycmF5XCI7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0KGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgdGhpcy5sb2NhbGNvbmNlcHRzQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdFRvTWVtb3J5KGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0KGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgbXlDb25jZXB0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHlpZWxkIExvY2FsQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbmNlcHQgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlDb25jZXB0ID0gcmV0dXJuZWRDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgIH1cbiAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXROb2RlRnJvbVRyZWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJfdmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIC8vIGxldCBjb25jZXB0TGlzdDpDb25jZXB0W10gPSBhd2FpdCB0aGlzLkdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKTtcbiAgICAgICAgICAgIC8vIGZvcih2YXIgaT0wO2k8Y29uY2VwdExpc3QubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgIGlmKGNoYXJhY3Rlcl92YWx1ZSA9PSBjb25jZXB0TGlzdFtpXS5jaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHlpZWxkIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLCB0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKSB7XG4gICAgICAgIHZhciBteUNvbmNlcHQ7XG4gICAgICAgIGxldCBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubG9jYWxjb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0udHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgbXlDb25jZXB0O1xuICAgICAgICAgICAgbGV0IENvbmNlcHRMaXN0ID0gW107XG4gICAgICAgICAgICAvLyBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS50eXBlSWQgPT0gdHlwZUlkICYmIHRoaXMuY29uY2VwdHNBcnJheVtpXS51c2VySWQgPT0gdXNlcklkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5jb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgIC8vICAgICAgfVxuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIENvbmNlcHRMaXN0ID0geWllbGQgTG9jYWxCaW5hcnlUeXBlVHJlZS5nZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpO1xuICAgICAgICAgICAgcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG5Mb2NhbENvbmNlcHRzRGF0YS5sb2NhbGNvbmNlcHRzQXJyYXkgPSBbXTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL05vSW5kZXhEYlwiO1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4uL0lkZW50aWZpZXJGbGFnc1wiO1xuZXhwb3J0IGNsYXNzIExvY2FsQ29ubmVjdGlvbkRhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNvbm5lY3Rpb24gQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IHRoaXMuQ2hlY2tDb250YWlucyhjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgIT0gMCB8fCBjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRUb0RpY3Rpb25hcnkoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25EaWN0aW9uYXJ5W2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCAhPSAwKSB7XG4gICAgICAgICAgICAvLyAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uKGlkKSB7XG4gICAgICAgIHZhciBteUNvbmNlcHQ7XG4gICAgICAgIG15Q29uY2VwdCA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIG15Q29uY2VwdCA9IHRoaXMuY29ubmVjdGlvbkFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDb25uZWN0aW9uTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KExvY2FsQ29ubmVjdGlvbkRhdGEuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uQXJyYXlbaV0udHlwZUlkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG5Mb2NhbENvbm5lY3Rpb25EYXRhLmNvbm5lY3Rpb25BcnJheSA9IFtdO1xuTG9jYWxDb25uZWN0aW9uRGF0YS5jb25uZWN0aW9uRGljdGlvbmFyeSA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIGxlZnROb2RlLCByaWdodE5vZGUpIHtcbiAgICAgICAgdGhpcy52YXJpYW50cyA9IFtdO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDE7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGVmdE5vZGUgPSBsZWZ0Tm9kZTtcbiAgICAgICAgdGhpcy5yaWdodE5vZGUgPSByaWdodE5vZGU7XG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xuICAgIH1cbiAgICBhZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IG5vZGUudmFsdWUudHlwZUlkKSB7XG4gICAgICAgICAgICBub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGVUeXBlKHBhc3NlZE5vZGUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCA9PSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIG5vZGUudmFyaWFudHMucHVzaChwYXNzZWROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvL25vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5IDwgcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiKXtcbiAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkQ2hhcmFjdGVyTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGRlYnVnRmxhZyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBpZihwYXNzZWROb2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlID09IFwiRGVmYXVsdFwiKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImRlZmF1bHQgaGVyZVwiKTtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z0ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcXVhbCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiICl7XG4gICAgICAgICAgICAvLyAgICAgaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWxcIik7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgTGVmdE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJpZ2h0IGhlcmVcIiwgbm9kZSwgUmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLmFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgUmlnaHROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgICAgICAvLyAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ3VycmVudE5vZGVUeXBlKHBhc3NlZE5vZGUsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaGVpZ2h0IGhlcmVcIiwgbm9kZS5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImJhbGFuY2luZ0ZhY3RvciBoZXJlXCIsIGJhbGFuY2luZ0ZhY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMSBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMiBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMyBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmU0IFwiLCByZXR1cm5lciwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ3aGF0IGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSA2XCIsIG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhZGRUeXBlTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGRlYnVnRmxhZyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKG5vZGUua2V5ID4gcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibGVmdCAgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgTGVmdE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJpZ2h0IGhlcmVcIiwgbm9kZSwgUmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlbHNlIGhlcmVcIiwgbm9kZSwgcGFzc2VkTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSAwICYmIG5vZGUudmFsdWUuaWQgIT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmlnaHRSb3RhdGUoeSkge1xuICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgbGV0IHggPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgbGV0IHkgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0geDtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXR1cm4geTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0QmFsYW5jZUZhY3RvcihOKSB7XG4gICAgICAgIGlmIChOID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhlaWdodChOLmxlZnROb2RlKSAtIHRoaXMuZ2V0SGVpZ2h0KE4ucmlnaHROb2RlKTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGUoaWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZVVwZGF0ZWQodmFsdWUsIG5vZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5IHx8ICgoX2EgPSBub2RlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZUlkKSA9PSA1MSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZSkge1xuICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSAmJiB0eXBlSWQgPT0gbm9kZS52YWx1ZS50eXBlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnZhcmlhbnRzW2ldLnZhbHVlLnR5cGVJZCA9PSB0eXBlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS52YXJpYW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZENhdGVnb3J5KHZhbHVlLCBjYXRlZ29yeUlkLCBub2RlKSB7XG4gICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlICYmIGNhdGVnb3J5SWQgPT0gbm9kZS52YWx1ZS5jYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS5jYXRlZ29yeUlkID09IGNhdGVnb3J5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS52YXJpYW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZihwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApe1xuICAgICAgICAvLyAgICAgaWYocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBpZCApe1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAvLyAgICAgaWYobmV3Tm9kZSl7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLmxlZnROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vY29uZGl0aW9uIGlmIHRoZSBtYWluIG5vZGUgaXMgZXF1YWwgdG8gdGhlIHZhbHVlXG4gICAgICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBjb25jZXB0SWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBtYWluIG5vZGUgaXMgbm90IGVxdWFsIHRvIHRoZSBjaGVja2luZyB2YWx1ZSBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRJZCA9PSBwYXNzZWROb2RlLnZhcmlhbnRzW2ldLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXksIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3VudE5vZGVCZWxvdyhyb290KSB7XG4gICAgICAgIGlmIChyb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVjdXJzaXZlIGNhbGwgdG8gbGVmdCBjaGlsZCBhbmQgcmlnaHQgY2hpbGQgYW5kXG4gICAgICAgIC8vIGFkZCB0aGUgcmVzdWx0IG9mIHRoZXNlIHdpdGggMSAoIDEgZm9yIGNvdW50aW5nIHRoZSByb290KVxuICAgICAgICByZXR1cm4gMSArIHRoaXMuY291bnROb2RlQmVsb3cocm9vdC5sZWZ0Tm9kZSkgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QucmlnaHROb2RlKTtcbiAgICB9XG4gICAgaW5PcmRlclN1Y2Nlc3Nvcihyb290KSB7XG4gICAgICAgIHdoaWxlIChyb290LmxlZnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QgPSByb290LmxlZnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQYXRjaGVyU3RydWN0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy51c2VySWQgPSA5OTk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gOTk5O1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gNDtcbiAgICAgICAgdGhpcy5vZlRoZUNvbXBvc2l0aW9uSWQgPSAwO1xuICAgICAgICB0aGlzLnBhdGNoT2JqZWN0ID0ge307XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRSZXNlcnZlZENvbm5lY3Rpb25JZHMgfSBmcm9tIFwiLi4vQXBpL0dldFJlc2VydmVkQ29ubmVjdGlvbklkc1wiO1xuaW1wb3J0IHsgR2V0UmVzZXJ2ZWRJZHMgfSBmcm9tIFwiLi4vQXBpL0dldFJlc2VydmVkSWRzXCI7XG5leHBvcnQgY2xhc3MgUmVzZXJ2ZWRJZHMge1xuICAgIHN0YXRpYyBnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkcy5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkcyA9IHlpZWxkIEdldFJlc2VydmVkSWRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmlkc1swXTtcbiAgICAgICAgICAgIHRoaXMuaWRzLnNoaWZ0KCk7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkSWQoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlkcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWRzLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuUmVzZXJ2ZWRJZHMuaWRzID0gW107XG5leHBvcnQgY2xhc3MgUmVzZXJ2ZWRDb25uZWN0aW9uSWRzIHtcbiAgICBzdGF0aWMgZ2V0SWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uSWRzLmxlbmd0aCA8IDUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbklkcyA9IHlpZWxkIEdldFJlc2VydmVkQ29ubmVjdGlvbklkcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5jb25uZWN0aW9uSWRzWzBdO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uSWRzLnNoaWZ0KCk7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkSWQoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb25JZHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25JZHMucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5SZXNlcnZlZENvbm5lY3Rpb25JZHMuY29ubmVjdGlvbklkcyA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIFJldHVybmVyIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgdXNlcklkLCByZWZlcmVudElkLCBpc05ldykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnJlZmVyZW50SWQgPSByZWZlcmVudElkO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNlYXJjaFF1ZXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbiA9IDA7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMubGlua2VyID0gXCJcIjtcbiAgICAgICAgdGhpcy5pbnBhZ2UgPSAxMDtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgdGhpcy5saXN0TGlua2VycyA9IFtdO1xuICAgICAgICB0aGlzLmZ1bGxMaW5rZXJzID0gW107XG4gICAgICAgIHRoaXMudGV4dFNlYXJjaCA9IFwiXCI7XG4gICAgICAgIHRoaXMubG9naWMgPSBcIm9yXCI7XG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpbHRlclNlYXJjaGVzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0b3JzID0gW107XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNlYXJjaFN0cnVjdHVyZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gXCJcIjtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbiA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb21wb3NpdGlvbiA9IFwiXCI7XG4gICAgICAgIHRoaXMudXNlcklkID0gOTk5O1xuICAgICAgICB0aGlzLmlucGFnZSA9IDEwO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBUb2tlblN0b3JhZ2Uge1xufVxuVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gXCJcIjtcbiIsImV4cG9ydCBjbGFzcyBTZXNzaW9uRGF0YSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaWQgPSBcIjBcIjtcbiAgICAgICAgdGhpcy5yZW1vdGVfYWRkcmVzcyA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VydmVyX3BvcnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlcnZlcl9hZGRyZXNzID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZXJ2ZXJfbmFtZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VydmVyX3NvZnR3YXJlID0gXCJcIjtcbiAgICAgICAgdGhpcy5odHRwX3VzZXJfYWdlbnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlbGYgPSBcIlwiO1xuICAgICAgICB0aGlzLnBvcnQgPSBcIlwiO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IFwiXCI7XG4gICAgICAgIHRoaXMuZW1haWwgPSBcIlwiO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTZXR0aW5nRGF0YSB7XG4gICAgY29uc3RydWN0b3IoaXNPbmxpbmVTeW5jKSB7XG4gICAgICAgIHRoaXMuaWQgPSAxO1xuICAgICAgICB0aGlzLmlzT25saW5lU3luYyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzT25saW5lU3luYyA9IGlzT25saW5lU3luYztcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgU2V0dGluZ3Mge1xufVxuU2V0dGluZ3MuaXNVcGRhdGVkID0gZmFsc2U7XG5TZXR0aW5ncy5pc09ubGluZVN5bmMgPSBmYWxzZTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4vLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25jZXB0QXBpIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29uY2VwdEFwaVwiO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaSB9IGZyb20gXCIuLi9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNvbm5lY3Rpb25BcGlcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgY2xhc3MgU3luY0RhdGEge1xuICAgIHN0YXRpYyBDaGVja0NvbnRhaW5zKGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbnM7XG4gICAgfVxuICAgIHN0YXRpYyBTeW5jRGF0YURlbGV0ZShpZCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSB0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQgPT0gaWQgfHwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLnRvVGhlQ29uY2VwdElkID09IGlkIHx8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS50eXBlSWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBDaGVja0NvbnRhaW5zQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS5pZCA9PSBjb25uZWN0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHRUZW1wb3JhcnkoY29uY2VwdCk7XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgUmVtb3ZlQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQgPT0gY29uY2VwdC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5LnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBSZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIFN5bmNEYXRhT25saW5lKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24odGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdHNBcnJheSA9IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICAgICAgQ3JlYXRlVGhlQ29uY2VwdEFwaShjb25jZXB0c0FycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZvcihsZXQgaSA9MCA7IGk8dGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aCA7IGkrKyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHRoZSBjb25uZWN0aW9uIGluIGJhY2tlbmRcIiwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLm9mVGhlQ29uY2VwdElkICsgXCI9PT09XCIgKyB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGlvbnNBcnJheSA9IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25BcGkoY29ubmVjdGlvbnNBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJkb25lXCI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgc3luY0RhdGFMb2NhbERiKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgdGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImxvY2FsY29ubmVjdGlvblwiLCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuU3luY0RhdGEuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcblN5bmNEYXRhLmNvbm5lY3Rpb25TeW5jQXJyYXkgPSBbXTtcbiIsImV4cG9ydCBjbGFzcyBUaGVDaGFyYWN0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJJZCwgZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgZW50cnlUaW1lc3RhbXAsIGlzTmV3KSB7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgICAgICB0aGlzLmlzTmV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLmRhdGEgPSBgJHtkYXRhfWA7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlJZCA9IHNlY3VyaXR5SWQ7XG4gICAgICAgIHRoaXMuc2VjdXJpdHlVc2VySWQgPSBzZWN1cml0eVVzZXJJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLmFjY2Vzc1VzZXJJZCA9IGFjY2Vzc1VzZXJJZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMuc2Vzc2lvblVzZXJJZCA9IHNlc3Npb25Vc2VySWQ7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldztcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgVGhlVGV4dHMge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJJZCwgZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgZW50cnlUaW1lc3RhbXAsIGlzTmV3KSB7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZWN1cml0eUlkID0gc2VjdXJpdHlJZDtcbiAgICAgICAgdGhpcy5zZWN1cml0eVVzZXJJZCA9IHNlY3VyaXR5VXNlcklkO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVXNlcklkID0gYWNjZXNzVXNlcklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uVXNlcklkID0gc2Vzc2lvblVzZXJJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVzdGFtcCA9IGVudHJ5VGltZXN0YW1wO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBVc2VyTm9kZSB9IGZyb20gXCIuL1VzZXJOb2RlXCI7XG5pbXBvcnQgeyBJZGVudGlmaWVyRmxhZ3MgfSBmcm9tIFwiLi8uLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmV4cG9ydCBjbGFzcyBVc2VyQmluYXJ5VHJlZSB7XG4gICAgc3RhdGljIGNvbXBvc2l0ZUtleSh1c2VySWQsIHNlc3Npb25JZCkge1xuICAgICAgICBsZXQgdXNlckhleCA9ICgnMDAwMCcgKyB1c2VySWQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC00KTtcbiAgICAgICAgbGV0IHNlc3Npb25IZXggPSAoJzAwMDAnICsgc2Vzc2lvbklkLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtNCk7XG4gICAgICAgIHJldHVybiB1c2VySGV4ICsgc2Vzc2lvbkhleDtcbiAgICB9XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LmFkZE5vZGUobm9kZSwgdGhpcy5yb290LCB0aGlzLnJvb3QuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoVXNlckJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCwgdXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgVXNlck5vZGUoa2V5LCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKHVzZXJJZCwgc2Vzc2lvbklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZShrZXksIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVOb2RlRnJvbVRyZWUodXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5jb21wb3NpdGVLZXkodXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5yZW1vdmVOb2RlKHRoaXMucm9vdCwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb3VudE51bWJlck9mTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY291bnROb2RlQmVsb3codGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5Vc2VyQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsImV4cG9ydCBjbGFzcyBVc2VyTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgIHRoaXMubGVmdE5vZGUgPSBsZWZ0Tm9kZTtcbiAgICAgICAgdGhpcy5yaWdodE5vZGUgPSByaWdodE5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlLnZhbHVlLnB1c2goLi4ucGFzc2VkTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBsZXQgeCA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IHk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeS5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgbGVmdFJvdGF0ZSh4KSB7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICBsZXQgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSB4O1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3JldHVybiB5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBnZXRIZWlnaHQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBnZXRCYWxhbmNlRmFjdG9yKE4pIHtcbiAgICAgICAgaWYgKE4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVpZ2h0KE4ubGVmdE5vZGUpIC0gdGhpcy5nZXRIZWlnaHQoTi5yaWdodE5vZGUpO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZShpZCwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKGlkID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFNldHRpbmdEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdEYXRhXCI7XG5pbXBvcnQgeyBJbmRleERiIH0gZnJvbSBcIi4vaW5kZXhlZGRiXCI7XG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBJbmRleERiLmRiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9EYXRhYmFzZShkYXRhYmFzZU5hbWUsIG9iamVjdCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldFN0YXRzRnJvbURhdGFiYXNlKCkge1xuICAgIHZhciBzZXR0aW5nc0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEodHJ1ZSk7XG4gICAgcmV0dXJuIHNldHRpbmdzRGF0YTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBBaVVwZGF0ZUZsYWcob2JqZWN0KSB7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUoZGF0YWJhc2VOYW1lLCB0eXBlLCBpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoZGF0YWJhc2VOYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tRGF0YWJhc2UoZGF0YWJhc2VOYW1lLCBpZCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZyb21Mb2NhbERiKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG4iLCJ2YXIgdmVyc2lvbiA9IDQ7XG5leHBvcnQgY2xhc3MgSW5kZXhEYiB7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZkNvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCA9IFtdLCBjb25jZXB0KSB7XG4gICAgbGV0IGZvdW5kQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29uY2VwdExpc3QuZmluZChjID0+IGMuaWQgPT09IGNvbmNlcHQuaWQpO1xuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29uY2VwdCA9IGNoZWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbmNlcHQ7XG59XG4vLyBleHBvcnQgZnVuY3Rpb24gQ2hlY2tJZlR5cGVDb25jZXB0RXhpc3RzSW5BcnJheShcbi8vICAgY29uY2VwdExpc3Q6IENvbmNlcHRbXSA9IFtdLFxuLy8gICBjb25jZXB0OiBDb25jZXB0LFxuLy8gKSB7XG4vLyAgIGxldCBuZXdDb25jZXB0VHlwZSA9IGNvbmNlcHQudHlwZT8uY2hhcmFjdGVyVmFsdWU7XG4vLyAgIGlmKCFuZXdDb25jZXB0VHlwZT8uc3RhcnRzV2l0aChcInRoZV9cIikpe1xuLy8gICAgIG5ld0NvbmNlcHRUeXBlID0gXCJ0aGVfXCIgKyBuZXdDb25jZXB0VHlwZTtcbi8vICAgfVxuLy8gICBsZXQgc3RhcnRzV2l0aCA9IGNvbmNlcHRMaXN0W2ldLnR5cGU/LmNoYXJhY3RlclZhbHVlO1xuLy8gICBpZighc3RhcnRzV2l0aD8uc3RhcnRzV2l0aChcInRoZV9cIikpe1xuLy8gICAgIHN0YXJ0c1dpdGggPSBcInRoZV9cIiArIHN0YXJ0c1dpdGg7XG4vLyAgIH1cbi8vICAgbGV0IGZvdW5kQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KClcbi8vICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4vLyAgICAgY29uc3QgY2hlY2sgPSBjb25jZXB0TGlzdC5maW5kKGMgPT4gYy50eXBlSWQgPT0gY29uY2VwdC50eXBlSWQpXG4vLyAgICAgaWYgKGNoZWNrKSB7XG4vLyAgICAgICBmb3VuZENvbmNlcHQgPSBjaGVja1xuLy8gICAgIH1cbi8vICAgfVxuLy8gICByZXR1cm4gZm91bmRDb25jZXB0XG4vLyB9XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZlR5cGVDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QgPSBbXSwgY29uY2VwdCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IGZvdW5kQ29uY2VwdHMgPSBbXTtcbiAgICBsZXQgbmV3Q29uY2VwdFR5cGUgPSAoX2EgPSBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZTtcbiAgICBpZiAoIShuZXdDb25jZXB0VHlwZSA9PT0gbnVsbCB8fCBuZXdDb25jZXB0VHlwZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmV3Q29uY2VwdFR5cGUuc3RhcnRzV2l0aChcInRoZV9cIikpKSB7XG4gICAgICAgIG5ld0NvbmNlcHRUeXBlID0gXCJ0aGVfXCIgKyBuZXdDb25jZXB0VHlwZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydHNXaXRoID0gKF9iID0gY29uY2VwdExpc3RbaV0udHlwZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoYXJhY3RlclZhbHVlO1xuICAgICAgICAgICAgaWYgKCEoc3RhcnRzV2l0aCA9PT0gbnVsbCB8fCBzdGFydHNXaXRoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGFydHNXaXRoLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGggPSBcInRoZV9cIiArIHN0YXJ0c1dpdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgPT0gY29uY2VwdExpc3RbaV0udHlwZUlkIHx8IG5ld0NvbmNlcHRUeXBlID09IHN0YXJ0c1dpdGgpIHtcbiAgICAgICAgICAgICAgICBmb3VuZENvbmNlcHRzLnB1c2goY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbmNlcHRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUeXBlTENvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCA9IFtdLCBjb25jZXB0KSB7XG4gICAgbGV0IGZvdW5kQ29uY2VwdHMgPSBbXTtcbiAgICBsZXQgbmV3Q29uY2VwdFR5cGUgPSBjb25jZXB0LnR5cGVDaGFyYWN0ZXI7XG4gICAgaWYgKCEobmV3Q29uY2VwdFR5cGUgPT09IG51bGwgfHwgbmV3Q29uY2VwdFR5cGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld0NvbmNlcHRUeXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICBuZXdDb25jZXB0VHlwZSA9IFwidGhlX1wiICsgbmV3Q29uY2VwdFR5cGU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRzV2l0aCA9IGNvbmNlcHRMaXN0W2ldLnR5cGVDaGFyYWN0ZXI7XG4gICAgICAgICAgICBpZiAoIShzdGFydHNXaXRoID09PSBudWxsIHx8IHN0YXJ0c1dpdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXJ0c1dpdGguc3RhcnRzV2l0aChcInRoZV9cIikpKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRzV2l0aCA9IFwidGhlX1wiICsgc3RhcnRzV2l0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25jZXB0LnR5cGVJZCA9PSBjb25jZXB0TGlzdFtpXS50eXBlSWQgfHwgbmV3Q29uY2VwdFR5cGUgPT0gc3RhcnRzV2l0aCkge1xuICAgICAgICAgICAgICAgIGZvdW5kQ29uY2VwdHMucHVzaChjb25jZXB0TGlzdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kQ29uY2VwdHM7XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZkNvbm5lY3Rpb25FeGlzdHNJbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbm5lY3Rpb24pIHtcbiAgICBsZXQgZm91bmRDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMuaWQgPT09IGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29ubmVjdGlvbiA9IGNoZWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb247XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZlRvVGhlQ29uY2VwdEV4aXN0c0luQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbmNlcHRJZCkge1xuICAgIGxldCBmb3VuZENvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy50b1RoZUNvbmNlcHRJZCA9PT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb24gPSBjaGVjaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b0NoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMub2ZUaGVDb25jZXB0SWQgPT09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmICh0b0NoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb24gPSB0b0NoZWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb247XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbmNlcHRJZCkge1xuICAgIGxldCBmb3VuZENvbm5lY3Rpb25zID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMudG9UaGVDb25jZXB0SWQgPT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb25zLnB1c2goY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy5vZlRoZUNvbmNlcHRJZCA9PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAodG9DaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9ucy5wdXNoKHRvQ2hlY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb25zO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkxDb25uZWN0aW9uQXJyYXkoY29ubmVjdGlvbkxpc3QgPSBbXSwgY29uY2VwdElkKSB7XG4gICAgbGV0IGZvdW5kQ29ubmVjdGlvbnMgPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy50b1RoZUNvbmNlcHRJZCA9PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29ubmVjdGlvbnMucHVzaChjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9DaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLm9mVGhlQ29uY2VwdElkID09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmICh0b0NoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb25zLnB1c2godG9DaGVjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kQ29ubmVjdGlvbnM7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gUmVtb3ZlQ29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0ID0gW10sIGNvbmNlcHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgY29uY2VwdExpc3Quc3BsaWNlKGNvbmNlcHRMaXN0LmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuIGkuaWQgPT09IGNvbmNlcHQuaWQ7XG4gICAgICAgIH0pLCAxKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUmVtb3ZlQ29ubmVjdGlvbkZyb21MaXN0KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbm5lY3Rpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgY29ubmVjdGlvbkxpc3Quc3BsaWNlKGNvbm5lY3Rpb25MaXN0LmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuIGkuaWQgPT09IGNvbm5lY3Rpb24uaWQ7XG4gICAgICAgIH0pLCAxKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUmVtb3ZlTENvbm5lY3Rpb25Gcm9tTGlzdChjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25uZWN0aW9uKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0LnNwbGljZShjb25uZWN0aW9uTGlzdC5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBjb25uZWN0aW9uLmlkO1xuICAgICAgICB9KSwgMSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSW5zZXJ0VW5pcXVlTnVtYmVyKEFycmF5LCB0b0luc2VydCkge1xuICAgIGlmIChBcnJheS5pbmRleE9mKHRvSW5zZXJ0KSA9PT0gLTEpIHtcbiAgICAgICAgQXJyYXkucHVzaCh0b0luc2VydCk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheTtcbn1cbiIsImltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24obmV3Q29ubmVjdGlvbnMgPSBbXSwgb2xkQ29ubmVjdGlvbnMgPSBbXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkQ29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q29ubmVjdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAoIW5ld0Nvbm5lY3Rpb25zLmZpbmQob2JqID0+IG9iai5pZCA9PT0gb2xkQ29ubmVjdGlvbnNbaV0uaWQpKSB7XG4gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuUmVtb3ZlQ29ubmVjdGlvbihvbGRDb25uZWN0aW9uc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25XaXRoSWRzKG5ld0Nvbm5lY3Rpb25JZHMgPSBbXSwgb2xkQ29ubmVjdGlvbnMgPSBbXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkQ29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFuZXdDb25uZWN0aW9uSWRzLmluY2x1ZGVzKG9sZENvbm5lY3Rpb25zW2ldLmlkKSkge1xuICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuUmVtb3ZlQ29ubmVjdGlvbihvbGRDb25uZWN0aW9uc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhJztcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSAnLi4vLi4vU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHQnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBHZXRUaGVDb25jZXB0IH0gZnJvbSAnLi4vLi4vU2VydmljZXMvR2V0VGhlQ29uY2VwdCc7XG4vLyB0aGlzIGlzIGEgZGlmZmVyZW50IHR5cGUgb2YgcmVjdXJpc3ZlIGZldGNoIGJlY2F1c2UgaGVyZSBhbGwgdGhlIGNvbmNlcHRzIGFuZCBjb25uZWN0aW9ucyBhcmUgcGFzc2VkIGFzIGl0IGlzXG4vLyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHF1ZXJ5IHRoZSBjb25uZWN0aW9ucyBhbmQgY29uY2VwdHMgZnJvbSBvdXRzaWRlXG4vLyBpZiB0aGUgY29uY2VwdCBjb25uZWN0aW9uIGlzIG5vdCBmb3VuZCB0aGVuIGl0IHdpbGwgZ28gdG8gdGhlIGJhY2tlbmQgdG8gZmV0Y2ggaXRcbmV4cG9ydCBmdW5jdGlvbiByZWN1cnNpdmVGZXRjaE5ldyhpZCwgY29ubmVjdGlvbkxpc3QsIGNvbmNlcHRMaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgb3V0cHV0ID0ge307XG4gICAgICAgIGNvbnN0IGFycm91dHB1dCA9IFtdO1xuICAgICAgICBpZiAoaWQgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBjb25jZXB0IGZyb20gYSBsaXN0IG9mIGNvbmNlcHRzXG4gICAgICAgIGxldCBjb25jZXB0ID0gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCBpZCk7XG4gICAgICAgIC8vIGlmIHdlIGNhbm5vdCBmaW5kIHRoZSBjb25jZXB0IGZyb20gdGhlIGNvbmNlcHQgbGlzdCB0aGVuIGZpbmQgaXQgZnJvbSB0aGUgYmFja2VuZFxuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmNlcHRzIHRyaWVzIHRvIGZpbmQgaXQgZnJvbSB0aGUgYmluYXJ5IHRyZWUgZWxzZSBmcm9tIHRoZSBiYWNrZW5kIGlmIGNhbm5vdCBmaW5kIGl0IHRoZW5cbiAgICAgICAgICAgIC8vIGl0IHdpbGwgYmVjb21lIG51bGxcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb25jZXB0IHR5cGUgaXMgbm9uIGV4aXN0ZW50IHRoZW4geW91IGhhdmUgdG8gZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgIGlmIChjb25jZXB0LnR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY29uY2VwdCB0eXBlIGlkIGZyb20gdGhlIGNvbmNlcHQgd2hpY2ggaXMgc3RvcmVkIGluIHR5cGVJZFxuICAgICAgICAgICAgICAgIGNvbnN0IHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdFR5cGUgPSBnZXRDb25jZXB0RnJvbUxpc3QoY29uY2VwdExpc3QsIHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodG9Db25jZXB0VHlwZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vbGV0IG1haW5TdHJpbmcgPSBjb25jZXB0Py50eXBlPy5jaGFyYWN0ZXJWYWx1ZSA/PyAnJ1xuICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodmlzaXRlZENvbmNlcHRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlzaXRlZENvbmNlcHRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbG9vcCBvdmVyIGFsbCB0aGUgY29ubmVjdGlvbnNcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiBoYXMgdGhlIGlkIHRoYXQgaGFzIGJlZW4gcGFzc2VkIGluIHRoZSByZWN1cnNpb25cbiAgICAgICAgICAgICAgICAvLyBvZnRoZWNvbmNlcHRJZCAtLS0tLT4gdG9UaGVDb25jZXB0SWRcbiAgICAgICAgICAgICAgICAvLyB0aGlzIG9ubHkgZ2l2ZXMgdGhlIHZhbGlkIGNvbmNlcHQgaWQgdGhhdCBhcmUgaW5zaWRlIG9mIHRoaXMgaWRcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0YWtlIG91dCB0aGUgdG9UaGVDb25jZXB0SWQgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgdG9UaGVDb25jZXB0SWQgdG8gYSByZWFsIENvbmNlcHQgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCB0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmNlcHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09IG51bGwgfHwgdG9Db25jZXB0LmlkID09IDApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0SWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRvQ29uY2VwdCBpcyB2YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHR5cGUgaW4gY2FzZWUgdHlwZSBpcyBub3QgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0VHlwZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWdleCB0byBmaWx0ZXIgb3V0IHRoZSB0aGVfIGZyb20gdGhlIHR5cGUgY29uY2VwdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gJ3RoZV8nO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBjcmVhdGUgdGhlIGtleSBvZiB0aGUga2V5IHZhbHVlIHBhaXIgdGhhdCBpcyB0aGUgdHlwZSBvZiB0aGUgY29uY2VwdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxtYWluU3RyaW5nID0gKF9iID0gKF9hID0gdG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSB0aGVfIHdpdGggYW4gZW1wdHkgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgIHR5cGUgIGlzIGEgbnVtYmVyIHRoZW4gcHV0IGl0IGluc2lkZSBvZiBhbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIobG9jYWxLZXkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaE5ldyh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbmNlcHRMaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHR5cGUgaXMgYSBudW1iZXIgdGhlbiBwdXQgaXQgaW5zaWRlIGFuIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hOZXcodG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0TGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG4vLyBnZXRzIHRoZSBjb25jZXB0IGZyb20gdGhlIGxpc3Qgb2YgY29uY2VwdHMgdXNpbmcgdGhlIGNvbmNlcHRJZFxuZnVuY3Rpb24gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCBjb25jZXB0SWQpIHtcbiAgICBsZXQgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29uY2VwdElkID09IGNvbmNlcHRMaXN0W2ldLmlkKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdExpc3RbaV07XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSAnLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGEnO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbic7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsayB9IGZyb20gJy4uLy4uL0FwaS9HZXRDb25uZWN0aW9uQnVsayc7XG5pbXBvcnQgeyBHZXRDb25jZXB0IH0gZnJvbSAnLi4vLi4vQXBpL0dldENvbmNlcHQnO1xuaW1wb3J0IHsgcmVjdXJzaXZlRmV0Y2hOZXcgfSBmcm9tICcuL0J1aWxkQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgcmVjdXJzaXZlRmV0Y2ggfSBmcm9tICcuLi9HZXRDb21wb3NpdGlvbic7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uJztcbmltcG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQmluYXJ5VHJlZSc7XG5pbXBvcnQgeyBCdWxrQ29uY2VwdEdldHRlckFwaSB9IGZyb20gJy4uLy4uL0FwaS9HZXRDb25jZXB0QnVsayc7XG4vLyBnZXQgdGhlIGNvbXBvc2l0aW9uIHdpdGggdGhlIHBhc3NlZCBpZFxuLy8gaGVyZSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgcGFzc2VkIHdoaWNoIHdpbGwgcGFzcyB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaWYgZ2l2ZW5cbi8vIGVsc2UgdGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGdldCB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaXRzZWxmXG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoQ2FjaGUoaWQsIGNvbm5lY3Rpb25MaXN0UGFzc2VkID0gW10pIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0SWRMaXN0ID0gW107XG4gICAgICAgIGxldCByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgbGV0IG91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCB4ID0geWllbGQgQ29tcG9zaXRpb25CaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHggPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gW107XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RQYXNzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gZ2V0TXlDb25uZWN0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3RQYXNzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRJZExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29uY2VwdElkTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdElkTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBTYXZlVG9Db21wb3NpdGlvbkNhY2hlKGNvbmNlcHQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0SWRMaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgbGV0IHZpc2l0ZWRDb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgICAgICBjb25zdCBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSB4LnZhbHVlLkdldERhdGFDYWNoZSgpO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0ID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuLy8gdGhpcyBnZXRzIHRoZSBsaXN0IG9mIGNvbm5lY3Rpb25zIG9mIGEgY29tcG9zaXRpb24gZnJvbSBhIGxpc3Qgb2YgYnVsayBjb25uZWN0aW9uIHB1bGxcbmZ1bmN0aW9uIGdldE15Q29ubmVjdGlvbnMoaWQsIGNvbm5lY3Rpb25MaXN0KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFtpXS50eXBlSWQgPT0gaWQpIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbkxpc3RbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9ucztcbn1cbi8vIGdldCB0aGUgY29tcG9zaXRpb24gd2l0aCB0aGUgcGFzc2VkIGlkXG4vLyBoZXJlIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBpcyBwYXNzZWQgd2hpY2ggd2lsbCBwYXNzIHRoZSBpbnRlcm5hbCBjb25uZWN0aW9ucyBpZiBnaXZlblxuLy8gZWxzZSB0aGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZ2V0IHRoZSBpbnRlcm5hbCBjb25uZWN0aW9ucyBpdHNlbGZcbi8vIHRoaXMgZnVuY3Rpb24gaGFzIGEgIGZvcm1hdCBvZiBkYXRhIC0tIGlkXG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkV2l0aENhY2hlKGlkLCBjb25uZWN0aW9uTGlzdFBhc3NlZCA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbmNlcHRJZExpc3QgPSBbXTtcbiAgICAgICAgbGV0IG91dHB1dDtcbiAgICAgICAgY29uc3QgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIGNvbnN0IHggPSB5aWVsZCBDb21wb3NpdGlvbkJpbmFyeVRyZWUuZ2V0Tm9kZUZyb21UcmVlKGlkKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGxldCBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSBbXTtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFBhc3NlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSBnZXRNeUNvbm5lY3Rpb25zKGlkLCBjb25uZWN0aW9uTGlzdFBhc3NlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdElkTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb25jZXB0SWRMaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0SWRMaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFNhdmVUb0NvbXBvc2l0aW9uQ2FjaGUoY29uY2VwdCwgY29ubmVjdGlvbkxpc3QsIGNvbmNlcHRJZExpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICBjb25zdCBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgICAgICBGaW5hbFJldHVybltcImNyZWF0ZWRfYXRcIl0gPSBjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgICAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgICAgIEZpbmFsUmV0dXJuWydpZCddID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSB4LnZhbHVlLkdldERhdGFDYWNoZSgpO1xuICAgICAgICAgICAgRmluYWxSZXR1cm4gPSBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9KTtcbn1cbi8vIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcGFzc2VkIHdpdGggYnVsayBjb21wb3NpdGlvbnMgYW5kIGJ1bGsgaW50ZXJuYWwgY29ubmVjdGlvbnMgb2YgdGhlbVxuLy8gc28gdGhhdCBpIGNhbiBjb252ZXIgdGhlbSB0byBhY3R1YWwgbGlzdCBvZiBjb21wb3NpdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbldpdGhEYXRhSWRCdWxrKGlkcywgY29ubmVjdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25zID0gW107XG4gICAgICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsoY29ubmVjdGlvbnMpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IG5ld0Nvbm5lY3Rpb25zO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkV2l0aENhY2hlKGlkc1tpXSwgY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKG91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0aW9ucztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFNhdmVUb0NvbXBvc2l0aW9uQ2FjaGUoY29uY2VwdCwgY29ubmVjdGlvbnMsIGNvbmNlcHRJZExpc3QsIG51bWJlcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbiA9IG5ldyBDb21wb3NpdGlvbigpO1xuICAgICAgICBjb25zdCBjb25jZXB0cyA9IHlpZWxkIEJ1bGtDb25jZXB0R2V0dGVyKGNvbmNlcHRJZExpc3QpO1xuICAgICAgICBjb21wb3NpdGlvbi5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zO1xuICAgICAgICBjb21wb3NpdGlvbi5jb25jZXB0cyA9IGNvbmNlcHRzO1xuICAgICAgICBjb21wb3NpdGlvbi5pZCA9IGNvbmNlcHQuaWQ7XG4gICAgICAgIGNvbXBvc2l0aW9uLnN1YmNvbXBvc2l0aW9ucyA9IG51bWJlcnM7XG4gICAgICAgIGNvbXBvc2l0aW9uLm1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgbGV0IHZpc2l0ZWRDb25jZXB0cyA9IFtdO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaE5ldyhjb25jZXB0LmlkLCBjb25uZWN0aW9ucywgY29uY2VwdHMsIG51bWJlcnMsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgIGNvbXBvc2l0aW9uLmNhY2hlZCA9IG91dHB1dDtcbiAgICAgICAgQ29tcG9zaXRpb25CaW5hcnlUcmVlLmFkZENvbXBvc2l0aW9uVG9UcmVlKGNvbXBvc2l0aW9uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIEJ1bGtDb25jZXB0R2V0dGVyKGNvbmNlcHRJZHMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgYnVsa0NvbmNlcHRGZXRjaCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IChjb25jZXB0SWRzID09PSBudWxsIHx8IGNvbmNlcHRJZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHRJZHMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0VXNlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICBpZiAoY29uY2VwdFVzZS5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgYnVsa0NvbmNlcHRGZXRjaC5wdXNoKGNvbmNlcHRJZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb25jZXB0VXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGJ1bGtDb25jZXB0RmV0Y2ggPT09IG51bGwgfHwgYnVsa0NvbmNlcHRGZXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnVsa0NvbmNlcHRGZXRjaC5sZW5ndGgpID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0TGlzdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbmNlcHRMaXN0ID0geWllbGQgQnVsa0NvbmNlcHRHZXR0ZXJBcGkoYnVsa0NvbmNlcHRGZXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gJy4uL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmltcG9ydCB7IENvbXBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb24nO1xuaW1wb3J0IE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQgZnJvbSAnLi4vTWFrZVRoZUluc3RhbmNlQ29uY2VwdCc7XG5pbXBvcnQgeyBjcmVhdGVUaGVDb25uZWN0aW9uIH0gZnJvbSAnLi4vLi4vU2VydmljZXMvQ3JlYXRlVGhlQ29ubmVjdGlvbic7XG4vLyBjcmVhdGUgYSBjb21wb3NpdGlvbiB3aXRoIGNhY2hpbmcgbWVjaGFuaXNtXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUoanNvbiwgb2ZUaGVDb25jZXB0SWQgPSBudWxsLCBvZlRoZUNvbmNlcHRVc2VySWQgPSBudWxsLCBtYWluS2V5ID0gbnVsbCwgdXNlcklkID0gbnVsbCwgYWNjZXNzSWQgPSBudWxsLCBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IG51bGwsIGNvbXBvc2l0aW9uID0gbnVsbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsVXNlcklkID0gdXNlcklkICE9PSBudWxsICYmIHVzZXJJZCAhPT0gdm9pZCAwID8gdXNlcklkIDogOTk5O1xuICAgICAgICBjb25zdCBsb2NhbEFjY2Vzc0lkID0gYWNjZXNzSWQgIT09IG51bGwgJiYgYWNjZXNzSWQgIT09IHZvaWQgMCA/IGFjY2Vzc0lkIDogNDtcbiAgICAgICAgY29uc3QgbG9jYWxTZXNzaW9uSWQgPSBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gbnVsbCAmJiBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gdm9pZCAwID8gc2Vzc2lvbkluZm9ybWF0aW9uSWQgOiA5OTk7XG4gICAgICAgIGxldCBNYWluS2V5TG9jYWwgPSBtYWluS2V5ICE9PSBudWxsICYmIG1haW5LZXkgIT09IHZvaWQgMCA/IG1haW5LZXkgOiAwO1xuICAgICAgICBsZXQgTWFpbkNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBpZiAoY29tcG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaWYgbm8gY29tcG9zaXRpb24gaXMgcGFzc2VkIHRoZW4gY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW9uXG4gICAgICAgICAgICBjb21wb3NpdGlvbiA9IG5ldyBDb21wb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YganNvbltrZXldID09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoanNvbltrZXldKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KGtleSwgJycsIHRydWUsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBqc29uW2tleV0gIT0gJ3N0cmluZycgJiYgdHlwZW9mIGpzb25ba2V5XSAhPSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBjb25jZXB0SWQgYW5kIGNvbmNlcHRVc2VySWQgcGFzc2VkIHRoZW4gd2Uga25vdyB0aGlzIGlzIHRoZSBtYWluIGNvbmNlcHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyByZWxhdGVkIHRvIHRoaXMgY29uY2VwdC5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICBsb2NhbE1haW5LZXkgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICBNYWluS2V5TG9jYWwgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5jb25jZXB0cy5wdXNoKGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5pZCA9IGNvbmNlcHQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlKGpzb25ba2V5XSwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNvbmNlcHQgd2hpY2ggaGFzIHBhcmVudCBwYXNzZWQgb250byBpdCBhbmQgdGhpcyBpcyBhIHN1YmNvbXBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5jb25jZXB0cy5wdXNoKGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgY3JlYXRlVGhlQ29ubmVjdGlvbihvZlRoZSwgb2ZUaGVVc2VyLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCBsb2NhbFNlc3Npb25JZCwgY29uY2VwdC51c2VySWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUoanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoanNvbltrZXldICE9IG51bGwgJiYganNvbltrZXldICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5zdWJjb21wb3NpdGlvbnMucHVzaChjb25jZXB0LmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHRoZSBjb25jZXB0IGlzIG5vdyBhIGtleSB2YWx1ZSBwYWlyIGFuZCBoYXMgdGhlIGFjdHVhbCBkYXRhXG4gICAgICAgICAgICAgICAgY29uc3Qgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2ZUaGVVc2VyID0gb2ZUaGVDb25jZXB0VXNlcklkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0VXNlcklkIDogOTk5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIGpzb25ba2V5XSwgZmFsc2UsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgY3JlYXRlVGhlQ29ubmVjdGlvbihvZlRoZSwgb2ZUaGVVc2VyLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCBsb2NhbFNlc3Npb25JZCwgY29uY2VwdC51c2VySWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuIHRoZSBtYWluIGNvbmNlcHRcbiAgICAgICAgcmV0dXJuIE1haW5Db25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZSB9IGZyb20gXCIuLi8uLi9BcGkvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0QXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9TZWFyY2hDb25jZXB0L0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0XCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEsIENyZWF0ZURlZmF1bHRDb25jZXB0LCBTcGxpdFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09IFwidGhlXCIpIHtcbiAgICAgICAgICAgIGNvbmNlcHQuaWQgPSAxO1xuICAgICAgICAgICAgY29uY2VwdC50eXBlSWQgPSA1O1xuICAgICAgICAgICAgY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSA9IFwidGhlXCI7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3BsaXR0ZWRTdHJpbmdBcnJheSA9IFNwbGl0U3RyaW5ncyhjaGFyYWN0ZXIpO1xuICAgICAgICBpZiAoc3BsaXR0ZWRTdHJpbmdBcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSAxO1xuICAgICAgICAgICAgbGV0IHByZWZpeCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0pO1xuICAgICAgICAgICAgaWYgKHByZWZpeC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSBwcmVmaXguaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tTWVtb3J5KGNoYXJhY3RlciwgY2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0gPT0gY2hhcmFjdGVyKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKGNoYXJhY3RlclZhbHVlLCA1MSk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tTWVtb3J5KGNoYXJhY3RlciwgY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKGNoYXJhY3RlciwgY2F0ZWdvcnkpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlEaXJlY3RBcGkoY2hhcmFjdGVyLCBjYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBMQ29ubmVjdGlvbiB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gXCIuLi9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpIHtcbiAgICBjb25zdCBMQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgIExDb25jZXB0LmlkID0gY29uY2VwdC5pZDtcbiAgICBMQ29uY2VwdC5naG9zdElkID0gY29uY2VwdC5naG9zdElkO1xuICAgIExDb25jZXB0LnVzZXJJZCA9IGNvbmNlcHQudXNlcklkO1xuICAgIExDb25jZXB0LmFjY2Vzc0lkID0gY29uY2VwdC5hY2Nlc3NJZDtcbiAgICBMQ29uY2VwdC5jYXRlZ29yeUlkID0gY29uY2VwdC5jYXRlZ29yeUlkO1xuICAgIExDb25jZXB0LmNoYXJhY3RlclZhbHVlID0gY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZTtcbiAgICBMQ29uY2VwdC5lbnRyeVRpbWVTdGFtcCA9IGNvbmNlcHQuZW50cnlUaW1lU3RhbXA7XG4gICAgTENvbmNlcHQudHlwZUlkID0gY29uY2VwdC50eXBlSWQ7XG4gICAgTENvbmNlcHQudHlwZSA9IGNvbmNlcHQudHlwZTtcbiAgICBMQ29uY2VwdC5pc1RlbXAgPSBmYWxzZTtcbiAgICByZXR1cm4gTENvbmNlcHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdChsY29uY2VwdCkge1xuICAgIGNvbnN0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgIGNvbmNlcHQuaWQgPSBsY29uY2VwdC5pZDtcbiAgICBjb25jZXB0Lmdob3N0SWQgPSBsY29uY2VwdC5naG9zdElkO1xuICAgIGNvbmNlcHQudXNlcklkID0gbGNvbmNlcHQudXNlcklkO1xuICAgIGNvbmNlcHQuYWNjZXNzSWQgPSBsY29uY2VwdC5hY2Nlc3NJZDtcbiAgICBjb25jZXB0LmVudHJ5VGltZVN0YW1wID0gbGNvbmNlcHQuZW50cnlUaW1lU3RhbXA7XG4gICAgY29uY2VwdC50eXBlSWQgPSBsY29uY2VwdC50eXBlSWQ7XG4gICAgY29uY2VwdC5jYXRlZ29yeUlkID0gbGNvbmNlcHQuY2F0ZWdvcnlJZDtcbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RnJvbUNvbm5lY3Rpb25Ub0xDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICBjb25zdCBMY29ubmVjdGlvbiA9IG5ldyBMQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICBMY29ubmVjdGlvbi5pZCA9IGNvbm5lY3Rpb24uaWQ7XG4gICAgTGNvbm5lY3Rpb24uZ2hvc3RJZCA9IGNvbm5lY3Rpb24uZ2hvc3RJZDtcbiAgICBMY29ubmVjdGlvbi5hY2Nlc3NJZCA9IGNvbm5lY3Rpb24uYWNjZXNzSWQ7XG4gICAgTGNvbm5lY3Rpb24ub2ZUaGVDb25jZXB0SWQgPSBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkO1xuICAgIExjb25uZWN0aW9uLnRvVGhlQ29uY2VwdElkID0gY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZDtcbiAgICBMY29ubmVjdGlvbi5lbnRyeVRpbWVTdGFtcCA9IGNvbm5lY3Rpb24uZW50cnlUaW1lU3RhbXA7XG4gICAgTGNvbm5lY3Rpb24udHlwZUlkID0gY29ubmVjdGlvbi50eXBlSWQ7XG4gICAgTGNvbm5lY3Rpb24uaXNUZW1wID0gZmFsc2U7XG4gICAgcmV0dXJuIExjb25uZWN0aW9uO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZCB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHRMaXN0ID0geWllbGQgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoXCJjb25jZXB0XCIpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0VG9NZW1vcnkoY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG5vZGUgPSBuZXcgTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBCaW5hcnlUcmVlLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIHRpbWUgPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbCB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsXCI7XG5pbXBvcnQgeyBEZWxldGVDb25uZWN0aW9uQnlJZCB9IGZyb20gXCIuL0RlbGV0ZUNvbm5lY3Rpb25cIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmltcG9ydCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IGZyb20gXCIuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzKG9mVGhlQ29uY2VwdCwgdG9UaGVDb25jZXB0LCBsaW5rZXIsIGJvdGggPSBmYWxzZSwgY291bnQgPSBmYWxzZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIHVzZXJJZCA9IG9mVGhlQ29uY2VwdC51c2VySWQ7XG4gICAgICAgIHZhciBvcmRlclVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSA5OTk7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gOTk5O1xuICAgICAgICBpZiAoYm90aCkge1xuICAgICAgICAgICAgbGV0IHByZWZpeDEgPSAoKF9hID0gdG9UaGVDb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCI7XG4gICAgICAgICAgICBsZXQgbGlua2VyQWRkMSA9IGxpbmtlciArIFwiX2J5XCI7XG4gICAgICAgICAgICBsZXQgYmFja3dhcmRMaW5rZXIgPSBwcmVmaXgxICsgXCJfXCIgKyBsaW5rZXJBZGQxO1xuICAgICAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICAgICAgeWllbGQgQ291bnRSZWxhdGlvbnNoaXAobGlua2VyQWRkMSwgdG9UaGVDb25jZXB0LCB1c2VySWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZSA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb25uZWN0aW9uXCIsIGJhY2t3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgICAgICBsZXQgbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIHRvVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LmlkLCB0b1RoZUNvbmNlcHQudXNlcklkLCBvZlRoZUNvbmNlcHQudXNlcklkLCB0b1RoZUNvbmNlcHQudXNlcklkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UuaWQsIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZS51c2VySWQsIDEwMDAsIHVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihuZXdDb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJlZml4ID0gKChfYiA9IG9mVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICBsZXQgbGlua2VyQWRkID0gbGlua2VyICsgXCJfc1wiO1xuICAgICAgICBsZXQgZm9yd2FyZExpbmtlciA9IHByZWZpeCArIFwiX1wiICsgbGlua2VyQWRkO1xuICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICAgIHlpZWxkIENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZCwgb2ZUaGVDb25jZXB0LCB1c2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25uZWN0aW9uQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb25uZWN0aW9uXCIsIGZvcndhcmRMaW5rZXIsIGZhbHNlLCA5OTksIDk5OSwgOTk5KTtcbiAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCBvZlRoZUNvbmNlcHQuaWQsIHRvVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgY29ubmVjdGlvbkNvbmNlcHQuaWQsIGNvbm5lY3Rpb25Db25jZXB0LnVzZXJJZCwgMTAwMCwgdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiBuZXdDb25uZWN0aW9uO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENvdW50UmVsYXRpb25zaGlwKGxpbmtlciwgY29uY2VwdCwgcGFzc2VkVXNlcklkID0gbnVsbCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdDEgPSBjb25jZXB0O1xuICAgICAgICB2YXIgdXNlcklkID0gcGFzc2VkVXNlcklkICE9PSBudWxsICYmIHBhc3NlZFVzZXJJZCAhPT0gdm9pZCAwID8gcGFzc2VkVXNlcklkIDogY29uY2VwdC51c2VySWQ7XG4gICAgICAgIHZhciBvcmRlclVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSA5OTk7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gOTk5O1xuICAgICAgICB2YXIgZm9yd2FyZExpbmtlckNvdW50ID0gbGlua2VyICsgXCJfY291bnRcIjtcbiAgICAgICAgdmFyIGZvcndhcmRMaW5rZXJDb3VudFN0cmluZyA9ICgoX2EgPSBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCIgKyBcIl9cIiArIGZvcndhcmRMaW5rZXJDb3VudDtcbiAgICAgICAgdmFyIGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyQ291bnRTdHJpbmcsIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQoZm9yd2FyZExpbmtlckNvdW50Q29uY2VwdC5pZCwgY29uY2VwdC5pZCwgdXNlcklkLCAxMCwgMSk7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zU3RyaW5nO1xuICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgdmFyIGNvdW50Q29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgdmFyIGNvdW50Q29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIGNvdW50Q29uY2VwdExpc3QucHVzaCh0b0NvbmNlcHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudENvbmNlcHRMaXN0Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIGNvdW50Q29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb3VudFwiLCBcIjFcIiwgZmFsc2UsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBvbGRjb3VudENvbmNlcHQgPSBjb3VudENvbmNlcHRMaXN0WzBdO1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY291bnQgPSBOdW1iZXIob2xkY291bnRDb25jZXB0LmNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxO1xuICAgICAgICAgICAgY291bnRDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvdW50XCIsIGNvdW50LnRvU3RyaW5nKCksIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgRGVsZXRlQ29ubmVjdGlvbkJ5SWQoY29ubmVjdGlvbnNbaV0uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgY29uY2VwdDEuaWQsIGNvdW50Q29uY2VwdC5pZCwgY29uY2VwdDEudXNlcklkLCBjb3VudENvbmNlcHQudXNlcklkLCBjb25jZXB0MS51c2VySWQsIGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQuaWQsIGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQudXNlcklkLCAxMDAwLCB1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgeWllbGQgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihuZXdDb25uZWN0aW9uKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzR2VuZXJhbChvZlRoZUNvbmNlcHQsIHRvVGhlQ29uY2VwdCwgbGlua2VyLCBib3RoID0gZmFsc2UsIGNvdW50ID0gZmFsc2UpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHQudXNlcklkO1xuICAgICAgICB2YXIgb3JkZXJVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgaWYgKGJvdGgpIHtcbiAgICAgICAgICAgIGxldCBwcmVmaXgxID0gKChfYSA9IHRvVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICAgICAgbGV0IGxpbmtlckFkZDEgPSBsaW5rZXIgKyBcIl9ieVwiO1xuICAgICAgICAgICAgbGV0IGJhY2t3YXJkTGlua2VyID0gcHJlZml4MSArIFwiX1wiICsgbGlua2VyQWRkMTtcbiAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZDEsIHRvVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBiYWNrd2FyZExpbmtlciwgZmFsc2UsIDk5OSwgOTk5LCA5OTkpO1xuICAgICAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCB0b1RoZUNvbmNlcHQuaWQsIG9mVGhlQ29uY2VwdC5pZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlLmlkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UudXNlcklkLCAxMDAwLCB1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZpeCA9ICgoX2IgPSBvZlRoZUNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIjtcbiAgICAgICAgbGV0IGxpbmtlckFkZCA9IGxpbmtlciArIFwiX3NcIjtcbiAgICAgICAgbGV0IGZvcndhcmRMaW5rZXIgPSBwcmVmaXggKyBcIl9cIiArIGxpbmtlckFkZDtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICB5aWVsZCBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXJBZGQsIG9mVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29ubmVjdGlvbkNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0geWllbGQgQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwob2ZUaGVDb25jZXB0LmlkLCBvZlRoZUNvbmNlcHQudXNlcklkLCB0b1RoZUNvbmNlcHQuaWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIGNvbm5lY3Rpb25Db25jZXB0LmlkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIDEwMDAsIGFjY2Vzc0lkKTtcbiAgICAgICAgcmV0dXJuIG5ld0Nvbm5lY3Rpb247XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25jZXB0IH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpIHtcbiAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBjb25jZXB0ID0gbmV3IENvbmNlcHQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgXCIwXCIsIDAsIDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBjcmVhdGVkX29uLCB1cGRhdGVkX29uKTtcbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuaW1wb3J0IHsgY3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbm5lY3Rpb25cIjtcbmltcG9ydCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IGZyb20gXCIuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbXBvc2l0aW9uKGpzb24sIG9mVGhlQ29uY2VwdElkID0gbnVsbCwgb2ZUaGVDb25jZXB0VXNlcklkID0gbnVsbCwgbWFpbktleSA9IG51bGwsIHVzZXJJZCA9IG51bGwsIGFjY2Vzc0lkID0gbnVsbCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSBudWxsKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGxvY2FsVXNlcklkID0gdXNlcklkICE9PSBudWxsICYmIHVzZXJJZCAhPT0gdm9pZCAwID8gdXNlcklkIDogOTk5O1xuICAgICAgICB2YXIgbG9jYWxBY2Nlc3NJZCA9IGFjY2Vzc0lkICE9PSBudWxsICYmIGFjY2Vzc0lkICE9PSB2b2lkIDAgPyBhY2Nlc3NJZCA6IDQ7XG4gICAgICAgIHZhciBsb2NhbFNlc3Npb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSBudWxsICYmIHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSB2b2lkIDAgPyBzZXNzaW9uSW5mb3JtYXRpb25JZCA6IDk5OTtcbiAgICAgICAgdmFyIE1haW5LZXlMb2NhbCA9IG1haW5LZXkgIT09IG51bGwgJiYgbWFpbktleSAhPT0gdm9pZCAwID8gbWFpbktleSA6IDA7XG4gICAgICAgIHZhciBNYWluQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgICAgICAgIGlmICgodHlwZW9mIGpzb25ba2V5XSAhPSAnc3RyaW5nJyAmJiB0eXBlb2YganNvbltrZXldICE9ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIFwiXCIsIHRydWUsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICBsb2NhbE1haW5LZXkgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICBNYWluS2V5TG9jYWwgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbihqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KGtleSwgXCJcIiwgdHJ1ZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBNYWluQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb24oanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiAxMDI2NztcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxNYWluS2V5ID0gTWFpbktleUxvY2FsO1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIGpzb25ba2V5XSwgZmFsc2UsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWFpbkNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZVRoZUNvbmNlcHRBcGkgfSBmcm9tIFwiLi4vQXBpL0NyZWF0ZS9DcmVhdGVUaGVDb25jZXB0QXBpXCI7XG5pbXBvcnQgeyBDb25jZXB0IH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHRcIjtcbmltcG9ydCB7IFJlc2VydmVkSWRzIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1Jlc2VydmVkSWRzXCI7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YVwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaWQgPSB5aWVsZCBSZXNlcnZlZElkcy5nZXRJZCgpO1xuICAgICAgICB2YXIgaXNOZXcgPSB0cnVlO1xuICAgICAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBuZXcgQ29uY2VwdChpZCwgdXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgcmVmZXJlbnQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBpc05ldywgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbik7XG4gICAgICAgIGNvbmNlcHQuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIFN5bmNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHRUZW1wb3JhcnkocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0geWllbGQgUmVzZXJ2ZWRJZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGlzTmV3ID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgdXBkYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBjb25jZXB0ID0gbmV3IENvbmNlcHQoaWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHJlZmVyZW50LCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgaXNOZXcsIGNyZWF0ZWRfb24sIHVwZGF0ZWRfb24pO1xuICAgICAgICBjb25jZXB0LmlzVGVtcCA9IHRydWU7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHRJbW1lZGlhdGUocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0geWllbGQgUmVzZXJ2ZWRJZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGlzTmV3ID0gZmFsc2U7XG4gICAgICAgIGxldCBjcmVhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IG5ldyBDb25jZXB0KGlkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCByZWZlcmVudCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uKTtcbiAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIENyZWF0ZVRoZUNvbmNlcHRBcGkoW2NvbmNlcHRdKTtcbiAgICAgICAgLy9TeW5jRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsImltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgU3luY0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUaGVDb25uZWN0aW9uKG9mVGhlQ29uY2VwdElkLCBvZlRoZUNvbmNlcHRVc2VySWQsIHRvVGhlQ29uY2VwdElkLCB0b1RoZUNvbmNlcHRVc2VySWQsIHR5cGVJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHZhciBvcmRlcklkID0gMTtcbiAgICB2YXIgb3JkZXJVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIHR5cGVVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIHVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICB2YXIgc2VjdXJpdHlJZCA9IDA7XG4gICAgdmFyIHNlY3VyaXR5VXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgdmFyIGFjY2Vzc1VzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIG9mVGhlQ29uY2VwdElkLCB0b1RoZUNvbmNlcHRJZCwgb2ZUaGVDb25jZXB0VXNlcklkLCB0b1RoZUNvbmNlcHRVc2VySWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBvcmRlcklkLCBvcmRlclVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSB0b1RoZUNvbmNlcHRJZCkge1xuICAgICAgICBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gMDtcbiAgICAgICAgY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZCA9IDE7XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBjb25uZWN0aW9uLmlzVGVtcCA9IHRydWU7XG4gICAgY29ubmVjdGlvbi5pZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBSZXNlcnZlZENvbm5lY3Rpb25JZHMgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvUmVzZXJ2ZWRJZHNcIjtcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwob2ZUaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdFVzZXJJZCwgdHlwZUlkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBvcmRlcklkID0gMSwgYWNjZXNzSWQgPSA0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIG9yZGVyVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB2YXIgdHlwZVVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICAgICAgdmFyIHVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSAwO1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciBpZCA9IHlpZWxkIFJlc2VydmVkQ29ubmVjdGlvbklkcy5nZXRJZCgpO1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKGlkLCBvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgb3JkZXJJZCwgb3JkZXJVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkID09IHRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gMDtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24udG9UaGVDb25jZXB0SWQgPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGdvIGFuZCB1cGRhdGUgdGhlIGV4aXN0aW5nIHdpdGggdGhlIHJlc2VydmVkIGlkXG4gICAgICAgIGNvbm5lY3Rpb24udG9VcGRhdGUgPSB0cnVlO1xuICAgICAgICBjb25uZWN0aW9uLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICBTeW5jRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IERlbGV0ZVRoZUNvbmNlcHQgZnJvbSBcIi4uL0FwaS9EZWxldGVUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeUNoYXJhY3RlclRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgQmluYXJ5VHlwZVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHlwZVRyZWVcIjtcbmltcG9ydCB7IHJlbW92ZUZyb21EYXRhYmFzZSB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBEZWxldGVDb25jZXB0QnlJZChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHlpZWxkIEJpbmFyeVRyZWUucmVtb3ZlTm9kZUZyb21UcmVlKGlkKTtcbiAgICAgICAgdmFyIHR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICB2YXIgY2hhcmFjdGVyID0gY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgeWllbGQgQmluYXJ5VHlwZVRyZWUucmVtb3ZlVHlwZUNvbmNlcHQodHlwZUlkLCBpZCk7XG4gICAgICAgIHlpZWxkIEJpbmFyeUNoYXJhY3RlclRyZWUucmVtb3ZlTm9kZUJ5Q2hhcmFjdGVyKGNoYXJhY3RlciwgaWQpO1xuICAgICAgICByZW1vdmVGcm9tRGF0YWJhc2UoXCJjb25jZXB0XCIsIGlkKTtcbiAgICAgICAgRGVsZXRlVGhlQ29uY2VwdChpZCk7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBEZWxldGVUaGVDb25uZWN0aW9uIGZyb20gXCIuLi9BcGkvRGVsZXRlVGhlQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkJpbmFyeVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvbkJpbmFyeVRyZWVcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25UeXBlVHJlZSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uVHlwZVRyZWVcIjtcbmltcG9ydCB7IHJlbW92ZUZyb21EYXRhYmFzZSB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IEdldENvbm5lY3Rpb25CeUlkIH0gZnJvbSBcIi4vR2V0Q29ubmVjdGlvbnNcIjtcbmV4cG9ydCBmdW5jdGlvbiBEZWxldGVDb25uZWN0aW9uQnlJZChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uID0geWllbGQgR2V0Q29ubmVjdGlvbkJ5SWQoaWQpO1xuICAgICAgICBEZWxldGVUaGVDb25uZWN0aW9uKGlkKTtcbiAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBpZCk7XG4gICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5yZW1vdmVUeXBlQ29uY2VwdChjb25uZWN0aW9uLnR5cGVJZCwgaWQpO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnVsayB9IGZyb20gXCIuLi9BcGkvR2V0Q29uY2VwdEJ1bGtcIjtcbmV4cG9ydCBmdW5jdGlvbiBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghQ29uY2VwdExpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUNvbmNlcHRMaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0TGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCBHZXRDb25jZXB0QnVsayhDb25jZXB0TGlzdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeShjb21wb3NpdGlvbl9pZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBGaW5hbENvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9zaXRpb25faWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChjb21wb3NpdGlvbl9pZHNbaV0pO1xuICAgICAgICAgICAgRmluYWxDb25uZWN0aW9uTGlzdC5wdXNoKC4uLmNvbm5lY3Rpb25MaXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRmluYWxDb25uZWN0aW9uTGlzdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0Q29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25cIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbihpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiByZXR1cm5PdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoQWxsSWRzKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDAgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hXaXRoU3ViQ29tcG9zaXRpb25zKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiByZXR1cm5PdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5KGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKTtcbiAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiByZXR1cm5PdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDAgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IG91dHB1dDtcbiAgICAgICAgdmFyIEZpbmFsUmV0dXJuID0ge307XG4gICAgICAgIEZpbmFsUmV0dXJuWydjcmVhdGVkX2F0J10gPSBjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoSWRBbmREYXRlRnJvbU1lbW9yeShpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICBGaW5hbFJldHVyblsnY3JlYXRlZF9hdCddID0gY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeUZyb21Db25uZWN0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3QpIHtcbiAgICB2YXIgY29ubmVjdGlvbkxpc3Q7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBhd2FpdCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoSWQoaWQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGFycm91dHB1dCA9IFtdO1xuICAgICAgICBpZiAoaWQgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IGNvbmNlcHQuaWQgPT0gMCkgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gY29uY2VwdC50eXBlSWQ7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodmlzaXRlZENvbmNlcHRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlzaXRlZENvbmNlcHRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT0gbnVsbCB8fCB0b0NvbmNlcHQuaWQgPT0gMCkgJiYgdG9Db25jZXB0SWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gdG9Db25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gXCJ0aGVfXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhcIlRvIHRoZSBjb25jZXB0XCIsIGNvbm5lY3Rpb25MaXN0W2ldLmlkLGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3RbaV0udHlwZUlkLCB0b0NvbmNlcHQuaWQsIHRvQ29uY2VwdC50eXBlSWQsIHRvQ29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgdG9Db25jZXB0LnR5cGU/LmNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaCh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCwgdmlzaXRlZENvbmNlcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2godG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2hXaXRoU3ViQ29tcG9zaXRpb25zKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFtcImlkXCJdID0gaWQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJiB0b0NvbmNlcHRJZCAhPSBudWxsICYmIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbkJ1bGtcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25XaXRoSWRzIH0gZnJvbSBcIi4vQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25cIjtcbmltcG9ydCB7IEZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25zQnVsa0luTWVtb3J5IH0gZnJvbSBcIi4vRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtJbk1lbW9yeVwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5LCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkgfSBmcm9tIFwiLi9HZXRDb21wb3NpdGlvblwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uQnVsayhpZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsoaWRzKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbkZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25CdWxrV2l0aERhdGFJZChpZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsoaWRzKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkKGlkcyA9IFtdLCBjb25uZWN0aW9ucyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIG5ld0Nvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsoY29ubmVjdGlvbnMpO1xuICAgICAgICB2YXIgbXlOZXdDb25uZWN0aW9ucyA9IG5ld0Nvbm5lY3Rpb25zO1xuICAgICAgICB2YXIgb2xkQ29ubmVjdGlvbnMgPSB5aWVsZCBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeShpZHMpO1xuICAgICAgICBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbldpdGhJZHMoY29ubmVjdGlvbnMsIG9sZENvbm5lY3Rpb25zKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QoaWRzID0gW10sIGNvbm5lY3Rpb25zID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVtYWluaW5nQ29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25zW2ldKTtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmlkID09IDApIHtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdDb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb25zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBHZXRDb25uZWN0aW9uQnVsayhyZW1haW5pbmdDb25uZWN0aW9ucyk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJ0SElTIElTIFRIRSBTVEFSVFwiLCBpZHNbaV0pXG4gICAgICAgICAgICB2YXIgY29tcCA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeShpZHNbaV0pO1xuICAgICAgICAgICAgY29tcG9zaXRpb25zW2lkc1tpXV0gPSBjb21wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldEFsbENvbmNlcHRzQnlUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25jZXB0c0J5VHlwZVwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1wiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkZyb21NZW1vcnksIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeSB9IGZyb20gXCIuL0dldENvbXBvc2l0aW9uXCI7XG5pbXBvcnQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyIGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlclwiO1xuLy8gZ2V0IHRoZSBsaXN0IG9mIGNvbXBvc2l0aW9ucyBmcm9tIHRoZSB0eXBlIFxuLy8gZm9yIGVnIGdldCBsaXN0IG9mIGJvb21ncHRcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3QoY29tcG9zaXRpb25OYW1lLCB1c2VySWQsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbmNlcHRzQnlUeXBlKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UGFnZSA9IGlucGFnZSAqIChwYWdlIC0gMSk7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2hDb21wb3NpdGlvbiA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3RXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbmNlcHRzQnlUeXBlKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UGFnZSA9IGlucGFnZSAqIChwYWdlIC0gMSk7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2hDb21wb3NpdGlvbiA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlXCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgIHZhciBsaXRlcmFsQ2hhcmFjdGVyID0gYCR7Y2hhcmFjdGVyVmFsdWV9YDtcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgKGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC5pZCkgPT0gMCkgJiYgbGl0ZXJhbENoYXJhY3Rlcikge1xuICAgICAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlclVwZGF0ZWQoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB2YXIgbGl0ZXJhbENoYXJhY3RlciA9IGAke2NoYXJhY3RlclZhbHVlfWA7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IChjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuaWQpID09IDApICYmIGxpdGVyYWxDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbiB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uQnlJZChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbihpZCk7XG4gICAgICAgIGlmICgoY29ubmVjdGlvbiA9PSBudWxsIHx8IGNvbm5lY3Rpb24uaWQgPT0gMCkgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbihpZCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgZ2V0QWxsRnJvbUxvY2FsRGIgfSBmcm9tIFwiLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5pbXBvcnQgeyBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZCB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXREYXRhRnJvbUluZGV4RGIoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gdmFyIGNvbmNlcHRMaXN0ID0gYXdhaXQgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoXCJjb25jZXB0XCIpO1xuICAgICAgICBHZXRDb25uZWN0aW9uc0Zyb21JbmRleERiKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGNvbmNlcHRMaXN0KTtcbiAgICAgICAgLy8gaWYoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpe1xuICAgICAgICAvLyAgICAgZm9yKHZhciBpPTAgO2kgPCBjb25jZXB0TGlzdC5sZW5ndGggO2krKyl7XG4gICAgICAgIC8vICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0RGF0YUZyb21JbmRleERiTG9jYWwoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gdmFyIGNvbmNlcHRMaXN0ID0gYXdhaXQgZ2V0QWxsRnJvbUxvY2FsRGIoXCJsb2NhbGNvbmNlcHRcIik7XG4gICAgICAgIEdldENvbm5lY3Rpb25zRnJvbUluZGV4RGJMb2NhbCgpO1xuICAgICAgICAvLyBpZihBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSl7XG4gICAgICAgIC8vICAgICBmb3IodmFyIGk9MCA7aSA8IGNvbmNlcHRMaXN0Lmxlbmd0aCA7aSsrKXtcbiAgICAgICAgLy8gICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHRMaXN0W2ldKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gR2V0Q29ubmVjdGlvbnNGcm9tSW5kZXhEYigpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZChcImNvbm5lY3Rpb25cIik7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb25Ub01lbW9yeShjb25uZWN0aW9uTGlzdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIEdldENvbm5lY3Rpb25zRnJvbUluZGV4RGJMb2NhbCgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBnZXRBbGxGcm9tTG9jYWxEYihcImxvY2FsY29ubmVjdGlvblwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgTG9jYWxDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb25MaXN0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5IH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25cIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsgfSBmcm9tIFwiLi4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rKGlkLCBsaW5rZXIsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciBsaW5rU3RyaW5nID0gKChfYSA9IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIiArIFwiX1wiICsgbGlua2VyO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKGxpbmtTdHJpbmcsIDE2KTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsocHJlZmV0Y2gpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29tcG9zaXRpb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5KHRvQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gobmV3Q29tcG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0TGlua1JhdyhpZCwgbGlua2VyLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoaWQpO1xuICAgICAgICB2YXIgbGlua1N0cmluZyA9ICgoX2EgPSBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCIgKyBcIl9cIiArIGxpbmtlcjtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZShsaW5rU3RyaW5nLCAxNik7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdCA9IHJlbGF0ZWRDb25jZXB0U3RyaW5nO1xuICAgICAgICBpZiAocmVsYXRlZENvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnNTdHJpbmcgPSB5aWVsZCBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0KHJlbGF0ZWRDb25jZXB0LmlkLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgaW5wYWdlLCBwYWdlKTtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zU3RyaW5nO1xuICAgICAgICAgICAgdmFyIHByZWZldGNoID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJlZmV0Y2gucHVzaChjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdElkID0gY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRvQ29uY2VwdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNUb1RoZUNvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0XCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0cyhpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IHlpZWxkIEdldEFsbExpbmtlckNvbm5lY3Rpb25zRnJvbVRoZUNvbmNlcHQoaWQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25uZWN0aW9uID0gY29ubmVjdGlvbnNbaV07XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbklkZW50aWZpZXIgPSBsb2NhbENvbm5lY3Rpb24udHlwZUlkO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbm5lY3Rpb25JZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGxvY2FsQ29ubmVjdGlvbi50eXBlID0gY29uY2VwdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0TGlua2VyQ29ubmVjdGlvblRvQ29uY2VwdHMoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSB5aWVsZCBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc1RvVGhlQ29uY2VwdChpZCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbm5lY3Rpb24gPSBjb25uZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uSWRlbnRpZmllciA9IGxvY2FsQ29ubmVjdGlvbi50eXBlSWQ7XG4gICAgICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbklkZW50aWZpZXIpO1xuICAgICAgICAgICAgbG9jYWxDb25uZWN0aW9uLnR5cGUgPSBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb25XaXRoSWRBbmREYXRlRnJvbU1lbW9yeSB9IGZyb20gXCIuL0dldENvbXBvc2l0aW9uXCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrXCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeSB9IGZyb20gXCIuL0NvbmNlcHRGaW5kaW5nL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5XCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVsYXRpb24oaWQsIHJlbGF0aW9uLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHJlbGF0aW9uKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsocHJlZmV0Y2gpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29tcG9zaXRpb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5KHRvQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gobmV3Q29tcG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVsYXRpb25SYXcoaWQsIHJlbGF0aW9uLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHJlbGF0aW9uKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9Db25jZXB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0XCI7XG5pbXBvcnQgeyBjb252ZXJ0RnJvbUxDb25jZXB0VG9Db25jZXB0LCBHZXRVc2VyR2hvc3RJZCB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR2V0VGhlQ29uY2VwdChpZCwgdXNlcklkID0gOTk5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgICAgICBsZXQgbGNvbmNlcHQgPSB5aWVsZCBHZXRVc2VyR2hvc3RJZCh1c2VySWQsIGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb252ZXJ0RnJvbUxDb25jZXB0VG9Db25jZXB0KGxjb25jZXB0KTtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IGNvbmNlcHQuaWQgPT0gMCkgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFR5cGUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChjb25jZXB0LnR5cGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRUeXBlID09IG51bGwgJiYgY29uY2VwdC50eXBlSWQgIT0gbnVsbCAmJiBjb25jZXB0LnR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChjb25jZXB0LnR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0eXBlQ29uY2VwdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldEFpRGF0YSB9IGZyb20gXCIuLi9BcGkvR2V0QWlEYXRhXCI7XG5pbXBvcnQgeyBTZXR0aW5nRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TZXR0aW5nRGF0YVwiO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU2V0dGluZ3NcIjtcbmltcG9ydCB7IEFpVXBkYXRlRmxhZywgR2V0U3RhdHNGcm9tRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBJbml0aWFsaXplU3lzdGVtKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBzdGF0c0RhdGEgPSB5aWVsZCBHZXRTdGF0c0Zyb21EYXRhYmFzZSgpO1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSBzdGF0c0RhdGE7XG4gICAgICAgIHlpZWxkIEdldEFpRGF0YSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBQdXJnYXRvcnlEYXRhYmFzZVVwZGF0ZWQoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgU2V0dGluZ3MuaXNPbmxpbmVTeW5jID0gdHJ1ZTtcbiAgICAgICAgdmFyIHNldHRpbmdEYXRhID0gbmV3IFNldHRpbmdEYXRhKFNldHRpbmdzLmlzT25saW5lU3luYyk7XG4gICAgICAgIEFpVXBkYXRlRmxhZyhzZXR0aW5nRGF0YSk7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBMQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29uY2VwdFwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpIHtcbiAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBjb25jZXB0ID0gbmV3IExDb25jZXB0KDAsIDAsIDAsIDAsIDAsIFwiMFwiLCBcIjBcIiwgZmFsc2UsIGNyZWF0ZWRfb24sIHVwZGF0ZWRfb24sIDApO1xuICAgIHJldHVybiBjb25jZXB0O1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBnZXRBbGxGcm9tTG9jYWxEYiB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIGdldEFsbEZyb21Mb2NhbERiKFwibG9jYWxjb25jZXB0XCIpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZENvbmNlcHRUb01lbW9yeShjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAvLyBsZXQgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuaWQsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgICAgIC8vIExvY2FsQmluYXJ5VHJlZS5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gXCIuLi9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHRcIjtcbmltcG9ydCB7IENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbCB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbFwiO1xuaW1wb3J0IHsgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsIH0gZnJvbSBcIi4vTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChqc29uLCBvZlRoZUNvbmNlcHRJZCA9IG51bGwsIG9mVGhlQ29uY2VwdFVzZXJJZCA9IG51bGwsIG1haW5LZXkgPSBudWxsLCB1c2VySWQgPSBudWxsLCBhY2Nlc3NJZCA9IG51bGwsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gbnVsbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgdmFyIGxvY2FsQWNjZXNzSWQgPSBhY2Nlc3NJZCAhPT0gbnVsbCAmJiBhY2Nlc3NJZCAhPT0gdm9pZCAwID8gYWNjZXNzSWQgOiA5OTk7XG4gICAgICAgIHZhciBsb2NhbFNlc3Npb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSBudWxsICYmIHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSB2b2lkIDAgPyBzZXNzaW9uSW5mb3JtYXRpb25JZCA6IDQ7XG4gICAgICAgIHZhciBNYWluS2V5TG9jYWwgPSBtYWluS2V5ICE9PSBudWxsICYmIG1haW5LZXkgIT09IHZvaWQgMCA/IG1haW5LZXkgOiAwO1xuICAgICAgICB2YXIgTWFpbkNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uW2tleV0gIT0gJ3N0cmluZycgJiYgdHlwZW9mIGpzb25ba2V5XSAhPSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwgXCJcIiwgdHJ1ZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBNYWluQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsTWFpbktleSA9IGNvbmNlcHQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIE1haW5LZXlMb2NhbCA9IGNvbmNlcHQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwoanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwgXCJcIiwgdHJ1ZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwob2ZUaGUsIGNvbmNlcHQuaWQsIGxvY2FsTWFpbktleSk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwoanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChrZXksIGpzb25ba2V5XSwgZmFsc2UsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChvZlRoZSwgY29uY2VwdC5pZCwgbG9jYWxNYWluS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWFpbkNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25jZXB0XCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGVjaGFyYWN0ZXIsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUlkLCBhY2Nlc3NJZCwgcmVmZXJlbnRJZCA9IDApIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgICAgICB2YXIgaXNOZXcgPSB0cnVlO1xuICAgICAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBuZXcgTENvbmNlcHQoaWQsIHVzZXJJZCwgdHlwZUlkLCBjYXRlZ29yeUlkLCBhY2Nlc3NJZCwgcmVmZXJlbnQsIHR5cGVjaGFyYWN0ZXIsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uLCByZWZlcmVudElkKTtcbiAgICAgICAgY29uY2VwdC5pc1RlbXAgPSB0cnVlO1xuICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb25cIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL05vSW5kZXhEYlwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIHR5cGVJZCwgb3JkZXJJZCA9IDEpIHtcbiAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgIGxldCByYW5kb21pZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgbGV0IHJlYWxPZlRoZUNvbmNlcHRJZCA9IDA7XG4gICAgbGV0IHJlYWxUb1RoZUNvbmNlcHRJZCA9IDA7XG4gICAgbGV0IHJlYWxUeXBlSWQgPSAwO1xuICAgIHJlYWxPZlRoZUNvbmNlcHRJZCA9IG9mVGhlQ29uY2VwdElkO1xuICAgIHJlYWxUb1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgIHJlYWxUeXBlSWQgPSB0eXBlSWQ7XG4gICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgTENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgaWYgKG9mVGhlQ29uY2VwdElkICE9IHRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgTENvbm5lY3Rpb24oMCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgY29ubmVjdGlvbi5pc1RlbXAgPSB0cnVlO1xuICAgICAgICBjb25uZWN0aW9uLmlkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwKTtcbiAgICAgICAgTG9jYWxDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbm5lY3Rpb25cIiwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkxvY2FsLCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkIH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25Mb2NhbFwiO1xuaW1wb3J0IEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsIGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKGNvbmNlcHQuaWQsIHVzZXJJZCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbXBvc2l0aW9uSnNvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uTG9jYWwoY29uY2VwdExpc3RbaV0uaWQpO1xuICAgICAgICAgICAgICAgIENvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbXBvc2l0aW9uSnNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbFdpdGhJZChjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwoY29tcG9zaXRpb25OYW1lKTtcbiAgICAgICAgdmFyIENvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBpZiAoY29uY2VwdCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRMaXN0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdHNCeVR5cGVJZEFuZFVzZXIoY29uY2VwdC5pZCwgdXNlcklkKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25Mb2NhbFdpdGhJZChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ29tcG9zaXRpb25MaXN0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBMb2NhbENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHJldHVybk91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hMb2NhbChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZWN1cnNpdmVGZXRjaExvY2FsKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcInRvcFwiO1xuICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodmlzaXRlZENvbmNlcHRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlzaXRlZENvbmNlcHRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9Db25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gdG9Db25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZSA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gXCJ0aGVfXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbG1haW5TdHJpbmcgPSAoX2QgPSAoX2MgPSB0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcInRvcFwiO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxLZXkgPSBsb2NhbG1haW5TdHJpbmcucmVwbGFjZShyZWdleCwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIobG9jYWxLZXkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hMb2NhbCh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwodG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJMb2NhbChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0TG9jYWwgZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ29uY2VwdExvY2FsKHJlZmVyZW50LCB0eXBlQ2hhcmFjdGVyLCB1c2VySWQsIGNhdGVnb3J5SWQsIHR5cGVJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKHJlZmVyZW50LCB0eXBlSWQpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIGxldCBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGVDaGFyYWN0ZXIsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUlkLCBhY2Nlc3NJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IENyZWF0ZVRoZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0TG9jYWxcIjtcbmltcG9ydCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9NYWtlVGhlVHlwZUxvY2FsXCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKHR5cGUsIHJlZmVyZW50LCBjb21wb3NpdGlvbiA9IGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OSwgcmVmZXJlbnRJZCA9IDApIHtcbiAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGFjY2Vzc0lkO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIHN0cmluZ1RvQ2hlY2sgPSBcIlwiO1xuICAgICAgICB2YXIgc3RyaW5nTGVuZ3RoID0gcmVmZXJlbnQubGVuZ3RoO1xuICAgICAgICB2YXIgdHlwZUNvbmNlcHQ7XG4gICAgICAgIHZhciBjb25jZXB0O1xuICAgICAgICB2YXIgc3RhcnRzV2l0aFRoZSA9IHR5cGUuc3RhcnRzV2l0aChcInRoZV9cIik7XG4gICAgICAgIGlmIChzdGFydHNXaXRoVGhlKSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSBcInRoZV9cIiArIHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbCh0eXBlLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgdXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdExvY2FsKHJlZmVyZW50LCB0eXBlLCB1c2VySWQsIGNhdGVnb3J5SWQsIHR5cGVDb25jZXB0LmlkLCBhY2Nlc3NJZCwgcmVmZXJlbnRJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHN0cmluZ1RvQ2hlY2ssIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHN0cmluZ1RvQ2hlY2ssIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3RyaW5nVG9DaGVjaywgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB2YXIgY29uY2VwdEJ5Q2hhclR5cGVTdHJpbmcgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlTG9jYWwocmVmZXJlbnQsIHR5cGVDb25jZXB0LmlkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0VHlwZUNoYXJhY3RlciA9IGNvbmNlcHRCeUNoYXJUeXBlU3RyaW5nO1xuICAgICAgICAgICAgLy8gdmFyIG1ha2VUaGVOYW1lU3RyaW5nID0gYXdhaXQgTWFrZVRoZU5hbWUocmVmZXJlbnQsdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCx0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLGNvbmNlcHRUeXBlQ2hhcmFjdGVyICk7XG4gICAgICAgICAgICAvLyB2YXIgbWFrZVRoZU5hbWVDb25jZXB0ID0gbWFrZVRoZU5hbWVTdHJpbmcgYXMgQ29uY2VwdDtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0VHlwZUNoYXJhY3RlcjtcbiAgICAgICAgICAgIGlmIChjb25jZXB0VHlwZUNoYXJhY3Rlci5pZCA9PSAwICYmIGNvbmNlcHRUeXBlQ2hhcmFjdGVyLnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHN0cmluZ1RvQ2hlY2ssIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25jZXB0LnR5cGUgPSB0eXBlQ29uY2VwdDtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0TG9jYWwgZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdExvY2FsXCI7XG5pbXBvcnQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwgZnJvbSBcIi4vR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWxcIjtcbmltcG9ydCB7IFNwbGl0U3RyaW5ncyB9IGZyb20gXCIuLi9TcGxpdFN0cmluZ3NcIjtcbmltcG9ydCBNYWtlVGhlQ29uY2VwdExvY2FsIGZyb20gXCIuL01ha2VUaGVDb25jZXB0TG9jYWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHR5cGVTdHJpbmcsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGV4aXN0aW5nQ29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKHR5cGVTdHJpbmcpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0KSB7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0LmlkID09IDAgfHwgZXhpc3RpbmdDb25jZXB0LnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3ModHlwZVN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0gPT0gdHlwZVN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIE1ha2VUaGVDb25jZXB0TG9jYWwodHlwZVN0cmluZywgXCJ0aGVcIiwgdXNlcklkLCA0LCA1MSk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYXRlZ29yeUNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbChzcGxpdHRlZFN0cmluZ0FycmF5WzBdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHNwbGl0dGVkU3RyaW5nQXJyYXlbMV0sIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVDb25jZXB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRMb2NhbCh0eXBlU3RyaW5nLCBzcGxpdHRlZFN0cmluZ0FycmF5WzFdLCB1c2VySWQsIGNhdGVnb3J5Q29uY2VwdC5pZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IEluc2VydFVuaXF1ZU51bWJlciBmcm9tICcuLi8uLi9IZWxwZXJzL1VuaXF1ZUluc2VydCc7XG5pbXBvcnQgeyBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5MQ29ubmVjdGlvbkFycmF5LCBDaGVja0lmVHlwZUxDb25jZXB0c0V4aXN0c0luQXJyYXksIH0gZnJvbSAnLi4vLi4vSGVscGVycy9DaGVja0lmRXhpc3RzJztcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24nO1xuaW1wb3J0IEdldFRoZUNvbmNlcHQgZnJvbSAnLi8uLi9HZXRUaGVDb25jZXB0JztcbmltcG9ydCB7IERlbGV0ZUNvbm5lY3Rpb25CeUlkIH0gZnJvbSAnLi8uLi9EZWxldGVDb25uZWN0aW9uJztcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSAnLi4vLi4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGEnO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbCB9IGZyb20gJy4vQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbCc7XG5pbXBvcnQgeyBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwgfSBmcm9tICcuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCc7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQsIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbCB9IGZyb20gJy4uLy4uL2FwcCc7XG5pbXBvcnQgeyBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0LCBjb252ZXJ0RnJvbUNvbm5lY3Rpb25Ub0xDb25uZWN0aW9uIH0gZnJvbSAnLi4vQ29udmVyc2lvbi9Db252ZXJ0Q29uY2VwdHMnO1xuLy8gZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBjYWNoZSBjb21wb3NpdGlvblxuZXhwb3J0IGZ1bmN0aW9uIFVwZGF0ZUNvbXBvc2l0aW9uTG9jYWwocGF0Y2hlclN0cnVjdHVyZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGRlZmF1bHQgdXNlcklkLCBzZXNzaW9uSWQsIGFjY2Vzc0lkIHBhc3NlZCBieSB0aGUgcGF0Y2hlclN0cnVjdHVyZVxuICAgICAgICBjb25zdCB1c2VySWQgPSBwYXRjaGVyU3RydWN0dXJlLnVzZXJJZDtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gcGF0Y2hlclN0cnVjdHVyZS5zZXNzaW9uSWQ7XG4gICAgICAgIGNvbnN0IGFjY2Vzc0lkID0gcGF0Y2hlclN0cnVjdHVyZS5hY2Nlc3NJZDtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBsZXQgcGFyZW50Q29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBjb25zdCB0b0RlbGV0ZUNvbmNlcHRzID0gW107XG4gICAgICAgIC8vIHRoZSBtYWluIGNvbXBvc2l0aW9uIElkIHRoYXQgaGFzIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcGF0Y2hlZFxuICAgICAgICBjb25zdCBjb21wb3NpdGlvbklkID0gcGF0Y2hlclN0cnVjdHVyZS5jb21wb3NpdGlvbklkO1xuICAgICAgICAvLyBpZiB5b3Ugd2FudCB0byBlZGl0IHRoZSBzdWJjb21wb3NpdGlvbnMgb2YgdGhlIGNvbXBvc2l0aW9uIHRoZW4geW91IGhhdmUgdG8gcGFzcyB0byB0aGlzXG4gICAgICAgIGNvbnN0IG9mVGhlQ29uY2VwdElkID0gcGF0Y2hlclN0cnVjdHVyZS5vZlRoZUNvbXBvc2l0aW9uSWQ7XG4gICAgICAgIGxldCB0b0RlbGV0ZUNvbm5lY3Rpb25zID0gW107XG4gICAgICAgIC8vIGdldCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGUgYmFja2VuZCBiZWNhdXNlIGl0IG5lZWRzIGxhdGVzdCBkYXRhXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGNvbXBvc2l0aW9uSWQpO1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3RPcmlnaW5hbCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0T3JpZ2luYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2goY29udmVydEZyb21Db25uZWN0aW9uVG9MQ29ubmVjdGlvbihjb25uZWN0aW9uTGlzdE9yaWdpbmFsW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uY2VwdElkTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgLy8gcHV0IHRoaXMgaW4gdGhlIHVwcGVyIHNlY3Rpb24gYmVmb3JlIHVwZGF0aW5nIGJlY2F1c2UgdGhpcyB3aWxsIHRlbGwgYWxsIG90aGVyIGRpc3RyaWJ1dGVkXG4gICAgICAgIC8vc2VydmVycyB0byBkZXN0cm95IHRoZSBjb3B5IG9mIHRoZSBjb21wb3NpdGlvbiB0aGF0IHRoZXkgaGF2ZSBhcyBuZXcgY29tcG9zaXRpb24gaXMgY29taW5nIHVwXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGluc2lkZSBvZiB0aGUgY29tcG9zaXRpb24gYW5kIHN0b3JlIHRoZW0gaW5cbiAgICAgICAgbGV0IGFsbENvbmNlcHRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb21wb3NpdGlvbkxpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb25jZXB0SWRMaXN0LCBjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29uY2VwdElkTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgYWxsQ29uY2VwdHMucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY29uY2VwdHMgdGhhdCBhcmUgaW5zaWRlIG9mIHRoZSBjb21wb3NpdGlvbiBhbmQgc3RvcmUgdGhlbSBpbiBhIGNvbmNlcHRMaXN0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdElkTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29uY2VwdElkTGlzdFtpXSk7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbklkID09IGNvbmNlcHRJZExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbiA9IGNvbnZlcnRGcm9tQ29uY2VwdFRvTENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gY29uY2VwdElkTGlzdFtpXSkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmNlcHQgPSBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgdHJ5aW5nIHRvIHBhdGNoIHRoZSBuZXcgb2JqZWN0IGludG8gdGhlIGNvbXBvc2l0aW9uXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHBhdGNoZXJTdHJ1Y3R1cmUucGF0Y2hPYmplY3Q7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgbGV0IGluc2VydGluZ0NvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25jZXB0ID0gY29tcG9zaXRpb247XG4gICAgICAgICAgICAvLyBpZiB0aGUgaW1tZWRpZGF0ZSBwYXJlbnQgZXhpc3RzIGluIHRoZSBjb21wb3NpdGlvbiAoaS5lLiBmb3IgbXVsdGlsZXZlbCBjb21wb3NpdGlvbilcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsQ29uY2VwdCA9IHBhcmVudENvbmNlcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW5nQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChrZXksIFwiXCIsIHRydWUsIGNvbXBvc2l0aW9uLnVzZXJJZCwgNCwgOTk5KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbkxvY2FsKG9iamVjdFtrZXldLCBpbnNlcnRpbmdDb25jZXB0LmlkLCBpbnNlcnRpbmdDb25jZXB0LnVzZXJJZCwgY29tcG9zaXRpb24uaWQsIGNvbXBvc2l0aW9uLnVzZXJJZCwgNCwgOTk5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIG5ldyBjb25jZXB0IGluIHRoZSBvYmplY3RcbiAgICAgICAgICAgICAgICBpbnNlcnRpbmdDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwgdmFsdWUsIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGNvbmNlcHQgZXhpc3RzIGluIHRoZSBjb25jZXB0IGxpc3QgYmVjYXVzZSBpZiBpdCBleGlzdHMgdGhlbiB3ZSBoYXZlIHRvIGRlbGV0ZSBvbGQgY29ubmVjdGlvblxuICAgICAgICAgICAgY29uc3QgRXhpc3RpbmdDb25jZXB0cyA9IENoZWNrSWZUeXBlTENvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCwgaW5zZXJ0aW5nQ29uY2VwdCk7XG4gICAgICAgICAgICAvLyBpZiB0aGUgZXhpc3RpbmcgY29uY2VwdCB0aGVuIHN0YXJ0IHRoZSBwcm9jZXNzIGZvciBkZWxldGluZyB0aGUgY29uY2VwdCBpbiB0aGUgbGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFeGlzdGluZ0NvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0aW5nQ29ubmVjdGlvbnMgPSBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5MQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0LCBFeGlzdGluZ0NvbmNlcHRzW2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25uZWN0aW9ucyA9IHRvRGVsZXRlQ29ubmVjdGlvbnMuY29uY2F0KGRlbGV0aW5nQ29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0b0RlbGV0ZUNvbmNlcHRzLnB1c2goRXhpc3RpbmdDb25jZXB0c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIG5ldyBjb25jZXB0IGFuZCB0aGUgb2xkIGNvbXBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKGxvY2FsQ29uY2VwdC5pZCwgaW5zZXJ0aW5nQ29uY2VwdC5pZCwgY29tcG9zaXRpb24uaWQsIDIpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBjb25jZXB0TGlzdC5wdXNoKGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyB5b3UgaGF2ZSB0byBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gYnVsa1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRvRGVsZXRlQ29ubmVjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBjYWNoZSBsaXN0XG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgIERlbGV0ZUNvbm5lY3Rpb25CeUlkKHRvRGVsZXRlQ29ubmVjdGlvbnNbal0uaWQpO1xuICAgICAgICB9XG4gICAgICAgIFN5bmNEYXRhLlN5bmNEYXRhT25saW5lKCk7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBNYWtlVGhlQ2hhcmFjdGVyRGF0YSBmcm9tIFwiLi9NYWtlVGhlQ2hhcmFjdGVyRGF0YVwiO1xuaW1wb3J0IE1ha2VUaGVDb25jZXB0IGZyb20gXCIuL01ha2VUaGVDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ2hhcmFjdGVyKHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBzZWN1cml0eUlkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSWQpIHtcbiAgICB2YXIgYWNjZXNzVXNlcklkO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBjYXRlZ29yeUlkID0gNDtcbiAgICAgICAgdmFyIHR5cGVJZCA9IDUxO1xuICAgICAgICB2YXIgdHlwZVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciByZWZlcmVudFVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGxlbmd0aE9mQ2hhcmFjdGVycyA9IHRoZV9jaGFyYWN0ZXJfZGF0YS5sZW5ndGg7XG4gICAgICAgIHZhciBjb25jZXB0O1xuICAgICAgICBpZiAobGVuZ3RoT2ZDaGFyYWN0ZXJzID09IDEpIHtcbiAgICAgICAgICAgIHZhciByZWZlcmVudElkID0gdGhlX2NoYXJhY3Rlcl9kYXRhLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICB2YXIgdHlwZUlkRm9yQ2hhcmFjdGVyID0gNDk7XG4gICAgICAgICAgICB2YXIgY2hhcmFjdGVyRGF0YVN0cmluZyA9IHlpZWxkIE1ha2VUaGVDaGFyYWN0ZXJEYXRhKHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBzZWN1cml0eUlkLCBhY2Nlc3NJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBNYWtlVGhlQ29uY2VwdCh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCB0eXBlSWRGb3JDaGFyYWN0ZXIsIHR5cGVVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlckRhdGFTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ2hhcmFjdGVyRGF0YSh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICB2YXIgY2hhcmFjdGVyRGF0YSA9IGNoYXJhY3RlckRhdGFTdHJpbmc7XG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyRGF0YS5pc05ldykge1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUNvbmNlcHQodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNoYXJhY3RlckRhdGEuaWQsIGNoYXJhY3RlckRhdGEudXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUNvbmNlcHQodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNoYXJhY3RlckRhdGEuaWQsIGNoYXJhY3RlckRhdGEudXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ2hhcmFjdGVyIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ2hhcmFjdGVyXCI7XG5pbXBvcnQgeyBUaGVDaGFyYWN0ZXIgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvVGhlQ2hhcmFjdGVyXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ2hhcmFjdGVyRGF0YSh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgdGhlQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3Rlcih1c2VySWQsIHRoZV9jaGFyYWN0ZXJfZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCBDcmVhdGVUaGVDaGFyYWN0ZXIodGhlQ2hhcmFjdGVyKTtcbiAgICAgICAgdmFyIHJldHVybmVyID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0IGZyb20gXCIuL0NyZWF0ZVRoZUNvbmNlcHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1ha2VUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZShyZWZlcmVudCwgdHlwZUlkKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICBjb25jZXB0U3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZVRleHREYXRhIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlVGV4dERhdGFcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVcIjtcbmltcG9ydCB7IE1ha2VUaGVOYW1lSW5CYWNrZW5kIH0gZnJvbSBcIi4uL0FwaS9NYWtlVGhlTmFtZUluQmFja2VuZFwiO1xuaW1wb3J0IHsgVGhlVGV4dHMgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvVGhlVGV4dHNcIjtcbmltcG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdEFwaSB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0LCB7IENyZWF0ZVRoZUNvbmNlcHRJbW1lZGlhdGUgfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KHR5cGUsIHJlZmVyZW50LCBjb21wb3NpdGlvbiA9IGZhbHNlLCB1c2VySWQsIHBhc3NlZEFjY2Vzc0lkLCBwYXNzZWRTZXNzaW9uSWQgPSA5OTksIHJlZmVyZW50SWQgPSAwKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHNlc3Npb25JbmZvcm1hdGlvbklkID0gcGFzc2VkU2Vzc2lvbklkO1xuICAgICAgICBsZXQgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIGxldCBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgbGV0IHJlZmVyZW50VXNlcklkID0gOTk5O1xuICAgICAgICBsZXQgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgbGV0IHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICBsZXQgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICAvLyBjaGFuZ2UgdGhpc1xuICAgICAgICBsZXQgYWNjZXNzSWQgPSBwYXNzZWRBY2Nlc3NJZDtcbiAgICAgICAgbGV0IGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgbGV0IHN0cmluZ1RvQ2hlY2sgPSBcIlwiO1xuICAgICAgICBsZXQgc3RyaW5nTGVuZ3RoID0gcmVmZXJlbnQubGVuZ3RoO1xuICAgICAgICBsZXQgdHlwZUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBsZXQgY29uY2VwdDtcbiAgICAgICAgbGV0IHN0YXJ0c1dpdGhUaGUgPSB0eXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpO1xuICAgICAgICBpZiAoc3RhcnRzV2l0aFRoZSkge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gXCJ0aGVfXCIgKyB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb3NpdGlvbikge1xuICAgICAgICAgICAgbGV0IHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0QXBpKHR5cGUsIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgbGV0IHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0QXBpKHN0cmluZ1RvQ2hlY2ssIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgbGV0IFRoZVRleHRzRGF0YSA9IG5ldyBUaGVUZXh0cyh1c2VySWQsIHJlZmVyZW50LCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgRGF0ZS5ub3coKS50b1N0cmluZygpLCB0cnVlKTtcbiAgICAgICAgICAgIENyZWF0ZVRleHREYXRhKFRoZVRleHRzRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkoc3RyaW5nVG9DaGVjaywgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgY29uY2VwdEJ5Q2hhclR5cGVTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKHJlZmVyZW50LCB0eXBlQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICBsZXQgY29uY2VwdFR5cGVDaGFyYWN0ZXIgPSBjb25jZXB0QnlDaGFyVHlwZVN0cmluZztcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0VHlwZUNoYXJhY3RlcjtcbiAgICAgICAgICAgIGlmIChjb25jZXB0VHlwZUNoYXJhY3Rlci5pZCA9PSAwICYmIGNvbmNlcHRUeXBlQ2hhcmFjdGVyLnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG1ha2VUaGVOYW1lU3RyaW5nID0gYXdhaXQgTWFrZVRoZU5hbWUocmVmZXJlbnQsdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCx0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLGNvbmNlcHRUeXBlQ2hhcmFjdGVyICk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG1ha2VUaGVOYW1lQ29uY2VwdCA9IG1ha2VUaGVOYW1lU3RyaW5nIGFzIENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgLy8gY29uY2VwdCA9IGNvbmNlcHRUeXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdEltbWVkaWF0ZShyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCB1c2VySWQsIHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsIDEyLCAxMiwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIE1ha2VUaGVOYW1lSW5CYWNrZW5kKGNvbmNlcHQuaWQsIGAke3JlZmVyZW50fWAsIHR5cGVDb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmKGNvbmNlcHQpe1xuICAgICAgICAvLyAgICAgaWYoY29uY2VwdC50eXBlID09IG51bGwpe1xuICAgICAgICAvLyAgICAgICAgIGxldCBjb25jZXB0VHlwZSA9IENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgLy8gICAgICAgICBpZihjb25jZXB0VHlwZSA9PSBudWxsICYmIGNvbmNlcHQudHlwZUlkICE9IG51bGwgJiYgY29uY2VwdC50eXBlSWQgIT0gdW5kZWZpbmVkKXtcbiAgICAgICAgLy8gICAgICAgICAgICAgbGV0IHR5cGVDb25jZXB0U3RyaW5nTmV3ID0gYXdhaXQgR2V0Q29uY2VwdChjb25jZXB0LnR5cGVJZCk7XG4gICAgICAgIC8vICAgICAgICAgICAgIGxldCBuZXdUeXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nTmV3IGFzIENvbmNlcHQ7XG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IG5ld1R5cGVDb25jZXB0O1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBjb25jZXB0LnR5cGUgPSB0eXBlQ29uY2VwdDtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdEFwaSB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCBNYWtlVGhlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlQ29uY2VwdFwiO1xuZXhwb3J0IGZ1bmN0aW9uIE1ha2VUaGVUaW1lc3RhbXAodHlwZSwgcmVmZXJlbnQsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5KSB7XG4gICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvbklkLCBhY2Nlc3NJZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIGNhdGVnb3J5SWQgPSA0O1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciByZWZlcmVudElkID0gMDtcbiAgICAgICAgdmFyIHJlZmVyZW50VXNlcklkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzdHJpbmdUb0NoZWNrID0gXCJcIjtcbiAgICAgICAgdmFyIHN0YXJ0c1dpdGhUaGUgPSB0eXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpO1xuICAgICAgICB2YXIgdHlwZUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgaWYgKHN0YXJ0c1dpdGhUaGUpIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IFwidGhlX1wiICsgdHlwZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkoc3RyaW5nVG9DaGVjaywgdXNlcklkKTtcbiAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCB1c2VySWQsIHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29uY2VwdEltbWVkaWF0ZSB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbmNlcHRcIjtcbmltcG9ydCBHZXRDb25jZXB0QnlDaGFyYWN0ZXIgZnJvbSBcIi4vR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyXCI7XG5pbXBvcnQgTWFrZVRoZUNoYXJhY3RlciBmcm9tIFwiLi9NYWtlVGhlQ2hhcmFjdGVyXCI7XG5pbXBvcnQgeyBTcGxpdFN0cmluZ3MgfSBmcm9tIFwiLi9TcGxpdFN0cmluZ3NcIjtcbmV4cG9ydCBmdW5jdGlvbiBNYWtlVGhlVHlwZUNvbmNlcHQodHlwZVN0cmluZywgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgcmVmZXJlbnRJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSA5OTk7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSA5OTk7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGV4aXN0aW5nQ29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3Rlcih0eXBlU3RyaW5nKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdCkge1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdC5pZCA9PSAwIHx8IGV4aXN0aW5nQ29uY2VwdC51c2VySWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzcGxpdHRlZFN0cmluZ0FycmF5ID0gU3BsaXRTdHJpbmdzKHR5cGVTdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coc3BsaXR0ZWRTdHJpbmdBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5WzBdID09IHR5cGVTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUNoYXJhY3Rlcih0eXBlU3RyaW5nLCB1c2VySWQsIHNlY3VyaXR5SWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5SWQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5Q29uY2VwdCA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdChzcGxpdHRlZFN0cmluZ0FycmF5WzBdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHQoc3BsaXR0ZWRTdHJpbmdBcnJheVsxXSwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVDb25jZXB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlKHR5cGVTdHJpbmcsIHVzZXJJZCwgY2F0ZWdvcnlDb25jZXB0LmlkLCB1c2VySWQsIHR5cGVDb25jZXB0LmlkLCB1c2VySWQsIHJlZmVyZW50SWQsIHVzZXJJZCwgc2VjdXJpdHlJZCwgdXNlcklkLCBhY2Nlc3NJZCwgdXNlcklkLCBzZXNzaW9uSWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdDb25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb25jZXB0O1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaE1lc3NhZ2UodG9waWMsIG1lc3NhZ2UpIHtcbiAgICBpZiAoQmFzZVVybC5NUVRUX0NPTk5FQ1RJT04pIHtcbiAgICAgICAgQmFzZVVybC5NUVRUX0NPTk5FQ1RJT04ucHVibGlzaCh0b3BpYywgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBTZWFyY2hJbnRlcm5hbEFwaSB9IGZyb20gXCIuLi8uLi9BcGkvU2VhcmNoL1NlYXJjaEludGVybmFsQXBpXCI7XG5pbXBvcnQgeyBWaWV3SW50ZXJuYWxEYXRhIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaExpbmtJbnRlcm5hbChzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHRzQ29ubmVjdGlvbnMgPSB5aWVsZCBTZWFyY2hJbnRlcm5hbEFwaShzZWFyY2hRdWVyeSwgdG9rZW4pO1xuICAgICAgICBsZXQgb3V0ID0geWllbGQgVmlld0ludGVybmFsRGF0YShjb25jZXB0c0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgU2VhcmNoTGlua011bHRpcGxlQXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9TZWFyY2gvU2VhcmNoTGlua011bHRpcGxlQXBpXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsaywgR2V0VGhlQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZEluT2JqZWN0IH0gZnJvbSBcIi4uL0dldENvbXBvc2l0aW9uQnVsa1wiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaExpbmtNdWx0aXBsZUFsbChzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHRzID0gW107XG4gICAgICAgIGxldCBjb25jZXB0c0Nvbm5lY3Rpb25zID0geWllbGQgU2VhcmNoTGlua011bHRpcGxlQXBpKHNlYXJjaFF1ZXJ5LCB0b2tlbik7XG4gICAgICAgIGxldCBtYWluQ29tcG9zaXRpb25JZCA9IHNlYXJjaFF1ZXJ5WzBdLmNvbXBvc2l0aW9uO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb25jZXB0c0Nvbm5lY3Rpb25zO1xuICAgICAgICBsZXQgY29uY2VwdElkcyA9IHJlc3VsdC5jb21wb3NpdGlvbklkcztcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0gcmVzdWx0LmludGVybmFsQ29ubmVjdGlvbnM7XG4gICAgICAgIGxldCBsaW5rZXJzID0gcmVzdWx0LmxpbmtlcnM7XG4gICAgICAgIGxldCByZXZlcnNlID0gcmVzdWx0LnJldmVyc2U7XG4gICAgICAgIGNvbmNlcHRzID0geWllbGQgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QoY29uY2VwdElkcywgY29ubmVjdGlvbnMpO1xuICAgICAgICBsZXQgb3V0ID0geWllbGQgRm9ybWF0RnJvbUNvbm5lY3Rpb25zKGxpbmtlcnMsIGNvbmNlcHRzLCBtYWluQ29tcG9zaXRpb25JZCwgcmV2ZXJzZSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0RnJvbUNvbm5lY3Rpb25zKGxpbmtlcnMsIGNvbXBvc2l0aW9uRGF0YSwgbWFpbkNvbXBvc2l0aW9uLCByZXZlcnNlID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgbWFpbkRhdGEgPSB7fTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsobGlua2Vycyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXZlcnNlRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJldmVyc2UuaW5jbHVkZXMoY29ubmVjdGlvbnNbaV0uaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZUZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJldmVyc2VGbGFnID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLm9mVGhlQ29uY2VwdElkXSAmJiBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteWRhdGEgPSBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlua2VyQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbnNbaV0udHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0RhdGEgPSBteWRhdGEgPT09IG51bGwgfHwgbXlkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBteWRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKG5ld0RhdGEpWzBdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJldmVyc2VDaGFyYXRlciA9IGxpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWUgKyBcIl9yZXZlcnNlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdEYXRhW2tleV1bcmV2ZXJzZUNoYXJhdGVyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV1bcmV2ZXJzZUNoYXJhdGVyXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS5vZlRoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtyZXZlcnNlQ2hhcmF0ZXJdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldW3JldmVyc2VDaGFyYXRlcl0ucHVzaChjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLm9mVGhlQ29uY2VwdElkXSAmJiBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteWRhdGEgPSBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlua2VyQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbnNbaV0udHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0RhdGEgPSBteWRhdGEgPT09IG51bGwgfHwgbXlkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBteWRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKG5ld0RhdGEpWzBdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RGF0YVtrZXldW2xpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYWluRGF0YSA9IGNvbXBvc2l0aW9uRGF0YVttYWluQ29tcG9zaXRpb25dO1xuICAgICAgICByZXR1cm4gbWFpbkRhdGE7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBUb2tlblN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVxdWVzdEhlYWRlcihjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJywgQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbixcbiAgICAgICAgJ0FjY2VwdCc6IEFjY2VwdCxcbiAgICB9O1xuICAgIHJldHVybiBoZWFkZXJzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJywgdG9rZW4gPSBcIlwiLCBBY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICBpZiAodG9rZW4gPT0gXCJcIikge1xuICAgICAgICB0b2tlbiA9IFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbjtcbiAgICB9XG4gICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIHRva2VuLFxuICAgICAgICAnQWNjZXB0JzogQWNjZXB0LFxuICAgIH07XG4gICAgcmV0dXJuIGhlYWRlcnM7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gU3BsaXRTdHJpbmdzKHR5cGVTdHJpbmcpIHtcbiAgICBjb25zdCBwb3MgPSB0eXBlU3RyaW5nLmxhc3RJbmRleE9mKFwiX1wiKTtcbiAgICBsZXQgU3BsaXR0ZWRTdHJpbmdzID0gW107XG4gICAgaWYgKHBvcyA+IDApIHtcbiAgICAgICAgdmFyIHJlc3QgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygwLCBwb3MpO1xuICAgICAgICB2YXIgbGFzdCA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEsIHR5cGVTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgU3BsaXR0ZWRTdHJpbmdzID0gW3Jlc3QsIGxhc3RdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgU3BsaXR0ZWRTdHJpbmdzID0gW3R5cGVTdHJpbmddO1xuICAgIH1cbiAgICByZXR1cm4gU3BsaXR0ZWRTdHJpbmdzO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgSW5zZXJ0VW5pcXVlTnVtYmVyIGZyb20gJy4uL0hlbHBlcnMvVW5pcXVlSW5zZXJ0JztcbmltcG9ydCB7IENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkNvbm5lY3Rpb25BcnJheSwgQ2hlY2tJZlR5cGVDb25jZXB0c0V4aXN0c0luQXJyYXksIH0gZnJvbSAnLi4vSGVscGVycy9DaGVja0lmRXhpc3RzJztcbmltcG9ydCB7IFJlbW92ZUNvbmNlcHRGcm9tTGlzdCwgUmVtb3ZlQ29ubmVjdGlvbkZyb21MaXN0LCB9IGZyb20gJy4uL0hlbHBlcnMvUmVtb3ZlRnJvbUFycmF5JztcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSAnLi9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24gfSBmcm9tICcuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uJztcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gJy4vR2V0VGhlQ29uY2VwdCc7XG5pbXBvcnQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCBmcm9tICcuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQnO1xuaW1wb3J0IHsgY3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gJy4vQ3JlYXRlVGhlQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBEZWxldGVDb25uZWN0aW9uQnlJZCB9IGZyb20gJy4vRGVsZXRlQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhJztcbmltcG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQmluYXJ5VHJlZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uJztcbmltcG9ydCB7IENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlIH0gZnJvbSAnLi9Db21wb3NpdGlvbi9DcmVhdGVDb21wb3NpdGlvbkNhY2hlJztcbi8vIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgY2FjaGUgY29tcG9zaXRpb25cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFVwZGF0ZUNvbXBvc2l0aW9uKHBhdGNoZXJTdHJ1Y3R1cmUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBkZWZhdWx0IHVzZXJJZCwgc2Vzc2lvbklkLCBhY2Nlc3NJZCBwYXNzZWQgYnkgdGhlIHBhdGNoZXJTdHJ1Y3R1cmVcbiAgICAgICAgY29uc3QgdXNlcklkID0gcGF0Y2hlclN0cnVjdHVyZS51c2VySWQ7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuc2Vzc2lvbklkO1xuICAgICAgICBjb25zdCBhY2Nlc3NJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuYWNjZXNzSWQ7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBsZXQgcGFyZW50Q29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGNvbnN0IHRvRGVsZXRlQ29uY2VwdHMgPSBbXTtcbiAgICAgICAgLy8gdGhlIG1haW4gY29tcG9zaXRpb24gSWQgdGhhdCBoYXMgdGhlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwYXRjaGVkXG4gICAgICAgIGxldCBjb21wb3NpdGlvbklkID0gcGF0Y2hlclN0cnVjdHVyZS5jb21wb3NpdGlvbklkO1xuICAgICAgICAvLyBpZiB5b3Ugd2FudCB0byBlZGl0IHRoZSBzdWJjb21wb3NpdGlvbnMgb2YgdGhlIGNvbXBvc2l0aW9uIHRoZW4geW91IGhhdmUgdG8gcGFzcyB0byB0aGlzXG4gICAgICAgIGNvbnN0IG9mVGhlQ29uY2VwdElkID0gcGF0Y2hlclN0cnVjdHVyZS5vZlRoZUNvbXBvc2l0aW9uSWQ7XG4gICAgICAgIGxldCB0b0RlbGV0ZUNvbm5lY3Rpb25zID0gW107XG4gICAgICAgIGlmIChjb21wb3NpdGlvbklkIDwgMCkge1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29tcG9zaXRpb25JZCwgdXNlcklkKTtcbiAgICAgICAgICAgIGlmIChsb2NhbENvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25JZCA9IGxvY2FsQ29uY2VwdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGUgYmFja2VuZCBiZWNhdXNlIGl0IG5lZWRzIGxhdGVzdCBkYXRhXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGNvbXBvc2l0aW9uSWQpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICBjb25zdCBjb25jZXB0SWRMaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uQ2FjaGUgPSBuZXcgQ29tcG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuaWQgPSBjb21wb3NpdGlvbklkO1xuICAgICAgICAvLyBwdXQgdGhpcyBpbiB0aGUgdXBwZXIgc2VjdGlvbiBiZWZvcmUgdXBkYXRpbmcgYmVjYXVzZSB0aGlzIHdpbGwgdGVsbCBhbGwgb3RoZXIgZGlzdHJpYnV0ZWRcbiAgICAgICAgLy9zZXJ2ZXJzIHRvIGRlc3Ryb3kgdGhlIGNvcHkgb2YgdGhlIGNvbXBvc2l0aW9uIHRoYXQgdGhleSBoYXZlIGFzIG5ldyBjb21wb3NpdGlvbiBpcyBjb21pbmcgdXBcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5pc1VwZGF0aW5nKCk7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGluc2lkZSBvZiB0aGUgY29tcG9zaXRpb24gYW5kIHN0b3JlIHRoZW0gaW5cbiAgICAgICAgbGV0IGFsbENvbmNlcHRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb21wb3NpdGlvbkxpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb25jZXB0SWRMaXN0LCBjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29uY2VwdElkTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgYWxsQ29uY2VwdHMucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5zdWJjb21wb3NpdGlvbnMgPSBjb21wb3NpdGlvbkxpc3Q7XG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY29uY2VwdHMgdGhhdCBhcmUgaW5zaWRlIG9mIHRoZSBjb21wb3NpdGlvbiBhbmQgc3RvcmUgdGhlbSBpbiBhIGNvbmNlcHRMaXN0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdElkTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29uY2VwdElkTGlzdFtpXSk7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbklkID09IGNvbmNlcHRJZExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbiA9IGNvbmNlcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gY29uY2VwdElkTGlzdFtpXSkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgdHJ5aW5nIHRvIHBhdGNoIHRoZSBuZXcgb2JqZWN0IGludG8gdGhlIGNvbXBvc2l0aW9uXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHBhdGNoZXJTdHJ1Y3R1cmUucGF0Y2hPYmplY3Q7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgbGV0IGluc2VydGluZ0NvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbmNlcHQgPSBjb21wb3NpdGlvbjtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBpbW1lZGlkYXRlIHBhcmVudCBleGlzdHMgaW4gdGhlIGNvbXBvc2l0aW9uIChpLmUuIGZvciBtdWx0aWxldmVsIGNvbXBvc2l0aW9uKVxuICAgICAgICAgICAgaWYgKHBhcmVudENvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxDb25jZXB0ID0gcGFyZW50Q29uY2VwdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRpbmdDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIFwiXCIsIHRydWUsIGNvbXBvc2l0aW9uLnVzZXJJZCwgNCwgOTk5KTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkNhY2hlLnN1YmNvbXBvc2l0aW9ucy5wdXNoKGluc2VydGluZ0NvbmNlcHQuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25jZXB0IGV4aXN0cyBpbiB0aGUgY29uY2VwdCBsaXN0IGJlY2F1c2UgaWYgaXQgZXhpc3RzIHRoZW4gd2UgaGF2ZSB0byBkZWxldGUgb2xkIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBFeGlzdGluZ0NvbmNlcHRzID0gQ2hlY2tJZlR5cGVDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QsIGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBleGlzdGluZyBjb25jZXB0IHRoZW4gc3RhcnQgdGhlIHByb2Nlc3MgZm9yIGRlbGV0aW5nIHRoZSBjb25jZXB0IGluIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFeGlzdGluZ0NvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFeGlzdGluZ0NvbmNlcHRzW2ldLmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRpbmdDb25uZWN0aW9ucyA9IENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkNvbm5lY3Rpb25BcnJheShjb21wb3NpdGlvbkNhY2hlLmNvbm5lY3Rpb25zLCBFeGlzdGluZ0NvbmNlcHRzW2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29ubmVjdGlvbnMgPSB0b0RlbGV0ZUNvbm5lY3Rpb25zLmNvbmNhdChkZWxldGluZ0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29uY2VwdHMucHVzaChFeGlzdGluZ0NvbmNlcHRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbldpdGhDYWNoZShvYmplY3Rba2V5XSwgaW5zZXJ0aW5nQ29uY2VwdC5pZCwgaW5zZXJ0aW5nQ29uY2VwdC51c2VySWQsIGNvbXBvc2l0aW9uLmlkLCBjb21wb3NpdGlvbi51c2VySWQsIDQsIDk5OSwgY29tcG9zaXRpb25DYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSBuZXcgY29uY2VwdCBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW5nQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCB2YWx1ZSwgZmFsc2UsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGNvbmNlcHQgZXhpc3RzIGluIHRoZSBjb25jZXB0IGxpc3QgYmVjYXVzZSBpZiBpdCBleGlzdHMgdGhlbiB3ZSBoYXZlIHRvIGRlbGV0ZSBvbGQgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IEV4aXN0aW5nQ29uY2VwdHMgPSBDaGVja0lmVHlwZUNvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCwgaW5zZXJ0aW5nQ29uY2VwdCk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGV4aXN0aW5nIGNvbmNlcHQgdGhlbiBzdGFydCB0aGUgcHJvY2VzcyBmb3IgZGVsZXRpbmcgdGhlIGNvbmNlcHQgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEV4aXN0aW5nQ29uY2VwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGluZ0Nvbm5lY3Rpb25zID0gQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluQ29ubmVjdGlvbkFycmF5KGNvbXBvc2l0aW9uQ2FjaGUuY29ubmVjdGlvbnMsIEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25uZWN0aW9ucyA9IHRvRGVsZXRlQ29ubmVjdGlvbnMuY29uY2F0KGRlbGV0aW5nQ29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25jZXB0cy5wdXNoKEV4aXN0aW5nQ29uY2VwdHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIG5ldyBjb25jZXB0IGFuZCB0aGUgb2xkIGNvbXBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0gY3JlYXRlVGhlQ29ubmVjdGlvbihsb2NhbENvbmNlcHQuaWQsIGxvY2FsQ29uY2VwdC51c2VySWQsIGluc2VydGluZ0NvbmNlcHQuaWQsIGluc2VydGluZ0NvbmNlcHQudXNlcklkLCBjb21wb3NpdGlvbi5pZCwgc2Vzc2lvbklkLCB1c2VySWQpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBjb25jZXB0TGlzdC5wdXNoKGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICAgICAgY29tcG9zaXRpb25DYWNoZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyB5b3UgaGF2ZSB0byBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gYnVsa1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRvRGVsZXRlQ29ubmVjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBjYWNoZSBsaXN0XG4gICAgICAgICAgICBSZW1vdmVDb25uZWN0aW9uRnJvbUxpc3QoY29tcG9zaXRpb25DYWNoZS5jb25uZWN0aW9ucywgdG9EZWxldGVDb25uZWN0aW9uc1tqXSk7XG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgIERlbGV0ZUNvbm5lY3Rpb25CeUlkKHRvRGVsZXRlQ29ubmVjdGlvbnNbal0uaWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFsc28gZGVsZXRlIHRoZSBleGlzdGluZyBjb25jZXB0IGZyb20gdGhlIGNhY2hlLlxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRvRGVsZXRlQ29uY2VwdHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb25jZXB0IGZyb20gdGhlIGNhY2hlIGNvbmNlcHQgbGlzdFxuICAgICAgICAgICAgUmVtb3ZlQ29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCB0b0RlbGV0ZUNvbmNlcHRzW2tdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgY3JlYXRlIGEgY29tcG9zaXRpb24gY2FjaGUgb2JqZWN0IHRvIGNhY2hlIGl0IGludG8gbm9kZSBzZXJ2ZXJcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5jb25jZXB0cyA9IGNvbXBvc2l0aW9uQ2FjaGUuY29uY2VwdHMuY29uY2F0KGNvbmNlcHRMaXN0KTtcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5tYWluQ29uY2VwdCA9IGNvbXBvc2l0aW9uO1xuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLmlkID0gY29tcG9zaXRpb24uaWQ7XG4gICAgICAgIC8vIC8vIGNyZWF0ZSBhIGNhY2hlXG4gICAgICAgIHlpZWxkIGNvbXBvc2l0aW9uQ2FjaGUudXBkYXRlQ2FjaGUoKTtcbiAgICAgICAgLy8gdXBkYXRlIGl0IHRoZSBiaW5hcnkgdHJlZVxuICAgICAgICBDb21wb3NpdGlvbkJpbmFyeVRyZWUuYWRkQ29tcG9zaXRpb25Ub1RyZWUoY29tcG9zaXRpb25DYWNoZSk7XG4gICAgICAgIFN5bmNEYXRhLlN5bmNEYXRhT25saW5lKCk7XG4gICAgICAgIGxldCB4ID0gY29tcG9zaXRpb25DYWNoZS5HZXREYXRhQ2FjaGUoKTtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gJy4vLi4vLi4vU2VydmljZXMvTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0JztcbmltcG9ydCB7IFVzZXJCaW5hcnlUcmVlIH0gZnJvbSAnLi8uLi8uLi9EYXRhU3RydWN0dXJlcy9Vc2VyL1VzZXJCaW5hcnlUcmVlJztcbmV4cG9ydCBmdW5jdGlvbiBHZXRVc2VyR2hvc3RJZCh1c2VySWQsIGdob3N0SWQsIHNlc3Npb25JZCA9IDk5OSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB1c2VyTm9kZSA9IHlpZWxkIFVzZXJCaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZSh1c2VySWQsIHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgZ2hvc3QgaWRcIiwgdXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICBsZXQgcmVhbENvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgaWYgKHVzZXJOb2RlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZXJOb2RlLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RDb25jZXB0ID0gdXNlck5vZGUudmFsdWVbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RDb25jZXB0Lmdob3N0SWQgPT0gZ2hvc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZWFsQ29uY2VwdCA9IHRlc3RDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVhbENvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQWRkR2hvc3RDb25jZXB0KGNvbmNlcHQsIHVzZXJJZCwgc2Vzc2lvbklkID0gOTk5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJhZGRpbmcgdGhpcyB0byBnaG9zdCBpZFwiLCB1c2VySWQsIHNlc3Npb25JZCk7XG4gICAgICAgIFVzZXJCaW5hcnlUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCwgdXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhcInRoaXMgaXMgdGhlIGFkZGVkIG5vZGVcIiwgVXNlckJpbmFyeVRyZWUucm9vdCk7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFZpZXdJbnRlcm5hbERhdGFBcGkgfSBmcm9tIFwiLi4vLi4vQXBpL1ZpZXcvVmlld0ludGVybmFsRGF0YUFwaVwiO1xuaW1wb3J0IHsgR2V0VGhlQ29uY2VwdCwgcmVjdXJzaXZlRmV0Y2ggfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gVmlld0ludGVybmFsRGF0YShpZHMpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0geWllbGQgVmlld0ludGVybmFsRGF0YUFwaShpZHMpO1xuICAgICAgICBsZXQgb3V0cHV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBpZHNbaV07XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zW2lkXTtcbiAgICAgICAgICAgIGlmIChpZCAmJiBsb2NhbENvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGZvcm1hdHRlZE91dHB1dCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWxDb25uZWN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmNlcHRzLmluY2x1ZGVzKGxvY2FsQ29ubmVjdGlvbnNbal0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKGxvY2FsQ29ubmVjdGlvbnNbal0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBvdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgbG9jYWxDb25uZWN0aW9ucywgY29uY2VwdHMpO1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZE91dHB1dC5kYXRhID0gb3V0O1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZE91dHB1dC5pZCA9IGlkO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGZvcm1hdHRlZE91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZm9ybWF0dGVkT3V0cHV0ID0ge307XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkT3V0cHV0LmlkID0gaWQ7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9jb25uID0ge307XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBub2Nvbm5bKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZV0gPSBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRPdXRwdXQuZGF0YSA9IG5vY29ubjtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goZm9ybWF0dGVkT3V0cHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbiIsImV4cG9ydCB7IGluaXQsIHVwZGF0ZUFjY2Vzc1Rva2VuIH07XG5pbXBvcnQgQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhIGZyb20gJy4vU2VydmljZXMvQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhJztcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvSWRlbnRpZmllckZsYWdzJztcbmV4cG9ydCB7IFNwbGl0U3RyaW5ncyB9IGZyb20gJy4vU2VydmljZXMvU3BsaXRTdHJpbmdzJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uTGlzdCwgR2V0Q29tcG9zaXRpb25MaXN0V2l0aElkIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkxpc3QnO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwsIEdldENvbXBvc2l0aW9uTGlzdExvY2FsV2l0aElkIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9HZXRDb21wb3NpdGlvbkxpc3RMb2NhbCc7XG5leHBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24gfSBmcm9tICcuL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb24sIEdldENvbXBvc2l0aW9uV2l0aElkLCByZWN1cnNpdmVGZXRjaCwgR2V0Q29tcG9zaXRpb25XaXRoQWxsSWRzIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbic7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbkxvY2FsLCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9HZXRDb21wb3NpdGlvbkxvY2FsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3JlYXRlQ29tcG9zaXRpb24gfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbXBvc2l0aW9uJztcbmV4cG9ydCB7IENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwnO1xuZXhwb3J0IHsgQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cywgQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c0dlbmVyYWwgfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZUNvbm5lY3Rpb25CZXR3ZWVuVHdvQ29uY2VwdHMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHZXRUaGVDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRUaGVDb25jZXB0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvTWFrZVRoZUluc3RhbmNlQ29uY2VwdCc7XG5leHBvcnQgeyBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCc7XG5leHBvcnQgeyBzdG9yZVRvRGF0YWJhc2UsIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlLCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZCB9IGZyb20gJy4vRGF0YWJhc2UvTm9JbmRleERiJztcbmV4cG9ydCB7IGNyZWF0ZVRoZUNvbm5lY3Rpb24gYXMgQ3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gJy4vU2VydmljZXMvQ3JlYXRlVGhlQ29ubmVjdGlvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdldENvbmNlcHRCeUNoYXJhY3RlciB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyJztcbmV4cG9ydCB7IEdldExpbmssIEdldExpbmtSYXcgfSBmcm9tICcuL1NlcnZpY2VzL0dldExpbmsnO1xuZXhwb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmV4cG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvTWFrZVRoZVR5cGVDb25jZXB0JztcbmV4cG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdEFwaSB9IGZyb20gJy4vQXBpL01ha2VUaGVUeXBlQ29uY2VwdEFwaSc7XG5leHBvcnQgeyBHZXRMaW5rZXJDb25uZWN0aW9uRnJvbUNvbmNlcHRzLCBHZXRMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0cyB9IGZyb20gJy4vU2VydmljZXMvR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0JztcbmV4cG9ydCB7IERlbGV0ZUNvbmNlcHRCeUlkIH0gZnJvbSAnLi9TZXJ2aWNlcy9EZWxldGVDb25jZXB0JztcbmV4cG9ydCB7IERlbGV0ZUNvbm5lY3Rpb25CeUlkIH0gZnJvbSAnLi9TZXJ2aWNlcy9EZWxldGVDb25uZWN0aW9uJztcbmV4cG9ydCB7IFRyYXNoVGhlQ29uY2VwdCB9IGZyb20gJy4vQXBpL0RlbGV0ZS9EZWxldGVDb25jZXB0SW5CYWNrZW5kJztcbmV4cG9ydCB7IEdldENvbm5lY3Rpb25CeUlkIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb25uZWN0aW9ucyc7XG5leHBvcnQgeyBNYWtlVGhlVGltZXN0YW1wIH0gZnJvbSAnLi9TZXJ2aWNlcy9NYWtlVGhlVGltZXN0YW1wJztcbmV4cG9ydCB7IFJlY3Vyc2l2ZVNlYXJjaEFwaSB9IGZyb20gJy4vQXBpL1JlY3Vyc2l2ZVNlYXJjaCc7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbkJ1bGtXaXRoRGF0YUlkLCBHZXRDb21wb3NpdGlvbkJ1bGssIEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZCB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29tcG9zaXRpb25CdWxrJztcbmV4cG9ydCB7IEdldENvbmNlcHRCdWxrIH0gZnJvbSAnLi9BcGkvR2V0Q29uY2VwdEJ1bGsnO1xuZXhwb3J0IHsgR2V0Q29ubmVjdGlvbkJ1bGsgfSBmcm9tICcuL0FwaS9HZXRDb25uZWN0aW9uQnVsayc7XG5leHBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSAnLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayc7XG5leHBvcnQgeyBMb2dpblRvQmFja2VuZCB9IGZyb20gJy4vQXBpL0xvZ2luJztcbmV4cG9ydCB7IEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQgfSBmcm9tICcuL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2lnbnVwIH0gZnJvbSAnLi9BcGkvU2lnbnVwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2lnbmluIH0gZnJvbSAnLi9BcGkvU2lnbmluJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVXBkYXRlQ29tcG9zaXRpb24gfSBmcm9tICcuL1NlcnZpY2VzL1VwZGF0ZUNvbXBvc2l0aW9uJztcbmV4cG9ydCB7IFNlYXJjaEFsbENvbmNlcHRzIH0gZnJvbSAnLi9BcGkvU2VhcmNoL1NlYXJjaCc7XG5leHBvcnQgeyBTZWFyY2hXaXRoTGlua2VyIH0gZnJvbSAnLi9BcGkvU2VhcmNoL1NlYXJjaFdpdGhMaW5rZXInO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25XaXRoQ2FjaGUsIEdldENvbXBvc2l0aW9uV2l0aERhdGFJZFdpdGhDYWNoZSwgR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkQnVsayB9IGZyb20gJy4vU2VydmljZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25DYWNoZSc7XG5leHBvcnQgeyBDcmVhdGVTZXNzaW9uIH0gZnJvbSAnLi9BcGkvU2Vzc2lvbi9DcmVhdGVTZXNzaW9uJztcbmV4cG9ydCB7IENyZWF0ZVNlc3Npb25WaXNpdCB9IGZyb20gJy4vQXBpL1Nlc3Npb24vQ3JlYXRlU2Vzc2lvblZpc2l0JztcbmV4cG9ydCB7IEdldFJlbGF0aW9uLCBHZXRSZWxhdGlvblJhdyB9IGZyb20gJy4vU2VydmljZXMvR2V0UmVsYXRpb24nO1xuZXhwb3J0IHsgcmVjdXJzaXZlRmV0Y2hOZXcgfSBmcm9tICcuL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0J1aWxkQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUgfSBmcm9tICcuL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0NyZWF0ZUNvbXBvc2l0aW9uQ2FjaGUnO1xuZXhwb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHQnO1xuZXhwb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwgfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsJztcbmV4cG9ydCB7IENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsJztcbmV4cG9ydCB7IEdldFVzZXJHaG9zdElkLCBBZGRHaG9zdENvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL1VzZXIvVXNlclRyYW5zbGF0aW9uJztcbmV4cG9ydCB7IFNlYXJjaExpbmtNdWx0aXBsZUFsbCwgRm9ybWF0RnJvbUNvbm5lY3Rpb25zIH0gZnJvbSAnLi9TZXJ2aWNlcy9TZWFyY2gvU2VhcmNoTGlua011bHRpcGxlJztcbmV4cG9ydCB7IFVwZGF0ZUNvbXBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL1VwZGF0ZUNvbXBvc2l0aW9uTG9jYWwnO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QgfSBmcm9tICcuL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uQnVsayc7XG5leHBvcnQgeyBWaWV3SW50ZXJuYWxEYXRhIH0gZnJvbSAnLi9TZXJ2aWNlcy9WaWV3L1ZpZXdJbnRlcm5hbERhdGEnO1xuZXhwb3J0IHsgY29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvQ29udmVyc2lvbi9Db252ZXJ0Q29uY2VwdHMnO1xuZXhwb3J0IHsgU2VhcmNoTGlua0ludGVybmFsIH0gZnJvbSAnLi9TZXJ2aWNlcy9TZWFyY2gvU2VhcmNoTGlua0ludGVybmFsJztcbmV4cG9ydCB7IFN5bmNEYXRhIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YSc7XG5leHBvcnQgeyBDb25jZXB0IH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0JztcbmV4cG9ydCB7IExDb25jZXB0IH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29uY2VwdCc7XG5leHBvcnQgeyBMQ29ubmVjdGlvbiB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb24nO1xuZXhwb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbic7XG5leHBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhJztcbmV4cG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YSc7XG5leHBvcnQgeyBCaW5hcnlUcmVlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9CaW5hcnlUcmVlJztcbmV4cG9ydCB7IFNlYXJjaFF1ZXJ5IH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9TZWFyY2hRdWVyeSc7XG5leHBvcnQgeyBQYXRjaGVyU3RydWN0dXJlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9QYXRjaGVyU3RydWN0dXJlJztcbmV4cG9ydCB7IFNlc3Npb25EYXRhIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9TZXNzaW9uL1Nlc3Npb25EYXRhJztcbmV4cG9ydCB7IENvbXBvc2l0aW9uIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbic7XG5leHBvcnQgeyBDb21wb3NpdGlvbkJpbmFyeVRyZWUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQmluYXJ5VHJlZSc7XG5leHBvcnQgeyBDb21wb3NpdGlvbk5vZGUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uTm9kZSc7XG5leHBvcnQgeyBVc2VyQmluYXJ5VHJlZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvVXNlci9Vc2VyQmluYXJ5VHJlZSc7XG5leHBvcnQgeyBGaWx0ZXJTZWFyY2ggfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0ZpbHRlclNlYXJjaCc7XG5leHBvcnQgeyBTZWFyY2hTdHJ1Y3R1cmUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1NlYXJjaC9TZWFyY2hTdHJ1Y3R1cmUnO1xuaW1wb3J0IHsgR2V0RGF0YUZyb21JbmRleERiLCBHZXREYXRhRnJvbUluZGV4RGJMb2NhbCB9IGZyb20gJy4vU2VydmljZXMvR2V0RGF0YUZyb21JbmRleERiJztcbmltcG9ydCBDcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhJztcbmltcG9ydCBJbml0aWFsaXplU3lzdGVtIGZyb20gJy4vU2VydmljZXMvSW5pdGlhbGl6ZVN5c3RlbSc7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsJztcbmltcG9ydCB7IFRva2VuU3RvcmFnZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlJztcbmV4cG9ydCB7IEJhc2VVcmwgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmwnO1xuZnVuY3Rpb24gdXBkYXRlQWNjZXNzVG9rZW4oYWNjZXNzVG9rZW4gPSBcIlwiKSB7XG4gICAgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG59XG5mdW5jdGlvbiBpbml0KHVybCA9IFwiXCIsIGFpdXJsID0gXCJcIiwgYWNjZXNzVG9rZW4gPSBcIlwiKSB7XG4gICAgQmFzZVVybC5CQVNFX1VSTCA9IHVybDtcbiAgICBCYXNlVXJsLkFJX1VSTCA9IGFpdXJsO1xuICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpc3QgaGUgYmFzZSB1cmxcIiwgQmFzZVVybC5CQVNFX1VSTCk7XG4gICAgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgSW5pdGlhbGl6ZVN5c3RlbSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBDcmVhdGVCaW5hcnlUcmVlRnJvbURhdGEoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0RhdGFMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzQ2hhcmFjdGVyTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc1R5cGVMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgdGltZSB0YWtlbiB0byBwcmVwYXJlIGNvbmNlcHQgIGRhdGEgaXMgIFwiLCBlbGFwc2VkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIENyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzTG9jYWxUeXBlTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0xvY2FsQ2hhcmFjdGVyTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIHRpbWUgdGFrZW4gdG8gcHJlcGFyZSBsb2NhbCBjb25jZXB0ICBcIiwgZWxhcHNlZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBHZXREYXRhRnJvbUluZGV4RGJMb2NhbCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDb25uZWN0aW9uTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIEdldERhdGFGcm9tSW5kZXhEYigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzQ29ubmVjdGlvbkxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNDb25uZWN0aW9uVHlwZUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSB0aW1lIHRha2VuIHRvIHByZXBhcmUgY29ubmVjdGlvbnMgIFwiLCBlbGFwc2VkKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vc3JjL2FwcC50c1wiKTtcbiIsIiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
11221
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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Z0U7QUFDekQ7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx5RUFBcUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Ozs7Ozs7Ozs7Ozs7O0FDdEJtRjtBQUM1RTtBQUNQO0FBQ0E7QUFDQSxvQkFBb0IsNEZBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNqQk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QiwwQkFBMEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QiwwQkFBMEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pLQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwr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QUNBLElBQUksNkRBQU87QUFDWCxJQUFJLDZEQUFPO0FBQ1gsd0NBQXdDLDZEQUFPO0FBQy9DLElBQUksZ0ZBQVk7QUFDaEIsSUFBSSx1RUFBZ0I7QUFDcEI7QUFDQSxRQUFRLDhFQUF3QjtBQUNoQyxZQUFZLDRFQUFlO0FBQzNCLFlBQVksNEVBQWU7QUFDM0IsWUFBWSw0RUFBZTtBQUMzQjtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVEsMEZBQTZCO0FBQ3JDLFlBQVksNEVBQWU7QUFDM0IsWUFBWSw0RUFBZTtBQUMzQixZQUFZLDRFQUFlO0FBQzNCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUSxzRkFBdUI7QUFDL0IsWUFBWSw0RUFBZTtBQUMzQixTQUFTO0FBQ1QsUUFBUSxpRkFBa0I7QUFDMUIsWUFBWSw0RUFBZTtBQUMzQixZQUFZLDRFQUFlO0FBQzNCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMOzs7Ozs7O1VDakhBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztVRU5BO1VBQ0E7VUFDQTtVQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvQ3JlYXRlL0NyZWF0ZVRoZUNvbmNlcHRBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0NyZWF0ZS9DcmVhdGVUaGVUZXh0RGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0RlbGV0ZVRoZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9EZWxldGVUaGVDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvRGVsZXRlL0RlbGV0ZUNvbmNlcHRJbkJhY2tlbmQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRBaURhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRBbGxDb25jZXB0c0J5VHlwZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRBbGxMaW5rZXJDb25uZWN0aW9uc0Zyb21UaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNUb1RoZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0Q29uY2VwdEJ1bGsudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0Q29ubmVjdGlvbkJ1bGsudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0UmVzZXJ2ZWRDb25uZWN0aW9uSWRzLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvR2V0UmVzZXJ2ZWRJZHMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9Mb2dpbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL01ha2VUaGVOYW1lSW5CYWNrZW5kLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvTWFrZVRoZVR5cGVDb25jZXB0QXBpLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvUmVjdXJzaXZlU2VhcmNoLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvU2VhcmNoQ29uY2VwdC9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL1NlYXJjaC9TZWFyY2gudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9TZWFyY2gvU2VhcmNoSW50ZXJuYWxBcGkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9TZWFyY2gvU2VhcmNoTGlua011bHRpcGxlQXBpLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9BcGkvU2VhcmNoL1NlYXJjaFdpdGhMaW5rZXIudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9TZXNzaW9uL0NyZWF0ZVNlc3Npb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0FwaS9TZXNzaW9uL0NyZWF0ZVNlc3Npb25WaXNpdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL1NpZ25pbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL1NpZ251cC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvQXBpL1ZpZXcvVmlld0ludGVybmFsRGF0YUFwaS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQmFzZVVybC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQmluYXJ5Q2hhcmFjdGVyVHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHlwZVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0NoYXJhY3RlclJlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkJpbmFyeVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uTm9kZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25CaW5hcnlUcmVlL0Nvbm5lY3Rpb25CaW5hcnlUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uTm9kZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvblR5cGVUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uRGF0YS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvRmlsdGVyU2VhcmNoLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9JZGVudGlmaWVyRmxhZ3MudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29ubmVjdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTE5vZGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxCaW5hcnlUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbEJpbmFyeVR5cGVUcmVlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbm5lY3Rpb25EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9Ob2RlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9QYXRjaGVyU3RydWN0dXJlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9SZXNlcnZlZElkcy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvUmV0dXJuZXIudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NlYXJjaFF1ZXJ5LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9TZWFyY2gvU2VhcmNoU3RydWN0dXJlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9TZWN1cml0eS9Ub2tlblN0b3JhZ2UudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1Nlc3Npb24vU2Vzc2lvbkRhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdEYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9EYXRhU3RydWN0dXJlcy9TZXR0aW5ncy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvU3luY0RhdGEudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1RoZUNoYXJhY3Rlci50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YVN0cnVjdHVyZXMvVGhlVGV4dHMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1VzZXIvVXNlckJpbmFyeVRyZWUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFTdHJ1Y3R1cmVzL1VzZXIvVXNlck5vZGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0RhdGFiYXNlL05vSW5kZXhEYi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvRGF0YWJhc2UvaW5kZXhlZGRiLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9IZWxwZXJzL0NoZWNrSWZFeGlzdHMudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL0hlbHBlcnMvUmVtb3ZlRnJvbUFycmF5LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9IZWxwZXJzL1VuaXF1ZUluc2VydC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0J1aWxkQ29tcG9zaXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0NyZWF0ZUNvbXBvc2l0aW9uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NvbmNlcHRGaW5kaW5nL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Db252ZXJzaW9uL0NvbnZlcnRDb25jZXB0cy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvQ3JlYXRlVGhlQ29tcG9zaXRpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbm5lY3Rpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9EZWxldGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9EZWxldGVDb25uZWN0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9GaW5kQ29uZWNlcHRzRnJvbUNvbm5lY3Rpb24udHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0ZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrSW5NZW1vcnkudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkJ1bGsudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0dldENvbXBvc2l0aW9uTGlzdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRDb25uZWN0aW9ucy50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvR2V0RGF0YUZyb21JbmRleERiLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRMaW5rLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRMaW5rZXJDb25uZWN0aW9uRnJvbUNvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0dldFJlbGF0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9HZXRUaGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Jbml0aWFsaXplU3lzdGVtLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHQudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb21wb3NpdGlvbkxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVUaGVDb25jZXB0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTG9jYWwvR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldENvbXBvc2l0aW9uTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0xvY2FsL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9NYWtlVGhlQ29uY2VwdExvY2FsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Mb2NhbC9NYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0xvY2FsL01ha2VUaGVUeXBlTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL0xvY2FsL1VwZGF0ZUNvbXBvc2l0aW9uTG9jYWwudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVDaGFyYWN0ZXIudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL01ha2VUaGVDaGFyYWN0ZXJEYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9NYWtlVGhlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTWFrZVRoZUluc3RhbmNlQ29uY2VwdC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTWFrZVRoZVRpbWVzdGFtcC50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvTWFrZVRoZVR5cGVDb25jZXB0LnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9NcXR0L3B1Ymxpc2hNZXNzYWdlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9TZWFyY2gvU2VhcmNoTGlua0ludGVybmFsLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9TZWFyY2gvU2VhcmNoTGlua011bHRpcGxlLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9TcGxpdFN0cmluZ3MudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlLy4vc3JjL1NlcnZpY2VzL1VwZGF0ZUNvbXBvc2l0aW9uLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9TZXJ2aWNlcy9Vc2VyL1VzZXJUcmFuc2xhdGlvbi50cyIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvLi9zcmMvU2VydmljZXMvVmlldy9WaWV3SW50ZXJuYWxEYXRhLnRzIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS8uL3NyYy9hcHAudHMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL21mdHNjY3Mtbm9kZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vbWZ0c2Njcy1ub2RlL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9tZnRzY2NzLW5vZGUvd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ2hhcmFjdGVyUmVwb3NpdG9yeSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9DaGFyYWN0ZXJSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXR1cm5lciB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9SZXR1cm5lclwiO1xuaW1wb3J0IHsgVGhlQ2hhcmFjdGVyIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL1RoZUNoYXJhY3RlclwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDaGFyYWN0ZXIoY2hhcmFjdGVyRGF0YSkge1xuICAgIHZhciBjaGFyYWN0ZXJEYXRhO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXJEYXRhID0gQ2hhcmFjdGVyUmVwb3NpdG9yeS5HZXRDaGFyYWN0ZXIoY2hhcmFjdGVyRGF0YS5kYXRhKTtcbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJEYXRhLmlkID09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVDaGFyYWN0ZXJEYXRhVXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY2hhcmFjdGVyRGF0YSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRTdHJpbmcgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0U3RyaW5nO1xuICAgICAgICAgICAgICAgIHZhciBzYXZpbmdDaGFyYWN0ZXIgPSBuZXcgVGhlQ2hhcmFjdGVyKHJlc3VsdC51c2VySWQsIGNoYXJhY3RlckRhdGEuZGF0YSwgMCwgMCwgNCwgNCwgOTk5LCA5OTksIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBzYXZpbmdDaGFyYWN0ZXIuaWQgPSByZXN1bHQuaWQ7XG4gICAgICAgICAgICAgICAgQ2hhcmFjdGVyUmVwb3NpdG9yeS5BZGRDaGFyYWN0ZXIoc2F2aW5nQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmluZ0RhdGEgPSBuZXcgUmV0dXJuZXIoY2hhcmFjdGVyRGF0YS5pZCwgY2hhcmFjdGVyRGF0YS51c2VySWQsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuaW5nRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NyZWF0ZSB0aGUgY2hhcmFjdGVyIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NyZWF0ZSB0aGUgY2hhcmFjdGVyIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25jZXB0QXBpKGNvbmNlcHREYXRhKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkNyZWF0ZVRoZUNvbmNlcHRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25jZXB0RGF0YSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0U3RyaW5nID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0U3RyaW5nO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29uY2VwdCBhcGkgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlIHRoZSBjb25jZXB0IGFwaSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUaGVDb25uZWN0aW9uQXBpKGNvbm5lY3Rpb25EYXRhKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBDb25uZWN0aW9uKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIHZhciBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGNvbm5lY3Rpb25EYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5DcmVhdGVUaGVDb25uZWN0aW9uVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keToganNvbkRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29ubmVjdGlvbiBlcnJvciBtZXNzYWdlOiAnLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSB0aGUgY29ubmVjdGlvbiBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgQ3JlYXRlIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVUZXh0RGF0YSh0ZXh0RGF0YSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkNyZWF0ZVRoZVRleHREYXRhVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkodGV4dERhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFN0cmluZyA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFN0cmluZztcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGUgdGhlIHRleHQgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlIHRoZSB0ZXh0IHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERlbGV0ZVRoZUNvbmNlcHQoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1kYXRhLmFwcGVuZChcImlkXCIsIGlkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkRlbGV0ZUNvbmNlcHRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGJvZHk6IGZvcm1kYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbmNlcHQgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbmNlcHQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRGVsZXRlVGhlQ29ubmVjdGlvbihpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9ybWRhdGEuYXBwZW5kKFwiaWRcIiwgaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuRGVsZXRlVGhlQ29ubmVjdGlvblVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgYm9keTogZm9ybWRhdGEsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6IFwiZm9sbG93XCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgY29ubmVjdGlvbiBlcnJvciBzdGF0dXM6ICcsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgY29ubmVjdGlvbiBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gVHJhc2hUaGVDb25jZXB0KGlkLCB0b2tlbikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBteUhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICAgICAgbXlIZWFkZXJzLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIHRva2VuKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1kYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQoJ2lkJywgaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuRGVsZXRlQ29uY2VwdFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgYm9keTogZm9ybWRhdGEsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZWxldGUgY29tcG9zaXRpb24gRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgY29tcG9zaXRpb24gZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNvbXBvc2l0aW9uIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tICcuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsJztcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhJztcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXInO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFpRGF0YSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbEFpRGF0YSgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWkgRXJyb3IgTWVzc2FnZTogJywgXCJDYW5ub3QgZ2V0IHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChyZXN1bHRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9QdXJnYXRvcnlEYXRhYmFzZVVwZGF0ZWQoKTtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIHRpbWUgdGFrZW4gaXMgXCIsIGVsYXBzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWkgRXJyb3IgTWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWkgRXJyb3IgTWVzc2FnZTogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29uY2VwdHNCeVR5cGUodHlwZSwgdXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciB1cmxlbmNvZGVkID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ1c2VyX2lkXCIsIHVzZXJJZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRBbGxDb25jZXB0c0J5VHlwZVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IHVybGVuY29kZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdFtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXRBbGxDb25jZXB0c0J5VHlwZSBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0QWxsQ29uY2VwdHNCeVR5cGUgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0QWxsQ29uY2VwdHNCeVR5cGUgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSAnLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGEnO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL0NoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uJztcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyJztcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oY29tcG9zaXRpb25faWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChjb21wb3NpdGlvbl9pZCk7XG4gICAgICAgIGlmIChjb25uZWN0aW9uTGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uT25saW5lKGNvbXBvc2l0aW9uX2lkKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbmV3Q29ubmVjdGlvbnNTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25PbmxpbmUoY29tcG9zaXRpb25faWQpO1xuICAgICAgICAgICAgdmFyIG5ld0Nvbm5lY3Rpb25zID0gbmV3Q29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbihuZXdDb25uZWN0aW9ucywgY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBuZXdDb25uZWN0aW9ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uT25saW5lKGNvbXBvc2l0aW9uX2lkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogYGNvbXBvc2l0aW9uX2lkPSR7Y29tcG9zaXRpb25faWR9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuQWRkQ29ubmVjdGlvbihyZXN1bHRbaV0pO1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2gocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgY29ubmVjdGlvbiBvZiBjb21wb3NpdGlvbiBlcnJvciA6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgY29ubmVjdGlvbiBvZiBjb21wb3NpdGlvbiBlcnJvciA6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhJztcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgRmluZENvbmNlcHRzRnJvbUNvbm5lY3Rpb25zIH0gZnJvbSAnLi4vU2VydmljZXMvRmluZENvbmVjZXB0c0Zyb21Db25uZWN0aW9uJztcbmltcG9ydCB7IEZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25zQnVsa0luTWVtb3J5IH0gZnJvbSAnLi4vU2VydmljZXMvRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtJbk1lbW9yeSc7XG5pbXBvcnQgeyBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL0NoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uJztcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyJztcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrKGNvbXBvc2l0aW9uX2lkcyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBpZiAoY29tcG9zaXRpb25faWRzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9sZENvbm5lY3Rpb25MaXN0ID0geWllbGQgRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbnNCdWxrSW5NZW1vcnkoY29tcG9zaXRpb25faWRzKTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uT25saW5lKGNvbXBvc2l0aW9uX2lkcyk7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgIENoZWNrRm9yQ29ubmVjdGlvbkRlbGV0aW9uKGNvbm5lY3Rpb25MaXN0LCBvbGRDb25uZWN0aW9uTGlzdCk7XG4gICAgICAgIHlpZWxkIEZpbmRDb25jZXB0c0Zyb21Db25uZWN0aW9ucyhjb25uZWN0aW9uTGlzdCk7XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25PbmxpbmUoY29tcG9zaXRpb25faWRzID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1VybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNvbXBvc2l0aW9uX2lkcylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb24ocmVzdWx0W2ldKTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QucHVzaChyZXN1bHRbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGNvbm5lY3Rpb25zIG9mIGNvbXBvc2l0aW9uIGJ1bGsgZXJyb3IgbWVzc2FnZTogJywgXCJDYW5ub3QgZ2V0IHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBjb25uZWN0aW9ucyBvZiBjb21wb3NpdGlvbiBidWxrIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgY29ubmVjdGlvbnMgb2YgY29tcG9zaXRpb24gYnVsayB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbExpbmtlckNvbm5lY3Rpb25zRnJvbVRoZUNvbmNlcHQoY29uY2VwdElkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbExpbmtlckNvbm5lY3Rpb25PZkNvbmNlcHRVcmwoKSArIGA/Y29uY2VwdElkPSR7Y29uY2VwdElkfWAsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0aW9uID0gcmVzdWx0W2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IGFsbCBsaW5rZXIgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25jZXB0cyBlcnJvclwiLCBcImNhbm5vdCBnZXQgcmVzcG9uZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29uY2VwdHMgZXJyb3I6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBhbGwgbGlua2VyIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29uY2VwdHMgZXJyb3IoVW5leHBlY3RlZCk6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNUb1RoZUNvbmNlcHQoY29uY2VwdElkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldEFsbExpbmtlckNvbm5lY3Rpb25Ub0NvbmNlcHRVcmwoKSArIGA/Y29uY2VwdElkPSR7Y29uY2VwdElkfWAsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0aW9uID0gcmVzdWx0W2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IGFsbCBsaW5rZXIgY29ubmVjdGlvbiBUbyB0aGUgY29uY2VwdHMgZXJyb3JcIiwgXCJjYW5ub3QgZ2V0IHJlc3BvbmVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgYWxsIGxpbmtlciBjb25uZWN0aW9uIFRvIHRoZSBjb25jZXB0cyBlcnJvcjogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IGFsbCBsaW5rZXIgY29ubmVjdGlvbiBUbyB0aGUgY29uY2VwdHMgZXJyb3IoVW5leHBlY3RlZCk6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHQoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0VXNlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgbGV0IGlzTnBjID0gQ29uY2VwdHNEYXRhLkdldE5wYyhpZCk7XG4gICAgICAgICAgICBpZiAoY29uY2VwdFVzZS5pZCAhPSAwIHx8IGlzTnBjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRVc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkdldENvbmNlcHRVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBgaWQ9JHtpZH1gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGROcGMoaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCB0aGUgY29uY2VwdCBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IHRoZSBjb25jZXB0IGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCB0aGUgY29uY2VwdCB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCdWxrKGNvbmNlcHRJZHMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgYnVsa0NvbmNlcHRGZXRjaCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0SWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRVc2UgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChjb25jZXB0SWRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdFVzZS5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1bGtDb25jZXB0RmV0Y2gucHVzaChjb25jZXB0SWRzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVsa0NvbmNlcHRGZXRjaC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25jZXB0QnVsa1VybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJ1bGtDb25jZXB0RmV0Y2gpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0ID0gcmVzdWx0W2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBDb25jZXB0IEJ1bGsgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25jZXB0IEJ1bGsgIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25jZXB0IEJ1bGsgIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBCdWxrQ29uY2VwdEdldHRlckFwaShidWxrQ29uY2VwdEZldGNoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgaWYgKGJ1bGtDb25jZXB0RmV0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbXlIZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0Q29uY2VwdEJ1bGtVcmwoKSwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbXlIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShidWxrQ29uY2VwdEZldGNoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IHJlc3VsdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0TGlzdC5wdXNoKGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2J1bGsgY29uY2VwdCBnZXR0ZXIgYXBpIGVycm9yOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdidWxrIGNvbmNlcHQgZ2V0dGVyIGFwaSBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdExpc3Q7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUoY2hhcmFjdGVyVmFsdWUsIHR5cGVJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJWYWx1ZSwgdHlwZUlkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25jZXB0ID09IG51bGwgfHwgY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGpzb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJfdmFsdWUnOiBgJHtjaGFyYWN0ZXJWYWx1ZX1gLFxuICAgICAgICAgICAgICAgICAgICAndHlwZV9pZCc6IHR5cGVJZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHRvU2VuZEpzb24gPSBKU09OLnN0cmluZ2lmeShqc29uKTtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlVXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogdG9TZW5kSnNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgdHlwZSBhbmQgY2hhcmFjdGVyIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgVGhpcyBpcyB0aGUgY29uY2VwdCBieSB0eXBlIGFuZCBjaGFyYWN0ZXIgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgdHlwZSBhbmQgY2hhcmFjdGVyIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZVVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGBjaGFyYWN0ZXJfdmFsdWU9JHtjaGFyYWN0ZXJWYWx1ZX1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBpbiBHZXR0aW5nIGNvbmNlcHQgYnkgY2hhcmFjdGVyIHZhbHVlIEVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSBlcnJvciBtZXNzYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gR2V0dGluZyBjb25jZXB0IGJ5IGNoYXJhY3RlciB2YWx1ZSB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb24oaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbihpZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25uZWN0aW9uVXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYGlkPSR7aWR9YFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuQWRkQ29ubmVjdGlvbihyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgQ29ubmVjdGlvbiBFcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IENvbm5lY3Rpb24gZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnR2V0IENvbm5lY3Rpb24gdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gXCIuLy4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEZpbmRDb25jZXB0c0Zyb21Db25uZWN0aW9ucyB9IGZyb20gXCIuLi9TZXJ2aWNlcy9GaW5kQ29uZWNlcHRzRnJvbUNvbm5lY3Rpb25cIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbm5lY3Rpb25CdWxrKGNvbm5lY3Rpb25JZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGJ1bGtDb25uZWN0aW9uRmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0VXNlID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uY2VwdFVzZS5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1bGtDb25uZWN0aW9uRmV0Y2gucHVzaChjb25uZWN0aW9uSWRzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2goY29uY2VwdFVzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1bGtDb25uZWN0aW9uRmV0Y2gubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25uZWN0aW9uQnVsa1VybCgpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJ1bGtDb25uZWN0aW9uRmV0Y2gpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9uID0gcmVzdWx0W2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIEZpbmRDb25jZXB0c0Zyb21Db25uZWN0aW9ucyhjb25uZWN0aW9uTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IENvbm5lY3Rpb24gQnVsayBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQ29ubmVjdGlvbiBCdWxrIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBDb25uZWN0aW9uIEJ1bGsgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdCh0eXBlSWQsIG9mVGhlQ29uY2VwdElkLCB1c2VySWQsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHVybGVuY29kZWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcInR5cGVJZFwiLCBgJHt0eXBlSWR9YCk7XG4gICAgICAgICAgICB1cmxlbmNvZGVkLmFwcGVuZChcIm9mVGhlQ29uY2VwdElkXCIsIGAke29mVGhlQ29uY2VwdElkfWApO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJ1c2VySWRcIiwgYCR7dXNlcklkfWApO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJpbnBhZ2VcIiwgYCR7aW5wYWdlfWApO1xuICAgICAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJwYWdlXCIsIGAke3BhZ2V9YCk7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0QWxsQ29ubmVjdGlvbnNPZkNvbmNlcHRVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiB1cmxlbmNvZGVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gKHlpZWxkIHJlc3BvbnNlLmpzb24oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBjb25uZWN0aW9uIG9mIGNvbmNlcHQgZXJyb3JcIiwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBjb25uZWN0aW9uIG9mIGNvbmNlcHQgIGVycm9yIG1lc3NhZ2U6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldCBjb25uZWN0aW9uIG9mIGNvbmNlcHQgdW5leHBlY3RlZCBlcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFJlc2VydmVkQ29ubmVjdGlvbklkcyB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9SZXNlcnZlZElkc1wiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRSZXNlcnZlZENvbm5lY3Rpb25JZHMoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRSZXNlcnZlZENvbm5lY3Rpb25JZFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBSZXNlcnZlZENvbm5lY3Rpb25JZHMuQWRkSWQocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dldCByZXNlcnZlZCBjb25uZWN0aW9uIGlkcyBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXQgcmVzZXJ2ZWQgY29ubmVjdGlvbiBpZHMgIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFJlc2VydmVkSWRzIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1Jlc2VydmVkSWRzXCI7XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldFJlc2VydmVkSWRzKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuR2V0UmVzZXJ2ZWRJZFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBSZXNlcnZlZElkcy5BZGRJZChyZXN1bHRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0IHJlc2VydmVkIGlkcyBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXQgcmVzZXJ2ZWQgaWRzICB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IFRva2VuU3RvcmFnZSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL1NlY3VyaXR5L1Rva2VuU3RvcmFnZSc7XG5leHBvcnQgZnVuY3Rpb24gTG9naW5Ub0JhY2tlbmQoZW1haWwsIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgJ2VtYWlsJzogZW1haWwsXG4gICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJzogcGFzc3dvcmRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgbXlIZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgICAgIG15SGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RPYmplY3QgPSBKU09OLnN0cmluZ2lmeShvYmplY3QpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChCYXNlVXJsLkxvZ2luVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBteUhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdE9iamVjdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbiA9IHJlc3VsdC5kYXRhLnRva2VuO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyB0aGUgdG9rZW5cIiwgVG9rZW5TdG9yYWdlLkJlYXJlckFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0xvZ2luIHRzY2NzIGVycm9yIG1lc3NhZ2U6ICcsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdMb2dpbiB0c2NjcyBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgTG9naW4gdHNjY3MgIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IEdldFJlcXVlc3RIZWFkZXIgfSBmcm9tIFwiLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIE1ha2VUaGVOYW1lSW5CYWNrZW5kKG5ld0NvbmNlcHRJZCwgcmVmZXJlbnQsIHR5cGVJZCwgdHlwZVVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0ge1xuICAgICAgICAgICAgICAgICduZXdDb25jZXB0SWQnOiBuZXdDb25jZXB0SWQsXG4gICAgICAgICAgICAgICAgJ3JlZmVyZW50JzogcmVmZXJlbnQsXG4gICAgICAgICAgICAgICAgJ3R5cGVJZCc6IHR5cGVJZCxcbiAgICAgICAgICAgICAgICAndHlwZVVzZXJJZCc6IHR5cGVVc2VySWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgbXlIZWFkZXJzID0gR2V0UmVxdWVzdEhlYWRlcigpO1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RPYmplY3QgPSBKU09OLnN0cmluZ2lmeShvYmplY3QpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBmZXRjaChCYXNlVXJsLk1ha2VUaGVOYW1lSW5CYWNrZW5kVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBteUhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdE9iamVjdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYWtlIHRoZSBuYW1lIGluIGJhY2tlbmQgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbWFrZSB0aGUgbmFtZSBpbiBiYWNrZW5kIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuLi9TZXJ2aWNlcy9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vU2VydmljZXMvQ29uY2VwdEZpbmRpbmcvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlcIjtcbi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayB0aGUgdHlwZSBjb25jcGV0IG9mIGEgcGFzc2VkIHN0cmluZ1xuLy8gaWYgdGhlIHRleHQgaXMgXCJ0aGVfcGVyc29uXCIgdGhlbiB0aGUgZnVuY3Rpb24gZmluZHMgdGhlIHJlbGF0ZWQgY29uY2VwdFxuZXhwb3J0IGZ1bmN0aW9uIE1ha2VUaGVUeXBlQ29uY2VwdEFwaSh0eXBlLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBjcmVhdGUgIGEgZGVmYXVsdCBjb25jZXB0IHdpdGggYWxsIGRlZmF1bHRpbmcgdG8gemVyb1xuICAgICAgICBsZXQgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmNlcHQgYnkgY2hhcmFjdGVyIGFuZCBjYXRlZ29yeSBmcm9tIHRoZSBhcGlcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeSh0eXBlKTtcbiAgICAgICAgICAgIGlmIChjb25jZXB0LmlkID09IDAgfHwgY29uY2VwdC50eXBlSWQgPT0gNCkge1xuICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuTWFrZVRoZVR5cGVDb25jZXB0VXJsKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYHR5cGU9JHt0eXBlfWBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTWFrZSBUaGUgVHlwZSBDb25jZXB0IEFwaSBlcnJvciA6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01ha2UgVGhlIFR5cGUgQ29uY2VwdCBBcGkgZXJyb3IgOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Jhc2VVcmxcIjtcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5IH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1NlYXJjaFF1ZXJ5XCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkZyb21Db25uZWN0aW9uc1dpdGhEYXRhSWQgfSBmcm9tIFwiLi4vU2VydmljZXMvR2V0Q29tcG9zaXRpb25CdWxrXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBSZWN1cnNpdmVTZWFyY2hBcGkoY29tcG9zaXRpb24gPSAwLCBsaXN0TGlua2VycyA9IFtdLCB0ZXh0U2VhcmNoID0gXCJcIikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0cyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHNlYXJjaFF1ZXJ5ID0gbmV3IFNlYXJjaFF1ZXJ5KCk7XG4gICAgICAgICAgICBzZWFyY2hRdWVyeS5jb21wb3NpdGlvbiA9IGNvbXBvc2l0aW9uO1xuICAgICAgICAgICAgc2VhcmNoUXVlcnkubGlzdExpbmtlcnMgPSBsaXN0TGlua2VycztcbiAgICAgICAgICAgIHNlYXJjaFF1ZXJ5LnRleHRTZWFyY2ggPSB0ZXh0U2VhcmNoO1xuICAgICAgICAgICAgdmFyIHJhdyA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaFF1ZXJ5KTtcbiAgICAgICAgICAgIHZhciBDb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgdmFyIG15SGVhZGVycyA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5SZWN1cnNpdmVTZWFyY2hVcmwoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiByYXdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0SWRzID0gcmVzdWx0LmNvbXBvc2l0aW9uSWRzO1xuICAgICAgICAgICAgICAgIHZhciBjb25uZWN0aW9ucyA9IHJlc3VsdC5pbnRlcm5hbENvbm5lY3Rpb25zO1xuICAgICAgICAgICAgICAgIHZhciBleHRlcm5hbENvbm5lY3Rpb25zID0gcmVzdWx0LmV4dGVybmFsQ29ubmVjdGlvbnM7XG4gICAgICAgICAgICAgICAgY29uY2VwdHMgPSB5aWVsZCBHZXRDb21wb3NpdGlvbkZyb21Db25uZWN0aW9uc1dpdGhEYXRhSWQoY29uY2VwdElkcywgY29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZWN1cnNpdmUgc2VhcmNoIGVycm9yIFwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVjdXJzaXZlIHNlYXJjaCBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZWN1cnNpdmUgc2VhcmNoIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0cztcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi8uLi8uLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0QXBpKGNoYXJhY3RlclZhbHVlLCBjYXRlZ29yeV9pZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeURpcmVjdFVybCgpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyLFxuICAgICAgICAgICAgICAgIGJvZHk6IGBjaGFyYWN0ZXJfdmFsdWU9JHtjaGFyYWN0ZXJWYWx1ZX0mY2F0ZWdvcnlfaWQ9JHtjYXRlZ29yeV9pZH1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgY29uY2VwdCBieSBjYXRlZ29yeSBhbmQgY2hhcmFjdGVyIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyBUaGlzIGlzIHRoZSBjb25jZXB0IGJ5IGNhdGVnb3J5IGFuZCBjaGFyYWN0ZXIgZXJyb3IgbWVzc2FnZTogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIGNvbmNlcHQgYnkgY2F0ZWdvcnkgYW5kIGNoYXJhY3RlciB1bmV4cGVjdGVkIGVycm9yOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24gfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvU2VjdXJpdHkvR2V0UmVxdWVzdEhlYWRlclwiO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoQWxsQ29uY2VwdHModHlwZSwgc2VhcmNoLCBjb21wb3NpdGlvbiwgdG9rZW4sIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIHRva2VuKTtcbiAgICAgICAgdmFyIHVybGVuY29kZWQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwidHlwZVwiLCB0eXBlKTtcbiAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJzZWFyY2hcIiwgc2VhcmNoKTtcbiAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJjb21wb3NpdGlvblwiLCBjb21wb3NpdGlvbik7XG4gICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwiaW5wYWdlXCIsIGlucGFnZS50b1N0cmluZygpKTtcbiAgICAgICAgdXJsZW5jb2RlZC5hcHBlbmQoXCJwYWdlXCIsIHBhZ2UudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5VXJsID0gQmFzZVVybC5TZWFyY2hDb21wb3NpdGlvbnNVcmwoKSArIFwiP1wiICsgdXJsZW5jb2RlZC50b1N0cmluZygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChxdWVyeVVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBTZWFyY2hJbnRlcm5hbEFwaShzZWFyY2gsIHRva2VuID0gXCJcIikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oXCJhcHBsaWNhdGlvbi9qc29uXCIsIHRva2VuKTtcbiAgICAgICAgbGV0IHF1ZXJ5VXJsID0gQmFzZVVybC5TZWFyY2hJbnRlcm5hbFdpdGhBdXRoZW50aWNhdGVkQ2NzVXJsKCk7XG4gICAgICAgIHF1ZXJ5VXJsID0gcXVlcnlVcmwgKyAnP2NvbXBvc2l0aW9uPScgKyBzZWFyY2guY29tcG9zaXRpb24gKyAnJnNlYXJjaD0nICsgc2VhcmNoLnNlYXJjaCArICcmaW50ZXJuYWxDb21wb3NpdGlvbj0nICsgc2VhcmNoLmludGVybmFsQ29tcG9zaXRpb24gKyAnJnR5cGU9JyArIHNlYXJjaC50eXBlICsgJyZpbnBhZ2U9JyArIHNlYXJjaC5pbnBhZ2UgKyAnJnBhZ2U9JyArIHNlYXJjaC5wYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChxdWVyeVVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIGludGVybmFsIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgaW50ZXJuYWwgZXJyb3JcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBTZWFyY2hMaW5rTXVsdGlwbGVBcGkoc2VhcmNoUXVlcnksIHRva2VuID0gXCJcIikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyV2l0aEF1dGhvcml6YXRpb24oXCJhcHBsaWNhdGlvbi9qc29uXCIsIHRva2VuKTtcbiAgICAgICAgY29uc3QgcXVlcnlVcmwgPSBCYXNlVXJsLlNlYXJjaExpbmtNdWx0aXBsZUFsbEFwaVVybCgpO1xuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNoUXVlcnkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBmZXRjaChxdWVyeVVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIG11bHRpcGxlIGVycm9yXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGlzIGlzIHRoZSBzZWFyY2hpbmcgbXVsdGlwbGUgZXJyb3JcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmV4cG9ydCBmdW5jdGlvbiBTZWFyY2hXaXRoTGlua2VyKHNlYXJjaFF1ZXJ5LCB0b2tlbiA9IFwiXCIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaGVhZGVyID0gR2V0UmVxdWVzdEhlYWRlcldpdGhBdXRob3JpemF0aW9uKFwiYXBwbGljYXRpb24vanNvblwiLCB0b2tlbik7XG4gICAgICAgIGNvbnN0IHF1ZXJ5VXJsID0gQmFzZVVybC5TZWFyY2hMaW5rTXVsdGlwbGVBbGwoKTtcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaFF1ZXJ5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2gocXVlcnlVcmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXMgdGhlIHNlYXJjaGluZyBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhpcyBpcyB0aGUgc2VhcmNoaW5nIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRSZXF1ZXN0SGVhZGVyIH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL1NlY3VyaXR5L0dldFJlcXVlc3RIZWFkZXJcIjtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVNlc3Npb24oc2Vzc2lvbkRhdGEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShzZXNzaW9uRGF0YSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlU2Vzc2lvbklkKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBzZXNzaW9uIGZhaWxlZFwiLCB5aWVsZCByZXNwb25zZS5qc29uKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIHNlc3Npb24gZmFpbGVkXCIsIGV4KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlU2Vzc2lvblZpc2l0KHNlc3Npb25JZCwgdXJsKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSBHZXRSZXF1ZXN0SGVhZGVyKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgdXJsZW5jb2RlZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwic2Vzc2lvbklkXCIsIHNlc3Npb25JZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHVybGVuY29kZWQuYXBwZW5kKFwidXJsXCIsIHVybCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKEJhc2VVcmwuQ3JlYXRlU2Vzc2lvblZpc2l0VXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogdXJsZW5jb2RlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBzZXNzaW9uIHVybCBmYWlsZWRcIiwgeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBzZXNzaW9uIHVybCBmYWlsZWRcIiwgZXgpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi9hcHBcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNpZ25pbihzaWduaW5JbmZvKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgcmF3ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZW1haWw6IHNpZ25pbkluZm8uZW1haWwsXG4gICAgICAgICAgICBwYXNzd29yZDogc2lnbmluSW5mby5wYXNzd29yZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBteUhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICBteUhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICBjb25zdCB1cmwgPSBCYXNlVXJsLkxvZ2luVXJsKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG15SGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiByYXcsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhT2JqZWN0ID0gb3V0cHV0ID09PSBudWxsIHx8IG91dHB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3V0cHV0LmRhdGE7XG4gICAgICAgICAgICAgICAgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YU9iamVjdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2Nhbm5vdCBhdXRoZW50aWNhdGUnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZnJlZXNjaGVtYVJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTaWduIGluIGFwaSBlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgIGZyZWVzY2hlbWFSZXMgPSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZnJlZXNjaGVtYVJlcztcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlVXJsIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2lnbnVwKHNpZ251cE1vZGVsKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3Qgc2lnbnVwUmVzcG9uc2UgPSB5aWVsZCBwb3N0RGF0YShCYXNlVXJsLlNpZ251cFVybCgpLCBzaWdudXBNb2RlbCk7XG4gICAgICAgIHJldHVybiBzaWdudXBSZXNwb25zZTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHBvc3REYXRhKHVybCA9ICcnLCBkYXRhID0ge30pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gRGVmYXVsdCBvcHRpb25zIGFyZSBtYXJrZWQgd2l0aCAqXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGZldGNoKHVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLCAvLyAqR0VULCBQT1NULCBQVVQsIERFTEVURSwgZXRjLlxuICAgICAgICAgICAgICAgIG1vZGU6ICdjb3JzJywgLy8gbm8tY29ycywgKmNvcnMsIHNhbWUtb3JpZ2luXG4gICAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScsIC8vICpkZWZhdWx0LCBuby1jYWNoZSwgcmVsb2FkLCBmb3JjZS1jYWNoZSwgb25seS1pZi1jYWNoZWRcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJywgLy8gaW5jbHVkZSwgKnNhbWUtb3JpZ2luLCBvbWl0XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAvLyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIG1hbnVhbCwgKmZvbGxvdywgZXJyb3JcbiAgICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJywgLy8gbm8tcmVmZXJyZXIsICpuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSwgb3JpZ2luLCBvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4sIHNhbWUtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLCB1bnNhZmUtdXJsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksIC8vIGJvZHkgZGF0YSB0eXBlIG11c3QgbWF0Y2ggXCJDb250ZW50LVR5cGVcIiBoZWFkZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogb3V0cHV0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmVlc2NoZW1hUmVzID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnY2Fubm90IGNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmcmVlc2NoZW1hUmVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpZ251cCBFcnJvcjogJywgZXJyb3IpO1xuICAgICAgICAgICAgZnJlZXNjaGVtYVJlcyA9IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgICAgICAgIGRhdGE6ICcnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBmcmVlc2NoZW1hUmVzO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2VVcmwgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybFwiO1xuaW1wb3J0IHsgR2V0UmVxdWVzdEhlYWRlciB9IGZyb20gXCIuLi8uLi9TZXJ2aWNlcy9TZWN1cml0eS9HZXRSZXF1ZXN0SGVhZGVyXCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnVsayB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBmdW5jdGlvbiBWaWV3SW50ZXJuYWxEYXRhQXBpKGlkcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IEdldFJlcXVlc3RIZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goQmFzZVVybC5WaWV3SW50ZXJuYWxEYXRhVXJsKCksIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdFN0cmluZyA9IHlpZWxkIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBsZXQgY29ubmVjdGlvbkRpY3Rpb25hcnkgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRMaXN0ID0gY29uY2VwdFN0cmluZ1tpXS5jb25jZXB0cztcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25jZXB0U3RyaW5nW2ldLmNvbm5lY3Rpb25zO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBjb25jZXB0U3RyaW5nW2ldLmlkO1xuICAgICAgICAgICAgICAgICAgICBHZXRDb25jZXB0QnVsayhjb25jZXB0TGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25EaWN0aW9uYXJ5W2lkXSA9IGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkRpY3Rpb25hcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlZpZXcgSW50ZXJuYWwgRGF0YSBlcnJvclwiLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnIFRoaXMgaXMgdGhlIHZpZXcgaW50ZXJuYWwgZGF0YSBlcnJvciBtZXNzYWdlOiAnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgVGhpcyBpcyB0aGUgdmlldyBpbnRlcm5hbCBkYXRhIHVuZXhwZWN0ZWQgZXJyb3I6ICcsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwiZXhwb3J0IGNsYXNzIEJhc2VVcmwge1xuICAgIC8vIHN0YXRpYyBHZXRDb25jZXB0VXJsOnN0cmluZyA9IHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRDb25jZXB0JztcbiAgICBzdGF0aWMgR2V0Q29uY2VwdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRDb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0LWNvbm5lY3Rpb24tYnktaWQnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ1bGtVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2NvbmNlcHRfYnVsayc7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uQnVsa1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfY29ubmVjdGlvbl9idWxrJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbENvbmNlcHRzT2ZVc2VyVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29uY2VwdHNfb2ZfdXNlcic7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRBbGxDb25uZWN0aW9uc09mVXNlclVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2Nvbm5lY3Rpb25zX29mX3VzZXInO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9hbGxfY29ubmVjdGlvbnNfb2ZfY29tcG9zaXRpb24nO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfYWxsX2Nvbm5lY3Rpb25zX29mX2NvbXBvc2l0aW9uX2J1bGsnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2NvbmNlcHRfYnlfY2hhcmFjdGVyX3ZhbHVlJztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2NvbmNlcHRfYnlfY2hhcmFjdGVyX2FuZF90eXBlJztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9jb25jZXB0X2J5X2NoYXJhY3Rlcl9hbmRfY2F0ZWdvcnknO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlEaXJlY3RVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2NvbmNlcHRfYnlfY2hhcmFjdGVyX2FuZF9jYXRlZ29yeV9kaXJlY3QnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q2hhcmFjdGVyQnlDaGFyYWN0ZXJVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2NoYXJhY3Rlcl9ieV9jaGFyYWN0ZXInO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsQ29uY2VwdHNCeVR5cGVVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25jZXB0c19ieV90eXBlJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbENvbm5lY3Rpb25zT2ZDb25jZXB0VXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldC1saW5rLWNvbm5lY3Rpb25zJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbEFpRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtcHJlbG9hZGVkLWNvbmNlcHRzJztcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuQUlfVVJMICsgJy9hcGkvZ2V0X3JhbmtlZF90eXBlX2lkP2lucGFnZT0zMDAnIHx8IHByb2Nlc3MuZW52LkFJX1VSTCB8fCAgJ2h0dHBzOi8vYWkuZnJlZXNjaGVtYS5jb20vYXBpL2dldF9yYW5rZWRfdHlwZV9pZD9pbnBhZ2U9MzAwJztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbFByZWZldGNoQ29ubmVjdGlvbnNVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0X2FsbF9jb25uZWN0aW9uc19vZl91c2VyP2lucGFnZT01MDAnO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0QWxsTGlua2VyQ29ubmVjdGlvbk9mQ29uY2VwdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtYWxsLWxpbmtlcnMtZnJvbS1jb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIEdldEFsbExpbmtlckNvbm5lY3Rpb25Ub0NvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvZ2V0LWFsbC1saW5rZXJzLXRvLWNvbmNlcHQnO1xuICAgIH1cbiAgICBzdGF0aWMgRGVsZXRlQ29uY2VwdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9kZWxldGVfY29uY2VwdCc7XG4gICAgfVxuICAgIHN0YXRpYyBSZWN1cnNpdmVTZWFyY2hVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvcmVjdXJzaXZlc2VhcmNoLWNvbmNlcHQtY29ubmVjdGlvbic7XG4gICAgfVxuICAgIHN0YXRpYyBTZWFyY2hMaW5rTXVsdGlwbGVBbGxBcGlVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvQ29ubmVjdGlvbi9zZWFyY2gtbGluay1tdWx0aXBsZS1hbGwtY2NzJztcbiAgICB9XG4gICAgc3RhdGljIE1ha2VUaGVOYW1lSW5CYWNrZW5kVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL21ha2UtbmFtZS1mcm9tLWZyb250ZW5kJztcbiAgICB9XG4gICAgc3RhdGljIExvZ2luVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2F1dGgvbG9naW4nO1xuICAgIH1cbiAgICBzdGF0aWMgU2lnbnVwVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2F1dGgvc2lnbnVwJztcbiAgICB9XG4gICAgc3RhdGljIEdldENvbXBvc2l0aW9uQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c1VybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXQtY29tcG9zaXRpb24tY29ubmVjdGlvbi1iZXR3ZWVuLXR3by1jb25jZXB0cyc7XG4gICAgfVxuICAgIHN0YXRpYyBTZWFyY2hDb21wb3NpdGlvbnNVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvc2VhcmNoLWNvbXBvc2l0aW9ucyc7XG4gICAgfVxuICAgIHN0YXRpYyBTZWFyY2hMaW5rTXVsdGlwbGVBbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvQ29ubmVjdGlvbi9zZWFyY2gtbGluay1tdWx0aXBsZS1hbGwnO1xuICAgIH1cbiAgICBzdGF0aWMgQ3JlYXRlU2Vzc2lvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2NyZWF0ZS1zZXNzaW9uLWlkLXJlbW90ZSc7XG4gICAgfVxuICAgIHN0YXRpYyBDcmVhdGVTZXNzaW9uVmlzaXRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlLXJlbW90ZS1zZXNzaW9uLXZpc2l0JztcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vQXBpIGZvciB2aWV3aW5nIGludGVybmFsIGRhdGEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgVmlld0ludGVybmFsRGF0YVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS92aWV3LWFwaS1pbnRlcm5hbC1kYXRhLWNjcy1pZC1idWxrJztcbiAgICB9XG4gICAgc3RhdGljIFNlYXJjaEludGVybmFsV2l0aEF1dGhlbnRpY2F0ZWRDY3NVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvc2VhcmNoLWNvbXBvc2l0aW9uLWludGVybmFsLWF1dGhlbnRpY2F0ZWQtY2NzJztcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLyBBUEkgRm9yIFJlc2VydmVkIElkcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgR2V0UmVzZXJ2ZWRJZFVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9nZXRfcmVzZXJ2ZWRfaWRzJztcbiAgICB9XG4gICAgc3RhdGljIEdldFJlc2VydmVkQ29ubmVjdGlvbklkVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CQVNFX1VSTCArICcvYXBpL2dldF9yZXNlcnZlZF9jb25uZWN0aW9uX2lkcyc7XG4gICAgfVxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vL0FQSSBGb3IgQ3JlYXRpbmcgRGF0YSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIHN0YXRpYyBDcmVhdGVUaGVUZXh0RGF0YVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9jcmVhdGVfdGV4dF9kYXRhJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNoYXJhY3RlckRhdGFVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX2NoYXJhY3Rlcl9kYXRhJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25jZXB0JztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbm5lY3Rpb25VcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25uZWN0aW9uJztcbiAgICB9XG4gICAgc3RhdGljIENyZWF0ZVRoZUNvbm5lY3Rpb25OZXdVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvY3JlYXRlX3RoZV9jb25uZWN0aW9uX25ldyc7XG4gICAgfVxuICAgIHN0YXRpYyBNYWtlVGhlVHlwZUNvbmNlcHRVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkJBU0VfVVJMICsgJy9hcGkvbWFrZV90aGVfdHlwZV9jb25jZXB0JztcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vQVBJIEZPUiBEZWxldGluZyBDb25uZWN0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBzdGF0aWMgRGVsZXRlVGhlQ29ubmVjdGlvblVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQkFTRV9VUkwgKyAnL2FwaS9kZWxldGVfY29ubmVjdGlvbic7XG4gICAgfVxufVxuQmFzZVVybC5CQVNFX1VSTCA9IFwiaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1My9cIjtcbkJhc2VVcmwuQUlfVVJMID0gXCJodHRwczovL2FpLmZyZWVzY2hlbWEuY29tXCI7XG5CYXNlVXJsLk1RVFRfVVJMID0gJzE5Mi4xNjguMS4yNDknO1xuQmFzZVVybC5OT0RFX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjUwMDEvJztcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcIi4vTm9kZVwiO1xuZXhwb3J0IGNsYXNzIEJpbmFyeUNoYXJhY3RlclRyZWUge1xuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzQ2hhcmFjdGVyTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KEJpbmFyeUNoYXJhY3RlclRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXJSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyYWN0ZXJSb290ID0gdGhpcy5jaGFyYWN0ZXJSb290LmFkZENoYXJhY3Rlck5vZGUobm9kZSwgdGhpcy5jaGFyYWN0ZXJSb290LCB0aGlzLmNoYXJhY3RlclJvb3QuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgcmVtb3ZlTm9kZUJ5Q2hhcmFjdGVyKGNoYXJhY3RlciwgaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJhY3RlclJvb3QucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyh0aGlzLmNoYXJhY3RlclJvb3QsIGNoYXJhY3RlciwgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNvdW50TnVtYmVyT2ZOb2RlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmFjdGVyUm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLmNoYXJhY3RlclJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmNoYXJhY3RlclZhbHVlICE9IFwiXCIpIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gbmV3IE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgdGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWVVcGRhdGVkKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5jaGFyYWN0ZXJSb290LmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCB0aGlzLmNoYXJhY3RlclJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmFjdGVyUm9vdDtcbiAgICB9XG4gICAgc3RhdGljIGdldENoYXJhY3RlckFuZFR5cGVGcm9tVHJlZSh2YWx1ZSwgdHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5jaGFyYWN0ZXJSb290LmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgdGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tVHJlZSh2YWx1ZSwgY2F0ZWdvcnlJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY2hhcmFjdGVyUm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgdGhpcy5jaGFyYWN0ZXJSb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJhY3RlclJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgcmVtb3ZlQ29uY2VwdENoYXJhY3RlcihpZCkge1xuICAgICAgICBpZiAodGhpcy5jaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB0aGlzLmNoYXJhY3RlclJvb3QgPSB0aGlzLmNoYXJhY3RlclJvb3QucmVtb3ZlTm9kZSh0aGlzLmNoYXJhY3RlclJvb3QsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkJpbmFyeUNoYXJhY3RlclRyZWUuY2hhcmFjdGVyUm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJpbmFyeUNoYXJhY3RlclRyZWUgfSBmcm9tIFwiLi9CaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcIi4vTm9kZVwiO1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4vSWRlbnRpZmllckZsYWdzXCI7XG5leHBvcnQgY2xhc3MgQmluYXJ5VHJlZSB7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LmFkZE5vZGUobm9kZSwgdGhpcy5yb290LCB0aGlzLnJvb3QuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoQmluYXJ5VHJlZS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KSB7XG4gICAgICAgIHZhciBub2RlID0gbmV3IE5vZGUoY29uY2VwdC5pZCwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHZhciBjaGFyYWN0ZXJOb2RlID0gbmV3IE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIEJpbmFyeUNoYXJhY3RlclRyZWUuYWRkTm9kZVRvVHJlZShjaGFyYWN0ZXJOb2RlKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5yb290LmdldEZyb21Ob2RlKGlkLCB0aGlzLnJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgcmVtb3ZlTm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LnJlbW92ZU5vZGUodGhpcy5yb290LCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY291bnROdW1iZXJPZk5vZGVzKCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvdW50Tm9kZUJlbG93KHRoaXMucm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuL0lkZW50aWZpZXJGbGFnc1wiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCIuL05vZGVcIjtcbmV4cG9ydCBjbGFzcyBCaW5hcnlUeXBlVHJlZSB7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZVJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZVJvb3QgPSBub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50eXBlUm9vdCA9IHRoaXMudHlwZVJvb3QuYWRkVHlwZU5vZGUobm9kZSwgdGhpcy50eXBlUm9vdCwgdGhpcy50eXBlUm9vdC5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZVJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LnR5cGVJZCAhPSAwKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQudHlwZUlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgcmVtb3ZlVHlwZUNvbmNlcHQodHlwZUlkLCBpZCkge1xuICAgICAgICBpZiAodGhpcy50eXBlUm9vdCkge1xuICAgICAgICAgICAgdGhpcy50eXBlUm9vdCA9IHRoaXMudHlwZVJvb3QucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyh0aGlzLnR5cGVSb290LCB0eXBlSWQsIGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGVSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMudHlwZVJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMudHlwZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZVJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZSh0eXBlSWQpIHtcbiAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNUeXBlTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KEJpbmFyeVR5cGVUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21UcmVlKHR5cGVJZCk7XG4gICAgICAgICAgICBpZiAoTm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdHMucHVzaChOb2RlID09PSBudWxsIHx8IE5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IE5vZGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE5vZGUudmFyaWFudHNbaV0udmFsdWUudXNlcklkID09IHVzZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzUHJlc2VudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb25jZXB0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXB0c1tqXS5pZCA9PSBOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlc2VudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ByZXNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldFR5cGVWYXJpYW50c1dpdGhDaGFyYWN0ZXJWYWx1ZShjaGFyYWN0ZXJWYWx1ZSwgdHlwZUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLmNoYXJhY3RlclZhbHVlID09IGNoYXJhY3RlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YXJpYW50c1tpXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNvdW50TnVtYmVyT2ZOb2RlcygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVSb290LmNvdW50Tm9kZUJlbG93KHRoaXMudHlwZVJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbkJpbmFyeVR5cGVUcmVlLnR5cGVSb290ID0gbnVsbDtcbiIsImltcG9ydCB7IFRoZUNoYXJhY3RlciB9IGZyb20gXCIuL1RoZUNoYXJhY3RlclwiO1xuZXhwb3J0IGNsYXNzIENoYXJhY3RlclJlcG9zaXRvcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcImNoYXJhY3RlciBSZXBvc2l0b3J5XCI7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDaGFyYWN0ZXIoY2hhcmFjdGVyKSB7XG4gICAgICAgIHRoaXMuY2hhcmFjdGVyRGF0YVtjaGFyYWN0ZXIuaWRdID0gY2hhcmFjdGVyO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q2hhcmFjdGVyKHZhbHVlKSB7XG4gICAgICAgIHZhciB0aGVDaGFyYWN0ZXIgPSBuZXcgVGhlQ2hhcmFjdGVyKDAsIFwiMFwiLCAwLCAwLCAwLCAwLCAwLCAwLCBcIjBcIiwgZmFsc2UpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hhcmFjdGVyRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyRGF0YVtpXS5kYXRhID09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhlQ2hhcmFjdGVyID0gdGhpcy5jaGFyYWN0ZXJEYXRhW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGVDaGFyYWN0ZXI7XG4gICAgfVxufVxuQ2hhcmFjdGVyUmVwb3NpdG9yeS5jaGFyYWN0ZXJEYXRhID0gW107XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IHJlY3Vyc2l2ZUZldGNoTmV3IH0gZnJvbSAnLi4vLi4vU2VydmljZXMvQ29tcG9zaXRpb24vQnVpbGRDb21wb3NpdGlvbic7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gJy4uLy4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmltcG9ydCB7IHB1Ymxpc2hNZXNzYWdlIH0gZnJvbSAnLi4vLi4vU2VydmljZXMvTXF0dC9wdWJsaXNoTWVzc2FnZSc7XG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyB3ZSBjYW4gYnVpbGQgYSBjb21wb3NpdGlvbiB1c2luZyB0aGlzIGNsYXNzXG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgICAgICB0aGlzLm1haW5Db25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNvbmNlcHRzID0gW107XG4gICAgICAgIHRoaXMuc3ViY29tcG9zaXRpb25zID0gW107XG4gICAgICAgIHRoaXMuY2FjaGVkID0ge307XG4gICAgfVxuICAgIHVwZGF0ZUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFpbkNvbmNlcHQuaWQgPT0gMClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNbaV0uaWQgPT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWluQ29uY2VwdCA9IHRoaXMuY29uY2VwdHNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmlzaXRlZENvbmNlcHRzID0gW107XG4gICAgICAgICAgICB0aGlzLmNhY2hlZCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTmV3KHRoaXMuaWQsIHRoaXMuY29ubmVjdGlvbnMsIHRoaXMuY29uY2VwdHMsIHRoaXMuc3ViY29tcG9zaXRpb25zLCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgVXBkYXRlQWNyb3NzRGlzdHJpYnV0ZWRTeXN0ZW0oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoTWVzc2FnZSgnY29tcG9zaXRpb25VcGRhdGUnLCAoX2EgPSB0aGlzLmlkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igd2hpbGUgcHVibGlzaGluZyBtZXNzYWdlJywgZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzVXBkYXRpbmcoKSB7XG4gICAgICAgIHRoaXMuVXBkYXRlQWNyb3NzRGlzdHJpYnV0ZWRTeXN0ZW0oKTtcbiAgICB9XG4gICAgR2V0RGF0YUNhY2hlKCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIGNvbnN0IG1haW5TdHJpbmcgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLm1haW5Db25jZXB0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAnJztcbiAgICAgICAgcmV0dXJuT3V0cHV0W21haW5TdHJpbmddID0gdGhpcy5jYWNoZWQ7XG4gICAgICAgIGNvbnN0IEZpbmFsUmV0dXJuID0ge307XG4gICAgICAgIEZpbmFsUmV0dXJuWydkYXRhJ10gPSByZXR1cm5PdXRwdXQ7XG4gICAgICAgIEZpbmFsUmV0dXJuWydpZCddID0gdGhpcy5pZDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29tcG9zaXRpb25Ob2RlIH0gZnJvbSAnLi9Db21wb3NpdGlvbk5vZGUnO1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uQmluYXJ5VHJlZSB7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LmFkZE5vZGUobm9kZSwgdGhpcy5yb290LCB0aGlzLnJvb3QuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29tcG9zaXRpb25Ub1RyZWUoY29tcG9zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBDb21wb3NpdGlvbk5vZGUoY29tcG9zaXRpb24uaWQsIGNvbXBvc2l0aW9uLCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5yb290KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZU5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5yZW1vdmVOb2RlKHRoaXMucm9vdCwgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNvdW50TnVtYmVyT2ZOb2RlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb3VudE5vZGVCZWxvdyh0aGlzLnJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbi8vIHRoaXMgaXMgYSBiaW5hcnkgdHJlZSB0byBob2xkIGNvbXBvc2l0aW9ucyBpbiBpdFxuQ29tcG9zaXRpb25CaW5hcnlUcmVlLnJvb3QgPSBudWxsO1xuIiwiaW1wb3J0IHsgQ29tcG9zaXRpb25CaW5hcnlUcmVlIH0gZnJvbSAnLi9Db21wb3NpdGlvbkJpbmFyeVRyZWUnO1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLmV4cGlyeVRpbWUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTAgKiA2MCAqIDEwMDApO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDE7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGVmdE5vZGUgPSBsZWZ0Tm9kZTtcbiAgICAgICAgdGhpcy5yaWdodE5vZGUgPSByaWdodE5vZGU7XG4gICAgfVxuICAgIGlzVmFsaWQoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoRGF0ZS5ub3coKSk7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyeVRpbWUgPCBjdXJyZW50VGltZSkge1xuICAgICAgICAgICAgQ29tcG9zaXRpb25CaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZSh0aGlzLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNhdmVUb0NhY2hlKGRhdGEpIHtcbiAgICAgICAgdGhpcy52YWx1ZS5jYWNoZWQgPSBkYXRhO1xuICAgIH1cbiAgICBhZGROb2RlKHBhc3NlZE5vZGUsIG5vZGUsIGhlaWdodCkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgY29uc3QgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5IDwgcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiKXtcbiAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCk7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaGVpZ2h0ID1cbiAgICAgICAgICAgIDEgK1xuICAgICAgICAgICAgICAgIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICBjb25zdCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzVmFsaWQoKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJpZ2h0Um90YXRlKHkpIHtcbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBUMiA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IHk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPVxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeS5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPVxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgbGVmdFJvdGF0ZSh4KSB7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICBjb25zdCB5ID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFQyID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0geDtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXR1cm4geTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0QmFsYW5jZUZhY3RvcihOKSB7XG4gICAgICAgIGlmIChOID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhlaWdodChOLmxlZnROb2RlKSAtIHRoaXMuZ2V0SGVpZ2h0KE4ucmlnaHROb2RlKTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGUoaWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSAmJiBub2RlLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJlbW92ZU5vZGUocGFzc2VkTm9kZSwgaWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICBjb25zdCBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvdW50Tm9kZUJlbG93KHJvb3QpIHtcbiAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWN1cnNpdmUgY2FsbCB0byBsZWZ0IGNoaWxkIGFuZCByaWdodCBjaGlsZCBhbmRcbiAgICAgICAgLy8gYWRkIHRoZSByZXN1bHQgb2YgdGhlc2Ugd2l0aCAxICggMSBmb3IgY291bnRpbmcgdGhlIHJvb3QpXG4gICAgICAgIHJldHVybiAoMSArXG4gICAgICAgICAgICB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICtcbiAgICAgICAgICAgIHRoaXMuY291bnROb2RlQmVsb3cocm9vdC5yaWdodE5vZGUpKTtcbiAgICB9XG4gICAgaW5PcmRlclN1Y2Nlc3Nvcihyb290KSB7XG4gICAgICAgIHdoaWxlIChyb290LmxlZnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QgPSByb290LmxlZnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBDb25jZXB0IHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgdXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgY2hhcmFjdGVyVmFsdWUsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIGlzTmV3ID0gZmFsc2UsIGVudHJ5VGltZVN0YW1wLCB1cGRhdGVkVGltZVN0YW1wKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHRoaXMudHlwZUlkID0gdHlwZUlkO1xuICAgICAgICB0aGlzLnR5cGVVc2VySWQgPSB0eXBlVXNlcklkO1xuICAgICAgICB0aGlzLmdob3N0SWQgPSBpZDtcbiAgICAgICAgdGhpcy5jYXRlZ29yeUlkID0gY2F0ZWdvcnlJZDtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVVzZXJJZCA9IGNhdGVnb3J5VXNlcklkO1xuICAgICAgICB0aGlzLnJlZmVyZW50SWQgPSByZWZlcmVudElkO1xuICAgICAgICB0aGlzLnJlZmVyZW50ID0gcmVmZXJlbnRJZDtcbiAgICAgICAgdGhpcy5yZWZlcmVudFVzZXJJZCA9IHJlZmVyZW50VXNlcklkO1xuICAgICAgICB0aGlzLmNoYXJhY3RlclZhbHVlID0gYCR7Y2hhcmFjdGVyVmFsdWV9YDtcbiAgICAgICAgdGhpcy5zZWN1cml0eUlkID0gc2VjdXJpdHlJZDtcbiAgICAgICAgdGhpcy5zZWN1cml0eVVzZXJJZCA9IHNlY3VyaXR5VXNlcklkO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVXNlcklkID0gYWNjZXNzVXNlcklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JbmZvcm1hdGlvbklkID0gc2Vzc2lvbklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IHNlc3Npb25Vc2VySWQ7XG4gICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgIHRoaXMudHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldztcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IGVudHJ5VGltZVN0YW1wO1xuICAgICAgICB0aGlzLnVwZGF0ZWRUaW1lU3RhbXAgPSB1cGRhdGVkVGltZVN0YW1wO1xuICAgICAgICAvLyBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdCh0aGlzKTtcbiAgICB9XG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy50eXBlSWQpO1xuICAgIH1cbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgcmVtb3ZlRnJvbURhdGFiYXNlLCBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5pbXBvcnQgeyBCaW5hcnlUcmVlIH0gZnJvbSBcIi4vQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgQmluYXJ5Q2hhcmFjdGVyVHJlZSB9IGZyb20gXCIuL0JpbmFyeUNoYXJhY3RlclRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeVR5cGVUcmVlIH0gZnJvbSBcIi4vQmluYXJ5VHlwZVRyZWVcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgY2xhc3MgQ29uY2VwdHNEYXRhIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjb25jZXB0c0FycmF5XCI7XG4gICAgfVxuICAgIHN0YXRpYyBDaGVja0NvbnRhaW5zKGNvbmNlcHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c0FycmF5W2ldLmlkID09IGNvbmNlcHQuaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkTnBjKGlkKSB7XG4gICAgICAgIGlmICghdGhpcy5OUEMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5OUEMubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgICAgICB0aGlzLk5QQyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5OUEMucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEdldE5wYyhpZCkge1xuICAgICAgICBpZiAodGhpcy5OUEMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0VG9TdG9yYWdlKGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJjb25jZXB0XCIsIGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0KGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAvL3ZhciBjb250YWlucyA9IHRoaXMuQ2hlY2tDb250YWlucyhjb25jZXB0KTtcbiAgICAgICAgICAgIC8vIHRoaXMuY29uY2VwdERpY3Rpb25hcnlbY29uY2VwdC5pZF0gPSBjb25jZXB0O1xuICAgICAgICAgICAgLy8gICAgaWYoY29udGFpbnMpe1xuICAgICAgICAgICAgLy8gICB0aGlzLlJlbW92ZUNvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgICAgICAvLyAgfVxuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29uY2VwdFwiLCBjb25jZXB0KTtcbiAgICAgICAgICAgIEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIEJpbmFyeVR5cGVUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlDaGFyYWN0ZXJUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHRUb01lbW9yeShjb25jZXB0KSB7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgLy92YXIgY29udGFpbnMgPSB0aGlzLkNoZWNrQ29udGFpbnMoY29uY2VwdCk7XG4gICAgICAgICAgICAvLyB0aGlzLmNvbmNlcHREaWN0aW9uYXJ5W2NvbmNlcHQuaWRdID0gY29uY2VwdDtcbiAgICAgICAgICAgIC8vICAgIGlmKGNvbnRhaW5zKXtcbiAgICAgICAgICAgIC8vICAgdGhpcy5SZW1vdmVDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIEJpbmFyeVR5cGVUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgICAgICBCaW5hcnlDaGFyYWN0ZXJUcmVlLmFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEFkZENvbmNlcHRUZW1wb3JhcnkoY29uY2VwdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSB0aGlzLkNoZWNrQ29udGFpbnMoY29uY2VwdCk7XG4gICAgICAgIHRoaXMuY29uY2VwdERpY3Rpb25hcnlbY29uY2VwdC5pZF0gPSBjb25jZXB0O1xuICAgICAgICBpZiAoY29udGFpbnMpIHtcbiAgICAgICAgICAgIHRoaXMuUmVtb3ZlQ29uY2VwdChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmNlcHRzQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbmNlcHQoY29uY2VwdCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW1vdmVGcm9tRGF0YWJhc2UoXCJjb25jZXB0XCIsIGNvbmNlcHQuaWQpO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdChpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIG15Q29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHlpZWxkIEJpbmFyeVRyZWUuZ2V0Tm9kZUZyb21UcmVlKGlkKTtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZWRDb25jZXB0ID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRDb25jZXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIG15Q29uY2VwdCA9IHJldHVybmVkQ29uY2VwdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZihteUNvbmNlcHQuaWQgPT0gMCB8fCBteUNvbmNlcHQgPT0gbnVsbCl7XG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBpPTA7IGk8dGhpcy5jb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYodGhpcy5jb25jZXB0c0FycmF5W2ldLmlkID09IGlkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG15Q29uY2VwdCA9IHRoaXMuY29uY2VwdHNBcnJheVtpXTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IEJpbmFyeUNoYXJhY3RlclRyZWUuZ2V0Tm9kZUZyb21UcmVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJVcGRhdGVkKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IEJpbmFyeUNoYXJhY3RlclRyZWUuZ2V0Tm9kZUZyb21UcmVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGlmIChOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdCA9IE5vZGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlTG9jYWwoY2hhcmFjdGVyX3ZhbHVlLCB0eXBlSWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0ID0gQ3JlYXRlRGVmYXVsdENvbmNlcHQoKTtcbiAgICAgICAgICAgIC8vdmFyIE5vZGUgPSBhd2FpdCBCaW5hcnlDaGFyYWN0ZXJUcmVlLmdldENoYXJhY3RlckFuZFR5cGVGcm9tVHJlZShjaGFyYWN0ZXJfdmFsdWUsdHlwZUlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBCaW5hcnlUeXBlVHJlZS5nZXRUeXBlVmFyaWFudHNXaXRoQ2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyX3ZhbHVlLCB0eXBlSWQpO1xuICAgICAgICAgICAgLy8gaWYoTm9kZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uY2VwdCA9ICBOb2RlLnZhbHVlO1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZm91bmQgdGhlIG91dHB1dFwiKTtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhjb25jZXB0KTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5TG9jYWwoY2hhcmFjdGVyX3ZhbHVlLCBjYXRlZ29yeUlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHlpZWxkIEJpbmFyeUNoYXJhY3RlclRyZWUuZ2V0Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tVHJlZShjaGFyYWN0ZXJfdmFsdWUsIGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKSB7XG4gICAgICAgIHZhciBteUNvbmNlcHQ7XG4gICAgICAgIGxldCBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNBcnJheVtpXS50eXBlSWQgPT0gdHlwZUlkKSB7XG4gICAgICAgICAgICAgICAgQ29uY2VwdExpc3QucHVzaCh0aGlzLmNvbmNlcHRzQXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vICBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZShcImNvbmNlcHRcIixcInR5cGVJZFwiLHR5cGVJZCkudGhlbihjb25jZXB0TGlzdD0+e1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJ0aGkgc2lzIG15IGxpc3RcIik7XG4gICAgICAgIC8vICB9KTtcbiAgICAgICAgLy8gICB2YXIgZGJDb25jZXB0TGlzdCA9IGF3YWl0IGdldEZyb21EYXRhYmFzZVdpdGhUeXBlT2xkKFwiY29uY2VwdFwiLFwidHlwZUlkXCIsIHR5cGVJZCk7XG4gICAgICAgIC8vICAgY29uc29sZS5sb2coZGJDb25jZXB0TGlzdCk7XG4gICAgICAgIC8vICAgaWYoQXJyYXkuaXNBcnJheShkYkNvbmNlcHRMaXN0KSl7XG4gICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZGJDb25jZXB0TGlzdCk7XG4gICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZGJDb25jZXB0TGlzdC5sZW5ndGgpO1xuICAgICAgICAvLyAgZm9yKHZhciBpPTA7IGk8IGRiQ29uY2VwdExpc3QubGVuZ3RoOyBpKyspe1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJoZXJlIHRvIHB1c2ggZmlyc3RzXCIpO1xuICAgICAgICAvLyAgICAgdmFyIGNvbnRhaW5zOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIC8vICAgICBmb3IodmFyIGo9MDsgajwgQ29uY2VwdExpc3QubGVuZ3RoOyBqKyspe1xuICAgICAgICAvLyAgICAgICAgIGlmKGRiQ29uY2VwdExpc3RbaV0uaWQgPT0gQ29uY2VwdExpc3Rbal0uaWQpe1xuICAgICAgICAvLyAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJoZXJlIHRvIHB1c2hcIik7XG4gICAgICAgIC8vICAgICBpZighY29udGFpbnMpe1xuICAgICAgICAvLyAgICAgICAgIENvbmNlcHRMaXN0LnB1c2goZGJDb25jZXB0TGlzdFtpXSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0aGlzIGlzIHRoZSBjb25jZXB0IGxpc3RcIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKENvbmNlcHRMaXN0KTtcbiAgICAgICAgcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdHNCeVR5cGVJZEFuZFVzZXIodHlwZUlkLCB1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICAgICAgQ29uY2VwdExpc3QgPSB5aWVsZCBCaW5hcnlUeXBlVHJlZS5nZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpO1xuICAgICAgICAgICAgcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldEJpbmFyeUNoYXJhY3RlclRyZWUoKSB7XG4gICAgICAgIHJldHVybiBCaW5hcnlDaGFyYWN0ZXJUcmVlLmNoYXJhY3RlclJvb3Q7XG4gICAgfVxuICAgIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxufVxuQ29uY2VwdHNEYXRhLmNvbmNlcHRzQXJyYXkgPSBbXTtcbkNvbmNlcHRzRGF0YS5OUEMgPSBbXTtcbkNvbmNlcHRzRGF0YS5jb25jZXB0RGljdGlvbmFyeSA9IFtdO1xuIiwiaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihpZCA9IDAsIG9mVGhlQ29uY2VwdElkLCB0b1RoZUNvbmNlcHRJZCwgb2ZUaGVDb25jZXB0VXNlcklkLCB0b1RoZUNvbmNlcHRVc2VySWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBvcmRlcklkLCBvcmRlclVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpIHtcbiAgICAgICAgdGhpcy5pc1RlbXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnR5cGUgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMub2ZUaGVDb25jZXB0SWQgPSBvZlRoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy50b1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICB0aGlzLk9mVGhlQ29uY2VwdFVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICAgICAgdGhpcy5Ub1RoZUNvbmNlcHRVc2VySWQgPSB0b1RoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMudHlwZVVzZXJJZCA9IHR5cGVVc2VySWQ7XG4gICAgICAgIHRoaXMub3JkZXJJZCA9IG9yZGVySWQ7XG4gICAgICAgIHRoaXMub3JkZXJVc2VySWQgPSBvcmRlclVzZXJJZDtcbiAgICAgICAgdGhpcy5zZWN1cml0eUlkID0gc2VjdXJpdHlJZDtcbiAgICAgICAgdGhpcy5zZWN1cml0eVVzZXJJZCA9IHNlY3VyaXR5VXNlcklkO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVXNlcklkID0gYWNjZXNzVXNlcklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JbmZvcm1hdGlvbklkID0gc2Vzc2lvbkluZm9ybWF0aW9uSWQ7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkO1xuICAgICAgICB0aGlzLmVudHJ5VGltZVN0YW1wID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy50ZXJtaW5hdGlvbkRhdGVUaW1lID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5sb2NhbFN5bmNUaW1lID0gbmV3IERhdGUoKTtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25Ob2RlIH0gZnJvbSBcIi4vQ29ubmVjdGlvbk5vZGVcIjtcbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uQmluYXJ5VHJlZSB7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9ucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25yb290ID0gbm9kZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25yb290O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9ucm9vdCA9IHRoaXMuY29ubmVjdGlvbnJvb3QuYWRkTm9kZShub2RlLCB0aGlzLmNvbm5lY3Rpb25yb290LCB0aGlzLmNvbm5lY3Rpb25yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBDb25uZWN0aW9uTm9kZShjb25uZWN0aW9uLmlkLCBjb25uZWN0aW9uLCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25Mb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoQ29ubmVjdGlvbkJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIHJlbW92ZU5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25yb290ID0gdGhpcy5jb25uZWN0aW9ucm9vdC5yZW1vdmVOb2RlKHRoaXMuY29ubmVjdGlvbnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9ucm9vdCkge1xuICAgICAgICAgICAgICAgIHZhciBOb2RlID0gdGhpcy5jb25uZWN0aW9ucm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5jb25uZWN0aW9ucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucm9vdDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuQ29ubmVjdGlvbkJpbmFyeVRyZWUuY29ubmVjdGlvbnJvb3QgPSBudWxsO1xuIiwiZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25Ob2RlIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKSB7XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLnR5cGVJZCAhPSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLmlkID09IG5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChub2RlLnZhcmlhbnRzW2ldLnZhbHVlLmlkID09IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250YWlucykge1xuICAgICAgICAgICAgbm9kZS52YXJpYW50cy5wdXNoKHBhc3NlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhZGROb2RlKHBhc3NlZE5vZGUsIG5vZGUsIGhlaWdodCkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgaWYgKG5vZGUua2V5ID4gcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZE5vZGUocGFzc2VkTm9kZSwgTGVmdE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLmFkZE5vZGUocGFzc2VkTm9kZSwgUmlnaHROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIpe1xuICAgICAgICAvLyAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhZGRUeXBlTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGRlYnVnRmxhZyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKG5vZGUua2V5ID4gcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibGVmdCAgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgTGVmdE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJpZ2h0IGhlcmVcIiwgbm9kZSwgUmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlbHNlIGhlcmVcIiwgbm9kZSwgcGFzc2VkTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ3VycmVudE5vZGVUeXBlKHBhc3NlZE5vZGUsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaGVpZ2h0IGhlcmVcIiwgbm9kZS5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImJhbGFuY2luZ0ZhY3RvciBoZXJlXCIsIGJhbGFuY2luZ0ZhY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMSBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMiBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMyBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmU0IFwiLCByZXR1cm5lciwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ3aGF0IGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSA2XCIsIG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBsZXQgeCA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IHk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeS5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgbGVmdFJvdGF0ZSh4KSB7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICBsZXQgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSB4O1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3JldHVybiB5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBnZXRIZWlnaHQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBnZXRCYWxhbmNlRmFjdG9yKE4pIHtcbiAgICAgICAgaWYgKE4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVpZ2h0KE4ubGVmdE5vZGUpIC0gdGhpcy5nZXRIZWlnaHQoTi5yaWdodE5vZGUpO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZShpZCwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKGlkID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJlbW92ZU5vZGUocGFzc2VkTm9kZSwgaWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoID4gMCl7XG4gICAgICAgIC8vICAgICBpZihwYXNzZWROb2RlLnZhbHVlLmlkID09IGlkICl7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgIC8vICAgICBpZihuZXdOb2RlKXtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gbmV3Tm9kZS52YWx1ZTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmtleSA9IG5ld05vZGUua2V5O1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IHR5cGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUubGVmdE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy9jb25kaXRpb24gaWYgdGhlIG1haW4gbm9kZSBpcyBlcXVhbCB0byB0aGUgdmFsdWVcbiAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLmlkID09IGNvbmNlcHRJZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdOb2RlID0gcGFzc2VkTm9kZS52YXJpYW50c1swXTtcbiAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gbmV3Tm9kZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IG5ld05vZGUuY3VycmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMuc3BsaWNlKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIG1haW4gbm9kZSBpcyBub3QgZXF1YWwgdG8gdGhlIGNoZWNraW5nIHZhbHVlIFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VwdElkID09IHBhc3NlZE5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cyA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YXJpYW50cztcbiAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBpbW1lZGlhdGVTdWNjZXNzb3IuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25Ob2RlIH0gZnJvbSBcIi4vQ29ubmVjdGlvbk5vZGVcIjtcbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uVHlwZVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QgPSBub2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblR5cGVSb290ID0gdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QuYWRkVHlwZU5vZGUobm9kZSwgdGhpcy5jb25uZWN0aW9uVHlwZVJvb3QsIHRoaXMuY29ubmVjdGlvblR5cGVSb290LmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVHlwZVJvb3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25UeXBlTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KENvbm5lY3Rpb25UeXBlVHJlZS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uLnR5cGVJZCAhPSAwKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBDb25uZWN0aW9uTm9kZShjb25uZWN0aW9uLnR5cGVJZCwgY29ubmVjdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZVR5cGVDb25jZXB0KHR5cGVJZCwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblR5cGVSb290KSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCA9IHRoaXMuY29ubmVjdGlvblR5cGVSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5jb25uZWN0aW9uVHlwZVJvb3QsIHR5cGVJZCwgaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblR5cGVSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuY29ubmVjdGlvblR5cGVSb290LmdldEZyb21Ob2RlKGlkLCB0aGlzLmNvbm5lY3Rpb25UeXBlUm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uVHlwZVJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZSh0eXBlSWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0geWllbGQgdGhpcy53YWl0Rm9yRGF0YVRvTG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wdXNoKE5vZGUudmFyaWFudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTm9kZS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkNvbm5lY3Rpb25UeXBlVHJlZS5jb25uZWN0aW9uVHlwZVJvb3QgPSBudWxsO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyByZW1vdmVGcm9tRGF0YWJhc2UsIHN0b3JlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uQmluYXJ5VHJlZSB9IGZyb20gXCIuL0Nvbm5lY3Rpb25CaW5hcnlUcmVlL0Nvbm5lY3Rpb25CaW5hcnlUcmVlXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHlwZVRyZWUgfSBmcm9tIFwiLi9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uVHlwZVRyZWVcIjtcbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRGF0YSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQ29ubmVjdGlvbiBBcnJheVwiO1xuICAgIH1cbiAgICBzdGF0aWMgQ2hlY2tDb250YWlucyhjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbnM7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uVG9TdG9yYWdlKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgc3RhdGljIEFkZENvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICAvLyAgICB2YXIgY29udGFpbnMgPSB0aGlzLkNoZWNrQ29udGFpbnMoY29ubmVjdGlvbik7XG4gICAgICAgIC8vICAgICBpZihjb250YWlucyl7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgaWYoY29ubmVjdGlvbi5pZCAhPSAwIHx8IGNvbm5lY3Rpb24uaXNUZW1wKXtcbiAgICAgICAgLy8gICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJjb25uZWN0aW9uXCIsY29ubmVjdGlvbik7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICB0aGlzLmNvbm5lY3Rpb25BcnJheS5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAoIWNvbm5lY3Rpb24uaXNUZW1wKSB7XG4gICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgQ29ubmVjdGlvbkJpbmFyeVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5hZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25uZWN0aW9uVG9NZW1vcnkoY29ubmVjdGlvbikge1xuICAgICAgICBpZiAoIWNvbm5lY3Rpb24uaXNUZW1wKSB7XG4gICAgICAgICAgICBDb25uZWN0aW9uQmluYXJ5VHJlZS5hZGRDb25uZWN0aW9uVG9UcmVlKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgQ29ubmVjdGlvblR5cGVUcmVlLmFkZENvbm5lY3Rpb25Ub1RyZWUoY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEFkZFRvRGljdGlvbmFyeShjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkRpY3Rpb25hcnlbY29ubmVjdGlvbi5pZF0gPSBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBzdGF0aWMgUmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIC8vICAgIGZvcih2YXIgaT0wOyBpPHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gICAgIGlmKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgfVxuICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCAhPSAwKSB7XG4gICAgICAgICAgICByZW1vdmVGcm9tRGF0YWJhc2UoXCJjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICAgICAgQ29ubmVjdGlvbkJpbmFyeVRyZWUucmVtb3ZlTm9kZUZyb21UcmVlKGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICAgICAgQ29ubmVjdGlvblR5cGVUcmVlLnJlbW92ZVR5cGVDb25jZXB0KGNvbm5lY3Rpb24udHlwZUlkLCBjb25uZWN0aW9uLmlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29ubmVjdGlvblRyZWUoKSB7XG4gICAgICAgIHJldHVybiBDb25uZWN0aW9uQmluYXJ5VHJlZS5jb25uZWN0aW9ucm9vdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25UeXBlVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIENvbm5lY3Rpb25UeXBlVHJlZS5jb25uZWN0aW9uVHlwZVJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAvLyAgICB2YXIgIG15Q29uY2VwdDogQ29ubmVjdGlvbnxudWxsO1xuICAgICAgICAgICAgLy8gICAgbXlDb25jZXB0ID0gbnVsbDtcbiAgICAgICAgICAgIC8vICAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGlmKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGlkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG15Q29uY2VwdCA9IHRoaXMuY29ubmVjdGlvbkFycmF5W2ldO1xuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgICAgICAgICB2YXIgbXlDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHlpZWxkIENvbm5lY3Rpb25CaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ29uY2VwdCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICBteUNvbm5lY3Rpb24gPSByZXR1cm5lZENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYobXlDb25jZXB0LmlkID09IDAgfHwgbXlDb25jZXB0ID09IG51bGwpe1xuICAgICAgICAgICAgLy8gICAgIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5pZCA9PSBpZCl7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBteUNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gbXlDb25uZWN0aW9uO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHZhciBub2RlID0geWllbGQgQ29ubmVjdGlvblR5cGVUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ29ubmVjdGlvbiA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbXlDb25uZWN0aW9uID0gcmV0dXJuZWRDb25uZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKG15Q29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMucHVzaChub2RlLnZhcmlhbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmKG15Q29uY2VwdC5pZCA9PSAwIHx8IG15Q29uY2VwdCA9PSBudWxsKXtcbiAgICAgICAgICAgIC8vICAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmNvbmNlcHRzQXJyYXkubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgICAgICBpZih0aGlzLmNvbmNlcHRzQXJyYXlbaV0uaWQgPT0gaWQpe1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgbXlDb25jZXB0ID0gdGhpcy5jb25jZXB0c0FycmF5W2ldO1xuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25zO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG5Db25uZWN0aW9uRGF0YS5jb25uZWN0aW9uQXJyYXkgPSBbXTtcbkNvbm5lY3Rpb25EYXRhLmNvbm5lY3Rpb25EaWN0aW9uYXJ5ID0gW107XG4iLCJleHBvcnQgY2xhc3MgRmlsdGVyU2VhcmNoIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50eXBlID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ2ljb3BlcmF0b3IgPSBcIj1cIjtcbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb24gPSB0cnVlO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBJZGVudGlmaWVyRmxhZ3Mge1xufVxuSWRlbnRpZmllckZsYWdzLmlzVHlwZUxvYWRlZCA9IGZhbHNlO1xuSWRlbnRpZmllckZsYWdzLmlzQ2hhcmFjdGVyTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNEYXRhTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0xvY2FsQ2hhcmFjdGVyTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbFR5cGVMb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25Mb2FkZWQgPSBmYWxzZTtcbklkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25UeXBlTG9hZGVkID0gZmFsc2U7XG5JZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENvbm5lY3Rpb25Mb2FkZWQgPSBmYWxzZTtcbiIsImV4cG9ydCBjbGFzcyBMQ29uY2VwdCB7XG4gICAgY29uc3RydWN0b3IoaWQsIHVzZXJJZCwgdHlwZUlkLCBjYXRlZ29yeUlkLCBhY2Nlc3NJZCwgY2hhcmFjdGVyVmFsdWUsIHR5cGVDaGFyYWN0ZXIsIGlzTmV3ID0gZmFsc2UsIGVudHJ5VGltZVN0YW1wLCB1cGRhdGVkVGltZVN0YW1wLCByZWZlcmVudElkKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlJZCA9IGNhdGVnb3J5SWQ7XG4gICAgICAgIHRoaXMuY2hhcmFjdGVyVmFsdWUgPSBjaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgdGhpcy5hY2Nlc3NJZCA9IGFjY2Vzc0lkO1xuICAgICAgICB0aGlzLnR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgICAgIHRoaXMudHlwZUNoYXJhY3RlciA9IHR5cGVDaGFyYWN0ZXI7XG4gICAgICAgIHRoaXMuZW50cnlUaW1lU3RhbXAgPSBlbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy51cGRhdGVkVGltZVN0YW1wID0gdXBkYXRlZFRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy5yZWZlcmVudElkID0gcmVmZXJlbnRJZDtcbiAgICAgICAgLy8gQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQodGhpcyk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZUlkKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQgfSBmcm9tIFwiLi4vLi4vU2VydmljZXMvTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0XCI7XG5leHBvcnQgY2xhc3MgTENvbm5lY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKGlkID0gMCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQsIGFjY2Vzc0lkKSB7XG4gICAgICAgIHRoaXMuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHlwZSA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMub2ZUaGVDb25jZXB0SWQgPSBvZlRoZUNvbmNlcHRJZDtcbiAgICAgICAgdGhpcy50b1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5naG9zdElkID0gaWQ7XG4gICAgICAgIHRoaXMub3JkZXJJZCA9IG9yZGVySWQ7XG4gICAgICAgIHRoaXMudHlwZUNoYXJhY3RlciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWNjZXNzSWQgPSBhY2Nlc3NJZDtcbiAgICAgICAgdGhpcy5lbnRyeVRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudGVybWluYXRpb25EYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMubG9jYWxTeW5jVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIExOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKSB7XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhbHVlLnR5cGVJZCAhPSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUuaWQgPT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICBub2RlLnZhcmlhbnRzLnB1c2gocGFzc2VkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9ub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZE5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBMZWZ0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgIT0gXCJcIikge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiApe1xuICAgICAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsXCIpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBub2RlLmN1cnJlbnROb2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZS5rZXkgPiBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJsZWZ0ICBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRDaGFyYWN0ZXJOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIpe1xuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVsc2UgaGVyZVwiLCBub2RlLCBwYXNzZWROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUua2V5ID09IHBhc3NlZE5vZGUua2V5ICYmIG5vZGUua2V5ICE9IFwiXCIgJiYgbm9kZS52YWx1ZS5pZCAhPSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgbm9kZSwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBkZWJ1Z0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmKHBhc3NlZE5vZGUudmFsdWUuY2hhcmFjdGVyVmFsdWUgPT0gXCJEZWZhdWx0XCIpe1xuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdCBoZXJlXCIpO1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVxdWFsIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyaWdodCBoZXJlXCIsIG5vZGUsIFJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGRUeXBlTm9kZShwYXNzZWROb2RlLCBSaWdodE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gMCAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDdXJyZW50Tm9kZVR5cGUocGFzc2VkTm9kZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZWlnaHQgaGVyZVwiLCBub2RlLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFsYW5jaW5nRmFjdG9yID0gdGhpcy5nZXRCYWxhbmNlRmFjdG9yKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmFsYW5jaW5nRmFjdG9yIGhlcmVcIiwgYmFsYW5jaW5nRmFjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAxIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAyIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5yaWdodE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSAzIFwiLCByZXR1cm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZTQgXCIsIHJldHVybmVyLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIndoYXQgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDZcIiwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJpZ2h0Um90YXRlKHkpIHtcbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIGxldCB4ID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0geTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh5LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkpICsgMTtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgICBsZWZ0Um90YXRlKHgpIHtcbiAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgIGxldCB5ID0geC5yaWdodE5vZGU7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICAgICAgeS5sZWZ0Tm9kZSA9IHg7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHgubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICB5LmhlaWdodCA9IE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KHkubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodCh4LnJpZ2h0Tm9kZSkgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGdldEhlaWdodChub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGdldEJhbGFuY2VGYWN0b3IoTikge1xuICAgICAgICBpZiAoTiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIZWlnaHQoTi5sZWZ0Tm9kZSkgLSB0aGlzLmdldEhlaWdodChOLnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlKGlkLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlKSB7XG4gICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlICYmIHR5cGVJZCA9PSBub2RlLnZhbHVlLnR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFyaWFudHNbaV0udmFsdWUudHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnZhcmlhbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kVHlwZSh2YWx1ZSwgdHlwZUlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKXtcbiAgICAgICAgLy8gICAgIGlmKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gaWQgKXtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHZhciBuZXdOb2RlID0gcGFzc2VkTm9kZS52YXJpYW50c1swXTtcbiAgICAgICAgLy8gICAgIGlmKG5ld05vZGUpe1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAvLyAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IG5ld05vZGUuY3VycmVudE5vZGU7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cyA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YXJpYW50cztcbiAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBpbW1lZGlhdGVTdWNjZXNzb3IuY3VycmVudE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaW1tZWRpYXRlU3VjY2Vzc29yLmtleSk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUsIHR5cGVJZGVudGlmaWVyLCBjb25jZXB0SWQpIHtcbiAgICAgICAgaWYgKHBhc3NlZE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUubGVmdE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5sZWZ0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IHR5cGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS52YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL2NvbmRpdGlvbiBpZiB0aGUgbWFpbiBub2RlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUuaWQgPT0gY29uY2VwdElkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBuZXdOb2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IG5ld05vZGUua2V5O1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb25kaXRpb24gdGhhdCB0aGUgbWFpbiBub2RlIGlzIG5vdCBlcXVhbCB0byB0aGUgY2hlY2tpbmcgdmFsdWUgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXB0SWQgPT0gcGFzc2VkTm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YXJpYW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5LCBjb25jZXB0SWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLy4uL0lkZW50aWZpZXJGbGFnc1wiO1xuaW1wb3J0IHsgTE5vZGUgfSBmcm9tIFwiLi8uLi9Mb2NhbC9MTm9kZVwiO1xuZXhwb3J0IGNsYXNzIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZSB7XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENoYXJhY3RlckxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXCJkb25lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChMb2NhbEJpbmFyeUNoYXJhY3RlclRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5hZGRDaGFyYWN0ZXJOb2RlKG5vZGUsIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LCB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LmNoYXJhY3RlclZhbHVlLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0Tm9kZUZyb21UcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCkge1xuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdC5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2hhcmFjdGVyQW5kVHlwZUZyb21UcmVlKHZhbHVlLCB0eXBlSWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgdGhpcy5Mb2NhbENoYXJhY3RlclJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHJlbW92ZUNvbmNlcHRUeXBlKGNoYXJhY3RlciwgaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290KSB7XG4gICAgICAgICAgICB0aGlzLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IHRoaXMuTG9jYWxDaGFyYWN0ZXJSb290LnJlbW92ZU5vZGVXaXRoVmFyaWFudHModGhpcy5Mb2NhbENoYXJhY3RlclJvb3QsIGNoYXJhY3RlciwgaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlLkxvY2FsQ2hhcmFjdGVyUm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLi9JZGVudGlmaWVyRmxhZ3NcIjtcbmltcG9ydCB7IExOb2RlIH0gZnJvbSBcIi4vLi4vTG9jYWwvTE5vZGVcIjtcbmV4cG9ydCBjbGFzcyBMb2NhbEJpbmFyeVRyZWUge1xuICAgIHN0YXRpYyBhZGROb2RlVG9UcmVlKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdC5hZGROb2RlKG5vZGUsIHRoaXMucm9vdCwgdGhpcy5yb290LmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBMTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgdmFyIGNoYXJhY3Rlck5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgY29uY2VwdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbERhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlUcmVlLmNoZWNrRmxhZywgMTAwMCwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIHN0YXRpYyBnZXROb2RlRnJvbVRyZWUoaWQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoaWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUodmFsdWUsIHR5cGVJZCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMucm9vdC5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIHRoaXMucm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gTm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgIH1cbiAgICBzdGF0aWMgcmVtb3ZlTm9kZUZyb21UcmVlKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LnJlbW92ZU5vZGUodGhpcy5yb290LCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkxvY2FsQmluYXJ5VHJlZS5yb290ID0gbnVsbDtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4vLi4vSWRlbnRpZmllckZsYWdzXCI7XG5pbXBvcnQgeyBMTm9kZSB9IGZyb20gXCIuL0xOb2RlXCI7XG5leHBvcnQgY2xhc3MgTG9jYWxCaW5hcnlUeXBlVHJlZSB7XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuTG9jYWxUeXBlUm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbFR5cGVSb290ID0gbm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Mb2NhbFR5cGVSb290O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5Mb2NhbFR5cGVSb290ID0gdGhpcy5Mb2NhbFR5cGVSb290LmFkZFR5cGVOb2RlKG5vZGUsIHRoaXMuTG9jYWxUeXBlUm9vdCwgdGhpcy5Mb2NhbFR5cGVSb290LmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Mb2NhbFR5cGVSb290O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCkge1xuICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgTE5vZGUoY29uY2VwdC50eXBlSWQsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyByZW1vdmVDb25jZXB0VHlwZSh0eXBlSWQsIGlkKSB7XG4gICAgICAgIGlmICh0aGlzLkxvY2FsVHlwZVJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuTG9jYWxUeXBlUm9vdCA9IHRoaXMuTG9jYWxUeXBlUm9vdC5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHRoaXMuTG9jYWxUeXBlUm9vdCwgdHlwZUlkLCBpZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZShpZCkge1xuICAgICAgICBpZiAodGhpcy5Mb2NhbFR5cGVSb290KSB7XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHRoaXMuTG9jYWxUeXBlUm9vdC5nZXRGcm9tTm9kZShpZCwgdGhpcy5Mb2NhbFR5cGVSb290KTtcbiAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkxvY2FsVHlwZVJvb3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRUeXBlVmFyaWFudHNGcm9tVHJlZSh0eXBlSWQpIHtcbiAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTm9kZS52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdhaXRGb3JEYXRhVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRmxhZyhyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwibm90XCIpO1xuICAgICAgICAgICAgICAgIH0sIDI1MDAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrRmxhZyhyZXNvbHZlKSB7XG4gICAgICAgIGlmIChJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbFR5cGVMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoTG9jYWxCaW5hcnlUeXBlVHJlZS5jaGVja0ZsYWcsIDEwMDAsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBzdGF0aWMgZ2V0VHlwZVZhcmlhbnRzRnJvbVRyZWVXaXRoVXNlcklkKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdHMgPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNlcHRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tVHJlZSh0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTm9kZS52YWx1ZS51c2VySWQgPT0gdXNlcklkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZSA9PT0gbnVsbCB8fCBOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOb2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOb2RlLnZhcmlhbnRzW2ldLnZhbHVlLnVzZXJJZCA9PSB1c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlcHRzLnB1c2goTm9kZS52YXJpYW50c1tpXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdHM7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbkxvY2FsQmluYXJ5VHlwZVRyZWUuTG9jYWxUeXBlUm9vdCA9IG51bGw7XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IHN0b3JlVG9EYXRhYmFzZSB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IExvY2FsQmluYXJ5VHJlZSB9IGZyb20gXCIuL0xvY2FsQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlDaGFyYWN0ZXJUcmVlXCI7XG5pbXBvcnQgeyBMb2NhbEJpbmFyeVR5cGVUcmVlIH0gZnJvbSBcIi4vTG9jYWxCaW5hcnlUeXBlVHJlZVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZURlZmF1bHRMQ29uY2VwdFwiO1xuZXhwb3J0IGNsYXNzIExvY2FsQ29uY2VwdHNEYXRhIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjb25jZXB0c0FycmF5XCI7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRDb25jZXB0KGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgdGhpcy5sb2NhbGNvbmNlcHRzQXJyYXkucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdFRvTWVtb3J5KGNvbmNlcHQpIHtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICBMb2NhbEJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0KTtcbiAgICAgICAgICAgIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICAgICAgTG9jYWxCaW5hcnlUeXBlVHJlZS5hZGRDb25jZXB0VG9UcmVlKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25jZXB0KGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgbXlDb25jZXB0ID0gQ3JlYXRlRGVmYXVsdExDb25jZXB0KCk7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHlpZWxkIExvY2FsQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvbmNlcHQgPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlDb25jZXB0ID0gcmV0dXJuZWRDb25jZXB0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS5jaGFyYWN0ZXJWYWx1ZSA9PSBjaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSB0aGlzLmNvbmNlcHRzQXJyYXlbaV07XG4gICAgICAgICAgICAvLyAgICAgIH1cbiAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXROb2RlRnJvbVRyZWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVMb2NhbChjaGFyYWN0ZXJfdmFsdWUsIHR5cGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIC8vIGxldCBjb25jZXB0TGlzdDpDb25jZXB0W10gPSBhd2FpdCB0aGlzLkdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKTtcbiAgICAgICAgICAgIC8vIGZvcih2YXIgaT0wO2k8Y29uY2VwdExpc3QubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgLy8gICAgIGlmKGNoYXJhY3Rlcl92YWx1ZSA9PSBjb25jZXB0TGlzdFtpXS5jaGFyYWN0ZXJWYWx1ZSl7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0TGlzdFtpXTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB2YXIgTm9kZSA9IHlpZWxkIExvY2FsQmluYXJ5Q2hhcmFjdGVyVHJlZS5nZXRDaGFyYWN0ZXJBbmRUeXBlRnJvbVRyZWUoY2hhcmFjdGVyX3ZhbHVlLCB0eXBlSWQpO1xuICAgICAgICAgICAgaWYgKE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gTm9kZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWQodHlwZUlkKSB7XG4gICAgICAgIHZhciBteUNvbmNlcHQ7XG4gICAgICAgIGxldCBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubG9jYWxjb25jZXB0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0udHlwZUlkID09IHR5cGVJZCkge1xuICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5sb2NhbGNvbmNlcHRzQXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb25jZXB0TGlzdDtcbiAgICB9XG4gICAgc3RhdGljIEdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKHR5cGVJZCwgdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgbXlDb25jZXB0O1xuICAgICAgICAgICAgbGV0IENvbmNlcHRMaXN0ID0gW107XG4gICAgICAgICAgICAvLyBteUNvbmNlcHQgPSBudWxsO1xuICAgICAgICAgICAgLy8gIGZvcih2YXIgaT0wOyBpPHRoaXMuY29uY2VwdHNBcnJheS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAvLyAgICAgIGlmKHRoaXMuY29uY2VwdHNBcnJheVtpXS50eXBlSWQgPT0gdHlwZUlkICYmIHRoaXMuY29uY2VwdHNBcnJheVtpXS51c2VySWQgPT0gdXNlcklkKXtcbiAgICAgICAgICAgIC8vICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2godGhpcy5jb25jZXB0c0FycmF5W2ldKTtcbiAgICAgICAgICAgIC8vICAgICAgfVxuICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgIENvbmNlcHRMaXN0ID0geWllbGQgTG9jYWxCaW5hcnlUeXBlVHJlZS5nZXRUeXBlVmFyaWFudHNGcm9tVHJlZVdpdGhVc2VySWQodHlwZUlkLCB1c2VySWQpO1xuICAgICAgICAgICAgcmV0dXJuIENvbmNlcHRMaXN0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG5Mb2NhbENvbmNlcHRzRGF0YS5sb2NhbGNvbmNlcHRzQXJyYXkgPSBbXTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL05vSW5kZXhEYlwiO1xuaW1wb3J0IHsgSWRlbnRpZmllckZsYWdzIH0gZnJvbSBcIi4uL0lkZW50aWZpZXJGbGFnc1wiO1xuZXhwb3J0IGNsYXNzIExvY2FsQ29ubmVjdGlvbkRhdGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNvbm5lY3Rpb24gQXJyYXlcIjtcbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IHRoaXMuQ2hlY2tDb250YWlucyhjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLlJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWQgIT0gMCB8fCBjb25uZWN0aW9uLmlzVGVtcCkge1xuICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnB1c2goY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHN0YXRpYyBBZGRUb0RpY3Rpb25hcnkoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25EaWN0aW9uYXJ5W2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uQXJyYXlbaV0uaWQgPT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbkFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCAhPSAwKSB7XG4gICAgICAgICAgICAvLyAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBHZXRDb25uZWN0aW9uKGlkKSB7XG4gICAgICAgIHZhciBteUNvbmNlcHQ7XG4gICAgICAgIG15Q29uY2VwdCA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25BcnJheVtpXS5pZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIG15Q29uY2VwdCA9IHRoaXMuY29ubmVjdGlvbkFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteUNvbmNlcHQ7XG4gICAgfVxuICAgIHN0YXRpYyB3YWl0Rm9yRGF0YVRvTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZsYWcocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIm5vdFwiKTtcbiAgICAgICAgICAgICAgICB9LCAyNTAwMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBjaGVja0ZsYWcocmVzb2x2ZSkge1xuICAgICAgICBpZiAoSWRlbnRpZmllckZsYWdzLmlzTG9jYWxDb25uZWN0aW9uTG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShcImRvbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KExvY2FsQ29ubmVjdGlvbkRhdGEuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIEdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB5aWVsZCB0aGlzLndhaXRGb3JEYXRhVG9Mb2FkKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uQXJyYXlbaV0udHlwZUlkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdC5wdXNoKHRoaXMuY29ubmVjdGlvbkFycmF5W2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbkxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25MaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG59XG5Mb2NhbENvbm5lY3Rpb25EYXRhLmNvbm5lY3Rpb25BcnJheSA9IFtdO1xuTG9jYWxDb25uZWN0aW9uRGF0YS5jb25uZWN0aW9uRGljdGlvbmFyeSA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIGxlZnROb2RlLCByaWdodE5vZGUpIHtcbiAgICAgICAgdGhpcy52YXJpYW50cyA9IFtdO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDE7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGVmdE5vZGUgPSBsZWZ0Tm9kZTtcbiAgICAgICAgdGhpcy5yaWdodE5vZGUgPSByaWdodE5vZGU7XG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xuICAgIH1cbiAgICBhZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUudmFsdWUudHlwZUlkICE9IG5vZGUudmFsdWUudHlwZUlkKSB7XG4gICAgICAgICAgICBub2RlLmN1cnJlbnROb2RlID0gdGhpcy5hZGRDdXJyZW50Tm9kZShwYXNzZWROb2RlLCBub2RlLmN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkQ3VycmVudE5vZGVUeXBlKHBhc3NlZE5vZGUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS5pZCA9PSBwYXNzZWROb2RlLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgIG5vZGUudmFyaWFudHMucHVzaChwYXNzZWROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvL25vZGUuY3VycmVudE5vZGUgPSB0aGlzLmFkZEN1cnJlbnROb2RlKHBhc3NlZE5vZGUsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICB2YXIgUmlnaHROb2RlID0gbm9kZS5yaWdodE5vZGU7XG4gICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIExlZnROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5IDwgcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5hZGROb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiKXtcbiAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5oZWlnaHQgPSAxICsgTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQobm9kZS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KG5vZGUucmlnaHROb2RlKSk7XG4gICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPiAxKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yIDwgLTEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgYWRkQ2hhcmFjdGVyTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGRlYnVnRmxhZyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBpZihwYXNzZWROb2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlID09IFwiRGVmYXVsdFwiKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImRlZmF1bHQgaGVyZVwiKTtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z0ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcXVhbCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSBcIlwiICl7XG4gICAgICAgICAgICAvLyAgICAgaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWxcIik7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIG5vZGUuY3VycmVudE5vZGUgPSBwYXNzZWROb2RlO1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgdmFyIExlZnROb2RlID0gbm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtleSA+IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxlZnQgIGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgTGVmdE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJpZ2h0IGhlcmVcIiwgbm9kZSwgUmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLmFkZENoYXJhY3Rlck5vZGUocGFzc2VkTm9kZSwgUmlnaHROb2RlLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIil7XG4gICAgICAgICAgICAvLyAgICAgbm9kZS5jdXJyZW50Tm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZWxzZSBoZXJlXCIsIG5vZGUsIHBhc3NlZE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5rZXkgPT0gcGFzc2VkTm9kZS5rZXkgJiYgbm9kZS5rZXkgIT0gXCJcIiAmJiBub2RlLnZhbHVlLmlkICE9IHBhc3NlZE5vZGUudmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZS5jdXJyZW50Tm9kZSA9IHRoaXMuYWRkQ3VycmVudE5vZGUocGFzc2VkTm9kZSwgbm9kZS5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ3VycmVudE5vZGVUeXBlKHBhc3NlZE5vZGUsIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUuaGVpZ2h0ID0gMSArIE1hdGgubWF4KHRoaXMuZ2V0SGVpZ2h0KG5vZGUubGVmdE5vZGUpLCB0aGlzLmdldEhlaWdodChub2RlLnJpZ2h0Tm9kZSkpO1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaGVpZ2h0IGhlcmVcIiwgbm9kZS5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImJhbGFuY2luZ0ZhY3RvciBoZXJlXCIsIGJhbGFuY2luZ0ZhY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFsYW5jaW5nRmFjdG9yID4gMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMSBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmxlZnRSb3RhdGUobm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuZXIgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMiBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA8IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgMyBcIiwgcmV0dXJuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmlnaHRSb3RhdGUobm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmU0IFwiLCByZXR1cm5lciwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ3aGF0IGhlcmVcIiwgbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXR1cm5pbmcgaGVyZSA2XCIsIG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBhZGRUeXBlTm9kZShwYXNzZWROb2RlLCBub2RlLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGRlYnVnRmxhZyA9IGZhbHNlO1xuICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS50eXBlSWQgIT0gMCkge1xuICAgICAgICAgICAgLy8gaWYocGFzc2VkTm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSA9PSBcIkRlZmF1bHRcIil7XG4gICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJkZWZhdWx0IGhlcmVcIik7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXF1YWwgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgTGVmdE5vZGUgPSBub2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgdmFyIFJpZ2h0Tm9kZSA9IG5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKG5vZGUua2V5ID4gcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibGVmdCAgaGVyZVwiLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMuYWRkVHlwZU5vZGUocGFzc2VkTm9kZSwgTGVmdE5vZGUsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmtleSA8IHBhc3NlZE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJpZ2h0IGhlcmVcIiwgbm9kZSwgUmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLmFkZFR5cGVOb2RlKHBhc3NlZE5vZGUsIFJpZ2h0Tm9kZSwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlbHNlIGhlcmVcIiwgbm9kZSwgcGFzc2VkTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmtleSA9PSBwYXNzZWROb2RlLmtleSAmJiBub2RlLmtleSAhPSAwICYmIG5vZGUudmFsdWUuaWQgIT0gcGFzc2VkTm9kZS52YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZEN1cnJlbnROb2RlVHlwZShwYXNzZWROb2RlLCBub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlaWdodCBoZXJlXCIsIG5vZGUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYWxhbmNpbmdGYWN0b3IgPSB0aGlzLmdldEJhbGFuY2VGYWN0b3Iobm9kZSk7XG4gICAgICAgICAgICBpZiAoZGVidWdGbGFnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJiYWxhbmNpbmdGYWN0b3IgaGVyZVwiLCBiYWxhbmNpbmdGYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPCBub2RlLmxlZnROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDEgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA+IG5vZGUubGVmdE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlZnROb2RlID0gdGhpcy5sZWZ0Um90YXRlKG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybmVyID0gdGhpcy5yaWdodFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDIgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnJpZ2h0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBub2RlLnJpZ2h0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlIDMgXCIsIHJldHVybmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IG5vZGUucmlnaHROb2RlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLnJpZ2h0Um90YXRlKG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5lciA9IHRoaXMubGVmdFJvdGF0ZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJldHVybmluZyBoZXJlNCBcIiwgcmV0dXJuZXIsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRlYnVnRmxhZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2hhdCBoZXJlXCIsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmV0dXJuaW5nIGhlcmUgNlwiLCBub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmlnaHRSb3RhdGUoeSkge1xuICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgbGV0IHggPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5yaWdodE5vZGUgPSB5O1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHkucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSkgKyAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGxlZnRSb3RhdGUoeCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgbGV0IHkgPSB4LnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICAgICAgbGV0IFQyID0geS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgICAgICB5LmxlZnROb2RlID0geDtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IFQyO1xuICAgICAgICAgICAgICAgIHguaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeC5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHkuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5nZXRIZWlnaHQoeS5sZWZ0Tm9kZSksIHRoaXMuZ2V0SGVpZ2h0KHgucmlnaHROb2RlKSArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9yZXR1cm4geTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgZ2V0SGVpZ2h0KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZ2V0QmFsYW5jZUZhY3RvcihOKSB7XG4gICAgICAgIGlmIChOID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhlaWdodChOLmxlZnROb2RlKSAtIHRoaXMuZ2V0SGVpZ2h0KE4ucmlnaHROb2RlKTtcbiAgICB9XG4gICAgZ2V0RnJvbU5vZGUoaWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZShpZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcmFjdGVyRnJvbU5vZGUodmFsdWUsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXRDaGFyYWN0ZXJGcm9tTm9kZVVwZGF0ZWQodmFsdWUsIG5vZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG5vZGUua2V5IHx8ICgoX2EgPSBub2RlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZUlkKSA9PSA1MSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoYXJhY3RlckZyb21Ob2RlKHZhbHVlLCBub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFyYWN0ZXJGcm9tTm9kZSh2YWx1ZSwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZSkge1xuICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbm9kZS52YWx1ZS5jaGFyYWN0ZXJWYWx1ZSAmJiB0eXBlSWQgPT0gbm9kZS52YWx1ZS50eXBlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnZhcmlhbnRzW2ldLnZhbHVlLnR5cGVJZCA9PSB0eXBlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS52YXJpYW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZFR5cGUodmFsdWUsIHR5cGVJZCwgbm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldEZyb21Ob2RlV2l0aENoYXJhY3RlckFuZENhdGVnb3J5KHZhbHVlLCBjYXRlZ29yeUlkLCBub2RlKSB7XG4gICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBub2RlLnZhbHVlLmNoYXJhY3RlclZhbHVlICYmIGNhdGVnb3J5SWQgPT0gbm9kZS52YWx1ZS5jYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnZhcmlhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS52YXJpYW50c1tpXS52YWx1ZS5jYXRlZ29yeUlkID09IGNhdGVnb3J5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS52YXJpYW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRUeXBlKHZhbHVlLCB0eXBlSWQsIG5vZGUuY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgbm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tTm9kZVdpdGhDaGFyYWN0ZXJBbmRDYXRlZ29yeSh2YWx1ZSwgY2F0ZWdvcnlJZCwgbm9kZS5sZWZ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGVXaXRoQ2hhcmFjdGVyQW5kQ2F0ZWdvcnkodmFsdWUsIGNhdGVnb3J5SWQsIG5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZW1vdmVOb2RlKHBhc3NlZE5vZGUsIGlkKSB7XG4gICAgICAgIGlmIChwYXNzZWROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmtleSA+IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmxlZnROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUubGVmdE5vZGUsIGlkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgaWQpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZihwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApe1xuICAgICAgICAvLyAgICAgaWYocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBpZCApe1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdmFyIG5ld05vZGUgPSBwYXNzZWROb2RlLnZhcmlhbnRzWzBdO1xuICAgICAgICAvLyAgICAgaWYobmV3Tm9kZSl7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgIC8vICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBuZXdOb2RlLmtleTtcbiAgICAgICAgLy8gICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gbmV3Tm9kZS5jdXJyZW50Tm9kZTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5sZWZ0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUucmlnaHROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IHBhc3NlZE5vZGUubGVmdE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzc2luZyB0aGUgcmlnaHROb2RlIHRvIHRoZSBpbk9yZGVyU3VjY2Vzc29yIGdpdmVzIHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoZSBub2RlXG4gICAgICAgICAgICB2YXIgaW1tZWRpYXRlU3VjY2Vzc29yID0gdGhpcy5pbk9yZGVyU3VjY2Vzc29yKHBhc3NlZE5vZGUucmlnaHROb2RlKTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFsdWUgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFsdWU7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmtleSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhcmlhbnRzO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5jdXJyZW50Tm9kZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci5jdXJyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlKHBhc3NlZE5vZGUucmlnaHROb2RlLCBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZSwgdHlwZUlkZW50aWZpZXIsIGNvbmNlcHRJZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiB0eXBlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZVdpdGhWYXJpYW50cyhwYXNzZWROb2RlLmxlZnROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgdHlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUucmlnaHROb2RlID0gdGhpcy5yZW1vdmVOb2RlV2l0aFZhcmlhbnRzKHBhc3NlZE5vZGUucmlnaHROb2RlLCB0eXBlSWRlbnRpZmllciwgY29uY2VwdElkKTtcbiAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vY29uZGl0aW9uIGlmIHRoZSBtYWluIG5vZGUgaXMgZXF1YWwgdG8gdGhlIHZhbHVlXG4gICAgICAgICAgICBpZiAocGFzc2VkTm9kZS52YWx1ZS5pZCA9PSBjb25jZXB0SWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IHBhc3NlZE5vZGUudmFyaWFudHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IG5ld05vZGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gbmV3Tm9kZS5rZXk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZE5vZGUuY3VycmVudE5vZGUgPSBuZXdOb2RlLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBtYWluIG5vZGUgaXMgbm90IGVxdWFsIHRvIHRoZSBjaGVja2luZyB2YWx1ZSBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhc3NlZE5vZGUudmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRJZCA9PSBwYXNzZWROb2RlLnZhcmlhbnRzW2ldLnZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWROb2RlLnZhcmlhbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXNzZWROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWROb2RlLmxlZnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5yaWdodE5vZGU7XG4gICAgICAgICAgICBwYXNzZWROb2RlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUucmlnaHROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZW1wID0gcGFzc2VkTm9kZS5sZWZ0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzaW5nIHRoZSByaWdodE5vZGUgdG8gdGhlIGluT3JkZXJTdWNjZXNzb3IgZ2l2ZXMgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3Igb2YgdGhlIG5vZGVcbiAgICAgICAgICAgIHZhciBpbW1lZGlhdGVTdWNjZXNzb3IgPSB0aGlzLmluT3JkZXJTdWNjZXNzb3IocGFzc2VkTm9kZS5yaWdodE5vZGUpO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS52YWx1ZSA9IGltbWVkaWF0ZVN1Y2Nlc3Nvci52YWx1ZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUua2V5ID0gaW1tZWRpYXRlU3VjY2Vzc29yLmtleTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUudmFyaWFudHMgPSBpbW1lZGlhdGVTdWNjZXNzb3IudmFyaWFudHM7XG4gICAgICAgICAgICBwYXNzZWROb2RlLmN1cnJlbnROb2RlID0gaW1tZWRpYXRlU3VjY2Vzc29yLmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGVXaXRoVmFyaWFudHMocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXksIGNvbmNlcHRJZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3VudE5vZGVCZWxvdyhyb290KSB7XG4gICAgICAgIGlmIChyb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVjdXJzaXZlIGNhbGwgdG8gbGVmdCBjaGlsZCBhbmQgcmlnaHQgY2hpbGQgYW5kXG4gICAgICAgIC8vIGFkZCB0aGUgcmVzdWx0IG9mIHRoZXNlIHdpdGggMSAoIDEgZm9yIGNvdW50aW5nIHRoZSByb290KVxuICAgICAgICByZXR1cm4gMSArIHRoaXMuY291bnROb2RlQmVsb3cocm9vdC5sZWZ0Tm9kZSkgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QucmlnaHROb2RlKTtcbiAgICB9XG4gICAgaW5PcmRlclN1Y2Nlc3Nvcihyb290KSB7XG4gICAgICAgIHdoaWxlIChyb290LmxlZnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QgPSByb290LmxlZnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQYXRjaGVyU3RydWN0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy51c2VySWQgPSA5OTk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gOTk5O1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gNDtcbiAgICAgICAgdGhpcy5vZlRoZUNvbXBvc2l0aW9uSWQgPSAwO1xuICAgICAgICB0aGlzLnBhdGNoT2JqZWN0ID0ge307XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRSZXNlcnZlZENvbm5lY3Rpb25JZHMgfSBmcm9tIFwiLi4vQXBpL0dldFJlc2VydmVkQ29ubmVjdGlvbklkc1wiO1xuaW1wb3J0IHsgR2V0UmVzZXJ2ZWRJZHMgfSBmcm9tIFwiLi4vQXBpL0dldFJlc2VydmVkSWRzXCI7XG5leHBvcnQgY2xhc3MgUmVzZXJ2ZWRJZHMge1xuICAgIHN0YXRpYyBnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkcy5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkcyA9IHlpZWxkIEdldFJlc2VydmVkSWRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmlkc1swXTtcbiAgICAgICAgICAgIHRoaXMuaWRzLnNoaWZ0KCk7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkSWQoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlkcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWRzLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuUmVzZXJ2ZWRJZHMuaWRzID0gW107XG5leHBvcnQgY2xhc3MgUmVzZXJ2ZWRDb25uZWN0aW9uSWRzIHtcbiAgICBzdGF0aWMgZ2V0SWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uSWRzLmxlbmd0aCA8IDUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ubmVjdGlvbklkcyA9IHlpZWxkIEdldFJlc2VydmVkQ29ubmVjdGlvbklkcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5jb25uZWN0aW9uSWRzWzBdO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uSWRzLnNoaWZ0KCk7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkSWQoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb25JZHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25JZHMucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5SZXNlcnZlZENvbm5lY3Rpb25JZHMuY29ubmVjdGlvbklkcyA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIFJldHVybmVyIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgdXNlcklkLCByZWZlcmVudElkLCBpc05ldykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLnJlZmVyZW50SWQgPSByZWZlcmVudElkO1xuICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNlYXJjaFF1ZXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbiA9IDA7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiXCI7XG4gICAgICAgIHRoaXMubGlua2VyID0gXCJcIjtcbiAgICAgICAgdGhpcy5pbnBhZ2UgPSAxMDtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgdGhpcy5saXN0TGlua2VycyA9IFtdO1xuICAgICAgICB0aGlzLmZ1bGxMaW5rZXJzID0gW107XG4gICAgICAgIHRoaXMudGV4dFNlYXJjaCA9IFwiXCI7XG4gICAgICAgIHRoaXMubG9naWMgPSBcIm9yXCI7XG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvRmlsdGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsdGVyU2VhcmNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RvcnMgPSBbXTtcbiAgICB9XG59XG4iLCJleHBvcnQgY2xhc3MgU2VhcmNoU3RydWN0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50eXBlID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBcIlwiO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uID0gXCJcIjtcbiAgICAgICAgdGhpcy5pbnRlcm5hbENvbXBvc2l0aW9uID0gXCJcIjtcbiAgICAgICAgdGhpcy51c2VySWQgPSA5OTk7XG4gICAgICAgIHRoaXMuaW5wYWdlID0gMTA7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFRva2VuU3RvcmFnZSB7XG59XG5Ub2tlblN0b3JhZ2UuQmVhcmVyQWNjZXNzVG9rZW4gPSBcIlwiO1xuIiwiZXhwb3J0IGNsYXNzIFNlc3Npb25EYXRhIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pZCA9IFwiMFwiO1xuICAgICAgICB0aGlzLnJlbW90ZV9hZGRyZXNzID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZXJ2ZXJfcG9ydCA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VydmVyX2FkZHJlc3MgPSBcIlwiO1xuICAgICAgICB0aGlzLnNlcnZlcl9uYW1lID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZXJ2ZXJfc29mdHdhcmUgPSBcIlwiO1xuICAgICAgICB0aGlzLmh0dHBfdXNlcl9hZ2VudCA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VsZiA9IFwiXCI7XG4gICAgICAgIHRoaXMucG9ydCA9IFwiXCI7XG4gICAgICAgIHRoaXMudXNlcklkID0gXCJcIjtcbiAgICAgICAgdGhpcy5lbWFpbCA9IFwiXCI7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNldHRpbmdEYXRhIHtcbiAgICBjb25zdHJ1Y3Rvcihpc09ubGluZVN5bmMpIHtcbiAgICAgICAgdGhpcy5pZCA9IDE7XG4gICAgICAgIHRoaXMuaXNPbmxpbmVTeW5jID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNPbmxpbmVTeW5jID0gaXNPbmxpbmVTeW5jO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBTZXR0aW5ncyB7XG59XG5TZXR0aW5ncy5pc1VwZGF0ZWQgPSBmYWxzZTtcblNldHRpbmdzLmlzT25saW5lU3luYyA9IGZhbHNlO1xuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi8uLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IENyZWF0ZVRoZUNvbmNlcHRBcGkgfSBmcm9tIFwiLi4vQXBpL0NyZWF0ZS9DcmVhdGVUaGVDb25jZXB0QXBpXCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uQXBpIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaVwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4vQ29uY2VwdERhdGFcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4vQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBjbGFzcyBTeW5jRGF0YSB7XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnMoY29uY2VwdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9XG4gICAgc3RhdGljIFN5bmNEYXRhRGVsZXRlKGlkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlkID09IHRoaXMuY29uY2VwdHNTeW5jQXJyYXlbaV0uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNlcHRzU3luY0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS5vZlRoZUNvbmNlcHRJZCA9PSBpZCB8fCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0udG9UaGVDb25jZXB0SWQgPT0gaWQgfHwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLnR5cGVJZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIENoZWNrQ29udGFpbnNDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3luY0FycmF5W2ldLmlkID09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH1cbiAgICBzdGF0aWMgQWRkQ29uY2VwdChjb25jZXB0KSB7XG4gICAgICAgIHZhciBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICAvLyBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdFRlbXBvcmFyeShjb25jZXB0KTtcbiAgICAgICAgaWYgKCFjb250YWlucykge1xuICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5wdXNoKGNvbmNlcHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBSZW1vdmVDb25jZXB0KGNvbmNlcHQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c1N5bmNBcnJheVtpXS5pZCA9PSBjb25jZXB0LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIEFkZENvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkucHVzaChjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgc3RhdGljIFJlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS5pZCA9PSBjb25uZWN0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgU3luY0RhdGFPbmxpbmUoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBDb25jZXB0c0RhdGEuQWRkQ29uY2VwdCh0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuQWRkQ29ubmVjdGlvbih0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29uY2VwdHNTeW5jQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0c0FycmF5ID0gdGhpcy5jb25jZXB0c1N5bmNBcnJheS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2VwdHNTeW5jQXJyYXkgPSBbXTtcbiAgICAgICAgICAgICAgICBDcmVhdGVUaGVDb25jZXB0QXBpKGNvbmNlcHRzQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yKGxldCBpID0wIDsgaTx0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoIDsgaSsrKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJjcmVhdGUgdGhlIGNvbm5lY3Rpb24gaW4gYmFja2VuZFwiLCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXlbaV0ub2ZUaGVDb25jZXB0SWQgKyBcIj09PT1cIiArIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9uc0FycmF5ID0gdGhpcy5jb25uZWN0aW9uU3luY0FycmF5LnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3luY0FycmF5ID0gW107XG4gICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29ubmVjdGlvbkFwaShjb25uZWN0aW9uc0FycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImRvbmVcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBzeW5jRGF0YUxvY2FsRGIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25jZXB0c1N5bmNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmNlcHRzU3luY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlVG9EYXRhYmFzZShcImxvY2FsY29uY2VwdFwiLCB0aGlzLmNvbmNlcHRzU3luY0FycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jZXB0c1N5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN5bmNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3Rpb25TeW5jQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVUb0RhdGFiYXNlKFwibG9jYWxjb25uZWN0aW9uXCIsIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiZG9uZVwiO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5TeW5jRGF0YS5jb25jZXB0c1N5bmNBcnJheSA9IFtdO1xuU3luY0RhdGEuY29ubmVjdGlvblN5bmNBcnJheSA9IFtdO1xuIiwiZXhwb3J0IGNsYXNzIFRoZUNoYXJhY3RlciB7XG4gICAgY29uc3RydWN0b3IodXNlcklkLCBkYXRhLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCBlbnRyeVRpbWVzdGFtcCwgaXNOZXcpIHtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IGAke2RhdGF9YDtcbiAgICAgICAgdGhpcy5zZWN1cml0eUlkID0gc2VjdXJpdHlJZDtcbiAgICAgICAgdGhpcy5zZWN1cml0eVVzZXJJZCA9IHNlY3VyaXR5VXNlcklkO1xuICAgICAgICB0aGlzLmFjY2Vzc0lkID0gYWNjZXNzSWQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVXNlcklkID0gYWNjZXNzVXNlcklkO1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5zZXNzaW9uVXNlcklkID0gc2Vzc2lvblVzZXJJZDtcbiAgICAgICAgdGhpcy5pc05ldyA9IGlzTmV3O1xuICAgIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBUaGVUZXh0cyB7XG4gICAgY29uc3RydWN0b3IodXNlcklkLCBkYXRhLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCBlbnRyeVRpbWVzdGFtcCwgaXNOZXcpIHtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnNlY3VyaXR5SWQgPSBzZWN1cml0eUlkO1xuICAgICAgICB0aGlzLnNlY3VyaXR5VXNlcklkID0gc2VjdXJpdHlVc2VySWQ7XG4gICAgICAgIHRoaXMuYWNjZXNzSWQgPSBhY2Nlc3NJZDtcbiAgICAgICAgdGhpcy5hY2Nlc3NVc2VySWQgPSBhY2Nlc3NVc2VySWQ7XG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgICAgICB0aGlzLnNlc3Npb25Vc2VySWQgPSBzZXNzaW9uVXNlcklkO1xuICAgICAgICB0aGlzLmVudHJ5VGltZXN0YW1wID0gZW50cnlUaW1lc3RhbXA7XG4gICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldztcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFVzZXJOb2RlIH0gZnJvbSBcIi4vVXNlck5vZGVcIjtcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gXCIuLy4uL0lkZW50aWZpZXJGbGFnc1wiO1xuaW1wb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vTG9jYWwvTENvbm5lY3Rpb25cIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmV4cG9ydCBjbGFzcyBVc2VyQmluYXJ5VHJlZSB7XG4gICAgc3RhdGljIGNvbXBvc2l0ZUtleSh1c2VySWQsIHNlc3Npb25JZCkge1xuICAgICAgICBsZXQgdXNlckhleCA9ICgnMDAwMCcgKyB1c2VySWQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC00KTtcbiAgICAgICAgbGV0IHNlc3Npb25IZXggPSAoJzAwMDAnICsgc2Vzc2lvbklkLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtNCk7XG4gICAgICAgIHJldHVybiB1c2VySGV4ICsgc2Vzc2lvbkhleDtcbiAgICB9XG4gICAgc3RhdGljIGFkZE5vZGVUb1RyZWUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5yb290LmFkZE5vZGUobm9kZSwgdGhpcy5yb290LCB0aGlzLnJvb3QuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvckRhdGFUb0xvYWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGbGFnKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJub3RcIik7XG4gICAgICAgICAgICAgICAgfSwgMjUwMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2tGbGFnKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKElkZW50aWZpZXJGbGFncy5pc0RhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFwiZG9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoVXNlckJpbmFyeVRyZWUuY2hlY2tGbGFnLCAxMDAwLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGFkZENvbmNlcHRUb1RyZWUoY29uY2VwdCwgdXNlcklkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgbGV0IEZha2VDb25uZWN0aW9uID0gbmV3IExDb25uZWN0aW9uKDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBVc2VyTm9kZShrZXksIGNvbmNlcHQsIEZha2VDb25uZWN0aW9uLCBudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uLCB1c2VySWQsIHNlc3Npb25JZCA9IDk5OSkge1xuICAgICAgICBsZXQga2V5ID0gdGhpcy5jb21wb3NpdGVLZXkodXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICBsZXQgRmFrZUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgVXNlck5vZGUoa2V5LCBGYWtlQ29uY2VwdCwgY29ubmVjdGlvbiwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYWRkTm9kZVRvVHJlZShub2RlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE5vZGVGcm9tVHJlZSh1c2VySWQsIHNlc3Npb25JZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHlpZWxkIHRoaXMud2FpdEZvckRhdGFUb0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLmNvbXBvc2l0ZUtleSh1c2VySWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgdmFyIE5vZGUgPSB0aGlzLnJvb3QuZ2V0RnJvbU5vZGUoa2V5LCB0aGlzLnJvb3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgcmVtb3ZlTm9kZUZyb21UcmVlKHVzZXJJZCwgc2Vzc2lvbklkID0gOTk5KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuY29tcG9zaXRlS2V5KHVzZXJJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLnJvb3QucmVtb3ZlTm9kZSh0aGlzLnJvb3QsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgY291bnROdW1iZXJPZk5vZGVzKCkge1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvdW50Tm9kZUJlbG93KHRoaXMucm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuVXNlckJpbmFyeVRyZWUucm9vdCA9IG51bGw7XG4iLCJleHBvcnQgY2xhc3MgVXNlck5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUsIGNvbm5lY3Rpb25WYWx1ZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSkge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25WYWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIGlmICh2YWx1ZS5pZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb25WYWx1ZS5pZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblZhbHVlLnB1c2goY29ubmVjdGlvblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnROb2RlID0gbGVmdE5vZGU7XG4gICAgICAgIHRoaXMucmlnaHROb2RlID0gcmlnaHROb2RlO1xuICAgIH1cbiAgICBhZGROb2RlKHBhc3NlZE5vZGUsIG5vZGUsIGhlaWdodCkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBub2RlID0gcGFzc2VkTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBMZWZ0Tm9kZSA9IG5vZGUubGVmdE5vZGU7XG4gICAgICAgIHZhciBSaWdodE5vZGUgPSBub2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgaWYgKG5vZGUua2V5ID4gcGFzc2VkTm9kZS5rZXkpIHtcbiAgICAgICAgICAgIG5vZGUubGVmdE5vZGUgPSB0aGlzLmFkZE5vZGUocGFzc2VkTm9kZSwgTGVmdE5vZGUsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPCBwYXNzZWROb2RlLmtleSkge1xuICAgICAgICAgICAgbm9kZS5yaWdodE5vZGUgPSB0aGlzLmFkZE5vZGUocGFzc2VkTm9kZSwgUmlnaHROb2RlLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZS52YWx1ZS5wdXNoKC4uLnBhc3NlZE5vZGUudmFsdWUpO1xuICAgICAgICAgICAgbm9kZS5jb25uZWN0aW9uVmFsdWUucHVzaCguLi5wYXNzZWROb2RlLmNvbm5lY3Rpb25WYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmhlaWdodCA9IDEgKyBNYXRoLm1heCh0aGlzLmdldEhlaWdodChub2RlLmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQobm9kZS5yaWdodE5vZGUpKTtcbiAgICAgICAgbGV0IGJhbGFuY2luZ0ZhY3RvciA9IHRoaXMuZ2V0QmFsYW5jZUZhY3Rvcihub2RlKTtcbiAgICAgICAgaWYgKGJhbGFuY2luZ0ZhY3RvciA+IDEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5sZWZ0Tm9kZS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWZ0Tm9kZSA9IHRoaXMubGVmdFJvdGF0ZShub2RlLmxlZnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiYWxhbmNpbmdGYWN0b3IgPCAtMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUucmlnaHROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZE5vZGUua2V5ID4gbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZE5vZGUua2V5IDwgbm9kZS5yaWdodE5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmlnaHROb2RlID0gdGhpcy5yaWdodFJvdGF0ZShub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnRSb3RhdGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByaWdodFJvdGF0ZSh5KSB7XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgICBsZXQgeCA9IHkubGVmdE5vZGU7XG4gICAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgICAgIGxldCBUMiA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSBUMjtcbiAgICAgICAgICAgICAgICB4LnJpZ2h0Tm9kZSA9IHk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeS5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpKSArIDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgbGVmdFJvdGF0ZSh4KSB7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICBsZXQgeSA9IHgucmlnaHROb2RlO1xuICAgICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgVDIgPSB5LmxlZnROb2RlO1xuICAgICAgICAgICAgICAgIHkubGVmdE5vZGUgPSB4O1xuICAgICAgICAgICAgICAgIHgucmlnaHROb2RlID0gVDI7XG4gICAgICAgICAgICAgICAgeC5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh4LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgeS5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmdldEhlaWdodCh5LmxlZnROb2RlKSwgdGhpcy5nZXRIZWlnaHQoeC5yaWdodE5vZGUpICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3JldHVybiB5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBnZXRIZWlnaHQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBnZXRCYWxhbmNlRmFjdG9yKE4pIHtcbiAgICAgICAgaWYgKE4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVpZ2h0KE4ubGVmdE5vZGUpIC0gdGhpcy5nZXRIZWlnaHQoTi5yaWdodE5vZGUpO1xuICAgIH1cbiAgICBnZXRGcm9tTm9kZShpZCwgbm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKGlkID09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA8IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbU5vZGUoaWQsIG5vZGUubGVmdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPiBub2RlLmtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZyb21Ob2RlKGlkLCBub2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmVtb3ZlTm9kZShwYXNzZWROb2RlLCBpZCkge1xuICAgICAgICBpZiAocGFzc2VkTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkTm9kZS5rZXkgPiBpZCkge1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5sZWZ0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLmxlZnROb2RlLCBpZCk7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2VkTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXNzZWROb2RlLmtleSA8IGlkKSB7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnJpZ2h0Tm9kZSA9IHRoaXMucmVtb3ZlTm9kZShwYXNzZWROb2RlLnJpZ2h0Tm9kZSwgaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZE5vZGUubGVmdE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLnJpZ2h0Tm9kZTtcbiAgICAgICAgICAgIHBhc3NlZE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFzc2VkTm9kZS5yaWdodE5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBwYXNzZWROb2RlLmxlZnROb2RlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3NpbmcgdGhlIHJpZ2h0Tm9kZSB0byB0aGUgaW5PcmRlclN1Y2Nlc3NvciBnaXZlcyB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgdmFyIGltbWVkaWF0ZVN1Y2Nlc3NvciA9IHRoaXMuaW5PcmRlclN1Y2Nlc3NvcihwYXNzZWROb2RlLnJpZ2h0Tm9kZSk7XG4gICAgICAgICAgICBwYXNzZWROb2RlLnZhbHVlID0gaW1tZWRpYXRlU3VjY2Vzc29yLnZhbHVlO1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5rZXkgPSBpbW1lZGlhdGVTdWNjZXNzb3Iua2V5O1xuICAgICAgICAgICAgcGFzc2VkTm9kZS5yaWdodE5vZGUgPSB0aGlzLnJlbW92ZU5vZGUocGFzc2VkTm9kZS5yaWdodE5vZGUsIGltbWVkaWF0ZVN1Y2Nlc3Nvci5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NlZE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnROb2RlQmVsb3cocm9vdCkge1xuICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL3JlY3Vyc2l2ZSBjYWxsIHRvIGxlZnQgY2hpbGQgYW5kIHJpZ2h0IGNoaWxkIGFuZFxuICAgICAgICAvLyBhZGQgdGhlIHJlc3VsdCBvZiB0aGVzZSB3aXRoIDEgKCAxIGZvciBjb3VudGluZyB0aGUgcm9vdClcbiAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmNvdW50Tm9kZUJlbG93KHJvb3QubGVmdE5vZGUpICsgdGhpcy5jb3VudE5vZGVCZWxvdyhyb290LnJpZ2h0Tm9kZSk7XG4gICAgfVxuICAgIGluT3JkZXJTdWNjZXNzb3Iocm9vdCkge1xuICAgICAgICB3aGlsZSAocm9vdC5sZWZ0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb290ID0gcm9vdC5sZWZ0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFNldHRpbmdEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1NldHRpbmdEYXRhXCI7XG5pbXBvcnQgeyBJbmRleERiIH0gZnJvbSBcIi4vaW5kZXhlZGRiXCI7XG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBJbmRleERiLmRiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9EYXRhYmFzZShkYXRhYmFzZU5hbWUsIG9iamVjdCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldFN0YXRzRnJvbURhdGFiYXNlKCkge1xuICAgIHZhciBzZXR0aW5nc0RhdGEgPSBuZXcgU2V0dGluZ0RhdGEodHJ1ZSk7XG4gICAgcmV0dXJuIHNldHRpbmdzRGF0YTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBBaVVwZGF0ZUZsYWcob2JqZWN0KSB7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGUoZGF0YWJhc2VOYW1lLCB0eXBlLCBpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoZGF0YWJhc2VOYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tRGF0YWJhc2UoZGF0YWJhc2VOYW1lLCBpZCkge1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZyb21Mb2NhbERiKGRhdGFiYXNlTmFtZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgfSk7XG59XG4iLCJ2YXIgdmVyc2lvbiA9IDQ7XG5leHBvcnQgY2xhc3MgSW5kZXhEYiB7XG59XG4iLCJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4uL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZkNvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCA9IFtdLCBjb25jZXB0KSB7XG4gICAgbGV0IGZvdW5kQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29uY2VwdExpc3QuZmluZChjID0+IGMuaWQgPT09IGNvbmNlcHQuaWQpO1xuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29uY2VwdCA9IGNoZWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbmNlcHQ7XG59XG4vLyBleHBvcnQgZnVuY3Rpb24gQ2hlY2tJZlR5cGVDb25jZXB0RXhpc3RzSW5BcnJheShcbi8vICAgY29uY2VwdExpc3Q6IENvbmNlcHRbXSA9IFtdLFxuLy8gICBjb25jZXB0OiBDb25jZXB0LFxuLy8gKSB7XG4vLyAgIGxldCBuZXdDb25jZXB0VHlwZSA9IGNvbmNlcHQudHlwZT8uY2hhcmFjdGVyVmFsdWU7XG4vLyAgIGlmKCFuZXdDb25jZXB0VHlwZT8uc3RhcnRzV2l0aChcInRoZV9cIikpe1xuLy8gICAgIG5ld0NvbmNlcHRUeXBlID0gXCJ0aGVfXCIgKyBuZXdDb25jZXB0VHlwZTtcbi8vICAgfVxuLy8gICBsZXQgc3RhcnRzV2l0aCA9IGNvbmNlcHRMaXN0W2ldLnR5cGU/LmNoYXJhY3RlclZhbHVlO1xuLy8gICBpZighc3RhcnRzV2l0aD8uc3RhcnRzV2l0aChcInRoZV9cIikpe1xuLy8gICAgIHN0YXJ0c1dpdGggPSBcInRoZV9cIiArIHN0YXJ0c1dpdGg7XG4vLyAgIH1cbi8vICAgbGV0IGZvdW5kQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KClcbi8vICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4vLyAgICAgY29uc3QgY2hlY2sgPSBjb25jZXB0TGlzdC5maW5kKGMgPT4gYy50eXBlSWQgPT0gY29uY2VwdC50eXBlSWQpXG4vLyAgICAgaWYgKGNoZWNrKSB7XG4vLyAgICAgICBmb3VuZENvbmNlcHQgPSBjaGVja1xuLy8gICAgIH1cbi8vICAgfVxuLy8gICByZXR1cm4gZm91bmRDb25jZXB0XG4vLyB9XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZlR5cGVDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QgPSBbXSwgY29uY2VwdCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IGZvdW5kQ29uY2VwdHMgPSBbXTtcbiAgICBsZXQgbmV3Q29uY2VwdFR5cGUgPSAoX2EgPSBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZTtcbiAgICBpZiAoIShuZXdDb25jZXB0VHlwZSA9PT0gbnVsbCB8fCBuZXdDb25jZXB0VHlwZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmV3Q29uY2VwdFR5cGUuc3RhcnRzV2l0aChcInRoZV9cIikpKSB7XG4gICAgICAgIG5ld0NvbmNlcHRUeXBlID0gXCJ0aGVfXCIgKyBuZXdDb25jZXB0VHlwZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uY2VwdExpc3QpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydHNXaXRoID0gKF9iID0gY29uY2VwdExpc3RbaV0udHlwZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoYXJhY3RlclZhbHVlO1xuICAgICAgICAgICAgaWYgKCEoc3RhcnRzV2l0aCA9PT0gbnVsbCB8fCBzdGFydHNXaXRoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGFydHNXaXRoLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGggPSBcInRoZV9cIiArIHN0YXJ0c1dpdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlSWQgPT0gY29uY2VwdExpc3RbaV0udHlwZUlkIHx8IG5ld0NvbmNlcHRUeXBlID09IHN0YXJ0c1dpdGgpIHtcbiAgICAgICAgICAgICAgICBmb3VuZENvbmNlcHRzLnB1c2goY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbmNlcHRzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrSWZUeXBlTENvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCA9IFtdLCBjb25jZXB0KSB7XG4gICAgbGV0IGZvdW5kQ29uY2VwdHMgPSBbXTtcbiAgICBsZXQgbmV3Q29uY2VwdFR5cGUgPSBjb25jZXB0LnR5cGVDaGFyYWN0ZXI7XG4gICAgaWYgKCEobmV3Q29uY2VwdFR5cGUgPT09IG51bGwgfHwgbmV3Q29uY2VwdFR5cGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld0NvbmNlcHRUeXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpKSkge1xuICAgICAgICBuZXdDb25jZXB0VHlwZSA9IFwidGhlX1wiICsgbmV3Q29uY2VwdFR5cGU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRzV2l0aCA9IGNvbmNlcHRMaXN0W2ldLnR5cGVDaGFyYWN0ZXI7XG4gICAgICAgICAgICBpZiAoIShzdGFydHNXaXRoID09PSBudWxsIHx8IHN0YXJ0c1dpdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXJ0c1dpdGguc3RhcnRzV2l0aChcInRoZV9cIikpKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRzV2l0aCA9IFwidGhlX1wiICsgc3RhcnRzV2l0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25jZXB0LnR5cGVJZCA9PSBjb25jZXB0TGlzdFtpXS50eXBlSWQgfHwgbmV3Q29uY2VwdFR5cGUgPT0gc3RhcnRzV2l0aCkge1xuICAgICAgICAgICAgICAgIGZvdW5kQ29uY2VwdHMucHVzaChjb25jZXB0TGlzdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kQ29uY2VwdHM7XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZkNvbm5lY3Rpb25FeGlzdHNJbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbm5lY3Rpb24pIHtcbiAgICBsZXQgZm91bmRDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMuaWQgPT09IGNvbm5lY3Rpb24uaWQpO1xuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29ubmVjdGlvbiA9IGNoZWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb247XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tJZlRvVGhlQ29uY2VwdEV4aXN0c0luQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbmNlcHRJZCkge1xuICAgIGxldCBmb3VuZENvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy50b1RoZUNvbmNlcHRJZCA9PT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb24gPSBjaGVjaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b0NoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMub2ZUaGVDb25jZXB0SWQgPT09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmICh0b0NoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb24gPSB0b0NoZWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb247XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbmNlcHRJZCkge1xuICAgIGxldCBmb3VuZENvbm5lY3Rpb25zID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gY29ubmVjdGlvbkxpc3QuZmluZChjID0+IGMudG9UaGVDb25jZXB0SWQgPT0gY29uY2VwdElkKTtcbiAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb25zLnB1c2goY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy5vZlRoZUNvbmNlcHRJZCA9PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAodG9DaGVjaykge1xuICAgICAgICAgICAgZm91bmRDb25uZWN0aW9ucy5wdXNoKHRvQ2hlY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZENvbm5lY3Rpb25zO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkxDb25uZWN0aW9uQXJyYXkoY29ubmVjdGlvbkxpc3QgPSBbXSwgY29uY2VwdElkKSB7XG4gICAgbGV0IGZvdW5kQ29ubmVjdGlvbnMgPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBjb25uZWN0aW9uTGlzdC5maW5kKGMgPT4gYy50b1RoZUNvbmNlcHRJZCA9PSBjb25jZXB0SWQpO1xuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGZvdW5kQ29ubmVjdGlvbnMucHVzaChjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9DaGVjayA9IGNvbm5lY3Rpb25MaXN0LmZpbmQoYyA9PiBjLm9mVGhlQ29uY2VwdElkID09IGNvbmNlcHRJZCk7XG4gICAgICAgIGlmICh0b0NoZWNrKSB7XG4gICAgICAgICAgICBmb3VuZENvbm5lY3Rpb25zLnB1c2godG9DaGVjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kQ29ubmVjdGlvbnM7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gUmVtb3ZlQ29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0ID0gW10sIGNvbmNlcHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgY29uY2VwdExpc3Quc3BsaWNlKGNvbmNlcHRMaXN0LmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuIGkuaWQgPT09IGNvbmNlcHQuaWQ7XG4gICAgICAgIH0pLCAxKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUmVtb3ZlQ29ubmVjdGlvbkZyb21MaXN0KGNvbm5lY3Rpb25MaXN0ID0gW10sIGNvbm5lY3Rpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25uZWN0aW9uTGlzdCkpIHtcbiAgICAgICAgY29ubmVjdGlvbkxpc3Quc3BsaWNlKGNvbm5lY3Rpb25MaXN0LmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuIGkuaWQgPT09IGNvbm5lY3Rpb24uaWQ7XG4gICAgICAgIH0pLCAxKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUmVtb3ZlTENvbm5lY3Rpb25Gcm9tTGlzdChjb25uZWN0aW9uTGlzdCA9IFtdLCBjb25uZWN0aW9uKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0LnNwbGljZShjb25uZWN0aW9uTGlzdC5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBjb25uZWN0aW9uLmlkO1xuICAgICAgICB9KSwgMSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSW5zZXJ0VW5pcXVlTnVtYmVyKEFycmF5LCB0b0luc2VydCkge1xuICAgIGlmIChBcnJheS5pbmRleE9mKHRvSW5zZXJ0KSA9PT0gLTEpIHtcbiAgICAgICAgQXJyYXkucHVzaCh0b0luc2VydCk7XG4gICAgfVxuICAgIHJldHVybiBBcnJheTtcbn1cbiIsImltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25EYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb24obmV3Q29ubmVjdGlvbnMgPSBbXSwgb2xkQ29ubmVjdGlvbnMgPSBbXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkQ29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q29ubmVjdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAoIW5ld0Nvbm5lY3Rpb25zLmZpbmQob2JqID0+IG9iai5pZCA9PT0gb2xkQ29ubmVjdGlvbnNbaV0uaWQpKSB7XG4gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuUmVtb3ZlQ29ubmVjdGlvbihvbGRDb25uZWN0aW9uc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25XaXRoSWRzKG5ld0Nvbm5lY3Rpb25JZHMgPSBbXSwgb2xkQ29ubmVjdGlvbnMgPSBbXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkQ29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFuZXdDb25uZWN0aW9uSWRzLmluY2x1ZGVzKG9sZENvbm5lY3Rpb25zW2ldLmlkKSkge1xuICAgICAgICAgICAgQ29ubmVjdGlvbkRhdGEuUmVtb3ZlQ29ubmVjdGlvbihvbGRDb25uZWN0aW9uc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhJztcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSAnLi4vLi4vU2VydmljZXMvQ3JlYXRlRGVmYXVsdENvbmNlcHQnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBHZXRUaGVDb25jZXB0IH0gZnJvbSAnLi4vLi4vU2VydmljZXMvR2V0VGhlQ29uY2VwdCc7XG4vLyB0aGlzIGlzIGEgZGlmZmVyZW50IHR5cGUgb2YgcmVjdXJpc3ZlIGZldGNoIGJlY2F1c2UgaGVyZSBhbGwgdGhlIGNvbmNlcHRzIGFuZCBjb25uZWN0aW9ucyBhcmUgcGFzc2VkIGFzIGl0IGlzXG4vLyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHF1ZXJ5IHRoZSBjb25uZWN0aW9ucyBhbmQgY29uY2VwdHMgZnJvbSBvdXRzaWRlXG4vLyBpZiB0aGUgY29uY2VwdCBjb25uZWN0aW9uIGlzIG5vdCBmb3VuZCB0aGVuIGl0IHdpbGwgZ28gdG8gdGhlIGJhY2tlbmQgdG8gZmV0Y2ggaXRcbmV4cG9ydCBmdW5jdGlvbiByZWN1cnNpdmVGZXRjaE5ldyhpZCwgY29ubmVjdGlvbkxpc3QsIGNvbmNlcHRMaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgb3V0cHV0ID0ge307XG4gICAgICAgIGNvbnN0IGFycm91dHB1dCA9IFtdO1xuICAgICAgICBpZiAoaWQgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBjb25jZXB0IGZyb20gYSBsaXN0IG9mIGNvbmNlcHRzXG4gICAgICAgIGxldCBjb25jZXB0ID0gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCBpZCk7XG4gICAgICAgIC8vIGlmIHdlIGNhbm5vdCBmaW5kIHRoZSBjb25jZXB0IGZyb20gdGhlIGNvbmNlcHQgbGlzdCB0aGVuIGZpbmQgaXQgZnJvbSB0aGUgYmFja2VuZFxuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmNlcHRzIHRyaWVzIHRvIGZpbmQgaXQgZnJvbSB0aGUgYmluYXJ5IHRyZWUgZWxzZSBmcm9tIHRoZSBiYWNrZW5kIGlmIGNhbm5vdCBmaW5kIGl0IHRoZW5cbiAgICAgICAgICAgIC8vIGl0IHdpbGwgYmVjb21lIG51bGxcbiAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb25jZXB0IHR5cGUgaXMgbm9uIGV4aXN0ZW50IHRoZW4geW91IGhhdmUgdG8gZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgIGlmIChjb25jZXB0LnR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY29uY2VwdCB0eXBlIGlkIGZyb20gdGhlIGNvbmNlcHQgd2hpY2ggaXMgc3RvcmVkIGluIHR5cGVJZFxuICAgICAgICAgICAgICAgIGNvbnN0IHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdFR5cGUgPSBnZXRDb25jZXB0RnJvbUxpc3QoY29uY2VwdExpc3QsIHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgY29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodG9Db25jZXB0VHlwZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vbGV0IG1haW5TdHJpbmcgPSBjb25jZXB0Py50eXBlPy5jaGFyYWN0ZXJWYWx1ZSA/PyAnJ1xuICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodmlzaXRlZENvbmNlcHRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlzaXRlZENvbmNlcHRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbG9vcCBvdmVyIGFsbCB0aGUgY29ubmVjdGlvbnNcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiBoYXMgdGhlIGlkIHRoYXQgaGFzIGJlZW4gcGFzc2VkIGluIHRoZSByZWN1cnNpb25cbiAgICAgICAgICAgICAgICAvLyBvZnRoZWNvbmNlcHRJZCAtLS0tLT4gdG9UaGVDb25jZXB0SWRcbiAgICAgICAgICAgICAgICAvLyB0aGlzIG9ubHkgZ2l2ZXMgdGhlIHZhbGlkIGNvbmNlcHQgaWQgdGhhdCBhcmUgaW5zaWRlIG9mIHRoaXMgaWRcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0YWtlIG91dCB0aGUgdG9UaGVDb25jZXB0SWQgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgdG9UaGVDb25jZXB0SWQgdG8gYSByZWFsIENvbmNlcHQgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCB0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNvbmNlcHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09IG51bGwgfHwgdG9Db25jZXB0LmlkID09IDApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0SWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRvQ29uY2VwdCBpcyB2YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHR5cGUgaW4gY2FzZWUgdHlwZSBpcyBub3QgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0VHlwZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdFR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWdleCB0byBmaWx0ZXIgb3V0IHRoZSB0aGVfIGZyb20gdGhlIHR5cGUgY29uY2VwdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gJ3RoZV8nO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBjcmVhdGUgdGhlIGtleSBvZiB0aGUga2V5IHZhbHVlIHBhaXIgdGhhdCBpcyB0aGUgdHlwZSBvZiB0aGUgY29uY2VwdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxtYWluU3RyaW5nID0gKF9iID0gKF9hID0gdG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSB0aGVfIHdpdGggYW4gZW1wdHkgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgIHR5cGUgIGlzIGEgbnVtYmVyIHRoZW4gcHV0IGl0IGluc2lkZSBvZiBhbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIobG9jYWxLZXkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaE5ldyh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbmNlcHRMaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHR5cGUgaXMgYSBudW1iZXIgdGhlbiBwdXQgaXQgaW5zaWRlIGFuIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hOZXcodG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0TGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG4vLyBnZXRzIHRoZSBjb25jZXB0IGZyb20gdGhlIGxpc3Qgb2YgY29uY2VwdHMgdXNpbmcgdGhlIGNvbmNlcHRJZFxuZnVuY3Rpb24gZ2V0Q29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCBjb25jZXB0SWQpIHtcbiAgICBsZXQgY29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25jZXB0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29uY2VwdElkID09IGNvbmNlcHRMaXN0W2ldLmlkKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdExpc3RbaV07XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSAnLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGEnO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbic7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsayB9IGZyb20gJy4uLy4uL0FwaS9HZXRDb25uZWN0aW9uQnVsayc7XG5pbXBvcnQgeyBHZXRDb25jZXB0IH0gZnJvbSAnLi4vLi4vQXBpL0dldENvbmNlcHQnO1xuaW1wb3J0IHsgcmVjdXJzaXZlRmV0Y2hOZXcgfSBmcm9tICcuL0J1aWxkQ29tcG9zaXRpb24nO1xuaW1wb3J0IHsgcmVjdXJzaXZlRmV0Y2ggfSBmcm9tICcuLi9HZXRDb21wb3NpdGlvbic7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uJztcbmltcG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQmluYXJ5VHJlZSc7XG5pbXBvcnQgeyBCdWxrQ29uY2VwdEdldHRlckFwaSB9IGZyb20gJy4uLy4uL0FwaS9HZXRDb25jZXB0QnVsayc7XG4vLyBnZXQgdGhlIGNvbXBvc2l0aW9uIHdpdGggdGhlIHBhc3NlZCBpZFxuLy8gaGVyZSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgcGFzc2VkIHdoaWNoIHdpbGwgcGFzcyB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaWYgZ2l2ZW5cbi8vIGVsc2UgdGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGdldCB0aGUgaW50ZXJuYWwgY29ubmVjdGlvbnMgaXRzZWxmXG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoQ2FjaGUoaWQsIGNvbm5lY3Rpb25MaXN0UGFzc2VkID0gW10pIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0SWRMaXN0ID0gW107XG4gICAgICAgIGxldCByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgbGV0IG91dHB1dCA9IHt9O1xuICAgICAgICBjb25zdCB4ID0geWllbGQgQ29tcG9zaXRpb25CaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCAmJiBpZCAhPSBudWxsICYmIGlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHggPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gW107XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3RQYXNzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0gZ2V0TXlDb25uZWN0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3RQYXNzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHRJZExpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29uY2VwdElkTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdElkTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBTYXZlVG9Db21wb3NpdGlvbkNhY2hlKGNvbmNlcHQsIGNvbm5lY3Rpb25MaXN0LCBjb25jZXB0SWRMaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgbGV0IHZpc2l0ZWRDb25jZXB0cyA9IFtdO1xuICAgICAgICAgICAgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgICAgICBjb25zdCBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSB4LnZhbHVlLkdldERhdGFDYWNoZSgpO1xuICAgICAgICAgICAgcmV0dXJuT3V0cHV0ID0gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0dXJuT3V0cHV0O1xuICAgIH0pO1xufVxuLy8gdGhpcyBnZXRzIHRoZSBsaXN0IG9mIGNvbm5lY3Rpb25zIG9mIGEgY29tcG9zaXRpb24gZnJvbSBhIGxpc3Qgb2YgYnVsayBjb25uZWN0aW9uIHB1bGxcbmZ1bmN0aW9uIGdldE15Q29ubmVjdGlvbnMoaWQsIGNvbm5lY3Rpb25MaXN0KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFtpXS50eXBlSWQgPT0gaWQpIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbkxpc3RbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9ucztcbn1cbi8vIGdldCB0aGUgY29tcG9zaXRpb24gd2l0aCB0aGUgcGFzc2VkIGlkXG4vLyBoZXJlIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBpcyBwYXNzZWQgd2hpY2ggd2lsbCBwYXNzIHRoZSBpbnRlcm5hbCBjb25uZWN0aW9ucyBpZiBnaXZlblxuLy8gZWxzZSB0aGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZ2V0IHRoZSBpbnRlcm5hbCBjb25uZWN0aW9ucyBpdHNlbGZcbi8vIHRoaXMgZnVuY3Rpb24gaGFzIGEgIGZvcm1hdCBvZiBkYXRhIC0tIGlkXG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkV2l0aENhY2hlKGlkLCBjb25uZWN0aW9uTGlzdFBhc3NlZCA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbmNlcHRJZExpc3QgPSBbXTtcbiAgICAgICAgbGV0IG91dHB1dDtcbiAgICAgICAgY29uc3QgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIGNvbnN0IHggPSB5aWVsZCBDb21wb3NpdGlvbkJpbmFyeVRyZWUuZ2V0Tm9kZUZyb21UcmVlKGlkKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGxldCBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSBbXTtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFBhc3NlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSBnZXRNeUNvbm5lY3Rpb25zKGlkLCBjb25uZWN0aW9uTGlzdFBhc3NlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdElkTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb25jZXB0SWRMaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0SWRMaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFNhdmVUb0NvbXBvc2l0aW9uQ2FjaGUoY29uY2VwdCwgY29ubmVjdGlvbkxpc3QsIGNvbmNlcHRJZExpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICBjb25zdCBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XG4gICAgICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgICAgICBGaW5hbFJldHVybltcImNyZWF0ZWRfYXRcIl0gPSBjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgICAgICAgICAgRmluYWxSZXR1cm5bJ2RhdGEnXSA9IHJldHVybk91dHB1dDtcbiAgICAgICAgICAgIEZpbmFsUmV0dXJuWydpZCddID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSB4LnZhbHVlLkdldERhdGFDYWNoZSgpO1xuICAgICAgICAgICAgRmluYWxSZXR1cm4gPSBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBGaW5hbFJldHVybjtcbiAgICB9KTtcbn1cbi8vIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcGFzc2VkIHdpdGggYnVsayBjb21wb3NpdGlvbnMgYW5kIGJ1bGsgaW50ZXJuYWwgY29ubmVjdGlvbnMgb2YgdGhlbVxuLy8gc28gdGhhdCBpIGNhbiBjb252ZXIgdGhlbSB0byBhY3R1YWwgbGlzdCBvZiBjb21wb3NpdGlvbnNcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbldpdGhEYXRhSWRCdWxrKGlkcywgY29ubmVjdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25zID0gW107XG4gICAgICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsoY29ubmVjdGlvbnMpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IG5ld0Nvbm5lY3Rpb25zO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkV2l0aENhY2hlKGlkc1tpXSwgY29ubmVjdGlvbkxpc3QpO1xuICAgICAgICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKG91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0aW9ucztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFNhdmVUb0NvbXBvc2l0aW9uQ2FjaGUoY29uY2VwdCwgY29ubmVjdGlvbnMsIGNvbmNlcHRJZExpc3QsIG51bWJlcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbiA9IG5ldyBDb21wb3NpdGlvbigpO1xuICAgICAgICBjb25zdCBjb25jZXB0cyA9IHlpZWxkIEJ1bGtDb25jZXB0R2V0dGVyKGNvbmNlcHRJZExpc3QpO1xuICAgICAgICBjb21wb3NpdGlvbi5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zO1xuICAgICAgICBjb21wb3NpdGlvbi5jb25jZXB0cyA9IGNvbmNlcHRzO1xuICAgICAgICBjb21wb3NpdGlvbi5pZCA9IGNvbmNlcHQuaWQ7XG4gICAgICAgIGNvbXBvc2l0aW9uLnN1YmNvbXBvc2l0aW9ucyA9IG51bWJlcnM7XG4gICAgICAgIGNvbXBvc2l0aW9uLm1haW5Db25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgbGV0IHZpc2l0ZWRDb25jZXB0cyA9IFtdO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaE5ldyhjb25jZXB0LmlkLCBjb25uZWN0aW9ucywgY29uY2VwdHMsIG51bWJlcnMsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgIGNvbXBvc2l0aW9uLmNhY2hlZCA9IG91dHB1dDtcbiAgICAgICAgQ29tcG9zaXRpb25CaW5hcnlUcmVlLmFkZENvbXBvc2l0aW9uVG9UcmVlKGNvbXBvc2l0aW9uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIEJ1bGtDb25jZXB0R2V0dGVyKGNvbmNlcHRJZHMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgYnVsa0NvbmNlcHRGZXRjaCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IChjb25jZXB0SWRzID09PSBudWxsIHx8IGNvbmNlcHRJZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHRJZHMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0VXNlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoY29uY2VwdElkc1tpXSk7XG4gICAgICAgICAgICBpZiAoY29uY2VwdFVzZS5pZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgYnVsa0NvbmNlcHRGZXRjaC5wdXNoKGNvbmNlcHRJZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb25jZXB0VXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGJ1bGtDb25jZXB0RmV0Y2ggPT09IG51bGwgfHwgYnVsa0NvbmNlcHRGZXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnVsa0NvbmNlcHRGZXRjaC5sZW5ndGgpID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0TGlzdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbmNlcHRMaXN0ID0geWllbGQgQnVsa0NvbmNlcHRHZXR0ZXJBcGkoYnVsa0NvbmNlcHRGZXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHRMaXN0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gJy4uL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmltcG9ydCB7IENvbXBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb24nO1xuaW1wb3J0IE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQgZnJvbSAnLi4vTWFrZVRoZUluc3RhbmNlQ29uY2VwdCc7XG5pbXBvcnQgeyBjcmVhdGVUaGVDb25uZWN0aW9uIH0gZnJvbSAnLi4vLi4vU2VydmljZXMvQ3JlYXRlVGhlQ29ubmVjdGlvbic7XG4vLyBjcmVhdGUgYSBjb21wb3NpdGlvbiB3aXRoIGNhY2hpbmcgbWVjaGFuaXNtXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUoanNvbiwgb2ZUaGVDb25jZXB0SWQgPSBudWxsLCBvZlRoZUNvbmNlcHRVc2VySWQgPSBudWxsLCBtYWluS2V5ID0gbnVsbCwgdXNlcklkID0gbnVsbCwgYWNjZXNzSWQgPSBudWxsLCBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IG51bGwsIGNvbXBvc2l0aW9uID0gbnVsbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsVXNlcklkID0gdXNlcklkICE9PSBudWxsICYmIHVzZXJJZCAhPT0gdm9pZCAwID8gdXNlcklkIDogOTk5O1xuICAgICAgICBjb25zdCBsb2NhbEFjY2Vzc0lkID0gYWNjZXNzSWQgIT09IG51bGwgJiYgYWNjZXNzSWQgIT09IHZvaWQgMCA/IGFjY2Vzc0lkIDogNDtcbiAgICAgICAgY29uc3QgbG9jYWxTZXNzaW9uSWQgPSBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gbnVsbCAmJiBzZXNzaW9uSW5mb3JtYXRpb25JZCAhPT0gdm9pZCAwID8gc2Vzc2lvbkluZm9ybWF0aW9uSWQgOiA5OTk7XG4gICAgICAgIGxldCBNYWluS2V5TG9jYWwgPSBtYWluS2V5ICE9PSBudWxsICYmIG1haW5LZXkgIT09IHZvaWQgMCA/IG1haW5LZXkgOiAwO1xuICAgICAgICBsZXQgTWFpbkNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBpZiAoY29tcG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaWYgbm8gY29tcG9zaXRpb24gaXMgcGFzc2VkIHRoZW4gY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW9uXG4gICAgICAgICAgICBjb21wb3NpdGlvbiA9IG5ldyBDb21wb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YganNvbltrZXldID09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoanNvbltrZXldKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KGtleSwgJycsIHRydWUsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBqc29uW2tleV0gIT0gJ3N0cmluZycgJiYgdHlwZW9mIGpzb25ba2V5XSAhPSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBjb25jZXB0SWQgYW5kIGNvbmNlcHRVc2VySWQgcGFzc2VkIHRoZW4gd2Uga25vdyB0aGlzIGlzIHRoZSBtYWluIGNvbmNlcHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyByZWxhdGVkIHRvIHRoaXMgY29uY2VwdC5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICBsb2NhbE1haW5LZXkgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICBNYWluS2V5TG9jYWwgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5jb25jZXB0cy5wdXNoKGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5pZCA9IGNvbmNlcHQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlKGpzb25ba2V5XSwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgdXNlcklkLCBhY2Nlc3NJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNvbmNlcHQgd2hpY2ggaGFzIHBhcmVudCBwYXNzZWQgb250byBpdCBhbmQgdGhpcyBpcyBhIHN1YmNvbXBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5jb25jZXB0cy5wdXNoKGNvbmNlcHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgY3JlYXRlVGhlQ29ubmVjdGlvbihvZlRoZSwgb2ZUaGVVc2VyLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCBsb2NhbFNlc3Npb25JZCwgY29uY2VwdC51c2VySWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUoanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoanNvbltrZXldICE9IG51bGwgJiYganNvbltrZXldICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbi5zdWJjb21wb3NpdGlvbnMucHVzaChjb25jZXB0LmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHRoZSBjb25jZXB0IGlzIG5vdyBhIGtleSB2YWx1ZSBwYWlyIGFuZCBoYXMgdGhlIGFjdHVhbCBkYXRhXG4gICAgICAgICAgICAgICAgY29uc3Qgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2ZUaGVVc2VyID0gb2ZUaGVDb25jZXB0VXNlcklkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0VXNlcklkIDogOTk5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIGpzb25ba2V5XSwgZmFsc2UsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb24uY29uY2VwdHMucHVzaChjb25jZXB0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgY3JlYXRlVGhlQ29ubmVjdGlvbihvZlRoZSwgb2ZUaGVVc2VyLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCBsb2NhbFNlc3Npb25JZCwgY29uY2VwdC51c2VySWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuIHRoZSBtYWluIGNvbmNlcHRcbiAgICAgICAgcmV0dXJuIE1haW5Db25jZXB0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZSB9IGZyb20gXCIuLi8uLi9BcGkvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWVcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0QXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9TZWFyY2hDb25jZXB0L0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5RGlyZWN0XCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEsIENyZWF0ZURlZmF1bHRDb25jZXB0LCBTcGxpdFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnkoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09IFwidGhlXCIpIHtcbiAgICAgICAgICAgIGNvbmNlcHQuaWQgPSAxO1xuICAgICAgICAgICAgY29uY2VwdC50eXBlSWQgPSA1O1xuICAgICAgICAgICAgY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSA9IFwidGhlXCI7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3BsaXR0ZWRTdHJpbmdBcnJheSA9IFNwbGl0U3RyaW5ncyhjaGFyYWN0ZXIpO1xuICAgICAgICBpZiAoc3BsaXR0ZWRTdHJpbmdBcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSAxO1xuICAgICAgICAgICAgbGV0IHByZWZpeCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0pO1xuICAgICAgICAgICAgaWYgKHByZWZpeC5pZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSBwcmVmaXguaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tTWVtb3J5KGNoYXJhY3RlciwgY2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0gPT0gY2hhcmFjdGVyKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKGNoYXJhY3RlclZhbHVlLCA1MSk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJWYWx1ZShjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlGcm9tTWVtb3J5KGNoYXJhY3RlciwgY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeUxvY2FsKGNoYXJhY3RlciwgY2F0ZWdvcnkpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kQ2F0ZWdvcnlEaXJlY3RBcGkoY2hhcmFjdGVyLCBjYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBMQ29ubmVjdGlvbiB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gXCIuLi9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpIHtcbiAgICBjb25zdCBMQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgIExDb25jZXB0LmlkID0gY29uY2VwdC5pZDtcbiAgICBMQ29uY2VwdC5naG9zdElkID0gY29uY2VwdC5naG9zdElkO1xuICAgIExDb25jZXB0LnVzZXJJZCA9IGNvbmNlcHQudXNlcklkO1xuICAgIExDb25jZXB0LmFjY2Vzc0lkID0gY29uY2VwdC5hY2Nlc3NJZDtcbiAgICBMQ29uY2VwdC5jYXRlZ29yeUlkID0gY29uY2VwdC5jYXRlZ29yeUlkO1xuICAgIExDb25jZXB0LmNoYXJhY3RlclZhbHVlID0gY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZTtcbiAgICBMQ29uY2VwdC5lbnRyeVRpbWVTdGFtcCA9IGNvbmNlcHQuZW50cnlUaW1lU3RhbXA7XG4gICAgTENvbmNlcHQudHlwZUlkID0gY29uY2VwdC50eXBlSWQ7XG4gICAgTENvbmNlcHQudHlwZSA9IGNvbmNlcHQudHlwZTtcbiAgICBMQ29uY2VwdC5pc1RlbXAgPSBmYWxzZTtcbiAgICByZXR1cm4gTENvbmNlcHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyb21MQ29uY2VwdFRvQ29uY2VwdChsY29uY2VwdCkge1xuICAgIGNvbnN0IGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgIGNvbmNlcHQuaWQgPSBsY29uY2VwdC5pZDtcbiAgICBjb25jZXB0Lmdob3N0SWQgPSBsY29uY2VwdC5naG9zdElkO1xuICAgIGNvbmNlcHQudXNlcklkID0gbGNvbmNlcHQudXNlcklkO1xuICAgIGNvbmNlcHQuYWNjZXNzSWQgPSBsY29uY2VwdC5hY2Nlc3NJZDtcbiAgICBjb25jZXB0LmVudHJ5VGltZVN0YW1wID0gbGNvbmNlcHQuZW50cnlUaW1lU3RhbXA7XG4gICAgY29uY2VwdC50eXBlSWQgPSBsY29uY2VwdC50eXBlSWQ7XG4gICAgY29uY2VwdC5jYXRlZ29yeUlkID0gbGNvbmNlcHQuY2F0ZWdvcnlJZDtcbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RnJvbUNvbm5lY3Rpb25Ub0xDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICBjb25zdCBMY29ubmVjdGlvbiA9IG5ldyBMQ29ubmVjdGlvbigwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICBMY29ubmVjdGlvbi5pZCA9IGNvbm5lY3Rpb24uaWQ7XG4gICAgTGNvbm5lY3Rpb24uZ2hvc3RJZCA9IGNvbm5lY3Rpb24uZ2hvc3RJZDtcbiAgICBMY29ubmVjdGlvbi5hY2Nlc3NJZCA9IGNvbm5lY3Rpb24uYWNjZXNzSWQ7XG4gICAgTGNvbm5lY3Rpb24ub2ZUaGVDb25jZXB0SWQgPSBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkO1xuICAgIExjb25uZWN0aW9uLnRvVGhlQ29uY2VwdElkID0gY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZDtcbiAgICBMY29ubmVjdGlvbi5lbnRyeVRpbWVTdGFtcCA9IGNvbm5lY3Rpb24uZW50cnlUaW1lU3RhbXA7XG4gICAgTGNvbm5lY3Rpb24udHlwZUlkID0gY29ubmVjdGlvbi50eXBlSWQ7XG4gICAgTGNvbm5lY3Rpb24uaXNUZW1wID0gZmFsc2U7XG4gICAgcmV0dXJuIExjb25uZWN0aW9uO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZCB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHRMaXN0ID0geWllbGQgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoXCJjb25jZXB0XCIpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgICAgIENvbmNlcHRzRGF0YS5BZGRDb25jZXB0VG9NZW1vcnkoY29uY2VwdCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG5vZGUgPSBuZXcgTm9kZShjb25jZXB0LmlkLCBjb25jZXB0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBCaW5hcnlUcmVlLmFkZE5vZGVUb1RyZWUobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIHRpbWUgPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb25cIjtcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhXCI7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0Q29uY2VwdCB9IGZyb20gXCIuL0NyZWF0ZURlZmF1bHRDb25jZXB0XCI7XG5pbXBvcnQgeyBDcmVhdGVUaGVDb25uZWN0aW9uR2VuZXJhbCB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsXCI7XG5pbXBvcnQgeyBEZWxldGVDb25uZWN0aW9uQnlJZCB9IGZyb20gXCIuL0RlbGV0ZUNvbm5lY3Rpb25cIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmltcG9ydCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IGZyb20gXCIuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzKG9mVGhlQ29uY2VwdCwgdG9UaGVDb25jZXB0LCBsaW5rZXIsIGJvdGggPSBmYWxzZSwgY291bnQgPSBmYWxzZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIHVzZXJJZCA9IG9mVGhlQ29uY2VwdC51c2VySWQ7XG4gICAgICAgIHZhciBvcmRlclVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSA5OTk7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gOTk5O1xuICAgICAgICBpZiAoYm90aCkge1xuICAgICAgICAgICAgbGV0IHByZWZpeDEgPSAoKF9hID0gdG9UaGVDb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCI7XG4gICAgICAgICAgICBsZXQgbGlua2VyQWRkMSA9IGxpbmtlciArIFwiX2J5XCI7XG4gICAgICAgICAgICBsZXQgYmFja3dhcmRMaW5rZXIgPSBwcmVmaXgxICsgXCJfXCIgKyBsaW5rZXJBZGQxO1xuICAgICAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICAgICAgeWllbGQgQ291bnRSZWxhdGlvbnNoaXAobGlua2VyQWRkMSwgdG9UaGVDb25jZXB0LCB1c2VySWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZSA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb25uZWN0aW9uXCIsIGJhY2t3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgICAgICBsZXQgbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIHRvVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LmlkLCB0b1RoZUNvbmNlcHQudXNlcklkLCBvZlRoZUNvbmNlcHQudXNlcklkLCB0b1RoZUNvbmNlcHQudXNlcklkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UuaWQsIGNvbm5lY3Rpb25Db25jZXB0UmV2ZXJzZS51c2VySWQsIDEwMDAsIHVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihuZXdDb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJlZml4ID0gKChfYiA9IG9mVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICBsZXQgbGlua2VyQWRkID0gbGlua2VyICsgXCJfc1wiO1xuICAgICAgICBsZXQgZm9yd2FyZExpbmtlciA9IHByZWZpeCArIFwiX1wiICsgbGlua2VyQWRkO1xuICAgICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgICAgIHlpZWxkIENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZCwgb2ZUaGVDb25jZXB0LCB1c2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25uZWN0aW9uQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb25uZWN0aW9uXCIsIGZvcndhcmRMaW5rZXIsIGZhbHNlLCA5OTksIDk5OSwgOTk5KTtcbiAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCBvZlRoZUNvbmNlcHQuaWQsIHRvVGhlQ29uY2VwdC5pZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgY29ubmVjdGlvbkNvbmNlcHQuaWQsIGNvbm5lY3Rpb25Db25jZXB0LnVzZXJJZCwgMTAwMCwgdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiBuZXdDb25uZWN0aW9uO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENvdW50UmVsYXRpb25zaGlwKGxpbmtlciwgY29uY2VwdCwgcGFzc2VkVXNlcklkID0gbnVsbCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdDEgPSBjb25jZXB0O1xuICAgICAgICB2YXIgdXNlcklkID0gcGFzc2VkVXNlcklkICE9PSBudWxsICYmIHBhc3NlZFVzZXJJZCAhPT0gdm9pZCAwID8gcGFzc2VkVXNlcklkIDogY29uY2VwdC51c2VySWQ7XG4gICAgICAgIHZhciBvcmRlclVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSA5OTk7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gOTk5O1xuICAgICAgICB2YXIgZm9yd2FyZExpbmtlckNvdW50ID0gbGlua2VyICsgXCJfY291bnRcIjtcbiAgICAgICAgdmFyIGZvcndhcmRMaW5rZXJDb3VudFN0cmluZyA9ICgoX2EgPSBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCIgKyBcIl9cIiArIGZvcndhcmRMaW5rZXJDb3VudDtcbiAgICAgICAgdmFyIGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyQ291bnRTdHJpbmcsIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQoZm9yd2FyZExpbmtlckNvdW50Q29uY2VwdC5pZCwgY29uY2VwdC5pZCwgdXNlcklkLCAxMCwgMSk7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zU3RyaW5nO1xuICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgdmFyIGNvdW50Q29uY2VwdExpc3QgPSBbXTtcbiAgICAgICAgdmFyIGNvdW50Q29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIGNvdW50Q29uY2VwdExpc3QucHVzaCh0b0NvbmNlcHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudENvbmNlcHRMaXN0Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIGNvdW50Q29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoXCJjb3VudFwiLCBcIjFcIiwgZmFsc2UsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBvbGRjb3VudENvbmNlcHQgPSBjb3VudENvbmNlcHRMaXN0WzBdO1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY291bnQgPSBOdW1iZXIob2xkY291bnRDb25jZXB0LmNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxO1xuICAgICAgICAgICAgY291bnRDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChcImNvdW50XCIsIGNvdW50LnRvU3RyaW5nKCksIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgRGVsZXRlQ29ubmVjdGlvbkJ5SWQoY29ubmVjdGlvbnNbaV0uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oMCwgY29uY2VwdDEuaWQsIGNvdW50Q29uY2VwdC5pZCwgY29uY2VwdDEudXNlcklkLCBjb3VudENvbmNlcHQudXNlcklkLCBjb25jZXB0MS51c2VySWQsIGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQuaWQsIGZvcndhcmRMaW5rZXJDb3VudENvbmNlcHQudXNlcklkLCAxMDAwLCB1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgeWllbGQgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihuZXdDb25uZWN0aW9uKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVDb25uZWN0aW9uQmV0d2VlblR3b0NvbmNlcHRzR2VuZXJhbChvZlRoZUNvbmNlcHQsIHRvVGhlQ29uY2VwdCwgbGlua2VyLCBib3RoID0gZmFsc2UsIGNvdW50ID0gZmFsc2UpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciB1c2VySWQgPSBvZlRoZUNvbmNlcHQudXNlcklkO1xuICAgICAgICB2YXIgb3JkZXJVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eUlkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCA9IDk5OTtcbiAgICAgICAgaWYgKGJvdGgpIHtcbiAgICAgICAgICAgIGxldCBwcmVmaXgxID0gKChfYSA9IHRvVGhlQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICsgXCJfc1wiO1xuICAgICAgICAgICAgbGV0IGxpbmtlckFkZDEgPSBsaW5rZXIgKyBcIl9ieVwiO1xuICAgICAgICAgICAgbGV0IGJhY2t3YXJkTGlua2VyID0gcHJlZml4MSArIFwiX1wiICsgbGlua2VyQWRkMTtcbiAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIENvdW50UmVsYXRpb25zaGlwKGxpbmtlckFkZDEsIHRvVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBiYWNrd2FyZExpbmtlciwgZmFsc2UsIDk5OSwgOTk5LCA5OTkpO1xuICAgICAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigwLCB0b1RoZUNvbmNlcHQuaWQsIG9mVGhlQ29uY2VwdC5pZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgb2ZUaGVDb25jZXB0LnVzZXJJZCwgdG9UaGVDb25jZXB0LnVzZXJJZCwgY29ubmVjdGlvbkNvbmNlcHRSZXZlcnNlLmlkLCBjb25uZWN0aW9uQ29uY2VwdFJldmVyc2UudXNlcklkLCAxMDAwLCB1c2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIFN5bmNEYXRhLkFkZENvbm5lY3Rpb24obmV3Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZpeCA9ICgoX2IgPSBvZlRoZUNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIjtcbiAgICAgICAgbGV0IGxpbmtlckFkZCA9IGxpbmtlciArIFwiX3NcIjtcbiAgICAgICAgbGV0IGZvcndhcmRMaW5rZXIgPSBwcmVmaXggKyBcIl9cIiArIGxpbmtlckFkZDtcbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgICB5aWVsZCBDb3VudFJlbGF0aW9uc2hpcChsaW5rZXJBZGQsIG9mVGhlQ29uY2VwdCwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29ubmVjdGlvbkNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KFwiY29ubmVjdGlvblwiLCBmb3J3YXJkTGlua2VyLCBmYWxzZSwgOTk5LCA5OTksIDk5OSk7XG4gICAgICAgIGxldCBuZXdDb25uZWN0aW9uID0geWllbGQgQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwob2ZUaGVDb25jZXB0LmlkLCBvZlRoZUNvbmNlcHQudXNlcklkLCB0b1RoZUNvbmNlcHQuaWQsIHRvVGhlQ29uY2VwdC51c2VySWQsIGNvbm5lY3Rpb25Db25jZXB0LmlkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIDEwMDAsIGFjY2Vzc0lkKTtcbiAgICAgICAgcmV0dXJuIG5ld0Nvbm5lY3Rpb247XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb25jZXB0IH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpIHtcbiAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBjb25jZXB0ID0gbmV3IENvbmNlcHQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgXCIwXCIsIDAsIDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBjcmVhdGVkX29uLCB1cGRhdGVkX29uKTtcbiAgICByZXR1cm4gY29uY2VwdDtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuaW1wb3J0IHsgY3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbm5lY3Rpb25cIjtcbmltcG9ydCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0IGZyb20gXCIuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbXBvc2l0aW9uKGpzb24sIG9mVGhlQ29uY2VwdElkID0gbnVsbCwgb2ZUaGVDb25jZXB0VXNlcklkID0gbnVsbCwgbWFpbktleSA9IG51bGwsIHVzZXJJZCA9IG51bGwsIGFjY2Vzc0lkID0gbnVsbCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQgPSBudWxsKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGxvY2FsVXNlcklkID0gdXNlcklkICE9PSBudWxsICYmIHVzZXJJZCAhPT0gdm9pZCAwID8gdXNlcklkIDogOTk5O1xuICAgICAgICB2YXIgbG9jYWxBY2Nlc3NJZCA9IGFjY2Vzc0lkICE9PSBudWxsICYmIGFjY2Vzc0lkICE9PSB2b2lkIDAgPyBhY2Nlc3NJZCA6IDQ7XG4gICAgICAgIHZhciBsb2NhbFNlc3Npb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSBudWxsICYmIHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSB2b2lkIDAgPyBzZXNzaW9uSW5mb3JtYXRpb25JZCA6IDk5OTtcbiAgICAgICAgdmFyIE1haW5LZXlMb2NhbCA9IG1haW5LZXkgIT09IG51bGwgJiYgbWFpbktleSAhPT0gdm9pZCAwID8gbWFpbktleSA6IDA7XG4gICAgICAgIHZhciBNYWluQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgICAgICAgIGlmICgodHlwZW9mIGpzb25ba2V5XSAhPSAnc3RyaW5nJyAmJiB0eXBlb2YganNvbltrZXldICE9ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIFwiXCIsIHRydWUsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgTWFpbkNvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgICAgICAgICBsb2NhbE1haW5LZXkgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICBNYWluS2V5TG9jYWwgPSBjb25jZXB0LmlkO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbihqc29uW2tleV0sIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBsb2NhbE1haW5LZXksIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZSA9IG9mVGhlQ29uY2VwdElkICE9PSBudWxsICYmIG9mVGhlQ29uY2VwdElkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9mVGhlVXNlciA9IG9mVGhlQ29uY2VwdFVzZXJJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRVc2VySWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdFVzZXJJZCA6IDk5OTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KGtleSwgXCJcIiwgdHJ1ZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBNYWluQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgQ3JlYXRlVGhlQ29tcG9zaXRpb24oanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiAxMDI2NztcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxNYWluS2V5ID0gTWFpbktleUxvY2FsO1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIGpzb25ba2V5XSwgZmFsc2UsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIHlpZWxkIGNyZWF0ZVRoZUNvbm5lY3Rpb24ob2ZUaGUsIG9mVGhlVXNlciwgY29uY2VwdC5pZCwgY29uY2VwdC51c2VySWQsIGxvY2FsTWFpbktleSwgbG9jYWxTZXNzaW9uSWQsIGNvbmNlcHQudXNlcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWFpbkNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZVRoZUNvbmNlcHRBcGkgfSBmcm9tIFwiLi4vQXBpL0NyZWF0ZS9DcmVhdGVUaGVDb25jZXB0QXBpXCI7XG5pbXBvcnQgeyBDb25jZXB0IH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHRcIjtcbmltcG9ydCB7IFJlc2VydmVkSWRzIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1Jlc2VydmVkSWRzXCI7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TeW5jRGF0YVwiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL2FwcFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaWQgPSB5aWVsZCBSZXNlcnZlZElkcy5nZXRJZCgpO1xuICAgICAgICB2YXIgaXNOZXcgPSB0cnVlO1xuICAgICAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBuZXcgQ29uY2VwdChpZCwgdXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgcmVmZXJlbnQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBpc05ldywgY3JlYXRlZF9vbiwgdXBkYXRlZF9vbik7XG4gICAgICAgIGNvbmNlcHQuaXNUZW1wID0gZmFsc2U7XG4gICAgICAgIFN5bmNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHRUZW1wb3JhcnkocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0geWllbGQgUmVzZXJ2ZWRJZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGlzTmV3ID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNyZWF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsZXQgdXBkYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBjb25jZXB0ID0gbmV3IENvbmNlcHQoaWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHJlZmVyZW50LCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgaXNOZXcsIGNyZWF0ZWRfb24sIHVwZGF0ZWRfb24pO1xuICAgICAgICBjb25jZXB0LmlzVGVtcCA9IHRydWU7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbmNlcHRJbW1lZGlhdGUocmVmZXJlbnQsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGlkID0geWllbGQgUmVzZXJ2ZWRJZHMuZ2V0SWQoKTtcbiAgICAgICAgdmFyIGlzTmV3ID0gZmFsc2U7XG4gICAgICAgIGxldCBjcmVhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IG5ldyBDb25jZXB0KGlkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCByZWZlcmVudCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uKTtcbiAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgIENyZWF0ZVRoZUNvbmNlcHRBcGkoW2NvbmNlcHRdKTtcbiAgICAgICAgLy9TeW5jRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsImltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgU3luY0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUaGVDb25uZWN0aW9uKG9mVGhlQ29uY2VwdElkLCBvZlRoZUNvbmNlcHRVc2VySWQsIHRvVGhlQ29uY2VwdElkLCB0b1RoZUNvbmNlcHRVc2VySWQsIHR5cGVJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHZhciBvcmRlcklkID0gMTtcbiAgICB2YXIgb3JkZXJVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIHR5cGVVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgdmFyIHVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICB2YXIgc2VjdXJpdHlJZCA9IDA7XG4gICAgdmFyIHNlY3VyaXR5VXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgIHZhciBhY2Nlc3NJZCA9IDQ7XG4gICAgdmFyIGFjY2Vzc1VzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKDAsIG9mVGhlQ29uY2VwdElkLCB0b1RoZUNvbmNlcHRJZCwgb2ZUaGVDb25jZXB0VXNlcklkLCB0b1RoZUNvbmNlcHRVc2VySWQsIHVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCBvcmRlcklkLCBvcmRlclVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSB0b1RoZUNvbmNlcHRJZCkge1xuICAgICAgICBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gMDtcbiAgICAgICAgY29ubmVjdGlvbi50b1RoZUNvbmNlcHRJZCA9IDE7XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBjb25uZWN0aW9uLmlzVGVtcCA9IHRydWU7XG4gICAgY29ubmVjdGlvbi5pZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgU3luY0RhdGEuQWRkQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBSZXNlcnZlZENvbm5lY3Rpb25JZHMgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvUmVzZXJ2ZWRJZHNcIjtcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwob2ZUaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdFVzZXJJZCwgdHlwZUlkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBvcmRlcklkID0gMSwgYWNjZXNzSWQgPSA0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIG9yZGVyVXNlcklkID0gb2ZUaGVDb25jZXB0VXNlcklkO1xuICAgICAgICB2YXIgdHlwZVVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICAgICAgdmFyIHVzZXJJZCA9IG9mVGhlQ29uY2VwdFVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSAwO1xuICAgICAgICB2YXIgc2VjdXJpdHlVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSBvZlRoZUNvbmNlcHRVc2VySWQ7XG4gICAgICAgIHZhciBpZCA9IHlpZWxkIFJlc2VydmVkQ29ubmVjdGlvbklkcy5nZXRJZCgpO1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKGlkLCBvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIG9mVGhlQ29uY2VwdFVzZXJJZCwgdG9UaGVDb25jZXB0VXNlcklkLCB1c2VySWQsIHR5cGVJZCwgdHlwZVVzZXJJZCwgb3JkZXJJZCwgb3JkZXJVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgaWYgKG9mVGhlQ29uY2VwdElkID09IHRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLm9mVGhlQ29uY2VwdElkID0gMDtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24udG9UaGVDb25jZXB0SWQgPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGdvIGFuZCB1cGRhdGUgdGhlIGV4aXN0aW5nIHdpdGggdGhlIHJlc2VydmVkIGlkXG4gICAgICAgIGNvbm5lY3Rpb24udG9VcGRhdGUgPSB0cnVlO1xuICAgICAgICBjb25uZWN0aW9uLmlzVGVtcCA9IGZhbHNlO1xuICAgICAgICBTeW5jRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IERlbGV0ZVRoZUNvbmNlcHQgZnJvbSBcIi4uL0FwaS9EZWxldGVUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBCaW5hcnlDaGFyYWN0ZXJUcmVlIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0JpbmFyeUNoYXJhY3RlclRyZWVcIjtcbmltcG9ydCB7IEJpbmFyeVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHJlZVwiO1xuaW1wb3J0IHsgQmluYXJ5VHlwZVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHlwZVRyZWVcIjtcbmltcG9ydCB7IHJlbW92ZUZyb21EYXRhYmFzZSB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmV4cG9ydCBmdW5jdGlvbiBEZWxldGVDb25jZXB0QnlJZChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHlpZWxkIEJpbmFyeVRyZWUucmVtb3ZlTm9kZUZyb21UcmVlKGlkKTtcbiAgICAgICAgdmFyIHR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICB2YXIgY2hhcmFjdGVyID0gY29uY2VwdC5jaGFyYWN0ZXJWYWx1ZTtcbiAgICAgICAgeWllbGQgQmluYXJ5VHlwZVRyZWUucmVtb3ZlVHlwZUNvbmNlcHQodHlwZUlkLCBpZCk7XG4gICAgICAgIHlpZWxkIEJpbmFyeUNoYXJhY3RlclRyZWUucmVtb3ZlTm9kZUJ5Q2hhcmFjdGVyKGNoYXJhY3RlciwgaWQpO1xuICAgICAgICByZW1vdmVGcm9tRGF0YWJhc2UoXCJjb25jZXB0XCIsIGlkKTtcbiAgICAgICAgRGVsZXRlVGhlQ29uY2VwdChpZCk7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBEZWxldGVUaGVDb25uZWN0aW9uIGZyb20gXCIuLi9BcGkvRGVsZXRlVGhlQ29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkJpbmFyeVRyZWUgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkJpbmFyeVRyZWUvQ29ubmVjdGlvbkJpbmFyeVRyZWVcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25UeXBlVHJlZSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25uZWN0aW9uQmluYXJ5VHJlZS9Db25uZWN0aW9uVHlwZVRyZWVcIjtcbmltcG9ydCB7IHJlbW92ZUZyb21EYXRhYmFzZSB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmltcG9ydCB7IEdldENvbm5lY3Rpb25CeUlkIH0gZnJvbSBcIi4vR2V0Q29ubmVjdGlvbnNcIjtcbmV4cG9ydCBmdW5jdGlvbiBEZWxldGVDb25uZWN0aW9uQnlJZChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uID0geWllbGQgR2V0Q29ubmVjdGlvbkJ5SWQoaWQpO1xuICAgICAgICBEZWxldGVUaGVDb25uZWN0aW9uKGlkKTtcbiAgICAgICAgcmVtb3ZlRnJvbURhdGFiYXNlKFwiY29ubmVjdGlvblwiLCBpZCk7XG4gICAgICAgIENvbm5lY3Rpb25CaW5hcnlUcmVlLnJlbW92ZU5vZGVGcm9tVHJlZShpZCk7XG4gICAgICAgIENvbm5lY3Rpb25UeXBlVHJlZS5yZW1vdmVUeXBlQ29uY2VwdChjb25uZWN0aW9uLnR5cGVJZCwgaWQpO1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnVsayB9IGZyb20gXCIuLi9BcGkvR2V0Q29uY2VwdEJ1bGtcIjtcbmV4cG9ydCBmdW5jdGlvbiBGaW5kQ29uY2VwdHNGcm9tQ29ubmVjdGlvbnMoY29ubmVjdGlvbkxpc3QgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBDb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBpZiAoY29ubmVjdGlvbkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghQ29uY2VwdExpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmNlcHRMaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUNvbmNlcHRMaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgICAgICBDb25jZXB0TGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCBHZXRDb25jZXB0QnVsayhDb25jZXB0TGlzdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeShjb21wb3NpdGlvbl9pZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBGaW5hbENvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9zaXRpb25faWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChjb21wb3NpdGlvbl9pZHNbaV0pO1xuICAgICAgICAgICAgRmluYWxDb25uZWN0aW9uTGlzdC5wdXNoKC4uLmNvbm5lY3Rpb25MaXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRmluYWxDb25uZWN0aW9uTGlzdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0Q29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25cIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbihpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSBjb25uZWN0aW9uTGlzdFN0cmluZztcbiAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiByZXR1cm5PdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoQWxsSWRzKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3RTdHJpbmcgPSB5aWVsZCBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24oaWQpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDAgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hXaXRoU3ViQ29tcG9zaXRpb25zKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiByZXR1cm5PdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5KGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKTtcbiAgICAgICAgLy9jb25uZWN0aW9uTGlzdCA9IENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHJldHVybiByZXR1cm5PdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIENvbm5lY3Rpb25EYXRhLkdldENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkxvY2FsKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDAgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCI7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IG91dHB1dDtcbiAgICAgICAgdmFyIEZpbmFsUmV0dXJuID0ge307XG4gICAgICAgIEZpbmFsUmV0dXJuWydjcmVhdGVkX2F0J10gPSBjb25jZXB0LmVudHJ5VGltZVN0YW1wO1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoSWRBbmREYXRlRnJvbU1lbW9yeShpZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIHZhciByZXR1cm5PdXRwdXQgPSB7fTtcbiAgICAgICAgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICBGaW5hbFJldHVyblsnY3JlYXRlZF9hdCddID0gY29uY2VwdC5lbnRyeVRpbWVTdGFtcDtcbiAgICAgICAgcmV0dXJuIEZpbmFsUmV0dXJuO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeUZyb21Db25uZWN0aW9ucyhpZCwgY29ubmVjdGlvbkxpc3QpIHtcbiAgICB2YXIgY29ubmVjdGlvbkxpc3Q7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIC8vY29ubmVjdGlvbkxpc3QgPSBhd2FpdCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25Mb2NhbChpZCk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25XaXRoSWQoaWQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICB2YXIgcmV0dXJuT3V0cHV0ID0ge307XG4gICAgICAgIHZhciBjb25uZWN0aW9uTGlzdFN0cmluZyA9IHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbihpZCk7XG4gICAgICAgIGNvbm5lY3Rpb25MaXN0ID0gY29ubmVjdGlvbkxpc3RTdHJpbmc7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25MaXN0LnB1c2goY29ubmVjdGlvbkxpc3RbaV0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0KTtcbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgIHZhciBGaW5hbFJldHVybiA9IHt9O1xuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2goaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyA9IFtdKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcbiAgICAgICAgdmFyIGFycm91dHB1dCA9IFtdO1xuICAgICAgICBpZiAoaWQgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IGNvbmNlcHQuaWQgPT0gMCkgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gY29uY2VwdC50eXBlSWQ7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiO1xuICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodmlzaXRlZENvbmNlcHRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlzaXRlZENvbmNlcHRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT0gbnVsbCB8fCB0b0NvbmNlcHQuaWQgPT0gMCkgJiYgdG9Db25jZXB0SWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gdG9Db25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZSA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KHRvQ29uY2VwdFR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdC50eXBlID0gdG9Db25jZXB0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gXCJ0aGVfXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhcIlRvIHRoZSBjb25jZXB0XCIsIGNvbm5lY3Rpb25MaXN0W2ldLmlkLGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkLCBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3RbaV0udHlwZUlkLCB0b0NvbmNlcHQuaWQsIHRvQ29uY2VwdC50eXBlSWQsIHRvQ29uY2VwdC5jaGFyYWN0ZXJWYWx1ZSwgdG9Db25jZXB0LnR5cGU/LmNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaCh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCwgdmlzaXRlZENvbmNlcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2godG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QsIHZpc2l0ZWRDb25jZXB0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJvdXRwdXRbbG9jYWxLZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gYXJyb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlRmV0Y2hXaXRoU3ViQ29tcG9zaXRpb25zKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgaWYgKGlkID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoKGNvbmNlcHQgPT0gbnVsbCB8fCBjb25jZXB0LmlkID09IDApICYmIGlkICE9IG51bGwgJiYgaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQoaWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmICh0b0NvbmNlcHRUeXBlID09IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IG51bGwgJiYgdG9Db25jZXB0VHlwZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0VHlwZSA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtYWluU3RyaW5nID0gKF9iID0gKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbiAgICAgICAgaWYgKCFjb21wb3NpdGlvbkxpc3QuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb25jZXB0cy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZpc2l0ZWRDb25jZXB0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFtcImlkXCJdID0gaWQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25MaXN0W2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRvQ29uY2VwdCA9PSBudWxsIHx8IHRvQ29uY2VwdC5pZCA9PSAwKSAmJiB0b0NvbmNlcHRJZCAhPSBudWxsICYmIHRvQ29uY2VwdElkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlSWQgPSB0b0NvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ29uY2VwdFR5cGUgPT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gbnVsbCAmJiB0b0NvbmNlcHRUeXBlSWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHRUeXBlID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db25jZXB0LnR5cGUgPSB0b0NvbmNlcHRUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBcInRoZV9cIjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsbWFpblN0cmluZyA9IChfZCA9IChfYyA9IHRvQ29uY2VwdCA9PT0gbnVsbCB8fCB0b0NvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRvQ29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEtleSA9IGxvY2FsbWFpblN0cmluZy5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKE51bWJlcihsb2NhbEtleSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtsb2NhbEtleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaFdpdGhTdWJDb21wb3NpdGlvbnModG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbkJ1bGtcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uL2FwcFwiO1xuaW1wb3J0IHsgQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25XaXRoSWRzIH0gZnJvbSBcIi4vQ2hlY2tGb3JDb25uZWN0aW9uRGVsZXRpb25cIjtcbmltcG9ydCB7IEZpbmRDb25uZWN0aW9uc09mQ29tcG9zaXRpb25zQnVsa0luTWVtb3J5IH0gZnJvbSBcIi4vRmluZENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtJbk1lbW9yeVwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5LCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkgfSBmcm9tIFwiLi9HZXRDb21wb3NpdGlvblwiO1xuZXhwb3J0IGZ1bmN0aW9uIEdldENvbXBvc2l0aW9uQnVsayhpZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsoaWRzKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbkZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25CdWxrV2l0aERhdGFJZChpZHMgPSBbXSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsoaWRzKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkKGlkcyA9IFtdLCBjb25uZWN0aW9ucyA9IFtdKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIG5ld0Nvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsoY29ubmVjdGlvbnMpO1xuICAgICAgICB2YXIgbXlOZXdDb25uZWN0aW9ucyA9IG5ld0Nvbm5lY3Rpb25zO1xuICAgICAgICB2YXIgb2xkQ29ubmVjdGlvbnMgPSB5aWVsZCBGaW5kQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uc0J1bGtJbk1lbW9yeShpZHMpO1xuICAgICAgICBDaGVja0ZvckNvbm5lY3Rpb25EZWxldGlvbldpdGhJZHMoY29ubmVjdGlvbnMsIG9sZENvbm5lY3Rpb25zKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEZyb21NZW1vcnkoaWRzW2ldKTtcbiAgICAgICAgICAgIGNvbXBvc2l0aW9ucy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QoaWRzID0gW10sIGNvbm5lY3Rpb25zID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVtYWluaW5nQ29ubmVjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSB5aWVsZCBDb25uZWN0aW9uRGF0YS5HZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25zW2ldKTtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmlkID09IDApIHtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdDb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb25zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBHZXRDb25uZWN0aW9uQnVsayhyZW1haW5pbmdDb25uZWN0aW9ucyk7XG4gICAgICAgIHZhciBjb21wb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJ0SElTIElTIFRIRSBTVEFSVFwiLCBpZHNbaV0pXG4gICAgICAgICAgICB2YXIgY29tcCA9IHlpZWxkIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeShpZHNbaV0pO1xuICAgICAgICAgICAgY29tcG9zaXRpb25zW2lkc1tpXV0gPSBjb21wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbnM7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldEFsbENvbmNlcHRzQnlUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25jZXB0c0J5VHlwZVwiO1xuaW1wb3J0IHsgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayB9IGZyb20gXCIuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsa1wiO1xuaW1wb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uL0RhdGFTdHJ1Y3R1cmVzL0NvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkZyb21NZW1vcnksIEdldENvbXBvc2l0aW9uV2l0aElkRnJvbU1lbW9yeSB9IGZyb20gXCIuL0dldENvbXBvc2l0aW9uXCI7XG5pbXBvcnQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyIGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlclwiO1xuLy8gZ2V0IHRoZSBsaXN0IG9mIGNvbXBvc2l0aW9ucyBmcm9tIHRoZSB0eXBlIFxuLy8gZm9yIGVnIGdldCBsaXN0IG9mIGJvb21ncHRcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3QoY29tcG9zaXRpb25OYW1lLCB1c2VySWQsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbmNlcHRzQnlUeXBlKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UGFnZSA9IGlucGFnZSAqIChwYWdlIC0gMSk7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2hDb21wb3NpdGlvbiA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25Gcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3RXaXRoSWQoY29tcG9zaXRpb25OYW1lLCB1c2VySWQsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbmNlcHRzQnlUeXBlKGNvbXBvc2l0aW9uTmFtZSwgdXNlcklkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0c0J5VHlwZUlkQW5kVXNlcihjb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0UGFnZSA9IGlucGFnZSAqIChwYWdlIC0gMSk7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2hDb21wb3NpdGlvbiA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0UGFnZTsgaSA8IHN0YXJ0UGFnZSArIGlucGFnZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRMaXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZWZldGNoQ29tcG9zaXRpb24ucHVzaChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayhwcmVmZXRjaENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFBhZ2U7IGkgPCBzdGFydFBhZ2UgKyBpbnBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25jZXB0TGlzdFtpXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25XaXRoSWRGcm9tTWVtb3J5KGNvbmNlcHRMaXN0W2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlXCI7XG5pbXBvcnQgeyBDb25jZXB0c0RhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdERhdGFcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgQ29uY2VwdHNEYXRhLkdldENvbmNlcHRCeUNoYXJhY3RlcihjaGFyYWN0ZXJWYWx1ZSk7XG4gICAgICAgIHZhciBsaXRlcmFsQ2hhcmFjdGVyID0gYCR7Y2hhcmFjdGVyVmFsdWV9YDtcbiAgICAgICAgaWYgKChjb25jZXB0ID09IG51bGwgfHwgKGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC5pZCkgPT0gMCkgJiYgbGl0ZXJhbENoYXJhY3Rlcikge1xuICAgICAgICAgICAgeWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyVmFsdWUoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICAgICAgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldENvbmNlcHRCeUNoYXJhY3RlclVwZGF0ZWQoY2hhcmFjdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXIoY2hhcmFjdGVyVmFsdWUpO1xuICAgICAgICB2YXIgbGl0ZXJhbENoYXJhY3RlciA9IGAke2NoYXJhY3RlclZhbHVlfWA7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IChjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuaWQpID09IDApICYmIGxpdGVyYWxDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlclZhbHVlKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbiB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb25uZWN0aW9uQnlJZChpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uID0geWllbGQgQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbihpZCk7XG4gICAgICAgIGlmICgoY29ubmVjdGlvbiA9PSBudWxsIHx8IGNvbm5lY3Rpb24uaWQgPT0gMCkgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgR2V0Q29ubmVjdGlvbihpZCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGFcIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgZ2V0QWxsRnJvbUxvY2FsRGIgfSBmcm9tIFwiLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5pbXBvcnQgeyBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZCB9IGZyb20gXCIuLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXREYXRhRnJvbUluZGV4RGIoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gdmFyIGNvbmNlcHRMaXN0ID0gYXdhaXQgZ2V0RnJvbURhdGFiYXNlV2l0aFR5cGVPbGQoXCJjb25jZXB0XCIpO1xuICAgICAgICBHZXRDb25uZWN0aW9uc0Zyb21JbmRleERiKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGNvbmNlcHRMaXN0KTtcbiAgICAgICAgLy8gaWYoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpe1xuICAgICAgICAvLyAgICAgZm9yKHZhciBpPTAgO2kgPCBjb25jZXB0TGlzdC5sZW5ndGggO2krKyl7XG4gICAgICAgIC8vICAgICAgICAgQ29uY2VwdHNEYXRhLkFkZENvbmNlcHQoY29uY2VwdExpc3RbaV0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0RGF0YUZyb21JbmRleERiTG9jYWwoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gdmFyIGNvbmNlcHRMaXN0ID0gYXdhaXQgZ2V0QWxsRnJvbUxvY2FsRGIoXCJsb2NhbGNvbmNlcHRcIik7XG4gICAgICAgIEdldENvbm5lY3Rpb25zRnJvbUluZGV4RGJMb2NhbCgpO1xuICAgICAgICAvLyBpZihBcnJheS5pc0FycmF5KGNvbmNlcHRMaXN0KSl7XG4gICAgICAgIC8vICAgICBmb3IodmFyIGk9MCA7aSA8IGNvbmNlcHRMaXN0Lmxlbmd0aCA7aSsrKXtcbiAgICAgICAgLy8gICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHRMaXN0W2ldKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gR2V0Q29ubmVjdGlvbnNGcm9tSW5kZXhEYigpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZChcImNvbm5lY3Rpb25cIik7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbm5lY3Rpb25MaXN0KSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIENvbm5lY3Rpb25EYXRhLkFkZENvbm5lY3Rpb25Ub01lbW9yeShjb25uZWN0aW9uTGlzdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIEdldENvbm5lY3Rpb25zRnJvbUluZGV4RGJMb2NhbCgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSB5aWVsZCBnZXRBbGxGcm9tTG9jYWxEYihcImxvY2FsY29ubmVjdGlvblwiKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29ubmVjdGlvbkxpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgTG9jYWxDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb25MaXN0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlIH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5IH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25cIjtcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gXCIuL0dldFRoZUNvbmNlcHRcIjtcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsgfSBmcm9tIFwiLi4vQXBpL0dldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGtcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRMaW5rKGlkLCBsaW5rZXIsIGlucGFnZSA9IDEwLCBwYWdlID0gMSkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciBsaW5rU3RyaW5nID0gKChfYSA9IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSArIFwiX3NcIiArIFwiX1wiICsgbGlua2VyO1xuICAgICAgICB2YXIgcmVsYXRlZENvbmNlcHRTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKGxpbmtTdHJpbmcsIDE2KTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsocHJlZmV0Y2gpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29tcG9zaXRpb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5KHRvQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gobmV3Q29tcG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0TGlua1JhdyhpZCwgbGlua2VyLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoaWQpO1xuICAgICAgICB2YXIgbGlua1N0cmluZyA9ICgoX2EgPSBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZSkgKyBcIl9zXCIgKyBcIl9cIiArIGxpbmtlcjtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZShsaW5rU3RyaW5nLCAxNik7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdCA9IHJlbGF0ZWRDb25jZXB0U3RyaW5nO1xuICAgICAgICBpZiAocmVsYXRlZENvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbnNTdHJpbmcgPSB5aWVsZCBHZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0KHJlbGF0ZWRDb25jZXB0LmlkLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgaW5wYWdlLCBwYWdlKTtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zU3RyaW5nO1xuICAgICAgICAgICAgdmFyIHByZWZldGNoID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJlZmV0Y2gucHVzaChjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdElkID0gY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRvQ29uY2VwdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNGcm9tVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0QWxsTGlua2VyQ29ubmVjdGlvbnNUb1RoZUNvbmNlcHQgfSBmcm9tIFwiLi4vQXBpL0dldEFsbExpbmtlckNvbm5lY3Rpb25zVG9UaGVDb25jZXB0XCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0cyhpZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9ucyA9IHlpZWxkIEdldEFsbExpbmtlckNvbm5lY3Rpb25zRnJvbVRoZUNvbmNlcHQoaWQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25uZWN0aW9uID0gY29ubmVjdGlvbnNbaV07XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbklkZW50aWZpZXIgPSBsb2NhbENvbm5lY3Rpb24udHlwZUlkO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGNvbm5lY3Rpb25JZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGxvY2FsQ29ubmVjdGlvbi50eXBlID0gY29uY2VwdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbnM7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0TGlua2VyQ29ubmVjdGlvblRvQ29uY2VwdHMoaWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbnMgPSB5aWVsZCBHZXRBbGxMaW5rZXJDb25uZWN0aW9uc1RvVGhlQ29uY2VwdChpZCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbm5lY3Rpb24gPSBjb25uZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uSWRlbnRpZmllciA9IGxvY2FsQ29ubmVjdGlvbi50eXBlSWQ7XG4gICAgICAgICAgICBsZXQgY29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbklkZW50aWZpZXIpO1xuICAgICAgICAgICAgbG9jYWxDb25uZWN0aW9uLnR5cGUgPSBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9ucztcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdCB9IGZyb20gXCIuLi9BcGkvR2V0Q29ubmVjdGlvbk9mVGhlQ29uY2VwdFwiO1xuaW1wb3J0IHsgR2V0Q29tcG9zaXRpb25XaXRoSWRBbmREYXRlRnJvbU1lbW9yeSB9IGZyb20gXCIuL0dldENvbXBvc2l0aW9uXCI7XG5pbXBvcnQgR2V0VGhlQ29uY2VwdCBmcm9tIFwiLi9HZXRUaGVDb25jZXB0XCI7XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSBcIi4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrXCI7XG5pbXBvcnQgeyBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRDYXRlZ29yeSB9IGZyb20gXCIuL0NvbmNlcHRGaW5kaW5nL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5XCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVsYXRpb24oaWQsIHJlbGF0aW9uLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHJlbGF0aW9uKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbkJ1bGsocHJlZmV0Y2gpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHRJZCA9IGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkO1xuICAgICAgICAgICAgICAgIGxldCB0b0NvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KHRvQ29uY2VwdElkKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29tcG9zaXRpb24gPSB5aWVsZCBHZXRDb21wb3NpdGlvbldpdGhJZEFuZERhdGVGcm9tTWVtb3J5KHRvQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gobmV3Q29tcG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVsYXRpb25SYXcoaWQsIHJlbGF0aW9uLCBpbnBhZ2UgPSAxMCwgcGFnZSA9IDEpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdChpZCk7XG4gICAgICAgIHZhciByZWxhdGVkQ29uY2VwdFN0cmluZyA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckFuZENhdGVnb3J5KHJlbGF0aW9uKTtcbiAgICAgICAgdmFyIHJlbGF0ZWRDb25jZXB0ID0gcmVsYXRlZENvbmNlcHRTdHJpbmc7XG4gICAgICAgIGlmIChyZWxhdGVkQ29uY2VwdC5pZCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0aW9uc1N0cmluZyA9IHlpZWxkIEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQocmVsYXRlZENvbmNlcHQuaWQsIGNvbmNlcHQuaWQsIGNvbmNlcHQudXNlcklkLCBpbnBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNTdHJpbmc7XG4gICAgICAgICAgICB2YXIgcHJlZmV0Y2ggPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcmVmZXRjaC5wdXNoKGNvbm5lY3Rpb25zW2ldLnRvVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICBsZXQgdG9Db25jZXB0ID0geWllbGQgR2V0VGhlQ29uY2VwdCh0b0NvbmNlcHRJZCk7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2godG9Db25jZXB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBHZXRDb25jZXB0IH0gZnJvbSBcIi4uL0FwaS9HZXRDb25jZXB0XCI7XG5pbXBvcnQgeyBjb252ZXJ0RnJvbUxDb25jZXB0VG9Db25jZXB0LCBHZXRVc2VyR2hvc3RJZCB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YVwiO1xuaW1wb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tIFwiLi9DcmVhdGVEZWZhdWx0Q29uY2VwdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR2V0VGhlQ29uY2VwdChpZCwgdXNlcklkID0gOTk5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgICAgICBsZXQgbGNvbmNlcHQgPSB5aWVsZCBHZXRVc2VyR2hvc3RJZCh1c2VySWQsIGlkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb252ZXJ0RnJvbUxDb25jZXB0VG9Db25jZXB0KGxjb25jZXB0KTtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgICAgICB9XG4gICAgICAgIGNvbmNlcHQgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChpZCk7XG4gICAgICAgIGlmICgoY29uY2VwdCA9PSBudWxsIHx8IGNvbmNlcHQuaWQgPT0gMCkgJiYgaWQgIT0gbnVsbCAmJiBpZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChpZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uY2VwdC50eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFR5cGUgPSB5aWVsZCBDb25jZXB0c0RhdGEuR2V0Q29uY2VwdChjb25jZXB0LnR5cGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHRUeXBlID09IG51bGwgJiYgY29uY2VwdC50eXBlSWQgIT0gbnVsbCAmJiBjb25jZXB0LnR5cGVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdChjb25jZXB0LnR5cGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25jZXB0LnR5cGUgPSB0eXBlQ29uY2VwdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldEFpRGF0YSB9IGZyb20gXCIuLi9BcGkvR2V0QWlEYXRhXCI7XG5pbXBvcnQgeyBTZXR0aW5nRGF0YSB9IGZyb20gXCIuLi9EYXRhU3RydWN0dXJlcy9TZXR0aW5nRGF0YVwiO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvU2V0dGluZ3NcIjtcbmltcG9ydCB7IEFpVXBkYXRlRmxhZywgR2V0U3RhdHNGcm9tRGF0YWJhc2UgfSBmcm9tIFwiLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBJbml0aWFsaXplU3lzdGVtKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBzdGF0c0RhdGEgPSB5aWVsZCBHZXRTdGF0c0Zyb21EYXRhYmFzZSgpO1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSBzdGF0c0RhdGE7XG4gICAgICAgIHlpZWxkIEdldEFpRGF0YSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBQdXJnYXRvcnlEYXRhYmFzZVVwZGF0ZWQoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgU2V0dGluZ3MuaXNPbmxpbmVTeW5jID0gdHJ1ZTtcbiAgICAgICAgdmFyIHNldHRpbmdEYXRhID0gbmV3IFNldHRpbmdEYXRhKFNldHRpbmdzLmlzT25saW5lU3luYyk7XG4gICAgICAgIEFpVXBkYXRlRmxhZyhzZXR0aW5nRGF0YSk7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBMQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9MQ29uY2VwdFwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpIHtcbiAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IHVwZGF0ZWRfb24gPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBjb25jZXB0ID0gbmV3IExDb25jZXB0KDAsIDAsIDAsIDAsIDAsIFwiMFwiLCBcIjBcIiwgZmFsc2UsIGNyZWF0ZWRfb24sIHVwZGF0ZWRfb24sIDApO1xuICAgIHJldHVybiBjb25jZXB0O1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBnZXRBbGxGcm9tTG9jYWxEYiB9IGZyb20gXCIuLi8uLi9EYXRhYmFzZS9Ob0luZGV4RGJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUxvY2FsQmluYXJ5VHJlZUZyb21EYXRhKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIGdldEFsbEZyb21Mb2NhbERiKFwibG9jYWxjb25jZXB0XCIpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25jZXB0TGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VwdCA9IGNvbmNlcHRMaXN0W2ldO1xuICAgICAgICAgICAgICAgIExvY2FsQ29uY2VwdHNEYXRhLkFkZENvbmNlcHRUb01lbW9yeShjb25jZXB0KTtcbiAgICAgICAgICAgICAgICAvLyBsZXQgbm9kZSA9IG5ldyBOb2RlKGNvbmNlcHQuaWQsIGNvbmNlcHQsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgICAgIC8vIExvY2FsQmluYXJ5VHJlZS5hZGROb2RlVG9UcmVlKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gXCIuLi9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHRcIjtcbmltcG9ydCB7IENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbCB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbFwiO1xuaW1wb3J0IHsgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsIH0gZnJvbSBcIi4vTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbChqc29uLCBvZlRoZUNvbmNlcHRJZCA9IG51bGwsIG9mVGhlQ29uY2VwdFVzZXJJZCA9IG51bGwsIG1haW5LZXkgPSBudWxsLCB1c2VySWQgPSBudWxsLCBhY2Nlc3NJZCA9IG51bGwsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gbnVsbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFVzZXJJZCA9IHVzZXJJZCAhPT0gbnVsbCAmJiB1c2VySWQgIT09IHZvaWQgMCA/IHVzZXJJZCA6IDk5OTtcbiAgICAgICAgdmFyIGxvY2FsQWNjZXNzSWQgPSBhY2Nlc3NJZCAhPT0gbnVsbCAmJiBhY2Nlc3NJZCAhPT0gdm9pZCAwID8gYWNjZXNzSWQgOiA5OTk7XG4gICAgICAgIHZhciBsb2NhbFNlc3Npb25JZCA9IHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSBudWxsICYmIHNlc3Npb25JbmZvcm1hdGlvbklkICE9PSB2b2lkIDAgPyBzZXNzaW9uSW5mb3JtYXRpb25JZCA6IDQ7XG4gICAgICAgIHZhciBNYWluS2V5TG9jYWwgPSBtYWluS2V5ICE9PSBudWxsICYmIG1haW5LZXkgIT09IHZvaWQgMCA/IG1haW5LZXkgOiAwO1xuICAgICAgICB2YXIgTWFpbkNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uW2tleV0gIT0gJ3N0cmluZycgJiYgdHlwZW9mIGpzb25ba2V5XSAhPSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGlmIChvZlRoZUNvbmNlcHRJZCA9PSBudWxsICYmIG9mVGhlQ29uY2VwdFVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwgXCJcIiwgdHJ1ZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBNYWluQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsTWFpbktleSA9IGNvbmNlcHQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIE1haW5LZXlMb2NhbCA9IGNvbmNlcHQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwoanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2ZUaGUgPSBvZlRoZUNvbmNlcHRJZCAhPT0gbnVsbCAmJiBvZlRoZUNvbmNlcHRJZCAhPT0gdm9pZCAwID8gb2ZUaGVDb25jZXB0SWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbE1haW5LZXkgPSBNYWluS2V5TG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwgXCJcIiwgdHJ1ZSwgbG9jYWxVc2VySWQsIGxvY2FsQWNjZXNzSWQsIGxvY2FsU2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb25uZWN0aW9uTG9jYWwob2ZUaGUsIGNvbmNlcHQuaWQsIGxvY2FsTWFpbktleSk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwoanNvbltrZXldLCBjb25jZXB0LmlkLCBjb25jZXB0LnVzZXJJZCwgbG9jYWxNYWluS2V5LCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mVGhlID0gb2ZUaGVDb25jZXB0SWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0SWQgIT09IHZvaWQgMCA/IG9mVGhlQ29uY2VwdElkIDogOTk5O1xuICAgICAgICAgICAgICAgIHZhciBvZlRoZVVzZXIgPSBvZlRoZUNvbmNlcHRVc2VySWQgIT09IG51bGwgJiYgb2ZUaGVDb25jZXB0VXNlcklkICE9PSB2b2lkIDAgPyBvZlRoZUNvbmNlcHRVc2VySWQgOiA5OTk7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsTWFpbktleSA9IE1haW5LZXlMb2NhbDtcbiAgICAgICAgICAgICAgICB2YXIgY29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChrZXksIGpzb25ba2V5XSwgZmFsc2UsIGxvY2FsVXNlcklkLCBsb2NhbEFjY2Vzc0lkLCBsb2NhbFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIHlpZWxkIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChvZlRoZSwgY29uY2VwdC5pZCwgbG9jYWxNYWluS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWFpbkNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExDb25jZXB0IH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25jZXB0XCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBzdG9yZVRvRGF0YWJhc2UgfSBmcm9tIFwiLi4vLi4vRGF0YWJhc2UvTm9JbmRleERiXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGVjaGFyYWN0ZXIsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUlkLCBhY2Nlc3NJZCwgcmVmZXJlbnRJZCA9IDApIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgaWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDApO1xuICAgICAgICB2YXIgaXNOZXcgPSB0cnVlO1xuICAgICAgICBsZXQgY3JlYXRlZF9vbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGxldCB1cGRhdGVkX29uID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBuZXcgTENvbmNlcHQoaWQsIHVzZXJJZCwgdHlwZUlkLCBjYXRlZ29yeUlkLCBhY2Nlc3NJZCwgcmVmZXJlbnQsIHR5cGVjaGFyYWN0ZXIsIGlzTmV3LCBjcmVhdGVkX29uLCB1cGRhdGVkX29uLCByZWZlcmVudElkKTtcbiAgICAgICAgY29uY2VwdC5pc1RlbXAgPSB0cnVlO1xuICAgICAgICBMb2NhbENvbmNlcHRzRGF0YS5BZGRDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbmNlcHRcIiwgY29uY2VwdCk7XG4gICAgICAgIHJldHVybiBjb25jZXB0O1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbm5lY3Rpb25cIjtcbmltcG9ydCB7IExvY2FsQ29ubmVjdGlvbkRhdGEgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTG9jYWxDb25uZWN0aW9uRGF0YVwiO1xuaW1wb3J0IHsgc3RvcmVUb0RhdGFiYXNlIH0gZnJvbSBcIi4uLy4uL0RhdGFiYXNlL05vSW5kZXhEYlwiO1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbChvZlRoZUNvbmNlcHRJZCwgdG9UaGVDb25jZXB0SWQsIHR5cGVJZCwgb3JkZXJJZCA9IDEpIHtcbiAgICB2YXIgYWNjZXNzSWQgPSA0O1xuICAgIGxldCByYW5kb21pZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCk7XG4gICAgbGV0IHJlYWxPZlRoZUNvbmNlcHRJZCA9IDA7XG4gICAgbGV0IHJlYWxUb1RoZUNvbmNlcHRJZCA9IDA7XG4gICAgbGV0IHJlYWxUeXBlSWQgPSAwO1xuICAgIHJlYWxPZlRoZUNvbmNlcHRJZCA9IG9mVGhlQ29uY2VwdElkO1xuICAgIHJlYWxUb1RoZUNvbmNlcHRJZCA9IHRvVGhlQ29uY2VwdElkO1xuICAgIHJlYWxUeXBlSWQgPSB0eXBlSWQ7XG4gICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgTENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgaWYgKG9mVGhlQ29uY2VwdElkICE9IHRvVGhlQ29uY2VwdElkKSB7XG4gICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgTENvbm5lY3Rpb24oMCwgb2ZUaGVDb25jZXB0SWQsIHRvVGhlQ29uY2VwdElkLCB0eXBlSWQsIG9yZGVySWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgY29ubmVjdGlvbi5pc1RlbXAgPSB0cnVlO1xuICAgICAgICBjb25uZWN0aW9uLmlkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwKTtcbiAgICAgICAgTG9jYWxDb25uZWN0aW9uRGF0YS5BZGRDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICBzdG9yZVRvRGF0YWJhc2UoXCJsb2NhbGNvbm5lY3Rpb25cIiwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBHZXRDb21wb3NpdGlvbkxvY2FsLCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkIH0gZnJvbSBcIi4vR2V0Q29tcG9zaXRpb25Mb2NhbFwiO1xuaW1wb3J0IEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsIGZyb20gXCIuL0dldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwoY29tcG9zaXRpb25OYW1lLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKGNvbXBvc2l0aW9uTmFtZSk7XG4gICAgICAgIHZhciBDb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgaWYgKGNvbmNlcHQpIHtcbiAgICAgICAgICAgIHZhciBjb25jZXB0TGlzdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHRzQnlUeXBlSWRBbmRVc2VyKGNvbmNlcHQuaWQsIHVzZXJJZCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmNlcHRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbXBvc2l0aW9uSnNvbiA9IHlpZWxkIEdldENvbXBvc2l0aW9uTG9jYWwoY29uY2VwdExpc3RbaV0uaWQpO1xuICAgICAgICAgICAgICAgIENvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbXBvc2l0aW9uSnNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvc2l0aW9uTGlzdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxpc3RMb2NhbFdpdGhJZChjb21wb3NpdGlvbk5hbWUsIHVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwoY29tcG9zaXRpb25OYW1lKTtcbiAgICAgICAgdmFyIENvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBpZiAoY29uY2VwdCkge1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRMaXN0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdHNCeVR5cGVJZEFuZFVzZXIoY29uY2VwdC5pZCwgdXNlcklkKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY2VwdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9zaXRpb25Kc29uID0geWllbGQgR2V0Q29tcG9zaXRpb25Mb2NhbFdpdGhJZChjb25jZXB0TGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgQ29tcG9zaXRpb25MaXN0LnB1c2goY29tcG9zaXRpb25Kc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ29tcG9zaXRpb25MaXN0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5pbXBvcnQgeyBMb2NhbENvbm5lY3Rpb25EYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29ubmVjdGlvbkRhdGFcIjtcbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICAvL2Nvbm5lY3Rpb25MaXN0ID0gQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGlkKTtcbiAgICAgICAgdmFyIGNvbXBvc2l0aW9uTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkxpc3QucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwoaWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgIHJldHVybk91dHB1dFttYWluU3RyaW5nXSA9IG91dHB1dDtcbiAgICAgICAgcmV0dXJuIHJldHVybk91dHB1dDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkKGlkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgdmFyIHJldHVybk91dHB1dCA9IHt9O1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IHlpZWxkIExvY2FsQ29ubmVjdGlvbkRhdGEuR2V0Q29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uTG9jYWwoaWQpO1xuICAgICAgICB2YXIgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29tcG9zaXRpb25MaXN0LmluY2x1ZGVzKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uTGlzdC5wdXNoKGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQoaWQpO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCAhPSAwKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hMb2NhbChpZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICB2YXIgbWFpblN0cmluZyA9IChfYiA9IChfYSA9IGNvbmNlcHQgPT09IG51bGwgfHwgY29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uY2VwdC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2hhcmFjdGVyVmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwidG9wXCI7XG4gICAgICAgICAgICByZXR1cm5PdXRwdXRbbWFpblN0cmluZ10gPSBvdXRwdXQ7XG4gICAgICAgICAgICB2YXIgRmluYWxSZXR1cm4gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBGaW5hbFJldHVyblsnZGF0YSddID0gcmV0dXJuT3V0cHV0O1xuICAgICAgICBGaW5hbFJldHVyblsnaWQnXSA9IGlkO1xuICAgICAgICByZXR1cm4gRmluYWxSZXR1cm47XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZWN1cnNpdmVGZXRjaExvY2FsKGlkLCBjb25uZWN0aW9uTGlzdCwgY29tcG9zaXRpb25MaXN0LCB2aXNpdGVkQ29uY2VwdHMgPSBbXSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgICAgIHZhciBhcnJvdXRwdXQgPSBbXTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGlkKTtcbiAgICAgICAgaWYgKGNvbmNlcHQuaWQgIT0gMCkge1xuICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdFR5cGVJZCA9IGNvbmNlcHQudHlwZUlkO1xuICAgICAgICAgICAgICAgIHZhciB0b0NvbmNlcHRUeXBlID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdCh0b0NvbmNlcHRUeXBlSWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1haW5TdHJpbmcgPSAoX2IgPSAoX2EgPSBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcInRvcFwiO1xuICAgICAgICBpZiAoIWNvbXBvc2l0aW9uTGlzdC5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25jZXB0ID09PSBudWxsIHx8IGNvbmNlcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmNlcHQuY2hhcmFjdGVyVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodmlzaXRlZENvbmNlcHRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlzaXRlZENvbmNlcHRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0SWQgPSBjb25uZWN0aW9uTGlzdFtpXS50b1RoZUNvbmNlcHRJZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvQ29uY2VwdCA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9Db25jZXB0LmlkICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodG9Db25jZXB0ID09PSBudWxsIHx8IHRvQ29uY2VwdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9Db25jZXB0LnR5cGUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZUlkID0gdG9Db25jZXB0LnR5cGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db25jZXB0VHlwZSA9IHlpZWxkIExvY2FsQ29uY2VwdHNEYXRhLkdldENvbmNlcHQodG9Db25jZXB0VHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0NvbmNlcHQudHlwZSA9IHRvQ29uY2VwdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gXCJ0aGVfXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbG1haW5TdHJpbmcgPSAoX2QgPSAoX2MgPSB0b0NvbmNlcHQgPT09IG51bGwgfHwgdG9Db25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b0NvbmNlcHQudHlwZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNoYXJhY3RlclZhbHVlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcInRvcFwiO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxLZXkgPSBsb2NhbG1haW5TdHJpbmcucmVwbGFjZShyZWdleCwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIobG9jYWxLZXkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVjdXJzaXZlRmV0Y2hMb2NhbCh0b0NvbmNlcHRJZCwgY29ubmVjdGlvbkxpc3QsIGNvbXBvc2l0aW9uTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlY3Vyc2l2ZUZldGNoTG9jYWwodG9Db25jZXB0SWQsIGNvbm5lY3Rpb25MaXN0LCBjb21wb3NpdGlvbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3V0cHV0W2xvY2FsS2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGFycm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHZXRDb25jZXB0QnlDaGFyYWN0ZXJMb2NhbChjaGFyYWN0ZXJWYWx1ZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0ID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyKGNoYXJhY3RlclZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvY2FsQ29uY2VwdHNEYXRhIH0gZnJvbSBcIi4uLy4uL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xvY2FsQ29uY2VwdERhdGFcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0TG9jYWwgZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdExvY2FsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ29uY2VwdExvY2FsKHJlZmVyZW50LCB0eXBlQ2hhcmFjdGVyLCB1c2VySWQsIGNhdGVnb3J5SWQsIHR5cGVJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTG9jYWxDb25jZXB0c0RhdGEuR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZUxvY2FsKHJlZmVyZW50LCB0eXBlSWQpO1xuICAgICAgICB2YXIgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIGxldCBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIGlmIChjb25jZXB0LmlkID09IDApIHtcbiAgICAgICAgICAgIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHR5cGVDaGFyYWN0ZXIsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUlkLCBhY2Nlc3NJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IENyZWF0ZVRoZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0TG9jYWxcIjtcbmltcG9ydCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbCBmcm9tIFwiLi9NYWtlVGhlVHlwZUxvY2FsXCI7XG5pbXBvcnQgeyBMb2NhbENvbmNlcHRzRGF0YSB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9Mb2NhbC9Mb2NhbENvbmNlcHREYXRhXCI7XG5leHBvcnQgZnVuY3Rpb24gTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKHR5cGUsIHJlZmVyZW50LCBjb21wb3NpdGlvbiA9IGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OSwgcmVmZXJlbnRJZCA9IDApIHtcbiAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIGFjY2Vzc0lkO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5O1xuICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIHN0cmluZ1RvQ2hlY2sgPSBcIlwiO1xuICAgICAgICB2YXIgc3RyaW5nTGVuZ3RoID0gcmVmZXJlbnQubGVuZ3RoO1xuICAgICAgICB2YXIgdHlwZUNvbmNlcHQ7XG4gICAgICAgIHZhciBjb25jZXB0O1xuICAgICAgICB2YXIgc3RhcnRzV2l0aFRoZSA9IHR5cGUuc3RhcnRzV2l0aChcInRoZV9cIik7XG4gICAgICAgIGlmIChzdGFydHNXaXRoVGhlKSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSBcInRoZV9cIiArIHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbCh0eXBlLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgdXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdExvY2FsKHJlZmVyZW50LCB0eXBlLCB1c2VySWQsIGNhdGVnb3J5SWQsIHR5cGVDb25jZXB0LmlkLCBhY2Nlc3NJZCwgcmVmZXJlbnRJZCk7XG4gICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdFN0cmluZyA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHN0cmluZ1RvQ2hlY2ssIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHN0cmluZ1RvQ2hlY2ssIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0TG9jYWwoc3RyaW5nVG9DaGVjaywgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICB2YXIgY29uY2VwdEJ5Q2hhclR5cGVTdHJpbmcgPSB5aWVsZCBMb2NhbENvbmNlcHRzRGF0YS5HZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlTG9jYWwocmVmZXJlbnQsIHR5cGVDb25jZXB0LmlkKTtcbiAgICAgICAgICAgIHZhciBjb25jZXB0VHlwZUNoYXJhY3RlciA9IGNvbmNlcHRCeUNoYXJUeXBlU3RyaW5nO1xuICAgICAgICAgICAgLy8gdmFyIG1ha2VUaGVOYW1lU3RyaW5nID0gYXdhaXQgTWFrZVRoZU5hbWUocmVmZXJlbnQsdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCx0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLGNvbmNlcHRUeXBlQ2hhcmFjdGVyICk7XG4gICAgICAgICAgICAvLyB2YXIgbWFrZVRoZU5hbWVDb25jZXB0ID0gbWFrZVRoZU5hbWVTdHJpbmcgYXMgQ29uY2VwdDtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0VHlwZUNoYXJhY3RlcjtcbiAgICAgICAgICAgIGlmIChjb25jZXB0VHlwZUNoYXJhY3Rlci5pZCA9PSAwICYmIGNvbmNlcHRUeXBlQ2hhcmFjdGVyLnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0TG9jYWwocmVmZXJlbnQsIHN0cmluZ1RvQ2hlY2ssIHVzZXJJZCwgY2F0ZWdvcnlJZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25jZXB0LnR5cGUgPSB0eXBlQ29uY2VwdDtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0TG9jYWwgZnJvbSBcIi4vQ3JlYXRlVGhlQ29uY2VwdExvY2FsXCI7XG5pbXBvcnQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWwgZnJvbSBcIi4vR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyTG9jYWxcIjtcbmltcG9ydCB7IFNwbGl0U3RyaW5ncyB9IGZyb20gXCIuLi9TcGxpdFN0cmluZ3NcIjtcbmltcG9ydCBNYWtlVGhlQ29uY2VwdExvY2FsIGZyb20gXCIuL01ha2VUaGVDb25jZXB0TG9jYWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHR5cGVTdHJpbmcsIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGFjY2Vzc0lkID0gNDtcbiAgICAgICAgdmFyIGV4aXN0aW5nQ29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3RlckxvY2FsKHR5cGVTdHJpbmcpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0KSB7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDb25jZXB0LmlkID09IDAgfHwgZXhpc3RpbmdDb25jZXB0LnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0dGVkU3RyaW5nQXJyYXkgPSBTcGxpdFN0cmluZ3ModHlwZVN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0dGVkU3RyaW5nQXJyYXlbMF0gPT0gdHlwZVN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIE1ha2VUaGVDb25jZXB0TG9jYWwodHlwZVN0cmluZywgXCJ0aGVcIiwgdXNlcklkLCA0LCA1MSk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnlJZCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYXRlZ29yeUNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRMb2NhbChzcGxpdHRlZFN0cmluZ0FycmF5WzBdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdExvY2FsKHNwbGl0dGVkU3RyaW5nQXJyYXlbMV0sIHNlc3Npb25JZCwgc2Vzc2lvblVzZXJJZCwgdXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVDb25jZXB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uY2VwdCA9IHlpZWxkIENyZWF0ZVRoZUNvbmNlcHRMb2NhbCh0eXBlU3RyaW5nLCBzcGxpdHRlZFN0cmluZ0FycmF5WzFdLCB1c2VySWQsIGNhdGVnb3J5Q29uY2VwdC5pZCwgdHlwZUNvbmNlcHQuaWQsIGFjY2Vzc0lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ29uY2VwdCA9IGNvbmNlcHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IEluc2VydFVuaXF1ZU51bWJlciBmcm9tICcuLi8uLi9IZWxwZXJzL1VuaXF1ZUluc2VydCc7XG5pbXBvcnQgeyBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5MQ29ubmVjdGlvbkFycmF5LCBDaGVja0lmVHlwZUxDb25jZXB0c0V4aXN0c0luQXJyYXksIH0gZnJvbSAnLi4vLi4vSGVscGVycy9DaGVja0lmRXhpc3RzJztcbmltcG9ydCB7IEdldEFsbENvbm5lY3Rpb25zT2ZDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24nO1xuaW1wb3J0IEdldFRoZUNvbmNlcHQgZnJvbSAnLi8uLi9HZXRUaGVDb25jZXB0JztcbmltcG9ydCB7IERlbGV0ZUNvbm5lY3Rpb25CeUlkIH0gZnJvbSAnLi8uLi9EZWxldGVDb25uZWN0aW9uJztcbmltcG9ydCB7IFN5bmNEYXRhIH0gZnJvbSAnLi4vLi4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGEnO1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbCB9IGZyb20gJy4vQ3JlYXRlVGhlQ29tcG9zaXRpb25Mb2NhbCc7XG5pbXBvcnQgeyBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwgfSBmcm9tICcuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCc7XG5pbXBvcnQgeyBDcmVhdGVEZWZhdWx0TENvbmNlcHQsIENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbCB9IGZyb20gJy4uLy4uL2FwcCc7XG5pbXBvcnQgeyBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0LCBjb252ZXJ0RnJvbUNvbm5lY3Rpb25Ub0xDb25uZWN0aW9uIH0gZnJvbSAnLi4vQ29udmVyc2lvbi9Db252ZXJ0Q29uY2VwdHMnO1xuLy8gZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBjYWNoZSBjb21wb3NpdGlvblxuZXhwb3J0IGZ1bmN0aW9uIFVwZGF0ZUNvbXBvc2l0aW9uTG9jYWwocGF0Y2hlclN0cnVjdHVyZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGRlZmF1bHQgdXNlcklkLCBzZXNzaW9uSWQsIGFjY2Vzc0lkIHBhc3NlZCBieSB0aGUgcGF0Y2hlclN0cnVjdHVyZVxuICAgICAgICBjb25zdCB1c2VySWQgPSBwYXRjaGVyU3RydWN0dXJlLnVzZXJJZDtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gcGF0Y2hlclN0cnVjdHVyZS5zZXNzaW9uSWQ7XG4gICAgICAgIGNvbnN0IGFjY2Vzc0lkID0gcGF0Y2hlclN0cnVjdHVyZS5hY2Nlc3NJZDtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25MaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbmNlcHRMaXN0ID0gW107XG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBsZXQgcGFyZW50Q29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBjb25zdCB0b0RlbGV0ZUNvbmNlcHRzID0gW107XG4gICAgICAgIC8vIHRoZSBtYWluIGNvbXBvc2l0aW9uIElkIHRoYXQgaGFzIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcGF0Y2hlZFxuICAgICAgICBjb25zdCBjb21wb3NpdGlvbklkID0gcGF0Y2hlclN0cnVjdHVyZS5jb21wb3NpdGlvbklkO1xuICAgICAgICAvLyBpZiB5b3Ugd2FudCB0byBlZGl0IHRoZSBzdWJjb21wb3NpdGlvbnMgb2YgdGhlIGNvbXBvc2l0aW9uIHRoZW4geW91IGhhdmUgdG8gcGFzcyB0byB0aGlzXG4gICAgICAgIGNvbnN0IG9mVGhlQ29uY2VwdElkID0gcGF0Y2hlclN0cnVjdHVyZS5vZlRoZUNvbXBvc2l0aW9uSWQ7XG4gICAgICAgIGxldCB0b0RlbGV0ZUNvbm5lY3Rpb25zID0gW107XG4gICAgICAgIC8vIGdldCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGUgYmFja2VuZCBiZWNhdXNlIGl0IG5lZWRzIGxhdGVzdCBkYXRhXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGNvbXBvc2l0aW9uSWQpO1xuICAgICAgICBsZXQgY29ubmVjdGlvbkxpc3RPcmlnaW5hbCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25MaXN0T3JpZ2luYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0LnB1c2goY29udmVydEZyb21Db25uZWN0aW9uVG9MQ29ubmVjdGlvbihjb25uZWN0aW9uTGlzdE9yaWdpbmFsW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uY2VwdElkTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb21wb3NpdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgLy8gcHV0IHRoaXMgaW4gdGhlIHVwcGVyIHNlY3Rpb24gYmVmb3JlIHVwZGF0aW5nIGJlY2F1c2UgdGhpcyB3aWxsIHRlbGwgYWxsIG90aGVyIGRpc3RyaWJ1dGVkXG4gICAgICAgIC8vc2VydmVycyB0byBkZXN0cm95IHRoZSBjb3B5IG9mIHRoZSBjb21wb3NpdGlvbiB0aGF0IHRoZXkgaGF2ZSBhcyBuZXcgY29tcG9zaXRpb24gaXMgY29taW5nIHVwXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGluc2lkZSBvZiB0aGUgY29tcG9zaXRpb24gYW5kIHN0b3JlIHRoZW0gaW5cbiAgICAgICAgbGV0IGFsbENvbmNlcHRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb21wb3NpdGlvbkxpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb25jZXB0SWRMaXN0LCBjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29uY2VwdElkTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgYWxsQ29uY2VwdHMucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY29uY2VwdHMgdGhhdCBhcmUgaW5zaWRlIG9mIHRoZSBjb21wb3NpdGlvbiBhbmQgc3RvcmUgdGhlbSBpbiBhIGNvbmNlcHRMaXN0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdElkTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29uY2VwdElkTGlzdFtpXSk7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbklkID09IGNvbmNlcHRJZExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbiA9IGNvbnZlcnRGcm9tQ29uY2VwdFRvTENvbmNlcHQoY29uY2VwdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gY29uY2VwdElkTGlzdFtpXSkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmNlcHQgPSBjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb252ZXJ0RnJvbUNvbmNlcHRUb0xDb25jZXB0KGNvbmNlcHQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgdHJ5aW5nIHRvIHBhdGNoIHRoZSBuZXcgb2JqZWN0IGludG8gdGhlIGNvbXBvc2l0aW9uXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHBhdGNoZXJTdHJ1Y3R1cmUucGF0Y2hPYmplY3Q7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgbGV0IGluc2VydGluZ0NvbmNlcHQgPSBDcmVhdGVEZWZhdWx0TENvbmNlcHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25jZXB0ID0gY29tcG9zaXRpb247XG4gICAgICAgICAgICAvLyBpZiB0aGUgaW1tZWRpZGF0ZSBwYXJlbnQgZXhpc3RzIGluIHRoZSBjb21wb3NpdGlvbiAoaS5lLiBmb3IgbXVsdGlsZXZlbCBjb21wb3NpdGlvbilcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb25jZXB0LmlkID4gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsQ29uY2VwdCA9IHBhcmVudENvbmNlcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW5nQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbChrZXksIFwiXCIsIHRydWUsIGNvbXBvc2l0aW9uLnVzZXJJZCwgNCwgOTk5KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbkxvY2FsKG9iamVjdFtrZXldLCBpbnNlcnRpbmdDb25jZXB0LmlkLCBpbnNlcnRpbmdDb25jZXB0LnVzZXJJZCwgY29tcG9zaXRpb24uaWQsIGNvbXBvc2l0aW9uLnVzZXJJZCwgNCwgOTk5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIG5ldyBjb25jZXB0IGluIHRoZSBvYmplY3RcbiAgICAgICAgICAgICAgICBpbnNlcnRpbmdDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdExvY2FsKGtleSwgdmFsdWUsIGZhbHNlLCB1c2VySWQsIGFjY2Vzc0lkLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGNvbmNlcHQgZXhpc3RzIGluIHRoZSBjb25jZXB0IGxpc3QgYmVjYXVzZSBpZiBpdCBleGlzdHMgdGhlbiB3ZSBoYXZlIHRvIGRlbGV0ZSBvbGQgY29ubmVjdGlvblxuICAgICAgICAgICAgY29uc3QgRXhpc3RpbmdDb25jZXB0cyA9IENoZWNrSWZUeXBlTENvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCwgaW5zZXJ0aW5nQ29uY2VwdCk7XG4gICAgICAgICAgICAvLyBpZiB0aGUgZXhpc3RpbmcgY29uY2VwdCB0aGVuIHN0YXJ0IHRoZSBwcm9jZXNzIGZvciBkZWxldGluZyB0aGUgY29uY2VwdCBpbiB0aGUgbGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFeGlzdGluZ0NvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0aW5nQ29ubmVjdGlvbnMgPSBDaGVja0FsbENvbm5lY3Rpb25zQ29ubmVjdGVkSW5MQ29ubmVjdGlvbkFycmF5KGNvbm5lY3Rpb25MaXN0LCBFeGlzdGluZ0NvbmNlcHRzW2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25uZWN0aW9ucyA9IHRvRGVsZXRlQ29ubmVjdGlvbnMuY29uY2F0KGRlbGV0aW5nQ29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0b0RlbGV0ZUNvbmNlcHRzLnB1c2goRXhpc3RpbmdDb25jZXB0c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIG5ldyBjb25jZXB0IGFuZCB0aGUgb2xkIGNvbXBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsKGxvY2FsQ29uY2VwdC5pZCwgaW5zZXJ0aW5nQ29uY2VwdC5pZCwgY29tcG9zaXRpb24uaWQsIDIpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBjb25jZXB0TGlzdC5wdXNoKGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyB5b3UgaGF2ZSB0byBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gYnVsa1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRvRGVsZXRlQ29ubmVjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBjYWNoZSBsaXN0XG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgIERlbGV0ZUNvbm5lY3Rpb25CeUlkKHRvRGVsZXRlQ29ubmVjdGlvbnNbal0uaWQpO1xuICAgICAgICB9XG4gICAgICAgIFN5bmNEYXRhLlN5bmNEYXRhT25saW5lKCk7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCBNYWtlVGhlQ2hhcmFjdGVyRGF0YSBmcm9tIFwiLi9NYWtlVGhlQ2hhcmFjdGVyRGF0YVwiO1xuaW1wb3J0IE1ha2VUaGVDb25jZXB0IGZyb20gXCIuL01ha2VUaGVDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ2hhcmFjdGVyKHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBzZWN1cml0eUlkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSWQpIHtcbiAgICB2YXIgYWNjZXNzVXNlcklkO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBjYXRlZ29yeUlkID0gNDtcbiAgICAgICAgdmFyIHR5cGVJZCA9IDUxO1xuICAgICAgICB2YXIgdHlwZVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlc3Npb25Vc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciByZWZlcmVudFVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGxlbmd0aE9mQ2hhcmFjdGVycyA9IHRoZV9jaGFyYWN0ZXJfZGF0YS5sZW5ndGg7XG4gICAgICAgIHZhciBjb25jZXB0O1xuICAgICAgICBpZiAobGVuZ3RoT2ZDaGFyYWN0ZXJzID09IDEpIHtcbiAgICAgICAgICAgIHZhciByZWZlcmVudElkID0gdGhlX2NoYXJhY3Rlcl9kYXRhLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICB2YXIgdHlwZUlkRm9yQ2hhcmFjdGVyID0gNDk7XG4gICAgICAgICAgICB2YXIgY2hhcmFjdGVyRGF0YVN0cmluZyA9IHlpZWxkIE1ha2VUaGVDaGFyYWN0ZXJEYXRhKHRoZV9jaGFyYWN0ZXJfZGF0YSwgdXNlcklkLCBzZWN1cml0eUlkLCBhY2Nlc3NJZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBNYWtlVGhlQ29uY2VwdCh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgY2F0ZWdvcnlJZCwgY2F0ZWdvcnlVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCB0eXBlSWRGb3JDaGFyYWN0ZXIsIHR5cGVVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlckRhdGFTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ2hhcmFjdGVyRGF0YSh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICB2YXIgY2hhcmFjdGVyRGF0YSA9IGNoYXJhY3RlckRhdGFTdHJpbmc7XG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyRGF0YS5pc05ldykge1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUNvbmNlcHQodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNoYXJhY3RlckRhdGEuaWQsIGNoYXJhY3RlckRhdGEudXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUNvbmNlcHQodGhlX2NoYXJhY3Rlcl9kYXRhLCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIGNoYXJhY3RlckRhdGEuaWQsIGNoYXJhY3RlckRhdGEudXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkKTtcbiAgICAgICAgICAgICAgICBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ2hhcmFjdGVyIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlQ2hhcmFjdGVyXCI7XG5pbXBvcnQgeyBUaGVDaGFyYWN0ZXIgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvVGhlQ2hhcmFjdGVyXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlQ2hhcmFjdGVyRGF0YSh0aGVfY2hhcmFjdGVyX2RhdGEsIHVzZXJJZCwgc2VjdXJpdHlJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgdGhlQ2hhcmFjdGVyID0gbmV3IFRoZUNoYXJhY3Rlcih1c2VySWQsIHRoZV9jaGFyYWN0ZXJfZGF0YSwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgIHZhciBvdXRwdXQgPSB5aWVsZCBDcmVhdGVUaGVDaGFyYWN0ZXIodGhlQ2hhcmFjdGVyKTtcbiAgICAgICAgdmFyIHJldHVybmVyID0gb3V0cHV0O1xuICAgICAgICByZXR1cm4gcmV0dXJuZXI7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0IGZyb20gXCIuL0NyZWF0ZVRoZUNvbmNlcHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1ha2VUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIGNhdGVnb3J5VXNlcklkLCB0eXBlSWQsIHR5cGVVc2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyQW5kVHlwZShyZWZlcmVudCwgdHlwZUlkKTtcbiAgICAgICAgdmFyIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICBpZiAoY29uY2VwdC5pZCA9PSAwKSB7XG4gICAgICAgICAgICBjb25jZXB0U3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCBjYXRlZ29yeVVzZXJJZCwgdHlwZUlkLCB0eXBlVXNlcklkLCByZWZlcmVudElkLCByZWZlcmVudFVzZXJJZCwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgY29uY2VwdCA9IGNvbmNlcHRTdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZVRleHREYXRhIH0gZnJvbSBcIi4uL0FwaS9DcmVhdGUvQ3JlYXRlVGhlVGV4dERhdGFcIjtcbmltcG9ydCB7IEdldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGUgfSBmcm9tIFwiLi4vQXBpL0dldENvbmNlcHRCeUNoYXJhY3RlckFuZFR5cGVcIjtcbmltcG9ydCB7IE1ha2VUaGVOYW1lSW5CYWNrZW5kIH0gZnJvbSBcIi4uL0FwaS9NYWtlVGhlTmFtZUluQmFja2VuZFwiO1xuaW1wb3J0IHsgVGhlVGV4dHMgfSBmcm9tIFwiLi4vRGF0YVN0cnVjdHVyZXMvVGhlVGV4dHNcIjtcbmltcG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdEFwaSB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCBDcmVhdGVUaGVDb25jZXB0LCB7IENyZWF0ZVRoZUNvbmNlcHRJbW1lZGlhdGUgfSBmcm9tIFwiLi9DcmVhdGVUaGVDb25jZXB0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYWtlVGhlSW5zdGFuY2VDb25jZXB0KHR5cGUsIHJlZmVyZW50LCBjb21wb3NpdGlvbiA9IGZhbHNlLCB1c2VySWQsIHBhc3NlZEFjY2Vzc0lkLCBwYXNzZWRTZXNzaW9uSWQgPSA5OTksIHJlZmVyZW50SWQgPSAwKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHNlc3Npb25JbmZvcm1hdGlvbklkID0gcGFzc2VkU2Vzc2lvbklkO1xuICAgICAgICBsZXQgY2F0ZWdvcnlJZCA9IDQ7XG4gICAgICAgIGxldCBjYXRlZ29yeVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgbGV0IHJlZmVyZW50VXNlcklkID0gOTk5O1xuICAgICAgICBsZXQgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgbGV0IHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICBsZXQgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICAvLyBjaGFuZ2UgdGhpc1xuICAgICAgICBsZXQgYWNjZXNzSWQgPSBwYXNzZWRBY2Nlc3NJZDtcbiAgICAgICAgbGV0IGFjY2Vzc1VzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgbGV0IHN0cmluZ1RvQ2hlY2sgPSBcIlwiO1xuICAgICAgICBsZXQgc3RyaW5nTGVuZ3RoID0gcmVmZXJlbnQubGVuZ3RoO1xuICAgICAgICBsZXQgdHlwZUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBsZXQgY29uY2VwdDtcbiAgICAgICAgbGV0IHN0YXJ0c1dpdGhUaGUgPSB0eXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpO1xuICAgICAgICBpZiAoc3RhcnRzV2l0aFRoZSkge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJpbmdUb0NoZWNrID0gXCJ0aGVfXCIgKyB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb3NpdGlvbikge1xuICAgICAgICAgICAgbGV0IHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0QXBpKHR5cGUsIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgbGV0IHR5cGVDb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZVR5cGVDb25jZXB0QXBpKHN0cmluZ1RvQ2hlY2ssIHVzZXJJZCk7XG4gICAgICAgICAgICB0eXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgbGV0IGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0KHJlZmVyZW50LCB1c2VySWQsIGNhdGVnb3J5SWQsIHVzZXJJZCwgdHlwZUNvbmNlcHQuaWQsIHR5cGVDb25jZXB0LnVzZXJJZCwgcmVmZXJlbnRJZCwgcmVmZXJlbnRVc2VySWQsIHNlY3VyaXR5SWQsIHNlY3VyaXR5VXNlcklkLCBhY2Nlc3NJZCwgYWNjZXNzVXNlcklkLCBzZXNzaW9uSW5mb3JtYXRpb25JZCwgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkKTtcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgbGV0IFRoZVRleHRzRGF0YSA9IG5ldyBUaGVUZXh0cyh1c2VySWQsIHJlZmVyZW50LCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCwgRGF0ZS5ub3coKS50b1N0cmluZygpLCB0cnVlKTtcbiAgICAgICAgICAgIENyZWF0ZVRleHREYXRhKFRoZVRleHRzRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkoc3RyaW5nVG9DaGVjaywgdXNlcklkKTtcbiAgICAgICAgICAgIHR5cGVDb25jZXB0ID0gdHlwZUNvbmNlcHRTdHJpbmc7XG4gICAgICAgICAgICBsZXQgY29uY2VwdEJ5Q2hhclR5cGVTdHJpbmcgPSB5aWVsZCBHZXRDb25jZXB0QnlDaGFyYWN0ZXJBbmRUeXBlKHJlZmVyZW50LCB0eXBlQ29uY2VwdC5pZCk7XG4gICAgICAgICAgICBsZXQgY29uY2VwdFR5cGVDaGFyYWN0ZXIgPSBjb25jZXB0QnlDaGFyVHlwZVN0cmluZztcbiAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0VHlwZUNoYXJhY3RlcjtcbiAgICAgICAgICAgIGlmIChjb25jZXB0VHlwZUNoYXJhY3Rlci5pZCA9PSAwICYmIGNvbmNlcHRUeXBlQ2hhcmFjdGVyLnVzZXJJZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG1ha2VUaGVOYW1lU3RyaW5nID0gYXdhaXQgTWFrZVRoZU5hbWUocmVmZXJlbnQsdXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCx0eXBlQ29uY2VwdC5pZCwgdHlwZUNvbmNlcHQudXNlcklkLGNvbmNlcHRUeXBlQ2hhcmFjdGVyICk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG1ha2VUaGVOYW1lQ29uY2VwdCA9IG1ha2VUaGVOYW1lU3RyaW5nIGFzIENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgLy8gY29uY2VwdCA9IGNvbmNlcHRUeXBlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXB0U3RyaW5nID0geWllbGQgQ3JlYXRlVGhlQ29uY2VwdEltbWVkaWF0ZShyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCB1c2VySWQsIHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsIDEyLCAxMiwgc2VjdXJpdHlJZCwgc2VjdXJpdHlVc2VySWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JbmZvcm1hdGlvbklkLCBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQpO1xuICAgICAgICAgICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgIE1ha2VUaGVOYW1lSW5CYWNrZW5kKGNvbmNlcHQuaWQsIGAke3JlZmVyZW50fWAsIHR5cGVDb25jZXB0LmlkLCB1c2VySWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmKGNvbmNlcHQpe1xuICAgICAgICAvLyAgICAgaWYoY29uY2VwdC50eXBlID09IG51bGwpe1xuICAgICAgICAvLyAgICAgICAgIGxldCBjb25jZXB0VHlwZSA9IENvbmNlcHRzRGF0YS5HZXRDb25jZXB0KGNvbmNlcHQudHlwZUlkKTtcbiAgICAgICAgLy8gICAgICAgICBpZihjb25jZXB0VHlwZSA9PSBudWxsICYmIGNvbmNlcHQudHlwZUlkICE9IG51bGwgJiYgY29uY2VwdC50eXBlSWQgIT0gdW5kZWZpbmVkKXtcbiAgICAgICAgLy8gICAgICAgICAgICAgbGV0IHR5cGVDb25jZXB0U3RyaW5nTmV3ID0gYXdhaXQgR2V0Q29uY2VwdChjb25jZXB0LnR5cGVJZCk7XG4gICAgICAgIC8vICAgICAgICAgICAgIGxldCBuZXdUeXBlQ29uY2VwdCA9IHR5cGVDb25jZXB0U3RyaW5nTmV3IGFzIENvbmNlcHQ7XG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbmNlcHQudHlwZSA9IG5ld1R5cGVDb25jZXB0O1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBjb25jZXB0LnR5cGUgPSB0eXBlQ29uY2VwdDtcbiAgICAgICAgcmV0dXJuIGNvbmNlcHQ7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdEFwaSB9IGZyb20gXCIuLi9hcHBcIjtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSBcIi4vQ3JlYXRlRGVmYXVsdENvbmNlcHRcIjtcbmltcG9ydCBNYWtlVGhlQ29uY2VwdCBmcm9tIFwiLi9NYWtlVGhlQ29uY2VwdFwiO1xuZXhwb3J0IGZ1bmN0aW9uIE1ha2VUaGVUaW1lc3RhbXAodHlwZSwgcmVmZXJlbnQsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JbmZvcm1hdGlvbklkID0gOTk5KSB7XG4gICAgdmFyIHNlc3Npb25JbmZvcm1hdGlvbklkLCBhY2Nlc3NJZDtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBzZXNzaW9uSW5mb3JtYXRpb25JZCA9IDk5OTtcbiAgICAgICAgdmFyIGNhdGVnb3J5SWQgPSA0O1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciByZWZlcmVudElkID0gMDtcbiAgICAgICAgdmFyIHJlZmVyZW50VXNlcklkID0gOTk5O1xuICAgICAgICB2YXIgc2VjdXJpdHlJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgc2Vzc2lvbkluZm9ybWF0aW9uVXNlcklkID0gdXNlcklkO1xuICAgICAgICBhY2Nlc3NJZCA9IDQ7XG4gICAgICAgIHZhciBhY2Nlc3NVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzdHJpbmdUb0NoZWNrID0gXCJcIjtcbiAgICAgICAgdmFyIHN0YXJ0c1dpdGhUaGUgPSB0eXBlLnN0YXJ0c1dpdGgoXCJ0aGVfXCIpO1xuICAgICAgICB2YXIgdHlwZUNvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICB2YXIgY29uY2VwdDtcbiAgICAgICAgaWYgKHN0YXJ0c1dpdGhUaGUpIHtcbiAgICAgICAgICAgIHN0cmluZ1RvQ2hlY2sgPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RyaW5nVG9DaGVjayA9IFwidGhlX1wiICsgdHlwZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZUNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHRBcGkoc3RyaW5nVG9DaGVjaywgdXNlcklkKTtcbiAgICAgICAgdHlwZUNvbmNlcHQgPSB0eXBlQ29uY2VwdFN0cmluZztcbiAgICAgICAgdmFyIGNvbmNlcHRTdHJpbmcgPSB5aWVsZCBNYWtlVGhlQ29uY2VwdChyZWZlcmVudCwgdXNlcklkLCBjYXRlZ29yeUlkLCB1c2VySWQsIHR5cGVDb25jZXB0LmlkLCB0eXBlQ29uY2VwdC51c2VySWQsIHJlZmVyZW50SWQsIHJlZmVyZW50VXNlcklkLCBzZWN1cml0eUlkLCBzZWN1cml0eVVzZXJJZCwgYWNjZXNzSWQsIGFjY2Vzc1VzZXJJZCwgc2Vzc2lvbkluZm9ybWF0aW9uSWQsIHNlc3Npb25JbmZvcm1hdGlvblVzZXJJZCk7XG4gICAgICAgIGNvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICByZXR1cm4gY29uY2VwdDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgQ3JlYXRlVGhlQ29uY2VwdEltbWVkaWF0ZSB9IGZyb20gXCIuL0NyZWF0ZVRoZUNvbmNlcHRcIjtcbmltcG9ydCBHZXRDb25jZXB0QnlDaGFyYWN0ZXIgZnJvbSBcIi4vR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyXCI7XG5pbXBvcnQgTWFrZVRoZUNoYXJhY3RlciBmcm9tIFwiLi9NYWtlVGhlQ2hhcmFjdGVyXCI7XG5pbXBvcnQgeyBTcGxpdFN0cmluZ3MgfSBmcm9tIFwiLi9TcGxpdFN0cmluZ3NcIjtcbmV4cG9ydCBmdW5jdGlvbiBNYWtlVGhlVHlwZUNvbmNlcHQodHlwZVN0cmluZywgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB2YXIgcmVmZXJlbnRJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5SWQgPSA5OTk7XG4gICAgICAgIHZhciBzZXNzaW9uSW5mb3JtYXRpb25Vc2VySWQgPSA5OTk7XG4gICAgICAgIHZhciBhY2Nlc3NJZCA9IDk5OTtcbiAgICAgICAgdmFyIHNlY3VyaXR5VXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgYWNjZXNzVXNlcklkID0gdXNlcklkO1xuICAgICAgICB2YXIgY2F0ZWdvcnlVc2VySWQgPSB1c2VySWQ7XG4gICAgICAgIHZhciBzZWN1cml0eVVzZXJJZCA9IHVzZXJJZDtcbiAgICAgICAgdmFyIGV4aXN0aW5nQ29uY2VwdCA9IHlpZWxkIEdldENvbmNlcHRCeUNoYXJhY3Rlcih0eXBlU3RyaW5nKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdCkge1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29uY2VwdC5pZCA9PSAwIHx8IGV4aXN0aW5nQ29uY2VwdC51c2VySWQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzcGxpdHRlZFN0cmluZ0FycmF5ID0gU3BsaXRTdHJpbmdzKHR5cGVTdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coc3BsaXR0ZWRTdHJpbmdBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdHRlZFN0cmluZ0FycmF5WzBdID09IHR5cGVTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25jZXB0U3RyaW5nID0geWllbGQgTWFrZVRoZUNoYXJhY3Rlcih0eXBlU3RyaW5nLCB1c2VySWQsIHNlY3VyaXR5SWQsIGFjY2Vzc0lkLCBhY2Nlc3NVc2VySWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NvbmNlcHQgPSBjb25jZXB0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5SWQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5Q29uY2VwdCA9IHlpZWxkIE1ha2VUaGVUeXBlQ29uY2VwdChzcGxpdHRlZFN0cmluZ0FycmF5WzBdLCBzZXNzaW9uSWQsIHNlc3Npb25Vc2VySWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZUNvbmNlcHQgPSB5aWVsZCBNYWtlVGhlVHlwZUNvbmNlcHQoc3BsaXR0ZWRTdHJpbmdBcnJheVsxXSwgc2Vzc2lvbklkLCBzZXNzaW9uVXNlcklkLCB1c2VySWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVDb25jZXB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNlcHQgPSB5aWVsZCBDcmVhdGVUaGVDb25jZXB0SW1tZWRpYXRlKHR5cGVTdHJpbmcsIHVzZXJJZCwgY2F0ZWdvcnlDb25jZXB0LmlkLCB1c2VySWQsIHR5cGVDb25jZXB0LmlkLCB1c2VySWQsIHJlZmVyZW50SWQsIHVzZXJJZCwgc2VjdXJpdHlJZCwgdXNlcklkLCBhY2Nlc3NJZCwgdXNlcklkLCBzZXNzaW9uSWQsIHVzZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdDb25jZXB0ID0gY29uY2VwdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb25jZXB0O1xuICAgIH0pO1xufVxuIiwiaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gXCIuLi8uLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsXCI7XG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaE1lc3NhZ2UodG9waWMsIG1lc3NhZ2UpIHtcbiAgICBpZiAoQmFzZVVybC5NUVRUX0NPTk5FQ1RJT04pIHtcbiAgICAgICAgQmFzZVVybC5NUVRUX0NPTk5FQ1RJT04ucHVibGlzaCh0b3BpYywgbWVzc2FnZSk7XG4gICAgfVxufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBTZWFyY2hJbnRlcm5hbEFwaSB9IGZyb20gXCIuLi8uLi9BcGkvU2VhcmNoL1NlYXJjaEludGVybmFsQXBpXCI7XG5pbXBvcnQgeyBWaWV3SW50ZXJuYWxEYXRhIH0gZnJvbSBcIi4uLy4uL2FwcFwiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaExpbmtJbnRlcm5hbChzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIGNvbmNlcHRzQ29ubmVjdGlvbnMgPSB5aWVsZCBTZWFyY2hJbnRlcm5hbEFwaShzZWFyY2hRdWVyeSwgdG9rZW4pO1xuICAgICAgICBsZXQgb3V0ID0geWllbGQgVmlld0ludGVybmFsRGF0YShjb25jZXB0c0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9KTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgU2VhcmNoTGlua011bHRpcGxlQXBpIH0gZnJvbSBcIi4uLy4uL0FwaS9TZWFyY2gvU2VhcmNoTGlua011bHRpcGxlQXBpXCI7XG5pbXBvcnQgeyBHZXRDb25uZWN0aW9uQnVsaywgR2V0VGhlQ29uY2VwdCB9IGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZEluT2JqZWN0IH0gZnJvbSBcIi4uL0dldENvbXBvc2l0aW9uQnVsa1wiO1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaExpbmtNdWx0aXBsZUFsbChzZWFyY2hRdWVyeSwgdG9rZW4gPSBcIlwiKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbmNlcHRzID0gW107XG4gICAgICAgIGxldCBjb25jZXB0c0Nvbm5lY3Rpb25zID0geWllbGQgU2VhcmNoTGlua011bHRpcGxlQXBpKHNlYXJjaFF1ZXJ5LCB0b2tlbik7XG4gICAgICAgIGxldCBtYWluQ29tcG9zaXRpb25JZCA9IHNlYXJjaFF1ZXJ5WzBdLmNvbXBvc2l0aW9uO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb25jZXB0c0Nvbm5lY3Rpb25zO1xuICAgICAgICBsZXQgY29uY2VwdElkcyA9IHJlc3VsdC5jb21wb3NpdGlvbklkcztcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0gcmVzdWx0LmludGVybmFsQ29ubmVjdGlvbnM7XG4gICAgICAgIGxldCBsaW5rZXJzID0gcmVzdWx0LmxpbmtlcnM7XG4gICAgICAgIGxldCByZXZlcnNlID0gcmVzdWx0LnJldmVyc2U7XG4gICAgICAgIGNvbmNlcHRzID0geWllbGQgR2V0Q29tcG9zaXRpb25Gcm9tQ29ubmVjdGlvbnNXaXRoRGF0YUlkSW5PYmplY3QoY29uY2VwdElkcywgY29ubmVjdGlvbnMpO1xuICAgICAgICBsZXQgb3V0ID0geWllbGQgRm9ybWF0RnJvbUNvbm5lY3Rpb25zKGxpbmtlcnMsIGNvbmNlcHRzLCBtYWluQ29tcG9zaXRpb25JZCwgcmV2ZXJzZSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0RnJvbUNvbm5lY3Rpb25zKGxpbmtlcnMsIGNvbXBvc2l0aW9uRGF0YSwgbWFpbkNvbXBvc2l0aW9uLCByZXZlcnNlID0gW10pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgbWFpbkRhdGEgPSB7fTtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0geWllbGQgR2V0Q29ubmVjdGlvbkJ1bGsobGlua2Vycyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXZlcnNlRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJldmVyc2UuaW5jbHVkZXMoY29ubmVjdGlvbnNbaV0uaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZUZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJldmVyc2VGbGFnID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLm9mVGhlQ29uY2VwdElkXSAmJiBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteWRhdGEgPSBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlua2VyQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbnNbaV0udHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0RhdGEgPSBteWRhdGEgPT09IG51bGwgfHwgbXlkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBteWRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKG5ld0RhdGEpWzBdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJldmVyc2VDaGFyYXRlciA9IGxpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWUgKyBcIl9yZXZlcnNlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdEYXRhW2tleV1bcmV2ZXJzZUNoYXJhdGVyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhW2tleV1bcmV2ZXJzZUNoYXJhdGVyXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS5vZlRoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtyZXZlcnNlQ2hhcmF0ZXJdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldW3JldmVyc2VDaGFyYXRlcl0ucHVzaChjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcyBpcyBlcnJvclwiLCBleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25EYXRhW2Nvbm5lY3Rpb25zW2ldLm9mVGhlQ29uY2VwdElkXSAmJiBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0udG9UaGVDb25jZXB0SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteWRhdGEgPSBjb21wb3NpdGlvbkRhdGFbY29ubmVjdGlvbnNbaV0ub2ZUaGVDb25jZXB0SWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlua2VyQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29ubmVjdGlvbnNbaV0udHlwZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0RhdGEgPSBteWRhdGEgPT09IG51bGwgfHwgbXlkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBteWRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKG5ld0RhdGEpWzBdO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RGF0YVtrZXldW2xpbmtlckNvbmNlcHQuY2hhcmFjdGVyVmFsdWVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdEYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVtrZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XVtsaW5rZXJDb25jZXB0LmNoYXJhY3RlclZhbHVlXS5wdXNoKGNvbXBvc2l0aW9uRGF0YVtjb25uZWN0aW9uc1tpXS50b1RoZUNvbmNlcHRJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzIGlzIGVycm9yXCIsIGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYWluRGF0YSA9IGNvbXBvc2l0aW9uRGF0YVttYWluQ29tcG9zaXRpb25dO1xuICAgICAgICByZXR1cm4gbWFpbkRhdGE7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBUb2tlblN0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vRGF0YVN0cnVjdHVyZXMvU2VjdXJpdHkvVG9rZW5TdG9yYWdlXCI7XG5leHBvcnQgZnVuY3Rpb24gR2V0UmVxdWVzdEhlYWRlcihjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJywgQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbixcbiAgICAgICAgJ0FjY2VwdCc6IEFjY2VwdCxcbiAgICB9O1xuICAgIHJldHVybiBoZWFkZXJzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEdldFJlcXVlc3RIZWFkZXJXaXRoQXV0aG9yaXphdGlvbihjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uJywgdG9rZW4gPSBcIlwiLCBBY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICBpZiAodG9rZW4gPT0gXCJcIikge1xuICAgICAgICB0b2tlbiA9IFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbjtcbiAgICB9XG4gICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIHRva2VuLFxuICAgICAgICAnQWNjZXB0JzogQWNjZXB0LFxuICAgIH07XG4gICAgcmV0dXJuIGhlYWRlcnM7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gU3BsaXRTdHJpbmdzKHR5cGVTdHJpbmcpIHtcbiAgICBjb25zdCBwb3MgPSB0eXBlU3RyaW5nLmxhc3RJbmRleE9mKFwiX1wiKTtcbiAgICBsZXQgU3BsaXR0ZWRTdHJpbmdzID0gW107XG4gICAgaWYgKHBvcyA+IDApIHtcbiAgICAgICAgdmFyIHJlc3QgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygwLCBwb3MpO1xuICAgICAgICB2YXIgbGFzdCA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEsIHR5cGVTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgU3BsaXR0ZWRTdHJpbmdzID0gW3Jlc3QsIGxhc3RdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgU3BsaXR0ZWRTdHJpbmdzID0gW3R5cGVTdHJpbmddO1xuICAgIH1cbiAgICByZXR1cm4gU3BsaXR0ZWRTdHJpbmdzO1xufVxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgSW5zZXJ0VW5pcXVlTnVtYmVyIGZyb20gJy4uL0hlbHBlcnMvVW5pcXVlSW5zZXJ0JztcbmltcG9ydCB7IENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkNvbm5lY3Rpb25BcnJheSwgQ2hlY2tJZlR5cGVDb25jZXB0c0V4aXN0c0luQXJyYXksIH0gZnJvbSAnLi4vSGVscGVycy9DaGVja0lmRXhpc3RzJztcbmltcG9ydCB7IFJlbW92ZUNvbmNlcHRGcm9tTGlzdCwgUmVtb3ZlQ29ubmVjdGlvbkZyb21MaXN0LCB9IGZyb20gJy4uL0hlbHBlcnMvUmVtb3ZlRnJvbUFycmF5JztcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRDb25jZXB0IH0gZnJvbSAnLi9DcmVhdGVEZWZhdWx0Q29uY2VwdCc7XG5pbXBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24gfSBmcm9tICcuLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uJztcbmltcG9ydCBHZXRUaGVDb25jZXB0IGZyb20gJy4vR2V0VGhlQ29uY2VwdCc7XG5pbXBvcnQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCBmcm9tICcuL01ha2VUaGVJbnN0YW5jZUNvbmNlcHQnO1xuaW1wb3J0IHsgY3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gJy4vQ3JlYXRlVGhlQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBEZWxldGVDb25uZWN0aW9uQnlJZCB9IGZyb20gJy4vRGVsZXRlQ29ubmVjdGlvbic7XG5pbXBvcnQgeyBTeW5jRGF0YSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL1N5bmNEYXRhJztcbmltcG9ydCB7IENvbXBvc2l0aW9uQmluYXJ5VHJlZSB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uQmluYXJ5VHJlZSc7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uL0RhdGFTdHJ1Y3R1cmVzL0NvbXBvc2l0aW9uL0NvbXBvc2l0aW9uJztcbmltcG9ydCB7IENyZWF0ZVRoZUNvbXBvc2l0aW9uV2l0aENhY2hlIH0gZnJvbSAnLi9Db21wb3NpdGlvbi9DcmVhdGVDb21wb3NpdGlvbkNhY2hlJztcbi8vIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgY2FjaGUgY29tcG9zaXRpb25cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFVwZGF0ZUNvbXBvc2l0aW9uKHBhdGNoZXJTdHJ1Y3R1cmUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBkZWZhdWx0IHVzZXJJZCwgc2Vzc2lvbklkLCBhY2Nlc3NJZCBwYXNzZWQgYnkgdGhlIHBhdGNoZXJTdHJ1Y3R1cmVcbiAgICAgICAgY29uc3QgdXNlcklkID0gcGF0Y2hlclN0cnVjdHVyZS51c2VySWQ7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuc2Vzc2lvbklkO1xuICAgICAgICBjb25zdCBhY2Nlc3NJZCA9IHBhdGNoZXJTdHJ1Y3R1cmUuYWNjZXNzSWQ7XG4gICAgICAgIGxldCBjb25uZWN0aW9uTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBjb25jZXB0TGlzdCA9IFtdO1xuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICBsZXQgcGFyZW50Q29uY2VwdCA9IENyZWF0ZURlZmF1bHRDb25jZXB0KCk7XG4gICAgICAgIGNvbnN0IHRvRGVsZXRlQ29uY2VwdHMgPSBbXTtcbiAgICAgICAgLy8gdGhlIG1haW4gY29tcG9zaXRpb24gSWQgdGhhdCBoYXMgdGhlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwYXRjaGVkXG4gICAgICAgIGxldCBjb21wb3NpdGlvbklkID0gcGF0Y2hlclN0cnVjdHVyZS5jb21wb3NpdGlvbklkO1xuICAgICAgICAvLyBpZiB5b3Ugd2FudCB0byBlZGl0IHRoZSBzdWJjb21wb3NpdGlvbnMgb2YgdGhlIGNvbXBvc2l0aW9uIHRoZW4geW91IGhhdmUgdG8gcGFzcyB0byB0aGlzXG4gICAgICAgIGNvbnN0IG9mVGhlQ29uY2VwdElkID0gcGF0Y2hlclN0cnVjdHVyZS5vZlRoZUNvbXBvc2l0aW9uSWQ7XG4gICAgICAgIGxldCB0b0RlbGV0ZUNvbm5lY3Rpb25zID0gW107XG4gICAgICAgIGlmIChjb21wb3NpdGlvbklkIDwgMCkge1xuICAgICAgICAgICAgbGV0IGxvY2FsQ29uY2VwdCA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29tcG9zaXRpb25JZCwgdXNlcklkKTtcbiAgICAgICAgICAgIGlmIChsb2NhbENvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25JZCA9IGxvY2FsQ29uY2VwdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGUgYmFja2VuZCBiZWNhdXNlIGl0IG5lZWRzIGxhdGVzdCBkYXRhXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25MaXN0U3RyaW5nID0geWllbGQgR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uKGNvbXBvc2l0aW9uSWQpO1xuICAgICAgICBjb25uZWN0aW9uTGlzdCA9IGNvbm5lY3Rpb25MaXN0U3RyaW5nO1xuICAgICAgICBjb25zdCBjb25jZXB0SWRMaXN0ID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0aW9uQ2FjaGUgPSBuZXcgQ29tcG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25MaXN0ID0gW107XG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuaWQgPSBjb21wb3NpdGlvbklkO1xuICAgICAgICAvLyBwdXQgdGhpcyBpbiB0aGUgdXBwZXIgc2VjdGlvbiBiZWZvcmUgdXBkYXRpbmcgYmVjYXVzZSB0aGlzIHdpbGwgdGVsbCBhbGwgb3RoZXIgZGlzdHJpYnV0ZWRcbiAgICAgICAgLy9zZXJ2ZXJzIHRvIGRlc3Ryb3kgdGhlIGNvcHkgb2YgdGhlIGNvbXBvc2l0aW9uIHRoYXQgdGhleSBoYXZlIGFzIG5ldyBjb21wb3NpdGlvbiBpcyBjb21pbmcgdXBcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5pc1VwZGF0aW5nKCk7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgYXJlIGluc2lkZSBvZiB0aGUgY29tcG9zaXRpb24gYW5kIHN0b3JlIHRoZW0gaW5cbiAgICAgICAgbGV0IGFsbENvbmNlcHRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ubmVjdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb21wb3NpdGlvbkxpc3QsIGNvbm5lY3Rpb25MaXN0W2ldLm9mVGhlQ29uY2VwdElkKTtcbiAgICAgICAgICAgIEluc2VydFVuaXF1ZU51bWJlcihjb25jZXB0SWRMaXN0LCBjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgICAgICBJbnNlcnRVbmlxdWVOdW1iZXIoY29uY2VwdElkTGlzdCwgY29ubmVjdGlvbkxpc3RbaV0udG9UaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgYWxsQ29uY2VwdHMucHVzaChjb25uZWN0aW9uTGlzdFtpXS5vZlRoZUNvbmNlcHRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5zdWJjb21wb3NpdGlvbnMgPSBjb21wb3NpdGlvbkxpc3Q7XG4gICAgICAgIGNvbXBvc2l0aW9uQ2FjaGUuY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uTGlzdDtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY29uY2VwdHMgdGhhdCBhcmUgaW5zaWRlIG9mIHRoZSBjb21wb3NpdGlvbiBhbmQgc3RvcmUgdGhlbSBpbiBhIGNvbmNlcHRMaXN0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uY2VwdElkTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29uY2VwdFN0cmluZyA9IHlpZWxkIEdldFRoZUNvbmNlcHQoY29uY2VwdElkTGlzdFtpXSk7XG4gICAgICAgICAgICBjb25zdCBjb25jZXB0ID0gY29uY2VwdFN0cmluZztcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbklkID09IGNvbmNlcHRJZExpc3RbaV0pIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbiA9IGNvbmNlcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2ZUaGVDb25jZXB0SWQgPT0gY29uY2VwdElkTGlzdFtpXSkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmNlcHQgPSBjb25jZXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uY2VwdExpc3QucHVzaChjb25jZXB0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgdHJ5aW5nIHRvIHBhdGNoIHRoZSBuZXcgb2JqZWN0IGludG8gdGhlIGNvbXBvc2l0aW9uXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHBhdGNoZXJTdHJ1Y3R1cmUucGF0Y2hPYmplY3Q7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgbGV0IGluc2VydGluZ0NvbmNlcHQgPSBDcmVhdGVEZWZhdWx0Q29uY2VwdCgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICAgIGxldCBsb2NhbENvbmNlcHQgPSBjb21wb3NpdGlvbjtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBpbW1lZGlkYXRlIHBhcmVudCBleGlzdHMgaW4gdGhlIGNvbXBvc2l0aW9uIChpLmUuIGZvciBtdWx0aWxldmVsIGNvbXBvc2l0aW9uKVxuICAgICAgICAgICAgaWYgKHBhcmVudENvbmNlcHQuaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxDb25jZXB0ID0gcGFyZW50Q29uY2VwdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRpbmdDb25jZXB0ID0geWllbGQgTWFrZVRoZUluc3RhbmNlQ29uY2VwdChrZXksIFwiXCIsIHRydWUsIGNvbXBvc2l0aW9uLnVzZXJJZCwgNCwgOTk5KTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbkNhY2hlLnN1YmNvbXBvc2l0aW9ucy5wdXNoKGluc2VydGluZ0NvbmNlcHQuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25jZXB0IGV4aXN0cyBpbiB0aGUgY29uY2VwdCBsaXN0IGJlY2F1c2UgaWYgaXQgZXhpc3RzIHRoZW4gd2UgaGF2ZSB0byBkZWxldGUgb2xkIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBFeGlzdGluZ0NvbmNlcHRzID0gQ2hlY2tJZlR5cGVDb25jZXB0c0V4aXN0c0luQXJyYXkoY29uY2VwdExpc3QsIGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBleGlzdGluZyBjb25jZXB0IHRoZW4gc3RhcnQgdGhlIHByb2Nlc3MgZm9yIGRlbGV0aW5nIHRoZSBjb25jZXB0IGluIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFeGlzdGluZ0NvbmNlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFeGlzdGluZ0NvbmNlcHRzW2ldLmlkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRpbmdDb25uZWN0aW9ucyA9IENoZWNrQWxsQ29ubmVjdGlvbnNDb25uZWN0ZWRJbkNvbm5lY3Rpb25BcnJheShjb21wb3NpdGlvbkNhY2hlLmNvbm5lY3Rpb25zLCBFeGlzdGluZ0NvbmNlcHRzW2ldLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29ubmVjdGlvbnMgPSB0b0RlbGV0ZUNvbm5lY3Rpb25zLmNvbmNhdChkZWxldGluZ0Nvbm5lY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvRGVsZXRlQ29uY2VwdHMucHVzaChFeGlzdGluZ0NvbmNlcHRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCBDcmVhdGVUaGVDb21wb3NpdGlvbldpdGhDYWNoZShvYmplY3Rba2V5XSwgaW5zZXJ0aW5nQ29uY2VwdC5pZCwgaW5zZXJ0aW5nQ29uY2VwdC51c2VySWQsIGNvbXBvc2l0aW9uLmlkLCBjb21wb3NpdGlvbi51c2VySWQsIDQsIDk5OSwgY29tcG9zaXRpb25DYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSBuZXcgY29uY2VwdCBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW5nQ29uY2VwdCA9IHlpZWxkIE1ha2VUaGVJbnN0YW5jZUNvbmNlcHQoa2V5LCB2YWx1ZSwgZmFsc2UsIHVzZXJJZCwgYWNjZXNzSWQsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGNvbmNlcHQgZXhpc3RzIGluIHRoZSBjb25jZXB0IGxpc3QgYmVjYXVzZSBpZiBpdCBleGlzdHMgdGhlbiB3ZSBoYXZlIHRvIGRlbGV0ZSBvbGQgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IEV4aXN0aW5nQ29uY2VwdHMgPSBDaGVja0lmVHlwZUNvbmNlcHRzRXhpc3RzSW5BcnJheShjb25jZXB0TGlzdCwgaW5zZXJ0aW5nQ29uY2VwdCk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGV4aXN0aW5nIGNvbmNlcHQgdGhlbiBzdGFydCB0aGUgcHJvY2VzcyBmb3IgZGVsZXRpbmcgdGhlIGNvbmNlcHQgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEV4aXN0aW5nQ29uY2VwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGluZ0Nvbm5lY3Rpb25zID0gQ2hlY2tBbGxDb25uZWN0aW9uc0Nvbm5lY3RlZEluQ29ubmVjdGlvbkFycmF5KGNvbXBvc2l0aW9uQ2FjaGUuY29ubmVjdGlvbnMsIEV4aXN0aW5nQ29uY2VwdHNbaV0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25uZWN0aW9ucyA9IHRvRGVsZXRlQ29ubmVjdGlvbnMuY29uY2F0KGRlbGV0aW5nQ29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9EZWxldGVDb25jZXB0cy5wdXNoKEV4aXN0aW5nQ29uY2VwdHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIG5ldyBjb25jZXB0IGFuZCB0aGUgb2xkIGNvbXBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0gY3JlYXRlVGhlQ29ubmVjdGlvbihsb2NhbENvbmNlcHQuaWQsIGxvY2FsQ29uY2VwdC51c2VySWQsIGluc2VydGluZ0NvbmNlcHQuaWQsIGluc2VydGluZ0NvbmNlcHQudXNlcklkLCBjb21wb3NpdGlvbi5pZCwgc2Vzc2lvbklkLCB1c2VySWQpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBjb25jZXB0TGlzdC5wdXNoKGluc2VydGluZ0NvbmNlcHQpO1xuICAgICAgICAgICAgY29tcG9zaXRpb25DYWNoZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyB5b3UgaGF2ZSB0byBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gYnVsa1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRvRGVsZXRlQ29ubmVjdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBjYWNoZSBsaXN0XG4gICAgICAgICAgICBSZW1vdmVDb25uZWN0aW9uRnJvbUxpc3QoY29tcG9zaXRpb25DYWNoZS5jb25uZWN0aW9ucywgdG9EZWxldGVDb25uZWN0aW9uc1tqXSk7XG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGNvbm5lY3Rpb24gaW4gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgIERlbGV0ZUNvbm5lY3Rpb25CeUlkKHRvRGVsZXRlQ29ubmVjdGlvbnNbal0uaWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFsc28gZGVsZXRlIHRoZSBleGlzdGluZyBjb25jZXB0IGZyb20gdGhlIGNhY2hlLlxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRvRGVsZXRlQ29uY2VwdHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb25jZXB0IGZyb20gdGhlIGNhY2hlIGNvbmNlcHQgbGlzdFxuICAgICAgICAgICAgUmVtb3ZlQ29uY2VwdEZyb21MaXN0KGNvbmNlcHRMaXN0LCB0b0RlbGV0ZUNvbmNlcHRzW2tdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgY3JlYXRlIGEgY29tcG9zaXRpb24gY2FjaGUgb2JqZWN0IHRvIGNhY2hlIGl0IGludG8gbm9kZSBzZXJ2ZXJcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5jb25jZXB0cyA9IGNvbXBvc2l0aW9uQ2FjaGUuY29uY2VwdHMuY29uY2F0KGNvbmNlcHRMaXN0KTtcbiAgICAgICAgY29tcG9zaXRpb25DYWNoZS5tYWluQ29uY2VwdCA9IGNvbXBvc2l0aW9uO1xuICAgICAgICBjb21wb3NpdGlvbkNhY2hlLmlkID0gY29tcG9zaXRpb24uaWQ7XG4gICAgICAgIC8vIC8vIGNyZWF0ZSBhIGNhY2hlXG4gICAgICAgIHlpZWxkIGNvbXBvc2l0aW9uQ2FjaGUudXBkYXRlQ2FjaGUoKTtcbiAgICAgICAgLy8gdXBkYXRlIGl0IHRoZSBiaW5hcnkgdHJlZVxuICAgICAgICBDb21wb3NpdGlvbkJpbmFyeVRyZWUuYWRkQ29tcG9zaXRpb25Ub1RyZWUoY29tcG9zaXRpb25DYWNoZSk7XG4gICAgICAgIFN5bmNEYXRhLlN5bmNEYXRhT25saW5lKCk7XG4gICAgICAgIGxldCB4ID0gY29tcG9zaXRpb25DYWNoZS5HZXREYXRhQ2FjaGUoKTtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IENyZWF0ZURlZmF1bHRMQ29uY2VwdCB9IGZyb20gJy4vLi4vLi4vU2VydmljZXMvTG9jYWwvQ3JlYXRlRGVmYXVsdExDb25jZXB0JztcbmltcG9ydCB7IFVzZXJCaW5hcnlUcmVlIH0gZnJvbSAnLi8uLi8uLi9EYXRhU3RydWN0dXJlcy9Vc2VyL1VzZXJCaW5hcnlUcmVlJztcbmltcG9ydCB7IExDb25uZWN0aW9uIH0gZnJvbSAnLi4vLi4vYXBwJztcbmV4cG9ydCBmdW5jdGlvbiBHZXRVc2VyR2hvc3RJZCh1c2VySWQsIGdob3N0SWQsIHNlc3Npb25JZCA9IDk5OSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB1c2VyTm9kZSA9IHlpZWxkIFVzZXJCaW5hcnlUcmVlLmdldE5vZGVGcm9tVHJlZSh1c2VySWQsIHNlc3Npb25JZCk7XG4gICAgICAgIGxldCByZWFsQ29uY2VwdCA9IENyZWF0ZURlZmF1bHRMQ29uY2VwdCgpO1xuICAgICAgICBpZiAodXNlck5vZGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXNlck5vZGUudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdENvbmNlcHQgPSB1c2VyTm9kZS52YWx1ZVtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGVzdENvbmNlcHQuZ2hvc3RJZCA9PSBnaG9zdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWxDb25jZXB0ID0gdGVzdENvbmNlcHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWFsQ29uY2VwdDtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHZXRVc2VyR2hvc3RDb25uZWN0aW9uSWQodXNlcklkLCBnaG9zdElkLCBzZXNzaW9uSWQgPSA5OTkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgdXNlck5vZGUgPSB5aWVsZCBVc2VyQmluYXJ5VHJlZS5nZXROb2RlRnJvbVRyZWUodXNlcklkLCBzZXNzaW9uSWQpO1xuICAgICAgICBsZXQgcmVhbENvbm5lY3Rpb24gPSBuZXcgTENvbm5lY3Rpb24oMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgICAgIGlmICh1c2VyTm9kZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyTm9kZS5jb25uZWN0aW9uVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdENvbm5lY3Rpb24gPSB1c2VyTm9kZS5jb25uZWN0aW9uVmFsdWVbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RDb25uZWN0aW9uLmdob3N0SWQgPT0gZ2hvc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZWFsQ29ubmVjdGlvbiA9IHRlc3RDb25uZWN0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVhbENvbm5lY3Rpb247XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQWRkR2hvc3RDb25jZXB0KGNvbmNlcHQsIHVzZXJJZCwgc2Vzc2lvbklkID0gOTk5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgVXNlckJpbmFyeVRyZWUuYWRkQ29uY2VwdFRvVHJlZShjb25jZXB0LCB1c2VySWQsIHNlc3Npb25JZCk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gQWRkR2hvc3RDb25uZWN0aW9uKGNvbm5lY3Rpb24sIHVzZXJJZCwgc2Vzc2lvbklkID0gOTk5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgVXNlckJpbmFyeVRyZWUuYWRkQ29ubmVjdGlvblRvVHJlZShjb25uZWN0aW9uLCB1c2VySWQsIHNlc3Npb25JZCk7XG4gICAgfSk7XG59XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFZpZXdJbnRlcm5hbERhdGFBcGkgfSBmcm9tIFwiLi4vLi4vQXBpL1ZpZXcvVmlld0ludGVybmFsRGF0YUFwaVwiO1xuaW1wb3J0IHsgR2V0VGhlQ29uY2VwdCwgcmVjdXJzaXZlRmV0Y2ggfSBmcm9tIFwiLi4vLi4vYXBwXCI7XG5leHBvcnQgZnVuY3Rpb24gVmlld0ludGVybmFsRGF0YShpZHMpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0geWllbGQgVmlld0ludGVybmFsRGF0YUFwaShpZHMpO1xuICAgICAgICBsZXQgb3V0cHV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBpZHNbaV07XG4gICAgICAgICAgICBsZXQgbG9jYWxDb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zW2lkXTtcbiAgICAgICAgICAgIGlmIChpZCAmJiBsb2NhbENvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHRzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGZvcm1hdHRlZE91dHB1dCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWxDb25uZWN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmNlcHRzLmluY2x1ZGVzKGxvY2FsQ29ubmVjdGlvbnNbal0ub2ZUaGVDb25jZXB0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jZXB0cy5wdXNoKGxvY2FsQ29ubmVjdGlvbnNbal0ub2ZUaGVDb25jZXB0SWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBvdXQgPSB5aWVsZCByZWN1cnNpdmVGZXRjaChpZCwgbG9jYWxDb25uZWN0aW9ucywgY29uY2VwdHMpO1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZE91dHB1dC5kYXRhID0gb3V0O1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZE91dHB1dC5pZCA9IGlkO1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGZvcm1hdHRlZE91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZm9ybWF0dGVkT3V0cHV0ID0ge307XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkT3V0cHV0LmlkID0gaWQ7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcHQgPSB5aWVsZCBHZXRUaGVDb25jZXB0KGlkKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9jb25uID0ge307XG4gICAgICAgICAgICAgICAgaWYgKGNvbmNlcHQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBub2Nvbm5bKF9hID0gY29uY2VwdCA9PT0gbnVsbCB8fCBjb25jZXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25jZXB0LnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGFyYWN0ZXJWYWx1ZV0gPSBjb25jZXB0LmNoYXJhY3RlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRPdXRwdXQuZGF0YSA9IG5vY29ubjtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goZm9ybWF0dGVkT3V0cHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbn1cbiIsImV4cG9ydCB7IGluaXQsIHVwZGF0ZUFjY2Vzc1Rva2VuIH07XG5pbXBvcnQgQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhIGZyb20gJy4vU2VydmljZXMvQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhJztcbmltcG9ydCB7IElkZW50aWZpZXJGbGFncyB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvSWRlbnRpZmllckZsYWdzJztcbmV4cG9ydCB7IFNwbGl0U3RyaW5ncyB9IGZyb20gJy4vU2VydmljZXMvU3BsaXRTdHJpbmdzJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uTGlzdCwgR2V0Q29tcG9zaXRpb25MaXN0V2l0aElkIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkxpc3QnO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25MaXN0TG9jYWwsIEdldENvbXBvc2l0aW9uTGlzdExvY2FsV2l0aElkIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9HZXRDb21wb3NpdGlvbkxpc3RMb2NhbCc7XG5leHBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24gfSBmcm9tICcuL0FwaS9HZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb24sIEdldENvbXBvc2l0aW9uV2l0aElkLCByZWN1cnNpdmVGZXRjaCwgR2V0Q29tcG9zaXRpb25XaXRoQWxsSWRzIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbic7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbkxvY2FsLCBHZXRDb21wb3NpdGlvbkxvY2FsV2l0aElkIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9HZXRDb21wb3NpdGlvbkxvY2FsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3JlYXRlQ29tcG9zaXRpb24gfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbXBvc2l0aW9uJztcbmV4cG9ydCB7IENyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL0NyZWF0ZVRoZUNvbXBvc2l0aW9uTG9jYWwnO1xuZXhwb3J0IHsgQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0cywgQ3JlYXRlQ29ubmVjdGlvbkJldHdlZW5Ud29Db25jZXB0c0dlbmVyYWwgfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZUNvbm5lY3Rpb25CZXR3ZWVuVHdvQ29uY2VwdHMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHZXRUaGVDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRUaGVDb25jZXB0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWFrZVRoZUluc3RhbmNlQ29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvTWFrZVRoZUluc3RhbmNlQ29uY2VwdCc7XG5leHBvcnQgeyBNYWtlVGhlSW5zdGFuY2VDb25jZXB0TG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0xvY2FsL01ha2VUaGVJbnN0YW5jZUNvbmNlcHRMb2NhbCc7XG5leHBvcnQgeyBzdG9yZVRvRGF0YWJhc2UsIGdldEZyb21EYXRhYmFzZVdpdGhUeXBlLCBnZXRGcm9tRGF0YWJhc2VXaXRoVHlwZU9sZCB9IGZyb20gJy4vRGF0YWJhc2UvTm9JbmRleERiJztcbmV4cG9ydCB7IGNyZWF0ZVRoZUNvbm5lY3Rpb24gYXMgQ3JlYXRlVGhlQ29ubmVjdGlvbiB9IGZyb20gJy4vU2VydmljZXMvQ3JlYXRlVGhlQ29ubmVjdGlvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdldENvbmNlcHRCeUNoYXJhY3RlciB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29uY2VwdEJ5Q2hhcmFjdGVyJztcbmV4cG9ydCB7IEdldExpbmssIEdldExpbmtSYXcgfSBmcm9tICcuL1NlcnZpY2VzL0dldExpbmsnO1xuZXhwb3J0IHsgQ3JlYXRlRGVmYXVsdENvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZURlZmF1bHRDb25jZXB0JztcbmV4cG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdCB9IGZyb20gJy4vU2VydmljZXMvTWFrZVRoZVR5cGVDb25jZXB0JztcbmV4cG9ydCB7IE1ha2VUaGVUeXBlQ29uY2VwdEFwaSB9IGZyb20gJy4vQXBpL01ha2VUaGVUeXBlQ29uY2VwdEFwaSc7XG5leHBvcnQgeyBHZXRMaW5rZXJDb25uZWN0aW9uRnJvbUNvbmNlcHRzLCBHZXRMaW5rZXJDb25uZWN0aW9uVG9Db25jZXB0cyB9IGZyb20gJy4vU2VydmljZXMvR2V0TGlua2VyQ29ubmVjdGlvbkZyb21Db25jZXB0JztcbmV4cG9ydCB7IERlbGV0ZUNvbmNlcHRCeUlkIH0gZnJvbSAnLi9TZXJ2aWNlcy9EZWxldGVDb25jZXB0JztcbmV4cG9ydCB7IERlbGV0ZUNvbm5lY3Rpb25CeUlkIH0gZnJvbSAnLi9TZXJ2aWNlcy9EZWxldGVDb25uZWN0aW9uJztcbmV4cG9ydCB7IFRyYXNoVGhlQ29uY2VwdCB9IGZyb20gJy4vQXBpL0RlbGV0ZS9EZWxldGVDb25jZXB0SW5CYWNrZW5kJztcbmV4cG9ydCB7IEdldENvbm5lY3Rpb25CeUlkIH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb25uZWN0aW9ucyc7XG5leHBvcnQgeyBNYWtlVGhlVGltZXN0YW1wIH0gZnJvbSAnLi9TZXJ2aWNlcy9NYWtlVGhlVGltZXN0YW1wJztcbmV4cG9ydCB7IFJlY3Vyc2l2ZVNlYXJjaEFwaSB9IGZyb20gJy4vQXBpL1JlY3Vyc2l2ZVNlYXJjaCc7XG5leHBvcnQgeyBHZXRDb21wb3NpdGlvbkJ1bGtXaXRoRGF0YUlkLCBHZXRDb21wb3NpdGlvbkJ1bGssIEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZCB9IGZyb20gJy4vU2VydmljZXMvR2V0Q29tcG9zaXRpb25CdWxrJztcbmV4cG9ydCB7IEdldENvbmNlcHRCdWxrIH0gZnJvbSAnLi9BcGkvR2V0Q29uY2VwdEJ1bGsnO1xuZXhwb3J0IHsgR2V0Q29ubmVjdGlvbkJ1bGsgfSBmcm9tICcuL0FwaS9HZXRDb25uZWN0aW9uQnVsayc7XG5leHBvcnQgeyBHZXRBbGxDb25uZWN0aW9uc09mQ29tcG9zaXRpb25CdWxrIH0gZnJvbSAnLi9BcGkvR2V0QWxsQ29ubmVjdGlvbnNPZkNvbXBvc2l0aW9uQnVsayc7XG5leHBvcnQgeyBMb2dpblRvQmFja2VuZCB9IGZyb20gJy4vQXBpL0xvZ2luJztcbmV4cG9ydCB7IEdldENvbm5lY3Rpb25PZlRoZUNvbmNlcHQgfSBmcm9tICcuL0FwaS9HZXRDb25uZWN0aW9uT2ZUaGVDb25jZXB0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2lnbnVwIH0gZnJvbSAnLi9BcGkvU2lnbnVwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2lnbmluIH0gZnJvbSAnLi9BcGkvU2lnbmluJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVXBkYXRlQ29tcG9zaXRpb24gfSBmcm9tICcuL1NlcnZpY2VzL1VwZGF0ZUNvbXBvc2l0aW9uJztcbmV4cG9ydCB7IFNlYXJjaEFsbENvbmNlcHRzIH0gZnJvbSAnLi9BcGkvU2VhcmNoL1NlYXJjaCc7XG5leHBvcnQgeyBTZWFyY2hXaXRoTGlua2VyIH0gZnJvbSAnLi9BcGkvU2VhcmNoL1NlYXJjaFdpdGhMaW5rZXInO1xuZXhwb3J0IHsgR2V0Q29tcG9zaXRpb25XaXRoQ2FjaGUsIEdldENvbXBvc2l0aW9uV2l0aERhdGFJZFdpdGhDYWNoZSwgR2V0Q29tcG9zaXRpb25XaXRoRGF0YUlkQnVsayB9IGZyb20gJy4vU2VydmljZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb25DYWNoZSc7XG5leHBvcnQgeyBDcmVhdGVTZXNzaW9uIH0gZnJvbSAnLi9BcGkvU2Vzc2lvbi9DcmVhdGVTZXNzaW9uJztcbmV4cG9ydCB7IENyZWF0ZVNlc3Npb25WaXNpdCB9IGZyb20gJy4vQXBpL1Nlc3Npb24vQ3JlYXRlU2Vzc2lvblZpc2l0JztcbmV4cG9ydCB7IEdldFJlbGF0aW9uLCBHZXRSZWxhdGlvblJhdyB9IGZyb20gJy4vU2VydmljZXMvR2V0UmVsYXRpb24nO1xuZXhwb3J0IHsgcmVjdXJzaXZlRmV0Y2hOZXcgfSBmcm9tICcuL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0J1aWxkQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgQ3JlYXRlVGhlQ29tcG9zaXRpb25XaXRoQ2FjaGUgfSBmcm9tICcuL1NlcnZpY2VzL0NvbXBvc2l0aW9uL0NyZWF0ZUNvbXBvc2l0aW9uQ2FjaGUnO1xuZXhwb3J0IHsgQ3JlYXRlRGVmYXVsdExDb25jZXB0IH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVEZWZhdWx0TENvbmNlcHQnO1xuZXhwb3J0IHsgQ3JlYXRlVGhlQ29ubmVjdGlvbkdlbmVyYWwgfSBmcm9tICcuL1NlcnZpY2VzL0NyZWF0ZVRoZUNvbm5lY3Rpb25HZW5lcmFsJztcbmV4cG9ydCB7IENyZWF0ZVRoZUNvbm5lY3Rpb25Mb2NhbCB9IGZyb20gJy4vU2VydmljZXMvTG9jYWwvQ3JlYXRlVGhlQ29ubmVjdGlvbkxvY2FsJztcbmV4cG9ydCB7IEdldFVzZXJHaG9zdElkLCBBZGRHaG9zdENvbmNlcHQsIEdldFVzZXJHaG9zdENvbm5lY3Rpb25JZCwgQWRkR2hvc3RDb25uZWN0aW9uIH0gZnJvbSAnLi9TZXJ2aWNlcy9Vc2VyL1VzZXJUcmFuc2xhdGlvbic7XG5leHBvcnQgeyBTZWFyY2hMaW5rTXVsdGlwbGVBbGwsIEZvcm1hdEZyb21Db25uZWN0aW9ucyB9IGZyb20gJy4vU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtNdWx0aXBsZSc7XG5leHBvcnQgeyBVcGRhdGVDb21wb3NpdGlvbkxvY2FsIH0gZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9VcGRhdGVDb21wb3NpdGlvbkxvY2FsJztcbmV4cG9ydCB7IEdldENvbXBvc2l0aW9uRnJvbUNvbm5lY3Rpb25zV2l0aERhdGFJZEluT2JqZWN0IH0gZnJvbSAnLi9TZXJ2aWNlcy9HZXRDb21wb3NpdGlvbkJ1bGsnO1xuZXhwb3J0IHsgVmlld0ludGVybmFsRGF0YSB9IGZyb20gJy4vU2VydmljZXMvVmlldy9WaWV3SW50ZXJuYWxEYXRhJztcbmV4cG9ydCB7IGNvbnZlcnRGcm9tTENvbmNlcHRUb0NvbmNlcHQgfSBmcm9tICcuL1NlcnZpY2VzL0NvbnZlcnNpb24vQ29udmVydENvbmNlcHRzJztcbmV4cG9ydCB7IFNlYXJjaExpbmtJbnRlcm5hbCB9IGZyb20gJy4vU2VydmljZXMvU2VhcmNoL1NlYXJjaExpbmtJbnRlcm5hbCc7XG5leHBvcnQgeyBTeW5jRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU3luY0RhdGEnO1xuZXhwb3J0IHsgQ29uY2VwdCB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29uY2VwdCc7XG5leHBvcnQgeyBMQ29uY2VwdCB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvTG9jYWwvTENvbmNlcHQnO1xuZXhwb3J0IHsgTENvbm5lY3Rpb24gfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0xvY2FsL0xDb25uZWN0aW9uJztcbmV4cG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL0Nvbm5lY3Rpb24nO1xuZXhwb3J0IHsgQ29uY2VwdHNEYXRhIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db25jZXB0RGF0YSc7XG5leHBvcnQgeyBDb25uZWN0aW9uRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29ubmVjdGlvbkRhdGEnO1xuZXhwb3J0IHsgQmluYXJ5VHJlZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQmluYXJ5VHJlZSc7XG5leHBvcnQgeyBTZWFyY2hRdWVyeSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU2VhcmNoUXVlcnknO1xuZXhwb3J0IHsgUGF0Y2hlclN0cnVjdHVyZSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvUGF0Y2hlclN0cnVjdHVyZSc7XG5leHBvcnQgeyBTZXNzaW9uRGF0YSB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvU2Vzc2lvbi9TZXNzaW9uRGF0YSc7XG5leHBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQ29tcG9zaXRpb24vQ29tcG9zaXRpb24nO1xuZXhwb3J0IHsgQ29tcG9zaXRpb25CaW5hcnlUcmVlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbkJpbmFyeVRyZWUnO1xuZXhwb3J0IHsgQ29tcG9zaXRpb25Ob2RlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9Db21wb3NpdGlvbi9Db21wb3NpdGlvbk5vZGUnO1xuZXhwb3J0IHsgVXNlckJpbmFyeVRyZWUgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1VzZXIvVXNlckJpbmFyeVRyZWUnO1xuZXhwb3J0IHsgRmlsdGVyU2VhcmNoIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9GaWx0ZXJTZWFyY2gnO1xuZXhwb3J0IHsgU2VhcmNoU3RydWN0dXJlIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9TZWFyY2gvU2VhcmNoU3RydWN0dXJlJztcbmltcG9ydCB7IEdldERhdGFGcm9tSW5kZXhEYiwgR2V0RGF0YUZyb21JbmRleERiTG9jYWwgfSBmcm9tICcuL1NlcnZpY2VzL0dldERhdGFGcm9tSW5kZXhEYic7XG5pbXBvcnQgQ3JlYXRlTG9jYWxCaW5hcnlUcmVlRnJvbURhdGEgZnJvbSAnLi9TZXJ2aWNlcy9Mb2NhbC9DcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YSc7XG5pbXBvcnQgSW5pdGlhbGl6ZVN5c3RlbSBmcm9tICcuL1NlcnZpY2VzL0luaXRpYWxpemVTeXN0ZW0nO1xuaW1wb3J0IHsgQmFzZVVybCB9IGZyb20gJy4vRGF0YVN0cnVjdHVyZXMvQmFzZVVybCc7XG5pbXBvcnQgeyBUb2tlblN0b3JhZ2UgfSBmcm9tICcuL0RhdGFTdHJ1Y3R1cmVzL1NlY3VyaXR5L1Rva2VuU3RvcmFnZSc7XG5leHBvcnQgeyBCYXNlVXJsIH0gZnJvbSAnLi9EYXRhU3RydWN0dXJlcy9CYXNlVXJsJztcbmZ1bmN0aW9uIHVwZGF0ZUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuID0gXCJcIikge1xuICAgIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xufVxuZnVuY3Rpb24gaW5pdCh1cmwgPSBcIlwiLCBhaXVybCA9IFwiXCIsIGFjY2Vzc1Rva2VuID0gXCJcIikge1xuICAgIEJhc2VVcmwuQkFTRV9VUkwgPSB1cmw7XG4gICAgQmFzZVVybC5BSV9VUkwgPSBhaXVybDtcbiAgICBjb25zb2xlLmxvZyhcIlRoaXMgaXN0IGhlIGJhc2UgdXJsXCIsIEJhc2VVcmwuQkFTRV9VUkwpO1xuICAgIFRva2VuU3RvcmFnZS5CZWFyZXJBY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xuICAgIEluaXRpYWxpemVTeXN0ZW0oKS50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgQ3JlYXRlQmluYXJ5VHJlZUZyb21EYXRhKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNEYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0NoYXJhY3RlckxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNUeXBlTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBlbGFwc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIHRpbWUgdGFrZW4gdG8gcHJlcGFyZSBjb25jZXB0ICBkYXRhIGlzICBcIiwgZWxhcHNlZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBDcmVhdGVMb2NhbEJpbmFyeVRyZWVGcm9tRGF0YSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzTG9jYWxEYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0xvY2FsVHlwZUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBJZGVudGlmaWVyRmxhZ3MuaXNMb2NhbENoYXJhY3RlckxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRoZSB0aW1lIHRha2VuIHRvIHByZXBhcmUgbG9jYWwgY29uY2VwdCAgXCIsIGVsYXBzZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgR2V0RGF0YUZyb21JbmRleERiTG9jYWwoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0xvY2FsQ29ubmVjdGlvbkxvYWRlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBHZXREYXRhRnJvbUluZGV4RGIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIElkZW50aWZpZXJGbGFncy5pc0Nvbm5lY3Rpb25Mb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgSWRlbnRpZmllckZsYWdzLmlzQ29ubmVjdGlvblR5cGVMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJUaGUgdGltZSB0YWtlbiB0byBwcmVwYXJlIGNvbm5lY3Rpb25zICBcIiwgZWxhcHNlZCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oXCIuL3NyYy9hcHAudHNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=