oxygen-cli 1.25.0-beta.2 → 1.25.0

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.
Files changed (265) hide show
  1. package/.husky/pre-commit +4 -0
  2. package/CHANGELOG.md +65 -0
  3. package/build/core/OxygenCore.js +36 -257
  4. package/build/core/OxygenEvents.js +1 -11
  5. package/build/core/OxygenModule.js +1 -14
  6. package/build/core/OxygenService.js +1 -12
  7. package/build/core/OxygenSubModule.js +1 -10
  8. package/build/core/WebDriverModule.js +1 -30
  9. package/build/core/utils.js +1 -17
  10. package/build/errors/HookError.js +1 -7
  11. package/build/errors/ModuleError.js +1 -7
  12. package/build/errors/ModuleUnavailableError.js +1 -3
  13. package/build/errors/OxygenError.js +1 -33
  14. package/build/errors/ScriptNotFound.js +1 -7
  15. package/build/errors/helper.js +46 -77
  16. package/build/index.js +6 -18
  17. package/build/lib/cli-util.js +28 -90
  18. package/build/lib/cli.js +1 -23
  19. package/build/lib/debugger.js +1 -144
  20. package/build/lib/img-merge.js +1 -15
  21. package/build/lib/launcher.js +1 -28
  22. package/build/lib/moduleRequire.js +1 -4
  23. package/build/lib/param-manager.js +1 -28
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/util.js +3 -58
  28. package/build/model/case-result.js +1 -2
  29. package/build/model/failure.js +1 -2
  30. package/build/model/status.js +1 -2
  31. package/build/model/step-result.js +1 -2
  32. package/build/model/suite-result.js +1 -2
  33. package/build/model/test-result.js +1 -2
  34. package/build/model/testcase.js +1 -2
  35. package/build/model/testsuite.js +1 -2
  36. package/build/ox_modules/index.js +13 -33
  37. package/build/ox_modules/module-assert.js +8 -24
  38. package/build/ox_modules/module-date.js +3 -8
  39. package/build/ox_modules/module-db.js +7 -28
  40. package/build/ox_modules/module-email.js +10 -36
  41. package/build/ox_modules/module-eyes.js +5 -46
  42. package/build/ox_modules/module-http.js +42 -104
  43. package/build/ox_modules/module-log.js +5 -22
  44. package/build/ox_modules/module-mailinator.js +10 -32
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -2
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -2
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -6
  48. package/build/ox_modules/module-mob/commands/assertText.js +1 -3
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -4
  50. package/build/ox_modules/module-mob/commands/assertValue.js +9 -15
  51. package/build/ox_modules/module-mob/commands/back.js +1 -2
  52. package/build/ox_modules/module-mob/commands/clear.js +1 -4
  53. package/build/ox_modules/module-mob/commands/click.js +3 -4
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -9
  55. package/build/ox_modules/module-mob/commands/clickLong.js +1 -2
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -4
  57. package/build/ox_modules/module-mob/commands/closeApp.js +1 -2
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -2
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -12
  61. package/build/ox_modules/module-mob/commands/execute.js +1 -2
  62. package/build/ox_modules/module-mob/commands/findElement.js +1 -3
  63. package/build/ox_modules/module-mob/commands/findElements.js +1 -4
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -2
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -2
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -10
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -2
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -2
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -9
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -2
  71. package/build/ox_modules/module-mob/commands/getLocation.js +1 -2
  72. package/build/ox_modules/module-mob/commands/getSource.js +1 -2
  73. package/build/ox_modules/module-mob/commands/getText.js +1 -4
  74. package/build/ox_modules/module-mob/commands/getTitle.js +1 -2
  75. package/build/ox_modules/module-mob/commands/getUrl.js +1 -2
  76. package/build/ox_modules/module-mob/commands/getValue.js +5 -9
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -2
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -2
  79. package/build/ox_modules/module-mob/commands/index.js +19 -94
  80. package/build/ox_modules/module-mob/commands/installApp.js +1 -2
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -2
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -2
  83. package/build/ox_modules/module-mob/commands/isChecked.js +1 -2
  84. package/build/ox_modules/module-mob/commands/isClickable.js +1 -2
  85. package/build/ox_modules/module-mob/commands/isExist.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isSelected.js +1 -2
  87. package/build/ox_modules/module-mob/commands/isVisible.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -2
  89. package/build/ox_modules/module-mob/commands/launchApp.js +1 -2
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -2
  91. package/build/ox_modules/module-mob/commands/open.js +1 -3
  92. package/build/ox_modules/module-mob/commands/pause.js +1 -2
  93. package/build/ox_modules/module-mob/commands/removeApp.js +1 -2
  94. package/build/ox_modules/module-mob/commands/resetApp.js +1 -2
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -6
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -2
  97. package/build/ox_modules/module-mob/commands/select.js +1 -4
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -4
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -26
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -9
  101. package/build/ox_modules/module-mob/commands/setContext.js +1 -2
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -2
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -2
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -6
  105. package/build/ox_modules/module-mob/commands/shake.js +1 -2
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -2
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -6
  108. package/build/ox_modules/module-mob/commands/swipe.js +1 -2
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -2
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -2
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -2
  112. package/build/ox_modules/module-mob/commands/tap.js +1 -2
  113. package/build/ox_modules/module-mob/commands/type.js +3 -7
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -10
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -2
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -3
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -2
  118. package/build/ox_modules/module-mob.js +72 -142
  119. package/build/ox_modules/module-pdf.js +23 -62
  120. package/build/ox_modules/module-proxy.js +8 -68
  121. package/build/ox_modules/module-serial.js +7 -32
  122. package/build/ox_modules/module-shell.js +8 -27
  123. package/build/ox_modules/module-soap.js +14 -47
  124. package/build/ox_modules/module-twilio.js +10 -53
  125. package/build/ox_modules/module-utils.js +16 -51
  126. package/build/ox_modules/module-web/commands/alertAccept.js +1 -2
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -2
  128. package/build/ox_modules/module-web/commands/assertAlert.js +1 -6
  129. package/build/ox_modules/module-web/commands/assertExist.js +1 -2
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -4
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertText.js +1 -3
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -6
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -6
  135. package/build/ox_modules/module-web/commands/assertTitle.js +1 -3
  136. package/build/ox_modules/module-web/commands/assertValue.js +1 -3
  137. package/build/ox_modules/module-web/commands/back.js +1 -2
  138. package/build/ox_modules/module-web/commands/clear.js +1 -5
  139. package/build/ox_modules/module-web/commands/click.js +4 -13
  140. package/build/ox_modules/module-web/commands/clickHidden.js +2 -7
  141. package/build/ox_modules/module-web/commands/closeWindow.js +1 -2
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -2
  144. package/build/ox_modules/module-web/commands/deselect.js +1 -2
  145. package/build/ox_modules/module-web/commands/doubleClick.js +3 -9
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -2
  147. package/build/ox_modules/module-web/commands/execute.js +1 -2
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -10
  149. package/build/ox_modules/module-web/commands/findElement.js +1 -3
  150. package/build/ox_modules/module-web/commands/findElements.js +1 -4
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -2
  152. package/build/ox_modules/module-web/commands/getAlertText.js +1 -2
  153. package/build/ox_modules/module-web/commands/getAttribute.js +1 -4
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -3
  155. package/build/ox_modules/module-web/commands/getCookies.js +1 -2
  156. package/build/ox_modules/module-web/commands/getCssValue.js +1 -4
  157. package/build/ox_modules/module-web/commands/getElementCount.js +1 -2
  158. package/build/ox_modules/module-web/commands/getHTML.js +1 -2
  159. package/build/ox_modules/module-web/commands/getSource.js +1 -2
  160. package/build/ox_modules/module-web/commands/getText.js +1 -4
  161. package/build/ox_modules/module-web/commands/getTitle.js +1 -2
  162. package/build/ox_modules/module-web/commands/getUrl.js +1 -2
  163. package/build/ox_modules/module-web/commands/getValue.js +1 -5
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -2
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -2
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -5
  167. package/build/ox_modules/module-web/commands/index.js +26 -99
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -2
  169. package/build/ox_modules/module-web/commands/isChecked.js +1 -2
  170. package/build/ox_modules/module-web/commands/isExist.js +1 -3
  171. package/build/ox_modules/module-web/commands/isInteractable.js +33 -0
  172. package/build/ox_modules/module-web/commands/isSelected.js +1 -2
  173. package/build/ox_modules/module-web/commands/isVisible.js +1 -3
  174. package/build/ox_modules/module-web/commands/makeVisible.js +2 -10
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -2
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -2
  177. package/build/ox_modules/module-web/commands/newWindow.js +1 -2
  178. package/build/ox_modules/module-web/commands/open.js +1 -4
  179. package/build/ox_modules/module-web/commands/pause.js +1 -2
  180. package/build/ox_modules/module-web/commands/point.js +1 -2
  181. package/build/ox_modules/module-web/commands/pointJS.js +2 -8
  182. package/build/ox_modules/module-web/commands/refresh.js +1 -2
  183. package/build/ox_modules/module-web/commands/rightClick.js +3 -8
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -2
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -2
  186. package/build/ox_modules/module-web/commands/select.js +1 -5
  187. package/build/ox_modules/module-web/commands/selectFrame.js +1 -3
  188. package/build/ox_modules/module-web/commands/selectWindow.js +5 -26
  189. package/build/ox_modules/module-web/commands/sendKeys.js +3 -6
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +1 -2
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -2
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -5
  194. package/build/ox_modules/module-web/commands/type.js +1 -5
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +6 -11
  196. package/build/ox_modules/module-web/commands/waitForExist.js +1 -2
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -2
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -8
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -5
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -5
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -5
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -5
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -2
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -21
  205. package/build/ox_modules/module-web.js +86 -192
  206. package/build/ox_modules/module-win/commands/assertText.js +1 -3
  207. package/build/ox_modules/module-win/commands/assertTitle.js +1 -4
  208. package/build/ox_modules/module-win/commands/assertValue.js +9 -15
  209. package/build/ox_modules/module-win/commands/back.js +1 -2
  210. package/build/ox_modules/module-win/commands/clear.js +1 -4
  211. package/build/ox_modules/module-win/commands/click.js +1 -2
  212. package/build/ox_modules/module-win/commands/clickLong.js +1 -2
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -4
  214. package/build/ox_modules/module-win/commands/findElement.js +1 -3
  215. package/build/ox_modules/module-win/commands/findElements.js +1 -4
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -2
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -2
  218. package/build/ox_modules/module-win/commands/getLocation.js +1 -2
  219. package/build/ox_modules/module-win/commands/getSource.js +1 -2
  220. package/build/ox_modules/module-win/commands/getText.js +1 -4
  221. package/build/ox_modules/module-win/commands/getValue.js +5 -9
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -2
  223. package/build/ox_modules/module-win/commands/index.js +5 -43
  224. package/build/ox_modules/module-win/commands/isCheckable.js +1 -2
  225. package/build/ox_modules/module-win/commands/isChecked.js +1 -2
  226. package/build/ox_modules/module-win/commands/isClickable.js +1 -2
  227. package/build/ox_modules/module-win/commands/isExist.js +1 -3
  228. package/build/ox_modules/module-win/commands/isSelected.js +1 -2
  229. package/build/ox_modules/module-win/commands/isVisible.js +1 -3
  230. package/build/ox_modules/module-win/commands/open.js +1 -2
  231. package/build/ox_modules/module-win/commands/pause.js +1 -2
  232. package/build/ox_modules/module-win/commands/rightClick.js +1 -2
  233. package/build/ox_modules/module-win/commands/selectWindow.js +1 -15
  234. package/build/ox_modules/module-win/commands/sendKeys.js +1 -4
  235. package/build/ox_modules/module-win/commands/setTimeout.js +1 -2
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -2
  237. package/build/ox_modules/module-win/commands/tap.js +1 -2
  238. package/build/ox_modules/module-win/commands/type.js +1 -4
  239. package/build/ox_modules/module-win/commands/waitForExist.js +1 -2
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -4
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -2
  242. package/build/ox_modules/module-win.js +48 -87
  243. package/build/ox_modules/utils.js +22 -76
  244. package/build/ox_reporters/reporter-excel.js +1 -58
  245. package/build/ox_reporters/reporter-html.js +1 -28
  246. package/build/ox_reporters/reporter-json.js +1 -14
  247. package/build/ox_reporters/reporter-junit.js +1 -24
  248. package/build/ox_reporters/reporter-pdf.js +1 -19
  249. package/build/ox_reporters/reporter-xml.js +1 -17
  250. package/build/ox_services/service-devtools/submodule-network.js +3 -84
  251. package/build/ox_services/service-devtools.js +1 -23
  252. package/build/reporter/FileReporterBase.js +5 -44
  253. package/build/reporter/ReportAggregator.js +1 -65
  254. package/build/reporter/ReporterBase.js +1 -6
  255. package/build/runners/WorkerProcess.js +1 -99
  256. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  257. package/build/runners/cucumber/CucumberReporter.js +1 -56
  258. package/build/runners/cucumber/CucumberWorker.js +1 -66
  259. package/build/runners/cucumber/index.js +1 -30
  260. package/build/runners/cucumber/worker.js +1 -18
  261. package/build/runners/index.js +1 -6
  262. package/build/runners/oxygen/OxygenWorker.js +20 -54
  263. package/build/runners/oxygen/index.js +17 -177
  264. package/build/runners/oxygen/worker.js +2 -25
  265. package/package.json +28 -29
@@ -4,57 +4,33 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _glob = _interopRequireDefault(require("glob"));
11
-
12
9
  var _path = _interopRequireDefault(require("path"));
13
-
14
10
  var _fs = _interopRequireDefault(require("fs"));
15
-
16
11
  var _deasync = _interopRequireDefault(require("deasync"));
17
-
18
12
  var _future = _interopRequireDefault(require("fibers/future"));
19
-
20
13
  var _fibers = _interopRequireDefault(require("fibers"));
21
-
22
14
  var _os = require("os");
23
-
24
15
  var _stepResult = _interopRequireDefault(require("../model/step-result"));
25
-
26
16
  var _OxygenEvents = _interopRequireDefault(require("./OxygenEvents"));
27
-
28
17
  var _util = _interopRequireDefault(require("../lib/util"));
29
-
30
18
  var coreUtils = _interopRequireWildcard(require("./utils"));
31
-
32
19
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
33
-
34
20
  var _helper = _interopRequireDefault(require("../errors/helper"));
35
-
36
21
  var _status = _interopRequireDefault(require("../model/status.js"));
37
-
38
22
  var Modules = _interopRequireWildcard(require("../ox_modules/index"));
39
-
40
23
  var _logger2 = _interopRequireWildcard(require("../lib/logger"));
41
-
42
24
  var _OxygenSubModule = require("./OxygenSubModule");
43
-
44
25
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
45
-
46
26
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
47
-
48
27
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
49
-
50
28
  Object.defineProperty(global, '__stack', {
51
29
  get: function () {
52
30
  var orig = Error.prepareStackTrace;
53
-
54
31
  Error.prepareStackTrace = function (_, stack) {
55
32
  return stack;
56
33
  };
57
-
58
34
  var err = new Error();
59
35
  Error.captureStackTrace(err);
60
36
  var stack = err.stack;
@@ -95,14 +71,15 @@ const DEFAULT_RESULT_STORE = {
95
71
  logs: [],
96
72
  har: null
97
73
  };
98
-
99
74
  class Oxygen extends _OxygenEvents.default {
100
75
  constructor() {
101
76
  super();
102
77
  this.isInitialized = false;
103
- this.resultStore = { ...DEFAULT_RESULT_STORE
78
+ this.resultStore = {
79
+ ...DEFAULT_RESULT_STORE
104
80
  };
105
- this.ctx = { ...DEFAULT_CTX
81
+ this.ctx = {
82
+ ...DEFAULT_CTX
106
83
  };
107
84
  this.modules = {};
108
85
  this.services = {};
@@ -113,29 +90,24 @@ class Oxygen extends _OxygenEvents.default {
113
90
  this.logger = this._wrapLogger((0, _logger2.default)('Oxygen'));
114
91
  this._waitStepResultList = [];
115
92
  }
116
-
117
93
  async init(options, caps, ctx = {}, results = {}) {
118
94
  this.opts = Object.assign(DEFAULT_OPTS, options);
119
95
  this.cwd = this.opts.cwd || process.cwd();
120
96
  this.ctx = Object.assign(DEFAULT_CTX, ctx || {});
121
- this.ctx.caps = { ...(ctx.caps || {}),
97
+ this.ctx.caps = {
98
+ ...(ctx.caps || {}),
122
99
  ...caps
123
100
  };
124
101
  this.resultStore = Object.assign(DEFAULT_RESULT_STORE, results || {});
125
102
  this.capabilities = this.ctx.caps = caps;
126
103
  this.makeOxGlobal();
127
-
128
104
  this._loadServices();
129
-
130
105
  this._loadModules();
131
-
132
106
  if (typeof options.globalScope === 'undefined' || options.globalScope === true) {
133
107
  this.makeContextAndModulesGlobal();
134
108
  }
135
-
136
109
  this.isInitialized = true;
137
110
  }
138
-
139
111
  async disposeModules(status = null) {
140
112
  try {
141
113
  await this._disposeModules(status);
@@ -144,7 +116,6 @@ class Oxygen extends _OxygenEvents.default {
144
116
  throw e;
145
117
  }
146
118
  }
147
-
148
119
  async dispose(status = null) {
149
120
  try {
150
121
  await this._disposeModules(status);
@@ -156,53 +127,41 @@ class Oxygen extends _OxygenEvents.default {
156
127
  throw e;
157
128
  }
158
129
  }
159
-
160
130
  get adjustScriptLine() {
161
131
  const isInDebugMode = _util.default.isInDebugMode();
162
-
163
132
  const result = isInDebugMode ? -1 : 0;
164
133
  return result;
165
134
  }
166
-
167
135
  get context() {
168
136
  return this.ctx;
169
137
  }
170
-
171
138
  set context(ctx) {
172
139
  this.ctx = ctx;
173
-
174
140
  if (global.ox) {
175
141
  global.ox.ctx = ctx;
176
-
177
142
  if (typeof this.opts.globalScope === 'undefined' || this.opts.globalScope === true) {
178
143
  global.params = ctx.params || {};
179
144
  global.env = ctx.env || {};
180
145
  }
181
146
  }
182
147
  }
183
-
184
148
  get repository() {
185
149
  return this.repo;
186
150
  }
187
-
188
151
  set repository(repo) {
189
152
  this.repo = repo;
190
-
191
153
  if (global.ox) {
192
154
  global.ox.repo = repo;
193
155
  }
194
156
  }
195
-
196
157
  get results() {
197
158
  for (const transStep of this.resultStore.steps) {
198
159
  if (transStep.name.includes('.transaction')) {
199
160
  const transName = transStep.transaction;
200
161
  transStep.duration = 0;
201
-
202
162
  for (const step of this.resultStore.steps) {
203
163
  if (step.transaction === transName && step !== transStep) {
204
164
  transStep.duration += step.duration;
205
-
206
165
  if (step.endTime > transStep.endTime) {
207
166
  transStep.endTime = step.endTime;
208
167
  }
@@ -210,46 +169,35 @@ class Oxygen extends _OxygenEvents.default {
210
169
  }
211
170
  }
212
171
  }
213
-
214
172
  return this.resultStore;
215
173
  }
216
-
217
174
  getModulesCapabilities() {
218
175
  if (!this.modules) {
219
176
  return null;
220
177
  }
221
-
222
178
  const modCaps = {};
223
-
224
179
  for (let moduleName in this.modules) {
225
180
  const module = this.modules[moduleName];
226
-
227
181
  if (module.name && module._getCapabilities && typeof module._getCapabilities === 'function') {
228
182
  const caps = module._getCapabilities();
229
-
230
183
  if (caps && typeof caps === 'object' && Object.keys(caps).length > 0) {
231
184
  modCaps[module.name] = caps;
232
185
  }
233
186
  }
234
187
  }
235
-
236
188
  return modCaps;
237
189
  }
238
-
239
190
  resetResults() {
240
191
  this.resultStore.steps = [];
241
192
  this.resultStore.logs = [];
242
193
  this.har = null;
243
194
  }
244
-
245
195
  async onBeforeCase(context) {
246
196
  for (let moduleName in this.modules) {
247
197
  const module = this.modules[moduleName];
248
-
249
198
  if (!module) {
250
199
  continue;
251
200
  }
252
-
253
201
  try {
254
202
  module.onBeforeCase && (await module.onBeforeCase(context));
255
203
  module._iterationStart && (await module._iterationStart());
@@ -258,15 +206,12 @@ class Oxygen extends _OxygenEvents.default {
258
206
  }
259
207
  }
260
208
  }
261
-
262
209
  async onAfterCase(error = null) {
263
210
  for (let moduleName in this.modules) {
264
211
  const module = this.modules[moduleName];
265
-
266
212
  if (!module) {
267
213
  continue;
268
214
  }
269
-
270
215
  try {
271
216
  module.onAfterCase && (await module.onAfterCase(error));
272
217
  module._iterationEnd && (await module._iterationEnd(error));
@@ -275,7 +220,6 @@ class Oxygen extends _OxygenEvents.default {
275
220
  }
276
221
  }
277
222
  }
278
-
279
223
  makeOxGlobal() {
280
224
  if (!global.ox) {
281
225
  global.ox = {
@@ -288,7 +232,6 @@ class Oxygen extends _OxygenEvents.default {
288
232
  global.vars = this.ctx.vars;
289
233
  }
290
234
  }
291
-
292
235
  makeContextAndModulesGlobal() {
293
236
  if (global.ox) {
294
237
  for (let moduleName in this.modules) {
@@ -296,23 +239,18 @@ class Oxygen extends _OxygenEvents.default {
296
239
  global[moduleName] = this.modules[moduleName];
297
240
  }
298
241
  }
299
-
300
242
  global.params = global.ox.ctx.params;
301
243
  global.env = global.ox.ctx.env;
302
244
  global.ctx = global.ox.ctx;
303
245
  }
304
246
  }
305
-
306
247
  loadPageObjectFile(poPath) {
307
248
  if (!poPath) {
308
249
  return;
309
250
  }
310
-
311
251
  try {
312
252
  const po = require(poPath);
313
-
314
253
  this.repository = po;
315
-
316
254
  if (typeof this.opts.globalScope === 'undefined' || this.opts.globalScope === true) {
317
255
  global.po = po;
318
256
  }
@@ -322,7 +260,6 @@ class Oxygen extends _OxygenEvents.default {
322
260
  }
323
261
  }
324
262
  }
325
-
326
263
  _wrapLogger(_logger) {
327
264
  const loggerWrap = {
328
265
  info: (...args) => this._log(_logger, 'info', args),
@@ -336,18 +273,13 @@ class Oxygen extends _OxygenEvents.default {
336
273
  };
337
274
  return loggerWrap;
338
275
  }
339
-
340
276
  _log(_logger, level, args, src = _logger2.DEFAULT_LOGGER_ISSUER) {
341
277
  if (!_logger[level]) {
342
278
  return;
343
279
  }
344
-
345
280
  _logger[level].apply(_logger, args);
346
-
347
281
  const message = _util.default.stringify(args, 2);
348
-
349
282
  const time = _util.default.getTimeStamp();
350
-
351
283
  if (this.resultStore && this.resultStore.logs) {
352
284
  this.resultStore.logs.push({
353
285
  time: time,
@@ -356,37 +288,26 @@ class Oxygen extends _OxygenEvents.default {
356
288
  src: src
357
289
  });
358
290
  }
359
-
360
291
  args = message ? args.shift() : args;
361
292
  this.emitLog(time, level, message, args, src);
362
293
  }
363
-
364
294
  _loadServices() {
365
295
  const oxServicesDirPath = _path.default.resolve(this.oxBaseDir, './ox_services');
366
-
367
296
  const serviceFiles = _glob.default.sync('service-*.js', {
368
297
  cwd: oxServicesDirPath
369
298
  });
370
-
371
299
  this.logger.debug('Loading services...');
372
-
373
300
  for (var i = 0; i < serviceFiles.length; i++) {
374
301
  const serviceFileName = serviceFiles[i];
375
-
376
302
  const serviceFilePath = _path.default.join(oxServicesDirPath, serviceFileName);
377
-
378
303
  const result = serviceFileName.match(SERVICE_NAME_MATCH_REGEX);
379
304
  const serviceName = result[1];
380
-
381
305
  if (Array.isArray(this.opts.services) && !this.opts.services.includes(serviceName)) {
382
306
  continue;
383
307
  }
384
-
385
308
  try {
386
309
  this.logger.debug('Loading service: ' + serviceName);
387
-
388
310
  const service = this._loadService(serviceName, serviceFilePath);
389
-
390
311
  service.init();
391
312
  this.services[serviceName] = service;
392
313
  } catch (e) {
@@ -394,216 +315,159 @@ class Oxygen extends _OxygenEvents.default {
394
315
  }
395
316
  }
396
317
  }
397
-
398
318
  _loadService(serviceName, servicePath) {
399
319
  let ServiceClass = require(servicePath);
400
-
401
320
  if (ServiceClass.default) {
402
321
  ServiceClass = ServiceClass.default;
403
322
  }
404
-
405
323
  const serviceLogger = this._wrapLogger((0, _logger2.default)(`Service:${serviceName}`));
406
-
407
324
  return new ServiceClass(this.opts, this.ctx, this.resultStore, serviceLogger);
408
325
  }
409
-
410
326
  _loadModules() {
411
327
  this.logger.debug('Loading internal modules...');
412
-
413
328
  this._loadInternalModules();
414
-
415
329
  this.logger.debug('Loading external modules...');
416
-
417
330
  this._loadExternalModules();
418
331
  }
419
-
420
332
  _loadExternalModules() {
421
333
  let modulesFolderPath = './modules';
422
-
423
334
  if (this.opts.modules_ext && typeof this.opts.modules_ext === 'string') {
424
335
  modulesFolderPath = this.opts.modules_ext;
425
336
  }
426
-
427
337
  const oxModulesDirPath = _path.default.resolve(this.cwd, modulesFolderPath);
428
-
429
338
  if (!_fs.default.existsSync(oxModulesDirPath)) {
430
339
  return false;
431
340
  }
432
-
433
341
  let moduleFiles = [];
434
-
435
342
  if (Array.isArray(this.opts.modules) && this.opts.modules.length > 0) {
436
343
  this.opts.modules.forEach(moduleName => moduleFiles.push(`module-${moduleName}.js`));
437
344
  } else {
438
- moduleFiles = _glob.default.sync('module-*.js', {
439
- cwd: oxModulesDirPath
440
- });
441
- }
442
-
345
+ moduleFiles = _glob.default.sync('module-*.js', {
346
+ cwd: oxModulesDirPath
347
+ });
348
+ }
443
349
  for (let moduleFileName of moduleFiles) {
444
350
  const moduleName = moduleFileName.match(MODULE_NAME_MATCH_REGEX)[1];
445
-
446
351
  try {
447
352
  const startTime = new Date();
448
-
449
353
  const moduleLogger = this._wrapLogger((0, _logger2.default)(`Module:${moduleName}`));
450
-
451
354
  const mod = coreUtils.loadModuleFromFile(moduleName, moduleFileName, moduleLogger, oxModulesDirPath, this);
452
-
453
355
  this._callServicesOnModuleLoaded(mod);
454
-
455
356
  this.modules[moduleName] = global.ox.modules[moduleName] = this._wrapModule(moduleName, mod);
456
357
  const endTime = new Date();
457
358
  const duration = (endTime - startTime) / 1000;
458
359
  this.logger.debug('Loading module: ' + moduleName + ' [ ' + duration + ' sec ]');
459
360
  } catch (e) {
460
361
  this.logger.error('Error initializing module "' + moduleName + '": ' + e.message + _os.EOL + (e.stacktrace ? e.stacktrace : ''));
461
-
462
362
  if (moduleName === 'web' || moduleName === 'mob') {
463
363
  break;
464
364
  }
465
365
  }
466
366
  }
467
367
  }
468
-
469
368
  _loadInternalModules() {
470
369
  const excludeUndefinedMods = this.opts.modules && this.opts.modules.length > 0;
471
-
472
370
  for (let moduleName of Object.keys(Modules)) {
473
371
  if (excludeUndefinedMods && !this.opts.modules.includes(moduleName)) {
474
372
  continue;
475
373
  }
476
-
477
374
  const ModuleClass = Modules[moduleName];
478
-
479
375
  const oxModulesDirPath = _util.default.getOxModulesDir();
480
-
481
376
  try {
482
377
  const startTime = new Date();
483
-
484
378
  const moduleLogger = this._wrapLogger((0, _logger2.default)(`Module:${moduleName}`));
485
-
486
379
  const mod = coreUtils.loadModuleFromClass(moduleName, ModuleClass, moduleLogger, oxModulesDirPath, this);
487
-
488
380
  this._callServicesOnModuleLoaded(mod);
489
-
490
381
  this.modules[moduleName] = global.ox.modules[moduleName] = this._wrapModule(moduleName, mod);
491
382
  const endTime = new Date();
492
383
  const duration = (endTime - startTime) / 1000;
493
384
  this.logger.debug('Loading module: ' + moduleName + ' [ ' + duration + ' sec ]');
494
385
  } catch (e) {
495
386
  this.logger.error('Error initializing module "' + moduleName + '": ' + e.message + _os.EOL + (e.stacktrace ? e.stacktrace : ''));
496
-
497
387
  if (moduleName === 'web' || moduleName === 'mob') {
498
388
  break;
499
389
  }
500
390
  }
501
391
  }
502
392
  }
503
-
504
393
  _wrapModule(name, module) {
505
394
  if (!module) {
506
395
  return undefined;
507
396
  }
508
-
509
397
  const wrapper = {
510
398
  name: name
511
399
  };
512
-
513
400
  const _this = this;
514
-
515
401
  let moduleMethods = Object.keys(module);
516
-
517
402
  if (!moduleMethods.some(x => x === 'exports')) {
518
403
  moduleMethods = this._getAllPropertyNames(module);
519
404
  }
520
-
521
405
  for (let methodName of moduleMethods) {
522
406
  const method = module[methodName];
523
-
524
407
  if (!(method instanceof Function) && !(method instanceof _OxygenSubModule.OxygenSubModule) && typeof method !== 'function' || methodName === 'exports' || methodName === '_compile') {
525
408
  continue;
526
409
  }
527
-
528
410
  if (method instanceof _OxygenSubModule.OxygenSubModule) {
529
411
  wrapper[methodName] = this._wrapModule(`${name}.${methodName}`, method);
530
412
  } else if (DO_NOT_WRAP_METHODS.includes(methodName)) {
531
- wrapper[methodName] = module[methodName].bind(module);
532
- } else if (methodName.indexOf('_') === 0 || methodName.indexOf('on') === 0) {
533
- wrapper[methodName] = function () {
534
- var args = Array.prototype.slice.call(arguments);
535
-
536
- _this.logger.debug('Executing: ' + _util.default.getMethodSignature(name, methodName, args));
537
-
538
- try {
539
- return module[methodName].apply(module, args);
540
- } catch (e) {
541
- throw _helper.default.getOxygenError(e, name, methodName, args);
542
- }
543
- };
544
- } else {
545
- if (methodName === 'getCapabilities') {
546
- wrapper['_getCapabilities'] = method.bind(module);
413
+ wrapper[methodName] = module[methodName].bind(module);
414
+ } else if (methodName.indexOf('_') === 0 || methodName.indexOf('on') === 0) {
415
+ wrapper[methodName] = function () {
416
+ var args = Array.prototype.slice.call(arguments);
417
+ _this.logger.debug('Executing: ' + _util.default.getMethodSignature(name, methodName, args));
418
+ try {
419
+ return module[methodName].apply(module, args);
420
+ } catch (e) {
421
+ throw _helper.default.getOxygenError(e, name, methodName, args);
422
+ }
423
+ };
424
+ } else {
425
+ if (methodName === 'getCapabilities') {
426
+ wrapper['_getCapabilities'] = method.bind(module);
427
+ }
428
+ wrapper[methodName] = (...args) => {
429
+ try {
430
+ return _this._commandWrapper(methodName, args, module, name);
431
+ } catch (e) {
432
+ if (e instanceof _OxygenError.default) {
433
+ throw e;
547
434
  }
548
-
549
- wrapper[methodName] = (...args) => {
550
- try {
551
- return _this._commandWrapper(methodName, args, module, name);
552
- } catch (e) {
553
- if (e instanceof _OxygenError.default) {
554
- throw e;
555
- }
556
-
557
- throw _helper.default.getOxygenError(e, name, methodName, args);
558
- }
559
- };
435
+ throw _helper.default.getOxygenError(e, name, methodName, args);
560
436
  }
437
+ };
438
+ }
561
439
  }
562
-
563
440
  return wrapper;
564
441
  }
565
-
566
442
  _commandWrapper(cmdName, cmdArgs, module, moduleName) {
567
443
  if (!module || !module[cmdName]) {
568
444
  return undefined;
569
445
  }
570
-
571
446
  let retval = null;
572
447
  let error = null;
573
448
  const cmdFn = module[cmdName];
574
449
  const publicMethod = !cmdName.startsWith('_') && cmdName !== 'dispose';
575
-
576
450
  if (this.opts.delay && publicMethod && cmdName !== 'init' && cmdName !== 'transaction') {
577
451
  _deasync.default.sleep(this.opts.delay * 1000);
578
452
  }
579
-
580
453
  if (!module.isInitialized && publicMethod && cmdName !== 'init' && cmdName !== 'transaction') {
581
454
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, 'Missing ' + moduleName + '.init()');
582
455
  }
583
-
584
456
  let decryptedArgs = this._getDecryptedArgsForApply(cmdArgs, moduleName);
585
-
586
457
  decryptedArgs = this._populateParametersValue(decryptedArgs);
587
458
  cmdArgs = this._populateParametersValue(cmdArgs);
588
-
589
459
  const startTime = _util.default.getTimeStamp();
590
-
591
460
  let cmdLocation = null;
592
-
593
461
  if (publicMethod) {
594
462
  cmdLocation = this._getCommandLocation();
595
463
  this.emitBeforeCommand(cmdName, moduleName, cmdFn, cmdArgs, this.ctx, cmdLocation, startTime);
596
464
  }
597
-
598
465
  this.logger.debug('Executing: ' + _util.default.getMethodSignature(moduleName, cmdName, cmdArgs));
599
-
600
466
  try {
601
467
  if (cmdName === 'dispose') {
602
468
  this._wrapAsync(this._callServicesOnModuleWillDispose).apply(this, [module]);
603
469
  }
604
-
605
470
  const retvalPromise = this._wrapAsync(module[cmdName]).apply(module, decryptedArgs);
606
-
607
471
  if (retvalPromise && retvalPromise.then) {
608
472
  let promiseDone = false;
609
473
  retvalPromise.then(value => {
@@ -613,12 +477,10 @@ class Oxygen extends _OxygenEvents.default {
613
477
  error = e;
614
478
  promiseDone = true;
615
479
  });
616
-
617
480
  _deasync.default.loopWhile(() => !promiseDone);
618
481
  } else {
619
482
  retval = retvalPromise;
620
483
  }
621
-
622
484
  if (cmdName === 'init') {
623
485
  this._wrapAsync(this._callServicesOnModuleInitialized).apply(this, [module]);
624
486
  }
@@ -629,63 +491,45 @@ class Oxygen extends _OxygenEvents.default {
629
491
  if (module && typeof module.isInitialized === 'boolean' && !module.isInitialized && cmdName !== 'init') {
630
492
  return;
631
493
  }
632
-
633
494
  error = _helper.default.getOxygenError(e, moduleName, cmdName, cmdArgs);
634
495
  }
635
496
  }
636
-
637
497
  const endTime = _util.default.getTimeStamp();
638
-
639
498
  let stepResult;
640
499
  let done = false;
641
-
642
500
  if (publicMethod) {
643
501
  const waitId = +new Date();
644
-
645
502
  this._waitStepResultList.push(waitId);
646
-
647
503
  stepResult = this._getStepResult(module, moduleName, cmdName, cmdArgs, cmdLocation, startTime, endTime, retval, error);
648
-
649
504
  const index = this._waitStepResultList.indexOf(waitId);
650
-
651
505
  this._waitStepResultList.splice(index, 1);
652
-
653
506
  this.resultStore.steps.push(stepResult);
654
507
  this.emitAfterCommand(cmdName, moduleName, cmdFn, cmdArgs, this.ctx, cmdLocation, endTime, stepResult);
655
508
  done = true;
656
509
  }
657
-
658
510
  if (error && error.isFatal && !this.opts.continueOnError) {
659
511
  if (!error.location && cmdLocation) {
660
512
  error.location = cmdLocation;
661
513
  }
662
-
663
514
  if (stepResult && stepResult.failure && stepResult.failure.location) {
664
515
  error.location = stepResult.failure.location;
665
516
  }
666
-
667
517
  throw error;
668
518
  }
669
-
670
519
  if (!publicMethod) {
671
520
  done = true;
672
521
  }
673
-
674
522
  _deasync.default.loopWhile(() => !done && !error);
675
-
676
523
  return retval;
677
524
  }
678
-
679
525
  _wrapAsync(fn, context) {
680
526
  return function (...args) {
681
527
  var self = context || this;
682
-
683
528
  if (!_fibers.default.current) {
684
529
  const retval = fn.apply(self, args);
685
530
  let done = false;
686
531
  let error = null;
687
532
  let finalVal = null;
688
-
689
533
  if (retval && retval.then) {
690
534
  Promise.resolve(retval).then(val => {
691
535
  finalVal = val;
@@ -698,79 +542,61 @@ class Oxygen extends _OxygenEvents.default {
698
542
  finalVal = retval;
699
543
  done = true;
700
544
  }
701
-
702
545
  try {
703
546
  _deasync.default.loopWhile(() => !done && !error);
704
547
  } catch (e) {
705
548
  if (e && e.message && typeof e.message === 'string' && e.message.includes('readyState')) {
706
549
  return undefined;
707
550
  }
708
-
709
551
  this.logger.error('deasync.loopWhile() failed:', e);
710
552
  return undefined;
711
553
  }
712
-
713
554
  if (!error) {
714
555
  return finalVal;
715
556
  }
716
-
717
557
  throw error;
718
558
  }
719
-
720
559
  let error = null;
721
560
  let done = false;
722
561
  let retval = null;
723
-
724
562
  try {
725
563
  const future = new _future.default();
726
564
  var result = fn.apply(self, args);
727
-
728
565
  if (result && typeof result.then === 'function') {
729
566
  result.then(val => future.return(val), err => future.throw(err));
730
567
  return future.wait();
731
568
  }
732
-
733
569
  return result;
734
570
  } catch (e) {
735
571
  error = e;
736
572
  }
737
-
738
573
  _deasync.default.loopWhile(() => !done && !error);
739
-
740
574
  if (!error) {
741
575
  return retval;
742
576
  }
743
-
744
577
  throw error;
745
578
  };
746
579
  }
747
-
748
580
  _getCommandLocation() {
749
581
  const stack = __stack;
750
582
  let caller = null;
751
-
752
583
  for (let call of stack) {
753
584
  if (__filename === call.getFileName()) {
754
585
  continue;
755
586
  }
756
-
757
587
  caller = call;
758
588
  break;
759
589
  }
760
-
761
590
  if (caller) {
762
591
  return `${caller.getFileName()}:${caller.getLineNumber() + this.adjustScriptLine}:${caller.getColumnNumber()}`;
763
592
  }
764
-
765
593
  return null;
766
594
  }
767
-
768
595
  _getStepResult(module, moduleName, methodName, args, location, startTime, endTime, retval, err) {
769
596
  var step = new _stepResult.default();
770
597
  step.name = _util.default.getMethodSignature(moduleName, methodName, args);
771
598
  step.transaction = global._lastTransactionName || null;
772
599
  step.location = location;
773
-
774
600
  if (err && err.type && err.type === _helper.default.errorCode.ASSERT_PASSED) {
775
601
  step.status = _status.default.PASSED;
776
602
  } else {
@@ -784,29 +610,24 @@ class Oxygen extends _OxygenEvents.default {
784
610
  step.status = _status.default.PASSED;
785
611
  }
786
612
  }
787
-
788
613
  step.action = typeof module._isAction === 'function' ? module._isAction(methodName) : false;
789
614
  step.startTime = startTime;
790
615
  step.endTime = endTime;
791
616
  step.duration = endTime - startTime;
792
-
793
617
  if (typeof module._getStats === 'function') {
794
618
  step.stats = module._getStats(methodName);
795
619
  } else {
796
620
  step.stats = {};
797
621
  }
798
-
799
622
  if (err) {
800
- if (err && err.type && err.type === _helper.default.errorCode.ASSERT_PASSED) {} else if (err && err.type && err.type === _helper.default.errorCode.SELENIUM_SESSION_TIMEOUT) {} else {
623
+ if (err && err.type && err.type === _helper.default.errorCode.ASSERT_PASSED) {} else if (err && err.type && (err.type === _helper.default.errorCode.SELENIUM_SESSION_TIMEOUT || err.type === _helper.default.errorCode.APPIUM_SESSION_TIMEOUT)) {} else {
801
624
  step.failure = _helper.default.getFailureFromError(err);
802
625
  step.failure.location = location;
803
-
804
626
  if (typeof module._takeScreenshotSilent === 'function' && !this.opts.disableScreenshot) {
805
627
  try {
806
628
  step.screenshot = module._takeScreenshotSilent(methodName);
807
629
  } catch (e) {
808
630
  _deasync.default.sleep(1000);
809
-
810
631
  try {
811
632
  step.screenshot = module._takeScreenshotSilent(methodName);
812
633
  } catch (e) {}
@@ -814,18 +635,14 @@ class Oxygen extends _OxygenEvents.default {
814
635
  }
815
636
  }
816
637
  }
817
-
818
638
  return step;
819
639
  }
820
-
821
640
  async _disposeServices() {
822
641
  if (!this.services || typeof this.services !== 'object') {
823
642
  return false;
824
643
  }
825
-
826
644
  for (let key in this.services) {
827
645
  const service = this.services[key];
828
-
829
646
  if (service.dispose) {
830
647
  try {
831
648
  await service.dispose();
@@ -834,22 +651,17 @@ class Oxygen extends _OxygenEvents.default {
834
651
  }
835
652
  }
836
653
  }
837
-
838
654
  return true;
839
655
  }
840
-
841
656
  async _disposeModules(status = null) {
842
657
  if (!this.modules || typeof this.modules !== 'object') {
843
658
  return false;
844
659
  }
845
-
846
660
  for (let key in this.modules) {
847
661
  const mod = this.modules[key];
848
-
849
662
  if (mod.dispose) {
850
663
  try {
851
664
  const disposeResult = mod.dispose(status);
852
-
853
665
  if (disposeResult && typeof disposeResult.then === 'function') {
854
666
  await disposeResult();
855
667
  }
@@ -858,18 +670,14 @@ class Oxygen extends _OxygenEvents.default {
858
670
  }
859
671
  }
860
672
  }
861
-
862
673
  return true;
863
674
  }
864
-
865
675
  _callServicesOnModuleLoaded(module) {
866
676
  for (let serviceName in this.services) {
867
677
  const service = this.services[serviceName];
868
-
869
678
  if (!service) {
870
679
  continue;
871
680
  }
872
-
873
681
  try {
874
682
  service.onModuleLoaded(module);
875
683
  } catch (e) {
@@ -877,15 +685,12 @@ class Oxygen extends _OxygenEvents.default {
877
685
  }
878
686
  }
879
687
  }
880
-
881
688
  async _callServicesOnModuleInitialized(module) {
882
689
  for (let serviceName in this.services) {
883
690
  const service = this.services[serviceName];
884
-
885
691
  if (!service) {
886
692
  continue;
887
693
  }
888
-
889
694
  try {
890
695
  await service.onModuleInitialized(module);
891
696
  } catch (e) {
@@ -893,19 +698,15 @@ class Oxygen extends _OxygenEvents.default {
893
698
  }
894
699
  }
895
700
  }
896
-
897
701
  async _callServicesOnModuleWillDispose(module) {
898
702
  if (!this || !this.services) {
899
703
  return;
900
704
  }
901
-
902
705
  for (let serviceName in this.services) {
903
706
  const service = this.services[serviceName];
904
-
905
707
  if (!service) {
906
708
  continue;
907
709
  }
908
-
909
710
  try {
910
711
  if (service.onModuleWillDispose) {
911
712
  service.onModuleWillDispose(module);
@@ -915,50 +716,39 @@ class Oxygen extends _OxygenEvents.default {
915
716
  }
916
717
  }
917
718
  }
918
-
919
719
  _populateParametersValue(args) {
920
720
  if (!args || !Array.isArray(args) || args.length == 0) {
921
721
  return args;
922
722
  }
923
-
924
723
  const _newArgs = [];
925
-
926
724
  for (let arg of args) {
927
725
  _newArgs.push(this._replaceParameterInArgument(arg));
928
726
  }
929
-
930
727
  return _newArgs;
931
728
  }
932
-
933
729
  _replaceParameterInArgument(arg) {
934
730
  if (arg && typeof arg.getDecryptResult === 'function') {
935
731
  return 'ENCRYPTED';
936
732
  }
937
-
938
733
  if (!arg || typeof arg !== 'string') {
939
734
  return arg;
940
735
  }
941
-
942
736
  for (let paramName in this.ctx.params) {
943
737
  if (this.ctx.params.hasOwnProperty(paramName)) {
944
738
  const paramValue = this.ctx.params[paramName];
945
739
  arg = arg.replace(new RegExp('\\${' + paramName + '}', 'g'), paramValue);
946
740
  }
947
741
  }
948
-
949
742
  for (let envName in this.ctx.env) {
950
743
  if (this.ctx.env.hasOwnProperty(envName)) {
951
744
  const envValue = this.ctx.env[envName];
952
745
  arg = arg.replace(new RegExp('\\${' + envName + '}', 'g'), envValue);
953
746
  }
954
747
  }
955
-
956
748
  return arg;
957
749
  }
958
-
959
750
  _getAllPropertyNames(obj) {
960
751
  const props = [];
961
-
962
752
  do {
963
753
  Object.getOwnPropertyNames(obj).forEach(function (prop) {
964
754
  if (props.indexOf(prop) === -1) {
@@ -966,10 +756,8 @@ class Oxygen extends _OxygenEvents.default {
966
756
  }
967
757
  });
968
758
  } while (obj = Object.getPrototypeOf(obj));
969
-
970
759
  return props;
971
760
  }
972
-
973
761
  _checkStepResult(resolve, reject) {
974
762
  if (this._waitStepResultList.length === 0) {
975
763
  resolve();
@@ -977,27 +765,21 @@ class Oxygen extends _OxygenEvents.default {
977
765
  this._checkStepResult(resolve, reject);
978
766
  }
979
767
  }
980
-
981
768
  _waitStepResult() {
982
769
  return new Promise((resolve, reject) => {
983
770
  this._checkStepResult(resolve, reject);
984
771
  });
985
772
  }
986
-
987
773
  _getDecryptedArgsForApply(args, moduleName) {
988
774
  if (!args || !Array.isArray(args) || args.length == 0) {
989
775
  return args;
990
776
  }
991
-
992
777
  const _newArgs = [];
993
-
994
778
  for (let arg of args) {
995
779
  _newArgs.push(this._decryptParameterForApplyInArgument(arg, moduleName));
996
780
  }
997
-
998
781
  return _newArgs;
999
782
  }
1000
-
1001
783
  _decryptParameterForApplyInArgument(arg, moduleName) {
1002
784
  if (arg && typeof arg.getDecryptResult === 'function') {
1003
785
  if (moduleName === 'log') {
@@ -1006,11 +788,8 @@ class Oxygen extends _OxygenEvents.default {
1006
788
  return arg.getDecryptResult();
1007
789
  }
1008
790
  }
1009
-
1010
791
  return arg;
1011
792
  }
1012
-
1013
793
  }
1014
-
1015
794
  exports.default = Oxygen;
1016
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnbG9iYWwiLCJnZXQiLCJvcmlnIiwiRXJyb3IiLCJwcmVwYXJlU3RhY2tUcmFjZSIsIl8iLCJzdGFjayIsImVyciIsImNhcHR1cmVTdGFja1RyYWNlIiwiREVGQVVMVF9USU1FT1VUIiwiREVGQVVMVF9PUFRTIiwiYmFja3RyYWNlIiwiY29tcGlsZXIiLCJmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnMiLCJmYWlsRmFzdCIsImlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zIiwibmFtZSIsInByb2ZpbGUiLCJyZXF1aXJlIiwib3JkZXIiLCJzbmlwcGV0U3ludGF4IiwidW5kZWZpbmVkIiwic25pcHBldHMiLCJzb3VyY2UiLCJzdHJpY3QiLCJ0YWdFeHByZXNzaW9uIiwidGFnc0luVGl0bGUiLCJ0aW1lb3V0IiwiTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgiLCJTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgiLCJET19OT1RfV1JBUF9NRVRIT0RTIiwiREVGQVVMVF9DVFgiLCJwYXJhbXMiLCJ2YXJzIiwiZW52IiwiY2FwcyIsIkRFRkFVTFRfUkVTVUxUX1NUT1JFIiwic3RlcHMiLCJsb2dzIiwiaGFyIiwiT3h5Z2VuIiwiT3h5Z2VuRXZlbnRzIiwiY29uc3RydWN0b3IiLCJpc0luaXRpYWxpemVkIiwicmVzdWx0U3RvcmUiLCJjdHgiLCJtb2R1bGVzIiwic2VydmljZXMiLCJyZXBvIiwiY2FwYWJpbGl0aWVzIiwib3B0cyIsIm94QmFzZURpciIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwibG9nZ2VyIiwiX3dyYXBMb2dnZXIiLCJfd2FpdFN0ZXBSZXN1bHRMaXN0IiwiaW5pdCIsIm9wdGlvbnMiLCJyZXN1bHRzIiwiYXNzaWduIiwiY3dkIiwicHJvY2VzcyIsIm1ha2VPeEdsb2JhbCIsIl9sb2FkU2VydmljZXMiLCJfbG9hZE1vZHVsZXMiLCJnbG9iYWxTY29wZSIsIm1ha2VDb250ZXh0QW5kTW9kdWxlc0dsb2JhbCIsImRpc3Bvc2VNb2R1bGVzIiwic3RhdHVzIiwiX2Rpc3Bvc2VNb2R1bGVzIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsImRpc3Bvc2UiLCJfZGlzcG9zZVNlcnZpY2VzIiwiYWRqdXN0U2NyaXB0TGluZSIsImlzSW5EZWJ1Z01vZGUiLCJveHV0aWwiLCJyZXN1bHQiLCJjb250ZXh0Iiwib3giLCJyZXBvc2l0b3J5IiwidHJhbnNTdGVwIiwiaW5jbHVkZXMiLCJ0cmFuc05hbWUiLCJ0cmFuc2FjdGlvbiIsImR1cmF0aW9uIiwic3RlcCIsImVuZFRpbWUiLCJnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzIiwibW9kQ2FwcyIsIm1vZHVsZU5hbWUiLCJtb2R1bGUiLCJfZ2V0Q2FwYWJpbGl0aWVzIiwia2V5cyIsImxlbmd0aCIsInJlc2V0UmVzdWx0cyIsIm9uQmVmb3JlQ2FzZSIsIl9pdGVyYXRpb25TdGFydCIsIm9uQWZ0ZXJDYXNlIiwiX2l0ZXJhdGlvbkVuZCIsImxvYWRQYWdlT2JqZWN0RmlsZSIsInBvUGF0aCIsInBvIiwiX2xvZ2dlciIsImxvZ2dlcldyYXAiLCJpbmZvIiwiYXJncyIsIl9sb2ciLCJkZWJ1ZyIsIndhcm4iLCJ1c2VySW5mbyIsIklTU1VFUlMiLCJVU0VSIiwidXNlckRlYnVnIiwidXNlckVycm9yIiwidXNlcldhcm4iLCJsZXZlbCIsInNyYyIsIkRFRkFVTFRfTE9HR0VSX0lTU1VFUiIsImFwcGx5IiwibWVzc2FnZSIsInN0cmluZ2lmeSIsInRpbWUiLCJnZXRUaW1lU3RhbXAiLCJwdXNoIiwidG9VcHBlckNhc2UiLCJtc2ciLCJzaGlmdCIsImVtaXRMb2ciLCJveFNlcnZpY2VzRGlyUGF0aCIsInJlc29sdmUiLCJzZXJ2aWNlRmlsZXMiLCJnbG9iIiwic3luYyIsImkiLCJzZXJ2aWNlRmlsZU5hbWUiLCJzZXJ2aWNlRmlsZVBhdGgiLCJtYXRjaCIsInNlcnZpY2VOYW1lIiwiQXJyYXkiLCJpc0FycmF5Iiwic2VydmljZSIsIl9sb2FkU2VydmljZSIsIkVPTCIsInN0YWNrdHJhY2UiLCJzZXJ2aWNlUGF0aCIsIlNlcnZpY2VDbGFzcyIsImRlZmF1bHQiLCJzZXJ2aWNlTG9nZ2VyIiwiX2xvYWRJbnRlcm5hbE1vZHVsZXMiLCJfbG9hZEV4dGVybmFsTW9kdWxlcyIsIm1vZHVsZXNGb2xkZXJQYXRoIiwibW9kdWxlc19leHQiLCJveE1vZHVsZXNEaXJQYXRoIiwiZnMiLCJleGlzdHNTeW5jIiwibW9kdWxlRmlsZXMiLCJmb3JFYWNoIiwibW9kdWxlRmlsZU5hbWUiLCJzdGFydFRpbWUiLCJEYXRlIiwibW9kdWxlTG9nZ2VyIiwibW9kIiwiY29yZVV0aWxzIiwibG9hZE1vZHVsZUZyb21GaWxlIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkIiwiX3dyYXBNb2R1bGUiLCJleGNsdWRlVW5kZWZpbmVkTW9kcyIsIk1vZHVsZXMiLCJNb2R1bGVDbGFzcyIsImdldE94TW9kdWxlc0RpciIsImxvYWRNb2R1bGVGcm9tQ2xhc3MiLCJ3cmFwcGVyIiwiX3RoaXMiLCJtb2R1bGVNZXRob2RzIiwic29tZSIsIngiLCJfZ2V0QWxsUHJvcGVydHlOYW1lcyIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJGdW5jdGlvbiIsIk94eWdlblN1Yk1vZHVsZSIsImJpbmQiLCJpbmRleE9mIiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiZ2V0TWV0aG9kU2lnbmF0dXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRPeHlnZW5FcnJvciIsIl9jb21tYW5kV3JhcHBlciIsIk94RXJyb3IiLCJjbWROYW1lIiwiY21kQXJncyIsInJldHZhbCIsImNtZEZuIiwicHVibGljTWV0aG9kIiwic3RhcnRzV2l0aCIsImRlbGF5IiwiZGVhc3luYyIsInNsZWVwIiwiZXJyb3JDb2RlIiwiTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiIsImRlY3J5cHRlZEFyZ3MiLCJfZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5IiwiX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlIiwiY21kTG9jYXRpb24iLCJfZ2V0Q29tbWFuZExvY2F0aW9uIiwiZW1pdEJlZm9yZUNvbW1hbmQiLCJfd3JhcEFzeW5jIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UiLCJyZXR2YWxQcm9taXNlIiwidGhlbiIsInByb21pc2VEb25lIiwidmFsdWUiLCJsb29wV2hpbGUiLCJfY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZCIsInN0ZXBSZXN1bHQiLCJkb25lIiwid2FpdElkIiwiX2dldFN0ZXBSZXN1bHQiLCJpbmRleCIsInNwbGljZSIsImVtaXRBZnRlckNvbW1hbmQiLCJpc0ZhdGFsIiwiY29udGludWVPbkVycm9yIiwibG9jYXRpb24iLCJmYWlsdXJlIiwiZm4iLCJzZWxmIiwiRmliZXIiLCJjdXJyZW50IiwiZmluYWxWYWwiLCJQcm9taXNlIiwidmFsIiwiY2F0Y2giLCJmdXR1cmUiLCJGdXR1cmUiLCJyZXR1cm4iLCJ0aHJvdyIsIndhaXQiLCJfX3N0YWNrIiwiY2FsbGVyIiwiX19maWxlbmFtZSIsImdldEZpbGVOYW1lIiwiZ2V0TGluZU51bWJlciIsImdldENvbHVtbk51bWJlciIsIlN0ZXBSZXN1bHQiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsInR5cGUiLCJBU1NFUlRfUEFTU0VEIiwiU1RBVFVTIiwiUEFTU0VEIiwiRkFJTEVEIiwiV0FSTklORyIsImFjdGlvbiIsIl9pc0FjdGlvbiIsIl9nZXRTdGF0cyIsInN0YXRzIiwiU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsImRpc2FibGVTY3JlZW5zaG90Iiwic2NyZWVuc2hvdCIsImtleSIsImRpc3Bvc2VSZXN1bHQiLCJvbk1vZHVsZUxvYWRlZCIsIm9uTW9kdWxlSW5pdGlhbGl6ZWQiLCJvbk1vZHVsZVdpbGxEaXNwb3NlIiwiX25ld0FyZ3MiLCJhcmciLCJfcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQiLCJnZXREZWNyeXB0UmVzdWx0IiwicGFyYW1OYW1lIiwiaGFzT3duUHJvcGVydHkiLCJwYXJhbVZhbHVlIiwicmVwbGFjZSIsIlJlZ0V4cCIsImVudk5hbWUiLCJlbnZWYWx1ZSIsIm9iaiIsInByb3BzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3AiLCJnZXRQcm90b3R5cGVPZiIsIl9jaGVja1N0ZXBSZXN1bHQiLCJyZWplY3QiLCJfd2FpdFN0ZXBSZXN1bHQiLCJfZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7Ozs7Ozs7O0FBR0FBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsRUFBOEIsU0FBOUIsRUFBeUM7QUFDckNDLEVBQUFBLEdBQUcsRUFBRSxZQUFZO0FBQ2IsUUFBSUMsSUFBSSxHQUFHQyxLQUFLLENBQUNDLGlCQUFqQjs7QUFDQUQsSUFBQUEsS0FBSyxDQUFDQyxpQkFBTixHQUEwQixVQUFVQyxDQUFWLEVBQWFDLEtBQWIsRUFBb0I7QUFBRSxhQUFPQSxLQUFQO0FBQWUsS0FBL0Q7O0FBQ0EsUUFBSUMsR0FBRyxHQUFHLElBQUlKLEtBQUosRUFBVjtBQUNBQSxJQUFBQSxLQUFLLENBQUNLLGlCQUFOLENBQXdCRCxHQUF4QjtBQUNBLFFBQUlELEtBQUssR0FBR0MsR0FBRyxDQUFDRCxLQUFoQjtBQUNBSCxJQUFBQSxLQUFLLENBQUNDLGlCQUFOLEdBQTBCRixJQUExQjtBQUNBLFdBQU9JLEtBQVA7QUFDSDtBQVRvQyxDQUF6QztBQVlBLE1BQU1HLGVBQWUsR0FBRyxLQUF4QjtBQUNBLE1BQU1DLFlBQVksR0FBRztBQUNqQkMsRUFBQUEsU0FBUyxFQUFFLEtBRE07QUFFakJDLEVBQUFBLFFBQVEsRUFBRSxFQUZPO0FBR2pCQyxF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Q0FBQ2dCLElBQUQsSUFBUyxDQUFDaUMsS0FBSyxDQUFDQyxPQUFOLENBQWNsQyxJQUFkLENBQVYsSUFBaUNBLElBQUksQ0FBQ1osTUFBTCxJQUFlLENBQXBELEVBQXVEO0FBQ25ELGFBQU9ZLElBQVA7QUFDSDs7QUFDRCxVQUFNb0ssUUFBUSxHQUFHLEVBQWpCOztBQUNBLFNBQUssSUFBSUMsR0FBVCxJQUFnQnJLLElBQWhCLEVBQXNCO0FBQ2xCb0ssTUFBQUEsUUFBUSxDQUFDbEosSUFBVCxDQUFjLEtBQUtxSyxtQ0FBTCxDQUF5Q2xCLEdBQXpDLEVBQThDckwsVUFBOUMsQ0FBZDtBQUNIOztBQUNELFdBQU9vTCxRQUFQO0FBQ0g7O0FBRURtQixFQUFBQSxtQ0FBbUMsQ0FBQ2xCLEdBQUQsRUFBTXJMLFVBQU4sRUFBa0I7QUFDakQsUUFBSXFMLEdBQUcsSUFBSSxPQUFPQSxHQUFHLENBQUNFLGdCQUFYLEtBQWdDLFVBQTNDLEVBQXVEO0FBQ25ELFVBQUl2TCxVQUFVLEtBQUssS0FBbkIsRUFBMEI7QUFDdEIsZUFBTyxXQUFQO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsZUFBT3FMLEdBQUcsQ0FBQ0UsZ0JBQUosRUFBUDtBQUNIO0FBQ0o7O0FBRUQsV0FBT0YsR0FBUDtBQUNIOztBQTc1QjRDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXHJcbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InO1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0IGRlYXN5bmMgZnJvbSAnZGVhc3luYyc7XHJcbmltcG9ydCBGdXR1cmUgZnJvbSAnZmliZXJzL2Z1dHVyZSc7XHJcbmltcG9ydCBGaWJlciBmcm9tICdmaWJlcnMnO1xyXG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XHJcbmltcG9ydCBTdGVwUmVzdWx0IGZyb20gJy4uL21vZGVsL3N0ZXAtcmVzdWx0JztcclxuaW1wb3J0IE94eWdlbkV2ZW50cyBmcm9tICcuL094eWdlbkV2ZW50cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgKiBhcyBjb3JlVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFNUQVRVUyBmcm9tICcuLi9tb2RlbC9zdGF0dXMuanMnO1xyXG5pbXBvcnQgKiBhcyBNb2R1bGVzIGZyb20gJy4uL294X21vZHVsZXMvaW5kZXgnO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIsIHsgREVGQVVMVF9MT0dHRVJfSVNTVUVSLCBJU1NVRVJTIH0gZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmltcG9ydCB7IE94eWdlblN1Yk1vZHVsZSB9IGZyb20gJy4vT3h5Z2VuU3ViTW9kdWxlJztcclxuXHJcbi8qZ2xvYmFsIF9fc3RhY2sqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnX19zdGFjaycsIHtcclxuICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBvcmlnID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XHJcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcclxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xyXG4gICAgICAgIHZhciBzdGFjayA9IGVyci5zdGFjaztcclxuICAgICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWc7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xyXG5jb25zdCBERUZBVUxUX09QVFMgPSB7XHJcbiAgICBiYWNrdHJhY2U6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gc2hvdyBmdWxsIGJhY2t0cmFjZSBmb3IgZXJyb3JzXHJcbiAgICBjb21waWxlcjogW10sIC8vIDxzdHJpbmdbXT4gKFwiZXh0ZW5zaW9uOm1vZHVsZVwiKSByZXF1aXJlIGZpbGVzIHdpdGggdGhlIGdpdmVuIEVYVEVOU0lPTiBhZnRlciByZXF1aXJpbmcgTU9EVUxFIChyZXBlYXRhYmxlKVxyXG4gICAgZmFpbEFtYmlndW91c0RlZmluaXRpb25zOiBmYWxzZSwgLy8gPGJvb2xlYW4+IHRyZWF0IGFtYmlndW91cyBkZWZpbml0aW9ucyBhcyBlcnJvcnNcclxuICAgIGZhaWxGYXN0OiBmYWxzZSwgLy8gPGJvb2xlYW4+IGFib3J0IHRoZSBydW4gb24gZmlyc3QgZmFpbHVyZVxyXG4gICAgaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnM6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gdHJlYXQgdW5kZWZpbmVkIGRlZmluaXRpb25zIGFzIHdhcm5pbmdzXHJcbiAgICBuYW1lOiBbXSwgLy8gPFJFR0VYUFtdPiBvbmx5IGV4ZWN1dGUgdGhlIHNjZW5hcmlvcyB3aXRoIG5hbWUgbWF0Y2hpbmcgdGhlIGV4cHJlc3Npb24gKHJlcGVhdGFibGUpXHJcbiAgICBwcm9maWxlOiBbXSwgLy8gPHN0cmluZz4gKG5hbWUpIHNwZWNpZnkgdGhlIHByb2ZpbGUgdG8gdXNlXHJcbiAgICByZXF1aXJlOiBbXSwgLy8gPHN0cmluZz4gKGZpbGUvZGlyL2dsb2IpIHJlcXVpcmUgZmlsZXMgYmVmb3JlIGV4ZWN1dGluZyBmZWF0dXJlc1xyXG4gICAgb3JkZXI6ICdkZWZpbmVkJywgLy8gPHN0cmluZz4gc3dpdGNoIGJldHdlZW4gZGV0ZXJtaW5pc3RpYyAgYW5kIHJhbmRvbSBmZWF0dXJlIGV4ZWN1dGlvbi4gRWl0aGVyIFwiZGVmaW5lZFwiLCBcInJhbmRvbVwiIG9yIFwicmFuZG9tOjQyXCIgd2hlcmVhcyA0MiBpcyB0aGUgc2VlZCBmb3IgcmFuZG9taXphdGlvblxyXG4gICAgc25pcHBldFN5bnRheDogdW5kZWZpbmVkLCAvLyA8c3RyaW5nPiBzcGVjaWZ5IGEgY3VzdG9tIHNuaXBwZXQgc3ludGF4XHJcbiAgICBzbmlwcGV0czogdHJ1ZSwgLy8gPGJvb2xlYW4+IGhpZGUgc3RlcCBkZWZpbml0aW9uIHNuaXBwZXRzIGZvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICBzb3VyY2U6IHRydWUsIC8vIDxib29sZWFuPiBoaWRlIHNvdXJjZSB1cmlzXHJcbiAgICBzdHJpY3Q6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gZmFpbCBpZiB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICB0YWdFeHByZXNzaW9uOiAnJywgLy8gPHN0cmluZz4gKGV4cHJlc3Npb24pIG9ubHkgZXhlY3V0ZSB0aGUgZmVhdHVyZXMgb3Igc2NlbmFyaW9zIHdpdGggdGFncyBtYXRjaGluZyB0aGUgZXhwcmVzc2lvblxyXG4gICAgdGFnc0luVGl0bGU6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gYWRkIGN1Y3VtYmVyIHRhZ3MgdG8gZmVhdHVyZSBvciBzY2VuYXJpbyBuYW1lXHJcbiAgICB0aW1lb3V0OiBERUZBVUxUX1RJTUVPVVQgLy8gPG51bWJlcj4gdGltZW91dCBmb3Igc3RlcCBkZWZpbml0aW9ucyBpbiBtaWxsaXNlY29uZHNcclxufTtcclxuY29uc3QgTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVggPSAvXm1vZHVsZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IFNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCA9IC9ec2VydmljZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IERPX05PVF9XUkFQX01FVEhPRFMgPSBbJ2RyaXZlcicsICdnZXREcml2ZXInXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfQ1RYID0ge1xyXG4gICAgcGFyYW1zOiB7fSxcclxuICAgIHZhcnM6IHt9LFxyXG4gICAgZW52OiB7fSxcclxuICAgIGNhcHM6IHt9XHJcbn07XHJcbmNvbnN0IERFRkFVTFRfUkVTVUxUX1NUT1JFID0ge1xyXG4gICAgc3RlcHM6IFtdLFxyXG4gICAgbG9nczogW10sXHJcbiAgICBoYXI6IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbiBleHRlbmRzIE94eWdlbkV2ZW50cyB7XHJcbiAgICBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0geyAuLi5ERUZBVUxUX1JFU1VMVF9TVE9SRSB9O1xyXG4gICAgICAgIHRoaXMuY3R4ID0geyAuLi5ERUZBVUxUX0NUWCB9O1xyXG4gICAgICAgIHRoaXMubW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2VydmljZXMgPSB7fTtcclxuICAgICAgICB0aGlzLnJlcG8gPSB7fTtcclxuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm94QmFzZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nKTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKCdPeHlnZW4nKSk7XHJcbiAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0ID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChvcHRpb25zLCBjYXBzLCBjdHggPSB7fSwgcmVzdWx0cyA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX09QVFMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY3dkID0gdGhpcy5vcHRzLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuY3R4ID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX0NUWCwgY3R4IHx8IHt9KTtcclxuICAgICAgICB0aGlzLmN0eC5jYXBzID0geyAuLi5jdHguY2FwcyB8fCB7fSwgLi4uY2FwcywgfTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX1JFU1VMVF9TVE9SRSwgcmVzdWx0cyB8fCB7fSk7XHJcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0aGlzLmN0eC5jYXBzID0gY2FwcztcclxuXHJcbiAgICAgICAgLy8gZGVmaW5lICdveCcgb2JqZWN0IGluIGdsb2JhbCBKUyBzY29wZVxyXG4gICAgICAgIC8vIHdlIHdpbGwgdXNlIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyBPeHlnZW4gbW9kdWxlcyBhbmQgdGVzdCBjb250ZXh0IGZyb20gbW9kdWxlcyB1c2VkIGluIHRoZSB0ZXN0IChpZiBhbnkpICAgICAgICBcclxuICAgICAgICB0aGlzLm1ha2VPeEdsb2JhbCgpO1xyXG4gICAgICAgIC8vIGxvYWQgc2VydmljZXNcclxuICAgICAgICB0aGlzLl9sb2FkU2VydmljZXMoKTtcclxuICAgICAgICAvLyBsb2FkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9sb2FkTW9kdWxlcygpO1xyXG4gICAgICAgIC8vIGlmIG9wdGlvbnMubWFrZU1vZHVsZXNHbG9iYWwgaXMgdHJ1ZSBvciB1bmRlZmluZWQgdGhhbiBkZWZpbmUgJ2N0eCcgY29udGVudCBhbmQgZWFjaCBtb2R1bGUgaW4gZ2xvYmFsIHNjb3BlXHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZXM6ICcsIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlU2VydmljZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZTogJywgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBhZGp1c3RTY3JpcHRMaW5lKCkge1xyXG4gICAgICAgIGNvbnN0IGlzSW5EZWJ1Z01vZGUgPSBveHV0aWwuaXNJbkRlYnVnTW9kZSgpO1xyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsaW5lIGlmIHdlIGFyZSBydW5uaW5nIGluIGRlYnVnZ2VyIG1vZGUgKFY4IGRlYnVnZ2VyIGFkZHMgYW4gZXh0cmEgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzSW5EZWJ1Z01vZGUgPyAtMSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGV4dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdHg7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbnRleHQoY3R4KSB7XHJcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3guY3R4ID0gY3R4O1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgXCJwYXJhbXNcIiBhbmQgXCJlbnZcIiBpbiBcIm94XCIgZ2xvYmFsIHZhcmlhYmxlXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucGFyYW1zID0gY3R4LnBhcmFtcyB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5lbnYgPSBjdHguZW52IHx8IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXBvc2l0b3J5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcG87XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHJlcG9zaXRvcnkocmVwbykge1xyXG4gICAgICAgIHRoaXMucmVwbyA9IHJlcG87XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3gucmVwbyA9IHJlcG87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXN1bHRzKCkge1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaXRzZWxmIC0gc3VtbWFyeSBvZiBkdXJhdGlvbnMgZm9yIGFsbCB0aGUgc3RlcHMgaW4gdGhpcyB0cmFuc2FjdGlvblxyXG4gICAgICAgIC8vIGFsc28gYWRqdXN0IHRyYW5zYWN0aW9uIGVuZCB0aW1lIHRvIG11Y2ggZW5kIHRpbWUgZm9yIHRoZSBsYXN0IGV4ZWN1dGVkIHN0ZXAgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24uXHJcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc1N0ZXAgb2YgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcykge1xyXG4gICAgICAgICAgICBpZiAodHJhbnNTdGVwLm5hbWUuaW5jbHVkZXMoJy50cmFuc2FjdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc05hbWUgPSB0cmFuc1N0ZXAudHJhbnNhY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gJiBpcyBub3QgdGhlIHRyYW5zYWN0aW9uIHN0ZXBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC50cmFuc2FjdGlvbiA9PT0gdHJhbnNOYW1lICYmIHN0ZXAgIT09IHRyYW5zU3RlcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gKz0gc3RlcC5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuZW5kVGltZSA+IHRyYW5zU3RlcC5lbmRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZW5kVGltZSA9IHN0ZXAuZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtb2RDYXBzID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgJiYgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgJiYgdHlwZW9mIG1vZHVsZS5fZ2V0Q2FwYWJpbGl0aWVzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXBzID0gbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9ubHkgbm9uLWVtcHR5IGNhcHMgcGVyIG1vZHVsZSB0aGF0IGhhcyB0aGlzLmNhcHMgcHJvcGVydHlcclxuICAgICAgICAgICAgICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjYXBzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kQ2Fwc1ttb2R1bGUubmFtZV0gPSBjYXBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb2RDYXBzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UmVzdWx0cygpIHtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzID0gW107XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzID0gW107XHJcbiAgICAgICAgdGhpcy5oYXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQmVmb3JlQ2FzZShjb250ZXh0KSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5vbkJlZm9yZUNhc2UgJiYgYXdhaXQgbW9kdWxlLm9uQmVmb3JlQ2FzZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5faXRlcmF0aW9uU3RhcnQgJiYgYXdhaXQgbW9kdWxlLl9pdGVyYXRpb25TdGFydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbkJlZm9yZUNhc2VcIiBtZXRob2Qgb2YgJHttb2R1bGVOYW1lfSBtb2R1bGUuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlckNhc2UoZXJyb3IgPSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGZvciBhdm9pZCBzdHVjayBvbiAqLmRpc3Bvc2UgY2FsbFxyXG4gICAgICAgICAgICAgICAgbW9kdWxlLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkFmdGVyQ2FzZShlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2l0ZXJhdGlvbkVuZCAmJiBhd2FpdCBtb2R1bGUuX2l0ZXJhdGlvbkVuZChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uQWZ0ZXJDYXNlXCIgbWV0aG9kIG9mICR7bW9kdWxlTmFtZX0gbW9kdWxlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1ha2VPeEdsb2JhbCgpIHtcclxuICAgICAgICBpZiAoIWdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3ggPSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGVzOiB0aGlzLm1vZHVsZXMsXHJcbiAgICAgICAgICAgICAgICBjdHg6IHRoaXMuY3R4LFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRzLFxyXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICByZXN1bHRTdG9yZTogdGhpcy5yZXN1bHRTdG9yZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLnZhcnMgPSB0aGlzLmN0eC52YXJzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwoKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlICdveCcgaXMgYWxyZWFkeSBnbG9iYWxcclxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBtb2R1bGVzIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsW21vZHVsZU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW21vZHVsZU5hbWVdID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBcImN0eFwiLCBcInBhcmFtc1wiIGFuZCBcImVudlwiIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZ2xvYmFsLnBhcmFtcyA9IGdsb2JhbC5veC5jdHgucGFyYW1zO1xyXG4gICAgICAgICAgICBnbG9iYWwuZW52ID0gZ2xvYmFsLm94LmN0eC5lbnY7XHJcbiAgICAgICAgICAgIGdsb2JhbC5jdHggPSBnbG9iYWwub3guY3R4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGFnZU9iamVjdEZpbGUocG9QYXRoKSB7XHJcbiAgICAgICAgaWYgKCFwb1BhdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBwbyA9IHJlcXVpcmUocG9QYXRoKTtcclxuICAgICAgICAgICAgLy8gc2V0IHBhZ2Ugb2JqZWN0IHJlcG9zaXRvcnkgYXMgdGhlIG1haW4gb25lXHJcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHBvO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSBwbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLnBvID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGUgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBfd3JhcExvZ2dlcihfbG9nZ2VyKSB7XHJcbiAgICAgICAgY29uc3QgbG9nZ2VyV3JhcCA9IHtcclxuICAgICAgICAgICAgaW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MpLFxyXG4gICAgICAgICAgICBkZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzKSxcclxuICAgICAgICAgICAgZXJyb3I6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2Vycm9yJywgYXJncyksXHJcbiAgICAgICAgICAgIHdhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzKSxcclxuICAgICAgICAgICAgdXNlckluZm86ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2luZm8nLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgICAgICB1c2VyRGVidWc6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2RlYnVnJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICAgICAgdXNlckVycm9yOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdlcnJvcicsIGFyZ3MsIElTU1VFUlMuVVNFUiksXHJcbiAgICAgICAgICAgIHVzZXJXYXJuOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICd3YXJuJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBsb2dnZXJXcmFwO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2coX2xvZ2dlciwgbGV2ZWwsIGFyZ3MsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGlmICghX2xvZ2dlcltsZXZlbF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfbG9nZ2VyW2xldmVsXS5hcHBseShfbG9nZ2VyLCBhcmdzKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG94dXRpbC5zdHJpbmdpZnkoYXJncywgMik7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAvLyBhZGQgdGhlIGxvZyBlbnRyeSB0byB0aGUgcmVzdWx0IHN0b3JlXHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5sb2dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUubG9ncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHNyYzogc3JjXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgYXJndW1lbnQsIGlmIGl0J3MgYSBtZXNzYWdlXHJcbiAgICAgICAgYXJncyA9IG1lc3NhZ2UgPyBhcmdzLnNoaWZ0KCkgOiBhcmdzO1xyXG4gICAgICAgIHRoaXMuZW1pdExvZyh0aW1lLCBsZXZlbCwgbWVzc2FnZSwgYXJncywgc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFNlcnZpY2VzKCkge1xyXG4gICAgICAgIGNvbnN0IG94U2VydmljZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3hCYXNlRGlyLCAnLi9veF9zZXJ2aWNlcycpO1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlcyA9IGdsb2Iuc3luYygnc2VydmljZS0qLmpzJywgeyBjd2Q6IG94U2VydmljZXNEaXJQYXRoIH0pO1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIHNlcnZpY2VzXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZXMuLi4nKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlRmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUZpbGVOYW1lID0gc2VydmljZUZpbGVzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZVBhdGggPSBwYXRoLmpvaW4ob3hTZXJ2aWNlc0RpclBhdGgsIHNlcnZpY2VGaWxlTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcnZpY2VGaWxlTmFtZS5tYXRjaChTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHJlc3VsdFsxXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMub3B0cy5zZXJ2aWNlcyA9IHVuZGVmaW5lZCBpbiBzaW5nbGUgZmlsZSBtb2RlXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5zZXJ2aWNlcykgJiYgIXRoaXMub3B0cy5zZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZTogJyArIHNlcnZpY2VOYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLl9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZUZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBzZXJ2aWNlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHNlcnZpY2UgXCInICsgc2VydmljZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZVBhdGgpIHtcclxuICAgICAgICBsZXQgU2VydmljZUNsYXNzID0gcmVxdWlyZShzZXJ2aWNlUGF0aCk7XHJcbiAgICAgICAgLy8gRVM2IGNsYXNzIHdpbGwgYmUgdW5kZXIgJ2RlZmF1bHQnIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKFNlcnZpY2VDbGFzcy5kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIFNlcnZpY2VDbGFzcyA9IFNlcnZpY2VDbGFzcy5kZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZXJ2aWNlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYFNlcnZpY2U6JHtzZXJ2aWNlTmFtZX1gKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2xhc3ModGhpcy5vcHRzLCB0aGlzLmN0eCwgdGhpcy5yZXN1bHRTdG9yZSwgc2VydmljZUxvZ2dlcik7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRNb2R1bGVzKCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIGludGVybmFsIG1vZHVsZXMuLi4nKTtcclxuICAgICAgICB0aGlzLl9sb2FkSW50ZXJuYWxNb2R1bGVzKCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZXh0ZXJuYWwgbW9kdWxlcy4uLicpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRFeHRlcm5hbE1vZHVsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEV4dGVybmFsTW9kdWxlcygpIHtcclxuICAgICAgICBsZXQgbW9kdWxlc0ZvbGRlclBhdGggPSAnLi9tb2R1bGVzJztcclxuICAgICAgICBpZiAodGhpcy5vcHRzLm1vZHVsZXNfZXh0ICYmIHR5cGVvZiB0aGlzLm9wdHMubW9kdWxlc19leHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXNGb2xkZXJQYXRoID0gdGhpcy5vcHRzLm1vZHVsZXNfZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL2NvbnN0IG94TW9kdWxlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X21vZHVsZXMnKTtcclxuICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY3dkLCBtb2R1bGVzRm9sZGVyUGF0aCk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG94TW9kdWxlc0RpclBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1vZHVsZUZpbGVzID0gW107XHJcbiAgICAgICAgLy8gaWYgcGFydGljdWxhciBtb2R1bGUgbmFtZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZywgdGhlbiBsb2FkIG9ubHkgdGhlc2UgbW9kdWxlc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5tb2R1bGVzKSAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tb2R1bGVzLmZvckVhY2gobW9kdWxlTmFtZSA9PiBtb2R1bGVGaWxlcy5wdXNoKGBtb2R1bGUtJHttb2R1bGVOYW1lfS5qc2ApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIGFsbCBhdmFpbGFibGUgbW9kdWxlcyAobWlnaHQgYmUgbW9yZSB0aW1lIGNvbnN1bWluZylcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbW9kdWxlRmlsZXMgPSBnbG9iLnN5bmMoJ21vZHVsZS0qLmpzJywgeyBjd2Q6IG94TW9kdWxlc0RpclBhdGggfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIG1vZHVsZXMgICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZUZpbGVOYW1lIG9mIG1vZHVsZUZpbGVzKSB7XHJcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHRoZSBtb2R1bGUgZmlsZSBuYW1lIGJhc2VkIG9uIG1vZHVsZSBuYW1lIHBhdHRlcm5cclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZHVsZUZpbGVOYW1lLm1hdGNoKE1PRFVMRV9OQU1FX01BVENIX1JFR0VYKVsxXTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbG9nZ2VyIGZvciB0aGUgbW9kdWxlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgTW9kdWxlOiR7bW9kdWxlTmFtZX1gKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBtb2R1bGUgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGNvcmVVdGlscy5sb2FkTW9kdWxlRnJvbUZpbGUobW9kdWxlTmFtZSwgbW9kdWxlRmlsZU5hbWUsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSW50ZXJuYWxNb2R1bGVzKCkge1xyXG4gICAgICAgIC8vIGlmIGBtb2R1bGVzYCBpcyBlbXB0eSBvciB1bmRlZmluZWQgaW4gb3h5Z2VuLmNvbmYgdGhlbiBsb2FkIGFsbCBtb2R1bGVzXHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIG9ubHkgdGhvc2UgaW1wbGljaXRseSBkZWZpbmVkXHJcbiAgICAgICAgY29uc3QgZXhjbHVkZVVuZGVmaW5lZE1vZHMgPSB0aGlzLm9wdHMubW9kdWxlcyAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIG9mIE9iamVjdC5rZXlzKE1vZHVsZXMpKSB7XHJcbiAgICAgICAgICAgIGlmIChleGNsdWRlVW5kZWZpbmVkTW9kcyAmJiAhdGhpcy5vcHRzLm1vZHVsZXMuaW5jbHVkZXMobW9kdWxlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IE1vZHVsZUNsYXNzID0gTW9kdWxlc1ttb2R1bGVOYW1lXTtcclxuICAgICAgICAgICAgY29uc3Qgb3hNb2R1bGVzRGlyUGF0aCA9IG94dXRpbC5nZXRPeE1vZHVsZXNEaXIoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBsb2dnZXIgZm9yIHRoZSBtb2R1bGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZUxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKGBNb2R1bGU6JHttb2R1bGVOYW1lfWApKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IG1vZHVsZSBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kID0gY29yZVV0aWxzLmxvYWRNb2R1bGVGcm9tQ2xhc3MobW9kdWxlTmFtZSwgTW9kdWxlQ2xhc3MsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF93cmFwTW9kdWxlKG5hbWUsIG1vZHVsZSkge1xyXG4gICAgICAgIGlmICghbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IG5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgbW9kdWxlTWV0aG9kcyA9IE9iamVjdC5rZXlzKG1vZHVsZSk7XHJcbiAgICAgICAgaWYgKCFtb2R1bGVNZXRob2RzLnNvbWUoeCA9PiB4PT09ICdleHBvcnRzJykpIHtcclxuICAgICAgICAgICAgbW9kdWxlTWV0aG9kcyA9IHRoaXMuX2dldEFsbFByb3BlcnR5TmFtZXMobW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgbWV0aG9kTmFtZSBvZiBtb2R1bGVNZXRob2RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1vZHVsZVttZXRob2ROYW1lXTtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgcHJvcGVydHkgdGhhdCBpcyBub3QgYSBmdW5jdGlvbiBvciBhIE94eWdlblN1Yk1vZHVsZVxyXG4gICAgICAgICAgICBpZiAoKCEobWV0aG9kIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICEobWV0aG9kIGluc3RhbmNlb2YgT3h5Z2VuU3ViTW9kdWxlKSAmJiB0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB8fCBtZXRob2ROYW1lID09PSAnZXhwb3J0cycgfHwgbWV0aG9kTmFtZSA9PT0gJ19jb21waWxlJykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gbWFwIGFuZCB3cmFwIHN1Yi1tb2R1bGUgbWV0aG9kcyAocmVjdXJzaXZlIGNhbGwgdG8gX3dyYXBNb2R1bGUpXHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBPeHlnZW5TdWJNb2R1bGUpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSB0aGlzLl93cmFwTW9kdWxlKGAke25hbWV9LiR7bWV0aG9kTmFtZX1gLCBtZXRob2QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCB3cmFwIG1ldGhvZHNcclxuICAgICAgICAgICAgZWxzZSBpZiAoRE9fTk9UX1dSQVBfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gPT09ICdkcml2ZXInIHx8IG1ldGhvZE5hbWUgPT09ICdnZXREcml2ZXInXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gbW9kdWxlW21ldGhvZE5hbWVdLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBwcml2YXRlIG1ldGhvZHMgYW5kIGV2ZW50IGhhbmRsZXJzXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZE5hbWUuaW5kZXhPZignXycpID09PSAwIHx8IG1ldGhvZE5hbWUuaW5kZXhPZignb24nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmc6ICcgKyBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVttZXRob2ROYW1lXS5hcHBseShtb2R1bGUsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpbnRlcm5hbCBfZ2V0Q2FwYWJpbGl0aWVzIG1ldGhvZCBmb3IgaW50ZXJuYWwgT3h5Z2VuIENvcmUgdXNlXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIF9nZXRDYXBhYmlsaXRpZXMgbWV0aG9kIHdvbid0IGJlIHZpc2libGUgaW4gdGhlIHRlc3QgcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdnZXRDYXBhYmlsaXRpZXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlclsnX2dldENhcGFiaWxpdGllcyddID0gbWV0aG9kLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY29tbWFuZFdyYXBwZXIobWV0aG9kTmFtZSwgYXJncywgbW9kdWxlLCBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBPeEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdUaHJvd2luZyBhZ2FpbjonLCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBuYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIF9jb21tYW5kV3JhcHBlcihjbWROYW1lLCBjbWRBcmdzLCBtb2R1bGUsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlW2NtZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmV0dmFsID0gbnVsbDtcclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNtZEZuID0gbW9kdWxlW2NtZE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY01ldGhvZCA9ICFjbWROYW1lLnN0YXJ0c1dpdGgoJ18nKSAmJiBjbWROYW1lICE9PSAnZGlzcG9zZSc7XHJcblxyXG4gICAgICAgIC8vIGRlbGF5IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBpZiByZXF1aXJlZFxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmRlbGF5ICYmXHJcbiAgICAgICAgICAgIHB1YmxpY01ldGhvZCAmJlxyXG4gICAgICAgICAgICBjbWROYW1lICE9PSAnaW5pdCcgJiZcclxuICAgICAgICAgICAgY21kTmFtZSAhPT0gJ3RyYW5zYWN0aW9uJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBkZWFzeW5jLnNsZWVwKHRoaXMub3B0cy5kZWxheSAqIDEwMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGhyb3cgaWYgYSBjb21tYW5kIGV4ZWN1dGVkIG9uIHVuaXRpYWxpemVkIG1vZHVsZSAoZXhjZXB0IGludGVybmFsIG1ldGhvZHMgYW5kIGEgZmV3IG90aGVyKVxyXG4gICAgICAgIGlmICghbW9kdWxlLmlzSW5pdGlhbGl6ZWQgJiYgcHVibGljTWV0aG9kICYmIGNtZE5hbWUgIT09ICdpbml0JyAmJiBjbWROYW1lICE9PSAndHJhbnNhY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnTWlzc2luZyAnICsgbW9kdWxlTmFtZSArICcuaW5pdCgpJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWN0eXB0IGFyZ3VtZW50c1xyXG4gICAgICAgIGxldCBkZWNyeXB0ZWRBcmdzID0gdGhpcy5fZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5KGNtZEFyZ3MsIG1vZHVsZU5hbWUpO1xyXG4gICAgICAgIGRlY3J5cHRlZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShkZWNyeXB0ZWRBcmdzKTtcclxuXHJcbiAgICAgICAgLy8gcmVwbGFjZSBwYXJhbWV0ZXJzIGluIG1ldGhvZCBhcmd1bWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlc1xyXG4gICAgICAgIGNtZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShjbWRBcmdzKTtcclxuICAgICAgICAvLyBzdGFydCBtZWFzdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbiB0aW1lXHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICAvLyBhZGQgY29tbWFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiAoZS5nLiBmaWxlIG5hbWUgYW5kIGNvbW1hbmQgbGluZSlcclxuICAgICAgICBsZXQgY21kTG9jYXRpb24gPSBudWxsO1xyXG4gICAgICAgIC8vIGRvIG5vdCByZXBvcnQgcmVzdWx0cyBvciBsaW5lIHVwZGF0ZXMgb24gaW50ZXJuYWwgbWV0aG9kcyAoc3RhcnRlZCB3aXRoICdfJylcclxuICAgICAgICBpZiAocHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNtZExvY2F0aW9uID0gdGhpcy5fZ2V0Q29tbWFuZExvY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJlZm9yZUNvbW1hbmQoY21kTmFtZSwgbW9kdWxlTmFtZSwgY21kRm4sIGNtZEFyZ3MsIHRoaXMuY3R4LCBjbWRMb2NhdGlvbiwgc3RhcnRUaW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmc6ICcgKyBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MpKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gZW1pdCBiZWZvcmUgZXZlbnRzXHJcbiAgICAgICAgICAgIGlmIChjbWROYW1lID09PSAnZGlzcG9zZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dyYXBBc3luYyh0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZVdpbGxEaXNwb3NlKS5hcHBseSh0aGlzLCBbbW9kdWxlXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJldHZhbFByb21pc2UgPSB0aGlzLl93cmFwQXN5bmMobW9kdWxlW2NtZE5hbWVdKS5hcHBseShtb2R1bGUsIGRlY3J5cHRlZEFyZ3MpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldHZhbFByb21pc2UgJiYgcmV0dmFsUHJvbWlzZS50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZURvbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR2YWxQcm9taXNlLnRoZW4oKHZhbHVlKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0sIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFwcm9taXNlRG9uZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR2YWwgPSByZXR2YWxQcm9taXNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY21kTmFtZSA9PT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cmFwQXN5bmModGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZCkuYXBwbHkodGhpcywgW21vZHVsZV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tZXNzYWdlICYmIHR5cGVvZiBlLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGUubWVzc2FnZS5pbmNsdWRlcygnaW52YWxpZCBzZXNzaW9uIGlkJykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyBpZiBlcnJvciBvY3VycmVkIGFmdGVyIHRoZSBtb2R1bGUgd2FzIGRpc3Bvc2VkIChvciBpbiBhIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQpXHJcbiAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIGluaXQgbWV0aG9kcyBvZiBjb3Vyc2VcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIG1vZHVsZS5pc0luaXRpYWxpemVkID09PSAnYm9vbGVhbicgJiYgIW1vZHVsZS5pc0luaXRpYWxpemVkKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNtZE5hbWUgIT09ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJz09PT0gZXJyb3IgPT09PScsIGUpXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9ySGVscGVyLmdldE94eWdlbkVycm9yKGUsIG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICBsZXQgc3RlcFJlc3VsdDtcclxuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhaXRJZCA9ICtuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QucHVzaCh3YWl0SWQpO1xyXG5cclxuICAgICAgICAgICAgc3RlcFJlc3VsdCA9IHRoaXMuX2dldFN0ZXBSZXN1bHQobW9kdWxlLCBtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzLCBjbWRMb2NhdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCByZXR2YWwsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LmluZGV4T2Yod2FpdElkKTtcclxuICAgICAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgICAvL3N0ZXBSZXN1bHQubG9jYXRpb24gPSBjbWRMb2NhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMucHVzaChzdGVwUmVzdWx0KTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QWZ0ZXJDb21tYW5kKGNtZE5hbWUsIG1vZHVsZU5hbWUsIGNtZEZuLCBjbWRBcmdzLCB0aGlzLmN0eCwgY21kTG9jYXRpb24sIGVuZFRpbWUsIHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5pc0ZhdGFsICYmICF0aGlzLm9wdHMuY29udGludWVPbkVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmICghZXJyb3IubG9jYXRpb24gJiYgY21kTG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGVycm9yLmxvY2F0aW9uID0gY21kTG9jYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0ICYmIHN0ZXBSZXN1bHQuZmFpbHVyZSAmJiBzdGVwUmVzdWx0LmZhaWx1cmUubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGVycm9yLmxvY2F0aW9uID0gc3RlcFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBfd3JhcEFzeW5jIChmbiwgY29udGV4dCkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IGNvbnRleHQgfHwgdGhpcztcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgY29kZSBpcyBub3QgcnVubmluZyBpbnNpZGUgdGhlIEZpYmVyIGNvbnRleHQsIHRoZW4gcnVuIGFzeW5jIGNvZGUgYXMgc3luYyB1c2luZyBkZWFzeW5jIG1vZHVsZVxyXG4gICAgICAgICAgICBpZiAoIUZpYmVyLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHZhbCA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsVmFsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmV0dmFsICYmIHJldHZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJldHZhbClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbCA9IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLm1lc3NhZ2UgJiYgdHlwZW9mIGUubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdyZWFkeVN0YXRlJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGFzIGl0IHVzdWFsbHkgaGFwcGVucyBcclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIE94eWdlbiBpcyBkaXNwb3NlZCBhbmQgcHJvY2VzcyBpcyBiZWluZyBraWxsZWRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVhc3luYy5sb29wV2hpbGUoKSBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCByZXR2YWwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIHdlIGFyZSBpbnNpZGUgdGhlIEZpYmVyIGNvbnRleHQsIHRoZW4gdXNlIEZpYmVyJ3MgRnV0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmdXR1cmUgPSBuZXcgRnV0dXJlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWwpID0+IGZ1dHVyZS5yZXR1cm4odmFsKSwgKGVycikgPT4gZnV0dXJlLnRocm93KGVycikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdXR1cmUud2FpdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXRyaWV2ZSBjdXJyZW50IGxpbmUgYW5kIGZ1bmN0aW9uIG5hbWUgZnJvbSB0aGUgY2FsbCBzdGFja1xyXG4gICAgX2dldENvbW1hbmRMb2NhdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzdGFjayA9IF9fc3RhY2s7XHJcbiAgICAgICAgbGV0IGNhbGxlciA9IG51bGw7XHJcbiAgICAgICAgZm9yIChsZXQgY2FsbCBvZiBzdGFjaykge1xyXG4gICAgICAgICAgICBpZiAoX19maWxlbmFtZSA9PT0gY2FsbC5nZXRGaWxlTmFtZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IGNhbGxlciwgd2hpY2ggaXMgbm90IHRoZSBjdXJyZW50IGZpbGVcclxuICAgICAgICAgICAgY2FsbGVyID0gY2FsbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYWxsZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke2NhbGxlci5nZXRGaWxlTmFtZSgpfToke2NhbGxlci5nZXRMaW5lTnVtYmVyKCkgKyB0aGlzLmFkanVzdFNjcmlwdExpbmV9OiR7Y2FsbGVyLmdldENvbHVtbk51bWJlcigpfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRTdGVwUmVzdWx0KG1vZHVsZSwgbW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgYXJncywgbG9jYXRpb24sIHN0YXJ0VGltZSwgZW5kVGltZSwgcmV0dmFsLCBlcnIpIHtcclxuICAgICAgICB2YXIgc3RlcCA9IG5ldyBTdGVwUmVzdWx0KCk7XHJcblxyXG4gICAgICAgIHN0ZXAubmFtZSA9IG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgc3RlcC50cmFuc2FjdGlvbiA9IGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSB8fCBudWxsOyAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogd2h5IGlzIHRoaXMgaGVyZSBpZiBpdCdzIGFscmVhZHkgcG9wdWxhdGVkIGluIHJzP1xyXG4gICAgICAgIHN0ZXAubG9jYXRpb24gPSBsb2NhdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKGVyciAmJiBlcnIudHlwZSAmJiBlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuUEFTU0VEO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSBzdGVwIHN0YXR1c1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmlzRmF0YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuUEFTU0VEO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGVwLmFjdGlvbiA9ICh0eXBlb2YgbW9kdWxlLl9pc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IG1vZHVsZS5faXNBY3Rpb24obWV0aG9kTmFtZSkgOiBmYWxzZSk7XHJcbiAgICAgICAgc3RlcC5zdGFydFRpbWUgPSBzdGFydFRpbWU7XHJcbiAgICAgICAgc3RlcC5lbmRUaW1lID0gZW5kVGltZTtcclxuICAgICAgICBzdGVwLmR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX2dldFN0YXRzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHMgPSBtb2R1bGUuX2dldFN0YXRzKG1ldGhvZE5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHMgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIudHlwZSAmJiBlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICYmIGVyci50eXBlICYmIGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlLmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIG1vZHVsZSBkZWNpZGUgd2hldGhlciBhIHNjcmVlbnNob3Qgc2hvdWxkIGJlIHRha2VuIG9uIGVycm9yIG9yIG5vdFxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudCA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpcy5vcHRzLmRpc2FibGVTY3JlZW5zaG90KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zY3JlZW5zaG90ID0gbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudChtZXRob2ROYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUsIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHNjcmVlbnNob3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHdhaXQgZm9yIGEgbW9tZW50IChpbiBQZXJmZWN0byBDbG91ZCwgdGhlIHNjcmVlbnNob3QgbWlnaHQgbm90IGJlIGltbWlkaWF0ZWx5IGF2YWlsYWJsZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVhc3luYy5zbGVlcCgxMDAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc2NyZWVuc2hvdCA9IG1vZHVsZS5fdGFrZVNjcmVlbnNob3RTaWxlbnQobWV0aG9kTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBpbmRpY2F0ZSB0byB1c2VyIHRoYXQgYW4gYXR0ZW1wdCB0byB0YWtlIGEgc2NyZWVuc2hvdCBoYXMgZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0ZXA7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2Rpc3Bvc2VTZXJ2aWNlcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VydmljZXMgfHwgdHlwZW9mIHRoaXMuc2VydmljZXMgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2aWNlLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHNlcnZpY2UgZGlzcG9zYWwgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRpc3Bvc2Ugc2VydmljZSAnJHtrZXl9JzpgLCBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzIHx8IHR5cGVvZiB0aGlzLm1vZHVsZXMgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBtb2QgPSB0aGlzLm1vZHVsZXNba2V5XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtb2QuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwb3NlUmVzdWx0ID0gbW9kLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcG9zZVJlc3VsdCAmJiB0eXBlb2YgZGlzcG9zZVJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IGEgcHJvbWlzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXNwb3NlUmVzdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbW9kdWxlIGRpc3Bvc2FsIGVycm9yIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGlzcG9zZSBtb2R1bGUgJyR7a2V5fSc6IGAsIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLypcclxuICAgICAqIFNlcnZpY2VzIEV2ZW50IEVtaXR0ZXJzXHJcbiAgICAgKi9cclxuICAgIF9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZChtb2R1bGUpIHtcclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5vbk1vZHVsZUxvYWRlZChtb2R1bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZUxvYWRlZFwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX2NhbGxTZXJ2aWNlc09uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZpY2Uub25Nb2R1bGVJbml0aWFsaXplZChtb2R1bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZUluaXRpYWxpemVkXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBfY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZShtb2R1bGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMgfHwgIXRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2Uub25Nb2R1bGVXaWxsRGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Nb2R1bGVXaWxsRGlzcG9zZShtb2R1bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZVdpbGxEaXNwb3NlXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUoYXJncykge1xyXG4gICAgICAgIGlmICghYXJncyB8fCAhQXJyYXkuaXNBcnJheShhcmdzKSB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBfbmV3QXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGFyZyBvZiBhcmdzKSB7XHJcbiAgICAgICAgICAgIF9uZXdBcmdzLnB1c2godGhpcy5fcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQoYXJnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfbmV3QXJncztcclxuICAgIH1cclxuICAgIF9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudChhcmcpIHtcclxuICAgICAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ0VOQ1JZUFRFRCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZXBsYWNlIHVzZXIgcGFyYW1ldGVycyB3aXRoIHZhbHVlc1xyXG4gICAgICAgIC8vIG5vdGU6IHVzZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUgbmFtZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZW52aXJvbm1lbnQgdmFyaWFibGVcclxuICAgICAgICBmb3IgKGxldCBwYXJhbU5hbWUgaW4gdGhpcy5jdHgucGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eC5wYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW1OYW1lKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHRoaXMuY3R4LnBhcmFtc1twYXJhbU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCR7JyArIHBhcmFtTmFtZSArICd9JywgJ2cnKSwgcGFyYW1WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBlbnZOYW1lIGluIHRoaXMuY3R4LmVudikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdHguZW52Lmhhc093blByb3BlcnR5KGVudk5hbWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZWYWx1ZSA9IHRoaXMuY3R4LmVudltlbnZOYW1lXTtcclxuICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwkeycgKyBlbnZOYW1lICsgJ30nLCAnZycpLCBlbnZWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFyZztcclxuICAgIH1cclxuICAgIF9nZXRBbGxQcm9wZXJ0eU5hbWVzKCBvYmogKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBbXTtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyggb2JqICkuZm9yRWFjaChmdW5jdGlvbiAoIHByb3AgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIHByb3BzLmluZGV4T2YoIHByb3AgKSA9PT0gLTEgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaCggcHJvcCApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXHJcbiAgICAgICAgfSB3aGlsZSAoIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiggb2JqICkgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfVxyXG5cclxuICAgIF9jaGVja1N0ZXBSZXN1bHQocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfd2FpdFN0ZXBSZXN1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldERlY3J5cHRlZEFyZ3NGb3JBcHBseShhcmdzLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKCFhcmdzIHx8ICFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IF9uZXdBcmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICAgICAgX25ld0FyZ3MucHVzaCh0aGlzLl9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50KGFyZywgbW9kdWxlTmFtZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX25ld0FyZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgX2RlY3J5cHRQYXJhbWV0ZXJGb3JBcHBseUluQXJndW1lbnQoYXJnLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKGFyZyAmJiB0eXBlb2YgYXJnLmdldERlY3J5cHRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0VOQ1JZUFRFRCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnLmdldERlY3J5cHRSZXN1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFyZztcclxuICAgIH1cclxufVxyXG4iXX0=
795
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdsb2JhbCIsImdldCIsIm9yaWciLCJFcnJvciIsInByZXBhcmVTdGFja1RyYWNlIiwiXyIsInN0YWNrIiwiZXJyIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJERUZBVUxUX1RJTUVPVVQiLCJERUZBVUxUX09QVFMiLCJiYWNrdHJhY2UiLCJjb21waWxlciIsImZhaWxBbWJpZ3VvdXNEZWZpbml0aW9ucyIsImZhaWxGYXN0IiwiaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnMiLCJuYW1lIiwicHJvZmlsZSIsInJlcXVpcmUiLCJvcmRlciIsInNuaXBwZXRTeW50YXgiLCJ1bmRlZmluZWQiLCJzbmlwcGV0cyIsInNvdXJjZSIsInN0cmljdCIsInRhZ0V4cHJlc3Npb24iLCJ0YWdzSW5UaXRsZSIsInRpbWVvdXQiLCJNT0RVTEVfTkFNRV9NQVRDSF9SRUdFWCIsIlNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCIsIkRPX05PVF9XUkFQX01FVEhPRFMiLCJERUZBVUxUX0NUWCIsInBhcmFtcyIsInZhcnMiLCJlbnYiLCJjYXBzIiwiREVGQVVMVF9SRVNVTFRfU1RPUkUiLCJzdGVwcyIsImxvZ3MiLCJoYXIiLCJPeHlnZW4iLCJPeHlnZW5FdmVudHMiLCJjb25zdHJ1Y3RvciIsImlzSW5pdGlhbGl6ZWQiLCJyZXN1bHRTdG9yZSIsImN0eCIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInJlcG8iLCJjYXBhYmlsaXRpZXMiLCJvcHRzIiwib3hCYXNlRGlyIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJsb2dnZXIiLCJfd3JhcExvZ2dlciIsIl93YWl0U3RlcFJlc3VsdExpc3QiLCJpbml0Iiwib3B0aW9ucyIsInJlc3VsdHMiLCJhc3NpZ24iLCJjd2QiLCJwcm9jZXNzIiwibWFrZU94R2xvYmFsIiwiX2xvYWRTZXJ2aWNlcyIsIl9sb2FkTW9kdWxlcyIsImdsb2JhbFNjb3BlIiwibWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsIiwiZGlzcG9zZU1vZHVsZXMiLCJzdGF0dXMiLCJfZGlzcG9zZU1vZHVsZXMiLCJlIiwiY29uc29sZSIsImVycm9yIiwiZGlzcG9zZSIsIl9kaXNwb3NlU2VydmljZXMiLCJhZGp1c3RTY3JpcHRMaW5lIiwiaXNJbkRlYnVnTW9kZSIsIm94dXRpbCIsInJlc3VsdCIsImNvbnRleHQiLCJveCIsInJlcG9zaXRvcnkiLCJ0cmFuc1N0ZXAiLCJpbmNsdWRlcyIsInRyYW5zTmFtZSIsInRyYW5zYWN0aW9uIiwiZHVyYXRpb24iLCJzdGVwIiwiZW5kVGltZSIsImdldE1vZHVsZXNDYXBhYmlsaXRpZXMiLCJtb2RDYXBzIiwibW9kdWxlTmFtZSIsIm1vZHVsZSIsIl9nZXRDYXBhYmlsaXRpZXMiLCJrZXlzIiwibGVuZ3RoIiwicmVzZXRSZXN1bHRzIiwib25CZWZvcmVDYXNlIiwiX2l0ZXJhdGlvblN0YXJ0Iiwib25BZnRlckNhc2UiLCJfaXRlcmF0aW9uRW5kIiwibG9hZFBhZ2VPYmplY3RGaWxlIiwicG9QYXRoIiwicG8iLCJfbG9nZ2VyIiwibG9nZ2VyV3JhcCIsImluZm8iLCJhcmdzIiwiX2xvZyIsImRlYnVnIiwid2FybiIsInVzZXJJbmZvIiwiSVNTVUVSUyIsIlVTRVIiLCJ1c2VyRGVidWciLCJ1c2VyRXJyb3IiLCJ1c2VyV2FybiIsImxldmVsIiwic3JjIiwiREVGQVVMVF9MT0dHRVJfSVNTVUVSIiwiYXBwbHkiLCJtZXNzYWdlIiwic3RyaW5naWZ5IiwidGltZSIsImdldFRpbWVTdGFtcCIsInB1c2giLCJ0b1VwcGVyQ2FzZSIsIm1zZyIsInNoaWZ0IiwiZW1pdExvZyIsIm94U2VydmljZXNEaXJQYXRoIiwicmVzb2x2ZSIsInNlcnZpY2VGaWxlcyIsImdsb2IiLCJzeW5jIiwiaSIsInNlcnZpY2VGaWxlTmFtZSIsInNlcnZpY2VGaWxlUGF0aCIsIm1hdGNoIiwic2VydmljZU5hbWUiLCJBcnJheSIsImlzQXJyYXkiLCJzZXJ2aWNlIiwiX2xvYWRTZXJ2aWNlIiwiRU9MIiwic3RhY2t0cmFjZSIsInNlcnZpY2VQYXRoIiwiU2VydmljZUNsYXNzIiwiZGVmYXVsdCIsInNlcnZpY2VMb2dnZXIiLCJfbG9hZEludGVybmFsTW9kdWxlcyIsIl9sb2FkRXh0ZXJuYWxNb2R1bGVzIiwibW9kdWxlc0ZvbGRlclBhdGgiLCJtb2R1bGVzX2V4dCIsIm94TW9kdWxlc0RpclBhdGgiLCJmcyIsImV4aXN0c1N5bmMiLCJtb2R1bGVGaWxlcyIsImZvckVhY2giLCJtb2R1bGVGaWxlTmFtZSIsInN0YXJ0VGltZSIsIkRhdGUiLCJtb2R1bGVMb2dnZXIiLCJtb2QiLCJjb3JlVXRpbHMiLCJsb2FkTW9kdWxlRnJvbUZpbGUiLCJfY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQiLCJfd3JhcE1vZHVsZSIsImV4Y2x1ZGVVbmRlZmluZWRNb2RzIiwiTW9kdWxlcyIsIk1vZHVsZUNsYXNzIiwiZ2V0T3hNb2R1bGVzRGlyIiwibG9hZE1vZHVsZUZyb21DbGFzcyIsIndyYXBwZXIiLCJfdGhpcyIsIm1vZHVsZU1ldGhvZHMiLCJzb21lIiwieCIsIl9nZXRBbGxQcm9wZXJ0eU5hbWVzIiwibWV0aG9kTmFtZSIsIm1ldGhvZCIsIkZ1bmN0aW9uIiwiT3h5Z2VuU3ViTW9kdWxlIiwiYmluZCIsImluZGV4T2YiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJhcmd1bWVudHMiLCJnZXRNZXRob2RTaWduYXR1cmUiLCJlcnJvckhlbHBlciIsImdldE94eWdlbkVycm9yIiwiX2NvbW1hbmRXcmFwcGVyIiwiT3hFcnJvciIsImNtZE5hbWUiLCJjbWRBcmdzIiwicmV0dmFsIiwiY21kRm4iLCJwdWJsaWNNZXRob2QiLCJzdGFydHNXaXRoIiwiZGVsYXkiLCJkZWFzeW5jIiwic2xlZXAiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiZGVjcnlwdGVkQXJncyIsIl9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkiLCJfcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUiLCJjbWRMb2NhdGlvbiIsIl9nZXRDb21tYW5kTG9jYXRpb24iLCJlbWl0QmVmb3JlQ29tbWFuZCIsIl93cmFwQXN5bmMiLCJfY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZSIsInJldHZhbFByb21pc2UiLCJ0aGVuIiwicHJvbWlzZURvbmUiLCJ2YWx1ZSIsImxvb3BXaGlsZSIsIl9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkIiwic3RlcFJlc3VsdCIsImRvbmUiLCJ3YWl0SWQiLCJfZ2V0U3RlcFJlc3VsdCIsImluZGV4Iiwic3BsaWNlIiwiZW1pdEFmdGVyQ29tbWFuZCIsImlzRmF0YWwiLCJjb250aW51ZU9uRXJyb3IiLCJsb2NhdGlvbiIsImZhaWx1cmUiLCJmbiIsInNlbGYiLCJGaWJlciIsImN1cnJlbnQiLCJmaW5hbFZhbCIsIlByb21pc2UiLCJ2YWwiLCJjYXRjaCIsImZ1dHVyZSIsIkZ1dHVyZSIsInJldHVybiIsInRocm93Iiwid2FpdCIsIl9fc3RhY2siLCJjYWxsZXIiLCJfX2ZpbGVuYW1lIiwiZ2V0RmlsZU5hbWUiLCJnZXRMaW5lTnVtYmVyIiwiZ2V0Q29sdW1uTnVtYmVyIiwiU3RlcFJlc3VsdCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwidHlwZSIsIkFTU0VSVF9QQVNTRUQiLCJTVEFUVVMiLCJQQVNTRUQiLCJGQUlMRUQiLCJXQVJOSU5HIiwiYWN0aW9uIiwiX2lzQWN0aW9uIiwiX2dldFN0YXRzIiwic3RhdHMiLCJTRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQiLCJBUFBJVU1fU0VTU0lPTl9USU1FT1VUIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsImRpc2FibGVTY3JlZW5zaG90Iiwic2NyZWVuc2hvdCIsImtleSIsImRpc3Bvc2VSZXN1bHQiLCJvbk1vZHVsZUxvYWRlZCIsIm9uTW9kdWxlSW5pdGlhbGl6ZWQiLCJvbk1vZHVsZVdpbGxEaXNwb3NlIiwiX25ld0FyZ3MiLCJhcmciLCJfcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQiLCJnZXREZWNyeXB0UmVzdWx0IiwicGFyYW1OYW1lIiwiaGFzT3duUHJvcGVydHkiLCJwYXJhbVZhbHVlIiwicmVwbGFjZSIsIlJlZ0V4cCIsImVudk5hbWUiLCJlbnZWYWx1ZSIsIm9iaiIsInByb3BzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3AiLCJnZXRQcm90b3R5cGVPZiIsIl9jaGVja1N0ZXBSZXN1bHQiLCJyZWplY3QiLCJfd2FpdFN0ZXBSZXN1bHQiLCJfZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXHJcbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InO1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0IGRlYXN5bmMgZnJvbSAnZGVhc3luYyc7XHJcbmltcG9ydCBGdXR1cmUgZnJvbSAnZmliZXJzL2Z1dHVyZSc7XHJcbmltcG9ydCBGaWJlciBmcm9tICdmaWJlcnMnO1xyXG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XHJcbmltcG9ydCBTdGVwUmVzdWx0IGZyb20gJy4uL21vZGVsL3N0ZXAtcmVzdWx0JztcclxuaW1wb3J0IE94eWdlbkV2ZW50cyBmcm9tICcuL094eWdlbkV2ZW50cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgKiBhcyBjb3JlVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFNUQVRVUyBmcm9tICcuLi9tb2RlbC9zdGF0dXMuanMnO1xyXG5pbXBvcnQgKiBhcyBNb2R1bGVzIGZyb20gJy4uL294X21vZHVsZXMvaW5kZXgnO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIsIHsgREVGQVVMVF9MT0dHRVJfSVNTVUVSLCBJU1NVRVJTIH0gZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmltcG9ydCB7IE94eWdlblN1Yk1vZHVsZSB9IGZyb20gJy4vT3h5Z2VuU3ViTW9kdWxlJztcclxuXHJcbi8qZ2xvYmFsIF9fc3RhY2sqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnX19zdGFjaycsIHtcclxuICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBvcmlnID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XHJcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcclxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xyXG4gICAgICAgIHZhciBzdGFjayA9IGVyci5zdGFjaztcclxuICAgICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWc7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xyXG5jb25zdCBERUZBVUxUX09QVFMgPSB7XHJcbiAgICBiYWNrdHJhY2U6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gc2hvdyBmdWxsIGJhY2t0cmFjZSBmb3IgZXJyb3JzXHJcbiAgICBjb21waWxlcjogW10sIC8vIDxzdHJpbmdbXT4gKFwiZXh0ZW5zaW9uOm1vZHVsZVwiKSByZXF1aXJlIGZpbGVzIHdpdGggdGhlIGdpdmVuIEVYVEVOU0lPTiBhZnRlciByZXF1aXJpbmcgTU9EVUxFIChyZXBlYXRhYmxlKVxyXG4gICAgZmFpbEFtYmlndW91c0RlZmluaXRpb25zOiBmYWxzZSwgLy8gPGJvb2xlYW4+IHRyZWF0IGFtYmlndW91cyBkZWZpbml0aW9ucyBhcyBlcnJvcnNcclxuICAgIGZhaWxGYXN0OiBmYWxzZSwgLy8gPGJvb2xlYW4+IGFib3J0IHRoZSBydW4gb24gZmlyc3QgZmFpbHVyZVxyXG4gICAgaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnM6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gdHJlYXQgdW5kZWZpbmVkIGRlZmluaXRpb25zIGFzIHdhcm5pbmdzXHJcbiAgICBuYW1lOiBbXSwgLy8gPFJFR0VYUFtdPiBvbmx5IGV4ZWN1dGUgdGhlIHNjZW5hcmlvcyB3aXRoIG5hbWUgbWF0Y2hpbmcgdGhlIGV4cHJlc3Npb24gKHJlcGVhdGFibGUpXHJcbiAgICBwcm9maWxlOiBbXSwgLy8gPHN0cmluZz4gKG5hbWUpIHNwZWNpZnkgdGhlIHByb2ZpbGUgdG8gdXNlXHJcbiAgICByZXF1aXJlOiBbXSwgLy8gPHN0cmluZz4gKGZpbGUvZGlyL2dsb2IpIHJlcXVpcmUgZmlsZXMgYmVmb3JlIGV4ZWN1dGluZyBmZWF0dXJlc1xyXG4gICAgb3JkZXI6ICdkZWZpbmVkJywgLy8gPHN0cmluZz4gc3dpdGNoIGJldHdlZW4gZGV0ZXJtaW5pc3RpYyAgYW5kIHJhbmRvbSBmZWF0dXJlIGV4ZWN1dGlvbi4gRWl0aGVyIFwiZGVmaW5lZFwiLCBcInJhbmRvbVwiIG9yIFwicmFuZG9tOjQyXCIgd2hlcmVhcyA0MiBpcyB0aGUgc2VlZCBmb3IgcmFuZG9taXphdGlvblxyXG4gICAgc25pcHBldFN5bnRheDogdW5kZWZpbmVkLCAvLyA8c3RyaW5nPiBzcGVjaWZ5IGEgY3VzdG9tIHNuaXBwZXQgc3ludGF4XHJcbiAgICBzbmlwcGV0czogdHJ1ZSwgLy8gPGJvb2xlYW4+IGhpZGUgc3RlcCBkZWZpbml0aW9uIHNuaXBwZXRzIGZvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICBzb3VyY2U6IHRydWUsIC8vIDxib29sZWFuPiBoaWRlIHNvdXJjZSB1cmlzXHJcbiAgICBzdHJpY3Q6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gZmFpbCBpZiB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICB0YWdFeHByZXNzaW9uOiAnJywgLy8gPHN0cmluZz4gKGV4cHJlc3Npb24pIG9ubHkgZXhlY3V0ZSB0aGUgZmVhdHVyZXMgb3Igc2NlbmFyaW9zIHdpdGggdGFncyBtYXRjaGluZyB0aGUgZXhwcmVzc2lvblxyXG4gICAgdGFnc0luVGl0bGU6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gYWRkIGN1Y3VtYmVyIHRhZ3MgdG8gZmVhdHVyZSBvciBzY2VuYXJpbyBuYW1lXHJcbiAgICB0aW1lb3V0OiBERUZBVUxUX1RJTUVPVVQgLy8gPG51bWJlcj4gdGltZW91dCBmb3Igc3RlcCBkZWZpbml0aW9ucyBpbiBtaWxsaXNlY29uZHNcclxufTtcclxuY29uc3QgTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVggPSAvXm1vZHVsZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IFNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCA9IC9ec2VydmljZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IERPX05PVF9XUkFQX01FVEhPRFMgPSBbJ2RyaXZlcicsICdnZXREcml2ZXInXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfQ1RYID0ge1xyXG4gICAgcGFyYW1zOiB7fSxcclxuICAgIHZhcnM6IHt9LFxyXG4gICAgZW52OiB7fSxcclxuICAgIGNhcHM6IHt9XHJcbn07XHJcbmNvbnN0IERFRkFVTFRfUkVTVUxUX1NUT1JFID0ge1xyXG4gICAgc3RlcHM6IFtdLFxyXG4gICAgbG9nczogW10sXHJcbiAgICBoYXI6IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbiBleHRlbmRzIE94eWdlbkV2ZW50cyB7XHJcbiAgICBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0geyAuLi5ERUZBVUxUX1JFU1VMVF9TVE9SRSB9O1xyXG4gICAgICAgIHRoaXMuY3R4ID0geyAuLi5ERUZBVUxUX0NUWCB9O1xyXG4gICAgICAgIHRoaXMubW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2VydmljZXMgPSB7fTtcclxuICAgICAgICB0aGlzLnJlcG8gPSB7fTtcclxuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm94QmFzZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nKTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKCdPeHlnZW4nKSk7XHJcbiAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0ID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChvcHRpb25zLCBjYXBzLCBjdHggPSB7fSwgcmVzdWx0cyA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX09QVFMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY3dkID0gdGhpcy5vcHRzLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuY3R4ID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX0NUWCwgY3R4IHx8IHt9KTtcclxuICAgICAgICB0aGlzLmN0eC5jYXBzID0geyAuLi5jdHguY2FwcyB8fCB7fSwgLi4uY2FwcywgfTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX1JFU1VMVF9TVE9SRSwgcmVzdWx0cyB8fCB7fSk7XHJcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0aGlzLmN0eC5jYXBzID0gY2FwcztcclxuXHJcbiAgICAgICAgLy8gZGVmaW5lICdveCcgb2JqZWN0IGluIGdsb2JhbCBKUyBzY29wZVxyXG4gICAgICAgIC8vIHdlIHdpbGwgdXNlIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyBPeHlnZW4gbW9kdWxlcyBhbmQgdGVzdCBjb250ZXh0IGZyb20gbW9kdWxlcyB1c2VkIGluIHRoZSB0ZXN0IChpZiBhbnkpICAgICAgICBcclxuICAgICAgICB0aGlzLm1ha2VPeEdsb2JhbCgpO1xyXG4gICAgICAgIC8vIGxvYWQgc2VydmljZXNcclxuICAgICAgICB0aGlzLl9sb2FkU2VydmljZXMoKTtcclxuICAgICAgICAvLyBsb2FkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9sb2FkTW9kdWxlcygpO1xyXG4gICAgICAgIC8vIGlmIG9wdGlvbnMubWFrZU1vZHVsZXNHbG9iYWwgaXMgdHJ1ZSBvciB1bmRlZmluZWQgdGhhbiBkZWZpbmUgJ2N0eCcgY29udGVudCBhbmQgZWFjaCBtb2R1bGUgaW4gZ2xvYmFsIHNjb3BlXHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZXM6ICcsIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlU2VydmljZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZTogJywgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBhZGp1c3RTY3JpcHRMaW5lKCkge1xyXG4gICAgICAgIGNvbnN0IGlzSW5EZWJ1Z01vZGUgPSBveHV0aWwuaXNJbkRlYnVnTW9kZSgpO1xyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsaW5lIGlmIHdlIGFyZSBydW5uaW5nIGluIGRlYnVnZ2VyIG1vZGUgKFY4IGRlYnVnZ2VyIGFkZHMgYW4gZXh0cmEgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzSW5EZWJ1Z01vZGUgPyAtMSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGV4dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdHg7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbnRleHQoY3R4KSB7XHJcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3guY3R4ID0gY3R4O1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgXCJwYXJhbXNcIiBhbmQgXCJlbnZcIiBpbiBcIm94XCIgZ2xvYmFsIHZhcmlhYmxlXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucGFyYW1zID0gY3R4LnBhcmFtcyB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5lbnYgPSBjdHguZW52IHx8IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXBvc2l0b3J5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcG87XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHJlcG9zaXRvcnkocmVwbykge1xyXG4gICAgICAgIHRoaXMucmVwbyA9IHJlcG87XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3gucmVwbyA9IHJlcG87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXN1bHRzKCkge1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaXRzZWxmIC0gc3VtbWFyeSBvZiBkdXJhdGlvbnMgZm9yIGFsbCB0aGUgc3RlcHMgaW4gdGhpcyB0cmFuc2FjdGlvblxyXG4gICAgICAgIC8vIGFsc28gYWRqdXN0IHRyYW5zYWN0aW9uIGVuZCB0aW1lIHRvIG11Y2ggZW5kIHRpbWUgZm9yIHRoZSBsYXN0IGV4ZWN1dGVkIHN0ZXAgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24uXHJcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc1N0ZXAgb2YgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcykge1xyXG4gICAgICAgICAgICBpZiAodHJhbnNTdGVwLm5hbWUuaW5jbHVkZXMoJy50cmFuc2FjdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc05hbWUgPSB0cmFuc1N0ZXAudHJhbnNhY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gJiBpcyBub3QgdGhlIHRyYW5zYWN0aW9uIHN0ZXBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC50cmFuc2FjdGlvbiA9PT0gdHJhbnNOYW1lICYmIHN0ZXAgIT09IHRyYW5zU3RlcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gKz0gc3RlcC5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuZW5kVGltZSA+IHRyYW5zU3RlcC5lbmRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZW5kVGltZSA9IHN0ZXAuZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtb2RDYXBzID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgJiYgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgJiYgdHlwZW9mIG1vZHVsZS5fZ2V0Q2FwYWJpbGl0aWVzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXBzID0gbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9ubHkgbm9uLWVtcHR5IGNhcHMgcGVyIG1vZHVsZSB0aGF0IGhhcyB0aGlzLmNhcHMgcHJvcGVydHlcclxuICAgICAgICAgICAgICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjYXBzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kQ2Fwc1ttb2R1bGUubmFtZV0gPSBjYXBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb2RDYXBzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UmVzdWx0cygpIHtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzID0gW107XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzID0gW107XHJcbiAgICAgICAgdGhpcy5oYXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQmVmb3JlQ2FzZShjb250ZXh0KSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5vbkJlZm9yZUNhc2UgJiYgYXdhaXQgbW9kdWxlLm9uQmVmb3JlQ2FzZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5faXRlcmF0aW9uU3RhcnQgJiYgYXdhaXQgbW9kdWxlLl9pdGVyYXRpb25TdGFydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbkJlZm9yZUNhc2VcIiBtZXRob2Qgb2YgJHttb2R1bGVOYW1lfSBtb2R1bGUuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlckNhc2UoZXJyb3IgPSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGZvciBhdm9pZCBzdHVjayBvbiAqLmRpc3Bvc2UgY2FsbFxyXG4gICAgICAgICAgICAgICAgbW9kdWxlLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkFmdGVyQ2FzZShlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2l0ZXJhdGlvbkVuZCAmJiBhd2FpdCBtb2R1bGUuX2l0ZXJhdGlvbkVuZChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uQWZ0ZXJDYXNlXCIgbWV0aG9kIG9mICR7bW9kdWxlTmFtZX0gbW9kdWxlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1ha2VPeEdsb2JhbCgpIHtcclxuICAgICAgICBpZiAoIWdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3ggPSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGVzOiB0aGlzLm1vZHVsZXMsXHJcbiAgICAgICAgICAgICAgICBjdHg6IHRoaXMuY3R4LFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRzLFxyXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICByZXN1bHRTdG9yZTogdGhpcy5yZXN1bHRTdG9yZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLnZhcnMgPSB0aGlzLmN0eC52YXJzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwoKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlICdveCcgaXMgYWxyZWFkeSBnbG9iYWxcclxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBtb2R1bGVzIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsW21vZHVsZU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW21vZHVsZU5hbWVdID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBcImN0eFwiLCBcInBhcmFtc1wiIGFuZCBcImVudlwiIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZ2xvYmFsLnBhcmFtcyA9IGdsb2JhbC5veC5jdHgucGFyYW1zO1xyXG4gICAgICAgICAgICBnbG9iYWwuZW52ID0gZ2xvYmFsLm94LmN0eC5lbnY7XHJcbiAgICAgICAgICAgIGdsb2JhbC5jdHggPSBnbG9iYWwub3guY3R4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGFnZU9iamVjdEZpbGUocG9QYXRoKSB7XHJcbiAgICAgICAgaWYgKCFwb1BhdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBwbyA9IHJlcXVpcmUocG9QYXRoKTtcclxuICAgICAgICAgICAgLy8gc2V0IHBhZ2Ugb2JqZWN0IHJlcG9zaXRvcnkgYXMgdGhlIG1haW4gb25lXHJcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHBvO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSBwbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLnBvID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGUgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBfd3JhcExvZ2dlcihfbG9nZ2VyKSB7XHJcbiAgICAgICAgY29uc3QgbG9nZ2VyV3JhcCA9IHtcclxuICAgICAgICAgICAgaW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MpLFxyXG4gICAgICAgICAgICBkZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzKSxcclxuICAgICAgICAgICAgZXJyb3I6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2Vycm9yJywgYXJncyksXHJcbiAgICAgICAgICAgIHdhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzKSxcclxuICAgICAgICAgICAgdXNlckluZm86ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2luZm8nLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgICAgICB1c2VyRGVidWc6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2RlYnVnJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICAgICAgdXNlckVycm9yOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdlcnJvcicsIGFyZ3MsIElTU1VFUlMuVVNFUiksXHJcbiAgICAgICAgICAgIHVzZXJXYXJuOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICd3YXJuJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBsb2dnZXJXcmFwO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2coX2xvZ2dlciwgbGV2ZWwsIGFyZ3MsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGlmICghX2xvZ2dlcltsZXZlbF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfbG9nZ2VyW2xldmVsXS5hcHBseShfbG9nZ2VyLCBhcmdzKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG94dXRpbC5zdHJpbmdpZnkoYXJncywgMik7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAvLyBhZGQgdGhlIGxvZyBlbnRyeSB0byB0aGUgcmVzdWx0IHN0b3JlXHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5sb2dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUubG9ncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHNyYzogc3JjXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgYXJndW1lbnQsIGlmIGl0J3MgYSBtZXNzYWdlXHJcbiAgICAgICAgYXJncyA9IG1lc3NhZ2UgPyBhcmdzLnNoaWZ0KCkgOiBhcmdzO1xyXG4gICAgICAgIHRoaXMuZW1pdExvZyh0aW1lLCBsZXZlbCwgbWVzc2FnZSwgYXJncywgc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFNlcnZpY2VzKCkge1xyXG4gICAgICAgIGNvbnN0IG94U2VydmljZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3hCYXNlRGlyLCAnLi9veF9zZXJ2aWNlcycpO1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlcyA9IGdsb2Iuc3luYygnc2VydmljZS0qLmpzJywgeyBjd2Q6IG94U2VydmljZXNEaXJQYXRoIH0pO1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIHNlcnZpY2VzXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZXMuLi4nKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlRmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUZpbGVOYW1lID0gc2VydmljZUZpbGVzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZVBhdGggPSBwYXRoLmpvaW4ob3hTZXJ2aWNlc0RpclBhdGgsIHNlcnZpY2VGaWxlTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcnZpY2VGaWxlTmFtZS5tYXRjaChTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHJlc3VsdFsxXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMub3B0cy5zZXJ2aWNlcyA9IHVuZGVmaW5lZCBpbiBzaW5nbGUgZmlsZSBtb2RlXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5zZXJ2aWNlcykgJiYgIXRoaXMub3B0cy5zZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZTogJyArIHNlcnZpY2VOYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLl9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZUZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBzZXJ2aWNlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHNlcnZpY2UgXCInICsgc2VydmljZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZVBhdGgpIHtcclxuICAgICAgICBsZXQgU2VydmljZUNsYXNzID0gcmVxdWlyZShzZXJ2aWNlUGF0aCk7XHJcbiAgICAgICAgLy8gRVM2IGNsYXNzIHdpbGwgYmUgdW5kZXIgJ2RlZmF1bHQnIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKFNlcnZpY2VDbGFzcy5kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIFNlcnZpY2VDbGFzcyA9IFNlcnZpY2VDbGFzcy5kZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZXJ2aWNlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYFNlcnZpY2U6JHtzZXJ2aWNlTmFtZX1gKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2xhc3ModGhpcy5vcHRzLCB0aGlzLmN0eCwgdGhpcy5yZXN1bHRTdG9yZSwgc2VydmljZUxvZ2dlcik7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRNb2R1bGVzKCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIGludGVybmFsIG1vZHVsZXMuLi4nKTtcclxuICAgICAgICB0aGlzLl9sb2FkSW50ZXJuYWxNb2R1bGVzKCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZXh0ZXJuYWwgbW9kdWxlcy4uLicpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRFeHRlcm5hbE1vZHVsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEV4dGVybmFsTW9kdWxlcygpIHtcclxuICAgICAgICBsZXQgbW9kdWxlc0ZvbGRlclBhdGggPSAnLi9tb2R1bGVzJztcclxuICAgICAgICBpZiAodGhpcy5vcHRzLm1vZHVsZXNfZXh0ICYmIHR5cGVvZiB0aGlzLm9wdHMubW9kdWxlc19leHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXNGb2xkZXJQYXRoID0gdGhpcy5vcHRzLm1vZHVsZXNfZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL2NvbnN0IG94TW9kdWxlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X21vZHVsZXMnKTtcclxuICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY3dkLCBtb2R1bGVzRm9sZGVyUGF0aCk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG94TW9kdWxlc0RpclBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1vZHVsZUZpbGVzID0gW107XHJcbiAgICAgICAgLy8gaWYgcGFydGljdWxhciBtb2R1bGUgbmFtZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZywgdGhlbiBsb2FkIG9ubHkgdGhlc2UgbW9kdWxlc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5tb2R1bGVzKSAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tb2R1bGVzLmZvckVhY2gobW9kdWxlTmFtZSA9PiBtb2R1bGVGaWxlcy5wdXNoKGBtb2R1bGUtJHttb2R1bGVOYW1lfS5qc2ApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIGFsbCBhdmFpbGFibGUgbW9kdWxlcyAobWlnaHQgYmUgbW9yZSB0aW1lIGNvbnN1bWluZylcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbW9kdWxlRmlsZXMgPSBnbG9iLnN5bmMoJ21vZHVsZS0qLmpzJywgeyBjd2Q6IG94TW9kdWxlc0RpclBhdGggfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIG1vZHVsZXMgICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZUZpbGVOYW1lIG9mIG1vZHVsZUZpbGVzKSB7XHJcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHRoZSBtb2R1bGUgZmlsZSBuYW1lIGJhc2VkIG9uIG1vZHVsZSBuYW1lIHBhdHRlcm5cclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZHVsZUZpbGVOYW1lLm1hdGNoKE1PRFVMRV9OQU1FX01BVENIX1JFR0VYKVsxXTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbG9nZ2VyIGZvciB0aGUgbW9kdWxlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgTW9kdWxlOiR7bW9kdWxlTmFtZX1gKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBtb2R1bGUgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGNvcmVVdGlscy5sb2FkTW9kdWxlRnJvbUZpbGUobW9kdWxlTmFtZSwgbW9kdWxlRmlsZU5hbWUsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSW50ZXJuYWxNb2R1bGVzKCkge1xyXG4gICAgICAgIC8vIGlmIGBtb2R1bGVzYCBpcyBlbXB0eSBvciB1bmRlZmluZWQgaW4gb3h5Z2VuLmNvbmYgdGhlbiBsb2FkIGFsbCBtb2R1bGVzXHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIG9ubHkgdGhvc2UgaW1wbGljaXRseSBkZWZpbmVkXHJcbiAgICAgICAgY29uc3QgZXhjbHVkZVVuZGVmaW5lZE1vZHMgPSB0aGlzLm9wdHMubW9kdWxlcyAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIG9mIE9iamVjdC5rZXlzKE1vZHVsZXMpKSB7XHJcbiAgICAgICAgICAgIGlmIChleGNsdWRlVW5kZWZpbmVkTW9kcyAmJiAhdGhpcy5vcHRzLm1vZHVsZXMuaW5jbHVkZXMobW9kdWxlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IE1vZHVsZUNsYXNzID0gTW9kdWxlc1ttb2R1bGVOYW1lXTtcclxuICAgICAgICAgICAgY29uc3Qgb3hNb2R1bGVzRGlyUGF0aCA9IG94dXRpbC5nZXRPeE1vZHVsZXNEaXIoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBsb2dnZXIgZm9yIHRoZSBtb2R1bGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZUxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKGBNb2R1bGU6JHttb2R1bGVOYW1lfWApKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IG1vZHVsZSBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kID0gY29yZVV0aWxzLmxvYWRNb2R1bGVGcm9tQ2xhc3MobW9kdWxlTmFtZSwgTW9kdWxlQ2xhc3MsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF93cmFwTW9kdWxlKG5hbWUsIG1vZHVsZSkge1xyXG4gICAgICAgIGlmICghbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IG5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgbW9kdWxlTWV0aG9kcyA9IE9iamVjdC5rZXlzKG1vZHVsZSk7XHJcbiAgICAgICAgaWYgKCFtb2R1bGVNZXRob2RzLnNvbWUoeCA9PiB4PT09ICdleHBvcnRzJykpIHtcclxuICAgICAgICAgICAgbW9kdWxlTWV0aG9kcyA9IHRoaXMuX2dldEFsbFByb3BlcnR5TmFtZXMobW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgbWV0aG9kTmFtZSBvZiBtb2R1bGVNZXRob2RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1vZHVsZVttZXRob2ROYW1lXTtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgcHJvcGVydHkgdGhhdCBpcyBub3QgYSBmdW5jdGlvbiBvciBhIE94eWdlblN1Yk1vZHVsZVxyXG4gICAgICAgICAgICBpZiAoKCEobWV0aG9kIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICEobWV0aG9kIGluc3RhbmNlb2YgT3h5Z2VuU3ViTW9kdWxlKSAmJiB0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB8fCBtZXRob2ROYW1lID09PSAnZXhwb3J0cycgfHwgbWV0aG9kTmFtZSA9PT0gJ19jb21waWxlJykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gbWFwIGFuZCB3cmFwIHN1Yi1tb2R1bGUgbWV0aG9kcyAocmVjdXJzaXZlIGNhbGwgdG8gX3dyYXBNb2R1bGUpXHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBPeHlnZW5TdWJNb2R1bGUpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSB0aGlzLl93cmFwTW9kdWxlKGAke25hbWV9LiR7bWV0aG9kTmFtZX1gLCBtZXRob2QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCB3cmFwIG1ldGhvZHNcclxuICAgICAgICAgICAgZWxzZSBpZiAoRE9fTk9UX1dSQVBfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gPT09ICdkcml2ZXInIHx8IG1ldGhvZE5hbWUgPT09ICdnZXREcml2ZXInXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gbW9kdWxlW21ldGhvZE5hbWVdLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBwcml2YXRlIG1ldGhvZHMgYW5kIGV2ZW50IGhhbmRsZXJzXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZE5hbWUuaW5kZXhPZignXycpID09PSAwIHx8IG1ldGhvZE5hbWUuaW5kZXhPZignb24nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmc6ICcgKyBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVttZXRob2ROYW1lXS5hcHBseShtb2R1bGUsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpbnRlcm5hbCBfZ2V0Q2FwYWJpbGl0aWVzIG1ldGhvZCBmb3IgaW50ZXJuYWwgT3h5Z2VuIENvcmUgdXNlXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIF9nZXRDYXBhYmlsaXRpZXMgbWV0aG9kIHdvbid0IGJlIHZpc2libGUgaW4gdGhlIHRlc3QgcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdnZXRDYXBhYmlsaXRpZXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlclsnX2dldENhcGFiaWxpdGllcyddID0gbWV0aG9kLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY29tbWFuZFdyYXBwZXIobWV0aG9kTmFtZSwgYXJncywgbW9kdWxlLCBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBPeEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdUaHJvd2luZyBhZ2FpbjonLCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBuYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIF9jb21tYW5kV3JhcHBlcihjbWROYW1lLCBjbWRBcmdzLCBtb2R1bGUsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlW2NtZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmV0dmFsID0gbnVsbDtcclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNtZEZuID0gbW9kdWxlW2NtZE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY01ldGhvZCA9ICFjbWROYW1lLnN0YXJ0c1dpdGgoJ18nKSAmJiBjbWROYW1lICE9PSAnZGlzcG9zZSc7XHJcblxyXG4gICAgICAgIC8vIGRlbGF5IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBpZiByZXF1aXJlZFxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmRlbGF5ICYmXHJcbiAgICAgICAgICAgIHB1YmxpY01ldGhvZCAmJlxyXG4gICAgICAgICAgICBjbWROYW1lICE9PSAnaW5pdCcgJiZcclxuICAgICAgICAgICAgY21kTmFtZSAhPT0gJ3RyYW5zYWN0aW9uJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBkZWFzeW5jLnNsZWVwKHRoaXMub3B0cy5kZWxheSAqIDEwMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGhyb3cgaWYgYSBjb21tYW5kIGV4ZWN1dGVkIG9uIHVuaXRpYWxpemVkIG1vZHVsZSAoZXhjZXB0IGludGVybmFsIG1ldGhvZHMgYW5kIGEgZmV3IG90aGVyKVxyXG4gICAgICAgIGlmICghbW9kdWxlLmlzSW5pdGlhbGl6ZWQgJiYgcHVibGljTWV0aG9kICYmIGNtZE5hbWUgIT09ICdpbml0JyAmJiBjbWROYW1lICE9PSAndHJhbnNhY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnTWlzc2luZyAnICsgbW9kdWxlTmFtZSArICcuaW5pdCgpJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWN0eXB0IGFyZ3VtZW50c1xyXG4gICAgICAgIGxldCBkZWNyeXB0ZWRBcmdzID0gdGhpcy5fZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5KGNtZEFyZ3MsIG1vZHVsZU5hbWUpO1xyXG4gICAgICAgIGRlY3J5cHRlZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShkZWNyeXB0ZWRBcmdzKTtcclxuXHJcbiAgICAgICAgLy8gcmVwbGFjZSBwYXJhbWV0ZXJzIGluIG1ldGhvZCBhcmd1bWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlc1xyXG4gICAgICAgIGNtZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShjbWRBcmdzKTtcclxuICAgICAgICAvLyBzdGFydCBtZWFzdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbiB0aW1lXHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICAvLyBhZGQgY29tbWFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiAoZS5nLiBmaWxlIG5hbWUgYW5kIGNvbW1hbmQgbGluZSlcclxuICAgICAgICBsZXQgY21kTG9jYXRpb24gPSBudWxsO1xyXG4gICAgICAgIC8vIGRvIG5vdCByZXBvcnQgcmVzdWx0cyBvciBsaW5lIHVwZGF0ZXMgb24gaW50ZXJuYWwgbWV0aG9kcyAoc3RhcnRlZCB3aXRoICdfJylcclxuICAgICAgICBpZiAocHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNtZExvY2F0aW9uID0gdGhpcy5fZ2V0Q29tbWFuZExvY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJlZm9yZUNvbW1hbmQoY21kTmFtZSwgbW9kdWxlTmFtZSwgY21kRm4sIGNtZEFyZ3MsIHRoaXMuY3R4LCBjbWRMb2NhdGlvbiwgc3RhcnRUaW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmc6ICcgKyBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MpKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gZW1pdCBiZWZvcmUgZXZlbnRzXHJcbiAgICAgICAgICAgIGlmIChjbWROYW1lID09PSAnZGlzcG9zZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dyYXBBc3luYyh0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZVdpbGxEaXNwb3NlKS5hcHBseSh0aGlzLCBbbW9kdWxlXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJldHZhbFByb21pc2UgPSB0aGlzLl93cmFwQXN5bmMobW9kdWxlW2NtZE5hbWVdKS5hcHBseShtb2R1bGUsIGRlY3J5cHRlZEFyZ3MpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldHZhbFByb21pc2UgJiYgcmV0dmFsUHJvbWlzZS50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZURvbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR2YWxQcm9taXNlLnRoZW4oKHZhbHVlKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0sIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFwcm9taXNlRG9uZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR2YWwgPSByZXR2YWxQcm9taXNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY21kTmFtZSA9PT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cmFwQXN5bmModGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZCkuYXBwbHkodGhpcywgW21vZHVsZV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tZXNzYWdlICYmIHR5cGVvZiBlLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGUubWVzc2FnZS5pbmNsdWRlcygnaW52YWxpZCBzZXNzaW9uIGlkJykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyBpZiBlcnJvciBvY3VycmVkIGFmdGVyIHRoZSBtb2R1bGUgd2FzIGRpc3Bvc2VkIChvciBpbiBhIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQpXHJcbiAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIGluaXQgbWV0aG9kcyBvZiBjb3Vyc2VcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIG1vZHVsZS5pc0luaXRpYWxpemVkID09PSAnYm9vbGVhbicgJiYgIW1vZHVsZS5pc0luaXRpYWxpemVkKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNtZE5hbWUgIT09ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJz09PT0gZXJyb3IgPT09PScsIGUpXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9ySGVscGVyLmdldE94eWdlbkVycm9yKGUsIG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICBsZXQgc3RlcFJlc3VsdDtcclxuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhaXRJZCA9ICtuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QucHVzaCh3YWl0SWQpO1xyXG5cclxuICAgICAgICAgICAgc3RlcFJlc3VsdCA9IHRoaXMuX2dldFN0ZXBSZXN1bHQobW9kdWxlLCBtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzLCBjbWRMb2NhdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCByZXR2YWwsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LmluZGV4T2Yod2FpdElkKTtcclxuICAgICAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgICAvL3N0ZXBSZXN1bHQubG9jYXRpb24gPSBjbWRMb2NhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMucHVzaChzdGVwUmVzdWx0KTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QWZ0ZXJDb21tYW5kKGNtZE5hbWUsIG1vZHVsZU5hbWUsIGNtZEZuLCBjbWRBcmdzLCB0aGlzLmN0eCwgY21kTG9jYXRpb24sIGVuZFRpbWUsIHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5pc0ZhdGFsICYmICF0aGlzLm9wdHMuY29udGludWVPbkVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmICghZXJyb3IubG9jYXRpb24gJiYgY21kTG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGVycm9yLmxvY2F0aW9uID0gY21kTG9jYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0ICYmIHN0ZXBSZXN1bHQuZmFpbHVyZSAmJiBzdGVwUmVzdWx0LmZhaWx1cmUubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGVycm9yLmxvY2F0aW9uID0gc3RlcFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBfd3JhcEFzeW5jIChmbiwgY29udGV4dCkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IGNvbnRleHQgfHwgdGhpcztcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgY29kZSBpcyBub3QgcnVubmluZyBpbnNpZGUgdGhlIEZpYmVyIGNvbnRleHQsIHRoZW4gcnVuIGFzeW5jIGNvZGUgYXMgc3luYyB1c2luZyBkZWFzeW5jIG1vZHVsZVxyXG4gICAgICAgICAgICBpZiAoIUZpYmVyLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHZhbCA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsVmFsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmV0dmFsICYmIHJldHZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJldHZhbClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbCA9IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLm1lc3NhZ2UgJiYgdHlwZW9mIGUubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdyZWFkeVN0YXRlJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGFzIGl0IHVzdWFsbHkgaGFwcGVucyBcclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIE94eWdlbiBpcyBkaXNwb3NlZCBhbmQgcHJvY2VzcyBpcyBiZWluZyBraWxsZWRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVhc3luYy5sb29wV2hpbGUoKSBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCByZXR2YWwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIHdlIGFyZSBpbnNpZGUgdGhlIEZpYmVyIGNvbnRleHQsIHRoZW4gdXNlIEZpYmVyJ3MgRnV0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmdXR1cmUgPSBuZXcgRnV0dXJlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWwpID0+IGZ1dHVyZS5yZXR1cm4odmFsKSwgKGVycikgPT4gZnV0dXJlLnRocm93KGVycikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdXR1cmUud2FpdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXRyaWV2ZSBjdXJyZW50IGxpbmUgYW5kIGZ1bmN0aW9uIG5hbWUgZnJvbSB0aGUgY2FsbCBzdGFja1xyXG4gICAgX2dldENvbW1hbmRMb2NhdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzdGFjayA9IF9fc3RhY2s7XHJcbiAgICAgICAgbGV0IGNhbGxlciA9IG51bGw7XHJcbiAgICAgICAgZm9yIChsZXQgY2FsbCBvZiBzdGFjaykge1xyXG4gICAgICAgICAgICBpZiAoX19maWxlbmFtZSA9PT0gY2FsbC5nZXRGaWxlTmFtZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IGNhbGxlciwgd2hpY2ggaXMgbm90IHRoZSBjdXJyZW50IGZpbGVcclxuICAgICAgICAgICAgY2FsbGVyID0gY2FsbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYWxsZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke2NhbGxlci5nZXRGaWxlTmFtZSgpfToke2NhbGxlci5nZXRMaW5lTnVtYmVyKCkgKyB0aGlzLmFkanVzdFNjcmlwdExpbmV9OiR7Y2FsbGVyLmdldENvbHVtbk51bWJlcigpfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRTdGVwUmVzdWx0KG1vZHVsZSwgbW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgYXJncywgbG9jYXRpb24sIHN0YXJ0VGltZSwgZW5kVGltZSwgcmV0dmFsLCBlcnIpIHtcclxuICAgICAgICB2YXIgc3RlcCA9IG5ldyBTdGVwUmVzdWx0KCk7XHJcblxyXG4gICAgICAgIHN0ZXAubmFtZSA9IG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgc3RlcC50cmFuc2FjdGlvbiA9IGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSB8fCBudWxsOyAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogd2h5IGlzIHRoaXMgaGVyZSBpZiBpdCdzIGFscmVhZHkgcG9wdWxhdGVkIGluIHJzP1xyXG4gICAgICAgIHN0ZXAubG9jYXRpb24gPSBsb2NhdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKGVyciAmJiBlcnIudHlwZSAmJiBlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuUEFTU0VEO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSBzdGVwIHN0YXR1c1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmlzRmF0YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuUEFTU0VEO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGVwLmFjdGlvbiA9ICh0eXBlb2YgbW9kdWxlLl9pc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IG1vZHVsZS5faXNBY3Rpb24obWV0aG9kTmFtZSkgOiBmYWxzZSk7XHJcbiAgICAgICAgc3RlcC5zdGFydFRpbWUgPSBzdGFydFRpbWU7XHJcbiAgICAgICAgc3RlcC5lbmRUaW1lID0gZW5kVGltZTtcclxuICAgICAgICBzdGVwLmR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX2dldFN0YXRzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHMgPSBtb2R1bGUuX2dldFN0YXRzKG1ldGhvZE5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHMgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIudHlwZSAmJiBlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICYmIGVyci50eXBlICYmIChlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCB8fCBlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFQUElVTV9TRVNTSU9OX1RJTUVPVVQpKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlLmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIG1vZHVsZSBkZWNpZGUgd2hldGhlciBhIHNjcmVlbnNob3Qgc2hvdWxkIGJlIHRha2VuIG9uIGVycm9yIG9yIG5vdFxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudCA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpcy5vcHRzLmRpc2FibGVTY3JlZW5zaG90KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zY3JlZW5zaG90ID0gbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudChtZXRob2ROYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUsIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHNjcmVlbnNob3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHdhaXQgZm9yIGEgbW9tZW50IChpbiBQZXJmZWN0byBDbG91ZCwgdGhlIHNjcmVlbnNob3QgbWlnaHQgbm90IGJlIGltbWlkaWF0ZWx5IGF2YWlsYWJsZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVhc3luYy5zbGVlcCgxMDAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc2NyZWVuc2hvdCA9IG1vZHVsZS5fdGFrZVNjcmVlbnNob3RTaWxlbnQobWV0aG9kTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBpbmRpY2F0ZSB0byB1c2VyIHRoYXQgYW4gYXR0ZW1wdCB0byB0YWtlIGEgc2NyZWVuc2hvdCBoYXMgZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0ZXA7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2Rpc3Bvc2VTZXJ2aWNlcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VydmljZXMgfHwgdHlwZW9mIHRoaXMuc2VydmljZXMgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2aWNlLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHNlcnZpY2UgZGlzcG9zYWwgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRpc3Bvc2Ugc2VydmljZSAnJHtrZXl9JzpgLCBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzIHx8IHR5cGVvZiB0aGlzLm1vZHVsZXMgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBtb2QgPSB0aGlzLm1vZHVsZXNba2V5XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtb2QuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwb3NlUmVzdWx0ID0gbW9kLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcG9zZVJlc3VsdCAmJiB0eXBlb2YgZGlzcG9zZVJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IGEgcHJvbWlzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXNwb3NlUmVzdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbW9kdWxlIGRpc3Bvc2FsIGVycm9yIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGlzcG9zZSBtb2R1bGUgJyR7a2V5fSc6IGAsIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLypcclxuICAgICAqIFNlcnZpY2VzIEV2ZW50IEVtaXR0ZXJzXHJcbiAgICAgKi9cclxuICAgIF9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZChtb2R1bGUpIHtcclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5vbk1vZHVsZUxvYWRlZChtb2R1bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZUxvYWRlZFwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX2NhbGxTZXJ2aWNlc09uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZpY2Uub25Nb2R1bGVJbml0aWFsaXplZChtb2R1bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZUluaXRpYWxpemVkXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBfY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZShtb2R1bGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMgfHwgIXRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2Uub25Nb2R1bGVXaWxsRGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Nb2R1bGVXaWxsRGlzcG9zZShtb2R1bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZVdpbGxEaXNwb3NlXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUoYXJncykge1xyXG4gICAgICAgIGlmICghYXJncyB8fCAhQXJyYXkuaXNBcnJheShhcmdzKSB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBfbmV3QXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGFyZyBvZiBhcmdzKSB7XHJcbiAgICAgICAgICAgIF9uZXdBcmdzLnB1c2godGhpcy5fcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQoYXJnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfbmV3QXJncztcclxuICAgIH1cclxuICAgIF9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudChhcmcpIHtcclxuICAgICAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ0VOQ1JZUFRFRCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZXBsYWNlIHVzZXIgcGFyYW1ldGVycyB3aXRoIHZhbHVlc1xyXG4gICAgICAgIC8vIG5vdGU6IHVzZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUgbmFtZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZW52aXJvbm1lbnQgdmFyaWFibGVcclxuICAgICAgICBmb3IgKGxldCBwYXJhbU5hbWUgaW4gdGhpcy5jdHgucGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eC5wYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW1OYW1lKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHRoaXMuY3R4LnBhcmFtc1twYXJhbU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCR7JyArIHBhcmFtTmFtZSArICd9JywgJ2cnKSwgcGFyYW1WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBlbnZOYW1lIGluIHRoaXMuY3R4LmVudikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdHguZW52Lmhhc093blByb3BlcnR5KGVudk5hbWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZWYWx1ZSA9IHRoaXMuY3R4LmVudltlbnZOYW1lXTtcclxuICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwkeycgKyBlbnZOYW1lICsgJ30nLCAnZycpLCBlbnZWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFyZztcclxuICAgIH1cclxuICAgIF9nZXRBbGxQcm9wZXJ0eU5hbWVzKCBvYmogKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBbXTtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyggb2JqICkuZm9yRWFjaChmdW5jdGlvbiAoIHByb3AgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIHByb3BzLmluZGV4T2YoIHByb3AgKSA9PT0gLTEgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaCggcHJvcCApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXHJcbiAgICAgICAgfSB3aGlsZSAoIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiggb2JqICkgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfVxyXG5cclxuICAgIF9jaGVja1N0ZXBSZXN1bHQocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfd2FpdFN0ZXBSZXN1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldERlY3J5cHRlZEFyZ3NGb3JBcHBseShhcmdzLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKCFhcmdzIHx8ICFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IF9uZXdBcmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICAgICAgX25ld0FyZ3MucHVzaCh0aGlzLl9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50KGFyZywgbW9kdWxlTmFtZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX25ld0FyZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgX2RlY3J5cHRQYXJhbWV0ZXJGb3JBcHBseUluQXJndW1lbnQoYXJnLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKGFyZyAmJiB0eXBlb2YgYXJnLmdldERlY3J5cHRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0VOQ1JZUFRFRCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnLmdldERlY3J5cHRSZXN1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFyZztcclxuICAgIH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQW9EO0FBQUE7QUFBQTtBQUdwREEsTUFBTSxDQUFDQyxjQUFjLENBQUNDLE1BQU0sRUFBRSxTQUFTLEVBQUU7RUFDckNDLEdBQUcsRUFBRSxZQUFZO0lBQ2IsSUFBSUMsSUFBSSxHQUFHQyxLQUFLLENBQUNDLGlCQUFpQjtJQUNsQ0QsS0FBSyxDQUFDQyxpQkFBaUIsR0FBRyxVQUFVQyxDQUFDLEVBQUVDLEtBQUssRUFBRTtNQUFFLE9BQU9BLEtBQUs7SUFBRSxDQUFDO0lBQy9ELElBQUlDLEdBQUcsR0FBRyxJQUFJSixLQUFLLEVBQUU7SUFDckJBLEtBQUssQ0FBQ0ssaUJBQWlCLENBQUNELEdBQUcsQ0FBQztJQUM1QixJQUFJRCxLQUFLLEdBQUdDLEdBQUcsQ0FBQ0QsS0FBSztJQUNyQkgsS0FBSyxDQUFDQyxpQkFBaUIsR0FBR0YsSUFBSTtJQUM5QixPQUFPSSxLQUFLO0VBQ2hCO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTUcsZUFBZSxHQUFHLEtBQUs7QUFDN0IsTUFBTUMsWUFBWSxHQUFHO0VBQ2pCQyxTQUFTLEVBQUUsS0FBSztFQUNoQkMsUUFBUSxFQUFFLEVBQUU7RUFDWkMsd0JBQXdCLEVBQUUsS0FBSztFQUMvQkMsUUFBUSxFQUFFLEtBQUs7RUFDZkMsMEJBQTBCLEVBQUUsS0FBSztFQUNqQ0MsSUFBSSxFQUFFLEVBQUU7RUFDUkMsT0FBTyxFQUFFLEVBQUU7RUFDWEMsT0FBTyxFQUFFLEVBQUU7RUFDWEMsS0FBSyxFQUFFLFNBQVM7RUFDaEJDLGFBQWEsRUFBRUMsU0FBUztFQUN4QkMsUUFBUSxFQUFFLElBQUk7RUFDZEMsTUFBTSxFQUFFLElB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