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,21 +4,13 @@ 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 _OxygenSubModule = require("../../core/OxygenSubModule");
11
-
12
9
  var _chromeHar = require("chrome-har");
13
-
14
10
  var _helper = _interopRequireDefault(require("../../errors/helper"));
15
-
16
11
  var _OxygenError = _interopRequireDefault(require("../../errors/OxygenError"));
17
-
18
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
13
  const observe = ['Page.domContentEventFired', 'Page.fileChooserOpened', 'Page.frameAttached', 'Page.frameDetached', 'Page.frameNavigated', 'Page.interstitialHidden', 'Page.interstitialShown', 'Page.javascriptDialogClosed', 'Page.javascriptDialogOpening', 'Page.lifecycleEvent', 'Page.loadEventFired', 'Page.windowOpen', 'Page.frameClearedScheduledNavigation', 'Page.frameScheduledNavigation', 'Page.compilationCacheProduced', 'Page.downloadProgress', 'Page.downloadWillBegin', 'Page.frameRequestedNavigation', 'Page.frameResized', 'Page.frameStartedLoading', 'Page.frameStoppedLoading', 'Page.navigatedWithinDocument', 'Page.screencastFrame', 'Page.screencastVisibilityChanged', 'Network.dataReceived', 'Network.eventSourceMessageReceived', 'Network.loadingFailed', 'Network.loadingFinished', 'Network.requestServedFromCache', 'Network.requestWillBeSent', 'Network.responseReceived', 'Network.webSocketClosed', 'Network.webSocketCreated', 'Network.webSocketFrameError', 'Network.webSocketFrameReceived', 'Network.webSocketFrameSent', 'Network.webSocketHandshakeResponseReceived', 'Network.webSocketWillSendHandshakeRequest', 'Network.requestWillBeSentExtraInfo', 'Network.resourceChangedPriority', 'Network.responseReceivedExtraInfo', 'Network.signedExchangeReceived', 'Network.requestIntercepted'];
21
-
22
14
  class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
23
15
  constructor(name, parent) {
24
16
  super(name, parent);
@@ -26,13 +18,11 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
26
18
  this._collectData = false;
27
19
  this._events = [];
28
20
  }
29
-
30
21
  init(devTools) {
31
22
  if (!devTools || !this._parent || !this._parent.getDriver || typeof this._parent.getDriver !== 'function' || !this._parent.getDriver()) {
32
23
  super.init();
33
24
  return false;
34
25
  }
35
-
36
26
  this._devTools = devTools;
37
27
  this._driver = this._parent.getDriver();
38
28
  observe.forEach(method => {
@@ -48,7 +38,6 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
48
38
  super.init();
49
39
  return true;
50
40
  }
51
-
52
41
  async dispose() {
53
42
  try {
54
43
  if (this._driver) {
@@ -59,56 +48,46 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
59
48
  await this._driver.emit('Network.close');
60
49
  }
61
50
  } catch (e) {}
62
-
63
51
  this._devTools = null;
64
52
  this._driver = null;
65
53
  this._events = [];
66
54
  super.dispose();
67
55
  }
68
-
69
56
  start() {
70
57
  this._collectData = true;
71
58
  this._events = [];
72
59
  }
73
-
74
60
  stop() {
75
61
  this._collectData = false;
76
62
  }
77
-
78
63
  async getRequests() {
79
64
  return await this._getEntries();
80
65
  }
81
-
82
66
  async _getEntries() {
83
67
  try {
84
68
  const har = (0, _chromeHar.harFromMessages)(this._events);
85
-
86
69
  if (har && har.log && har.log.entries && har.log.entries.map) {
87
70
  har.log.entries.reverse();
88
71
  return await Promise.all(har.log.entries.map(async item => {
89
72
  let responseBody = {};
90
-
91
73
  try {
92
74
  responseBody = await this._driver.cdp('Network', 'getResponseBody', {
93
75
  requestId: item._requestId
94
76
  });
95
77
  } catch (e) {}
96
-
97
78
  if (responseBody && responseBody.body) {
98
79
  try {
99
80
  responseBody.body = JSON.parse(responseBody.body);
100
81
  } catch (e) {}
101
82
  }
102
-
103
83
  let requestPostData = {};
104
-
105
84
  try {
106
85
  requestPostData = await this._driver.cdp('Network', 'getRequestPostData', {
107
86
  requestId: item._requestId
108
87
  });
109
88
  } catch (e) {}
110
-
111
- return { ...item,
89
+ return {
90
+ ...item,
112
91
  url: item.request.url,
113
92
  requestId: item._requestId,
114
93
  ...item.response,
@@ -123,205 +102,147 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
123
102
  return [];
124
103
  }
125
104
  }
126
-
127
105
  async waitForUrl(pattern, timeout = 60 * 1000) {
128
106
  if (!this._driver || !this._isInitialized || !this._parent) {
129
107
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
130
108
  }
131
-
132
109
  if (!this._collectData) {
133
110
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
134
111
  }
135
-
136
112
  this._parent.helpers.assertArgument(pattern, 'pattern');
137
-
138
113
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
139
-
140
114
  const start = Date.now();
141
-
142
115
  while (Date.now() - start < timeout) {
143
116
  const networkRequests = await this._getEntries();
144
-
145
117
  for (let req of networkRequests) {
146
118
  if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
147
119
  return req;
148
120
  }
149
121
  }
150
-
151
122
  await this._driver.pause(500);
152
123
  }
153
-
154
124
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
155
125
  }
156
-
157
126
  async waitForNotUrl(pattern, timeout = 60 * 1000) {
158
127
  if (!this._driver || !this._isInitialized || !this._parent) {
159
128
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
160
129
  }
161
-
162
130
  if (!this._collectData) {
163
131
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
164
132
  }
165
-
166
133
  this._parent.helpers.assertArgument(pattern, 'pattern');
167
-
168
134
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
169
-
170
135
  const start = Date.now();
171
-
172
136
  while (Date.now() - start < timeout) {
173
137
  const networkRequests = await this._getEntries();
174
-
175
138
  for (let req of networkRequests) {
176
139
  if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
177
140
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `A request matching the URL "${pattern}" was found.`);
178
141
  }
179
142
  }
180
-
181
143
  await this._driver.pause(500);
182
144
  }
183
145
  }
184
-
185
146
  async waitFor(matcher, timeout = 60 * 1000) {
186
147
  if (!this._driver || !this._isInitialized || !this._parent) {
187
148
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` module is not initialized.');
188
149
  }
189
-
190
150
  if (!this._collectData) {
191
151
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
192
152
  }
193
-
194
153
  this._parent.helpers.assertArgument(matcher, 'matcher');
195
-
196
154
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
197
-
198
155
  const start = Date.now();
199
-
200
156
  while (Date.now() - start < timeout) {
201
157
  const networkRequests = await this._getEntries();
202
-
203
158
  for (var req of networkRequests) {
204
159
  if (matcher(req)) {
205
160
  return req;
206
161
  }
207
162
  }
208
-
209
163
  await this._driver.pause(500);
210
164
  }
211
-
212
165
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
213
166
  }
214
-
215
167
  async assertUrl(url, timeout = 60 * 1000) {
216
168
  if (!this._driver || !this._isInitialized || !this._parent) {
217
169
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
218
170
  }
219
-
220
171
  if (!this._collectData) {
221
172
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
222
173
  }
223
-
224
174
  this._parent.helpers.assertArgument(url, 'url');
225
-
226
175
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
227
-
228
176
  const start = Date.now();
229
-
230
177
  while (Date.now() - start < timeout) {
231
178
  const networkRequests = await this._getEntries();
232
-
233
179
  for (let req of networkRequests) {
234
180
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
235
181
  return req;
236
182
  }
237
183
  }
238
-
239
184
  await this._driver.pause(500);
240
185
  }
241
-
242
186
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
243
187
  }
244
-
245
188
  async assertStatusCode(url, statusCode, failureMessage = null, timeout = 60 * 1000) {
246
189
  if (!this._driver || !this._isInitialized || !this._parent) {
247
190
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
248
191
  }
249
-
250
192
  if (!this._collectData) {
251
193
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
252
194
  }
253
-
254
195
  this._parent.helpers.assertArgument(url, 'url');
255
-
256
196
  this._parent.helpers.assertArgument(statusCode, 'statusCode');
257
-
258
197
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
259
-
260
198
  const start = Date.now();
261
199
  let matchedReq = null;
262
-
263
200
  while (Date.now() - start < timeout && !matchedReq) {
264
201
  const networkRequests = await this._getEntries();
265
-
266
202
  for (let req of networkRequests) {
267
203
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
268
204
  matchedReq = req;
269
205
  break;
270
206
  }
271
207
  }
272
-
273
208
  !matchedReq && (await this._driver.pause(500));
274
209
  }
275
-
276
210
  if (!matchedReq) {
277
211
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
278
212
  }
279
-
280
213
  if (statusCode !== matchedReq.status) {
281
214
  const message = failureMessage || `The expected status code "${statusCode}" does not match "${matchedReq.status}".`;
282
215
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
283
216
  }
284
217
  }
285
-
286
218
  async assertResponseContent(url, content, failureMessage = null, timeout = 60 * 1000) {
287
219
  if (!this._driver || !this._isInitialized || !this._parent) {
288
220
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
289
221
  }
290
-
291
222
  if (!this._collectData) {
292
223
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
293
224
  }
294
-
295
225
  this._parent.helpers.assertArgument(url, 'url');
296
-
297
226
  this._parent.helpers.assertArgument(content, 'content');
298
-
299
227
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
300
-
301
228
  const start = Date.now();
302
229
  let matchedReq = null;
303
-
304
230
  while (Date.now() - start < timeout && !matchedReq) {
305
231
  const networkRequests = await this._getEntries();
306
-
307
232
  for (let req of networkRequests) {
308
233
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
309
234
  matchedReq = req;
310
235
  break;
311
236
  }
312
237
  }
313
-
314
238
  !matchedReq && (await this._driver.pause(500));
315
239
  }
316
-
317
240
  if (!matchedReq) {
318
241
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
319
242
  }
320
-
321
243
  const resp = await this._driver.cdp('Network', 'getResponseBody', {
322
244
  requestId: matchedReq.requestId
323
245
  });
324
-
325
246
  if (resp && resp.body && !resp.base64Encoded) {
326
247
  if (content.constructor.name === 'RegExp' && (content.test(resp.body) || resp.body.indexOf(content) > -1)) {
327
248
  return true;
@@ -331,8 +252,6 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
331
252
  }
332
253
  }
333
254
  }
334
-
335
255
  }
336
-
337
256
  exports.default = NetworkSubModule;
338
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrLmpzIl0sIm5hbWVzIjpbIm9ic2VydmUiLCJOZXR3b3JrU3ViTW9kdWxlIiwiT3h5Z2VuU3ViTW9kdWxlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicGFyZW50IiwiX2RldlRvb2xzIiwiX2NvbGxlY3REYXRhIiwiX2V2ZW50cyIsImluaXQiLCJkZXZUb29scyIsIl9wYXJlbnQiLCJnZXREcml2ZXIiLCJfZHJpdmVyIiwiZm9yRWFjaCIsIm1ldGhvZCIsIm9uIiwicGFyYW1zIiwicHVzaCIsImRpc3Bvc2UiLCJyZW1vdmVMaXN0ZW5lciIsImVtaXQiLCJlIiwic3RhcnQiLCJzdG9wIiwiZ2V0UmVxdWVzdHMiLCJfZ2V0RW50cmllcyIsImhhciIsImxvZyIsImVudHJpZXMiLCJtYXAiLCJyZXZlcnNlIiwiUHJvbWlzZSIsImFsbCIsIml0ZW0iLCJyZXNwb25zZUJvZHkiLCJjZHAiLCJyZXF1ZXN0SWQiLCJfcmVxdWVzdElkIiwiYm9keSIsIkpTT04iLCJwYXJzZSIsInJlcXVlc3RQb3N0RGF0YSIsInVybCIsInJlcXVlc3QiLCJyZXNwb25zZSIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIl9pc0luaXRpYWxpemVkIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IiLCJoZWxwZXJzIiwiYXNzZXJ0QXJndW1lbnQiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJEYXRlIiwibm93IiwibmV0d29ya1JlcXVlc3RzIiwicmVxIiwidGVzdCIsInBhdXNlIiwiVElNRU9VVCIsIndhaXRGb3JOb3RVcmwiLCJ3YWl0Rm9yIiwibWF0Y2hlciIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwic3RhdHVzIiwibWVzc2FnZSIsImFzc2VydFJlc3BvbnNlQ29udGVudCIsImNvbnRlbnQiLCJyZXNwIiwiYmFzZTY0RW5jb2RlZCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsT0FBTyxHQUFHLENBQ1osMkJBRFksRUFFWix3QkFGWSxFQUdaLG9CQUhZLEVBSVosb0JBSlksRUFLWixxQkFMWSxFQU1aLHlCQU5ZLEVBT1osd0JBUFksRUFRWiw2QkFSWSxFQVNaLDhCQVRZLEVBVVoscUJBVlksRUFXWixxQkFYWSxFQVlaLGlCQVpZLEVBYVosc0NBYlksRUFjWiwrQkFkWSxFQWVaLCtCQWZZLEVBZ0JaLHVCQWhCWSxFQWlCWix3QkFqQlksRUFrQlosK0JBbEJZLEVBbUJaLG1CQW5CWSxFQW9CWiwwQkFwQlksRUFxQlosMEJBckJZLEVBc0JaLDhCQXRCWSxFQXVCWixzQkF2QlksRUF3Qlosa0NBeEJZLEVBeUJaLHNCQXpCWSxFQTBCWixvQ0ExQlksRUEyQlosdUJBM0JZLEVBNEJaLHlCQTVCWSxFQTZCWixnQ0E3QlksRUE4QlosMkJBOUJZLEVBK0JaLDBCQS9CWSxFQWdDWix5QkFoQ1ksRUFpQ1osMEJBakNZLEVBa0NaLDZCQWxDWSxFQW1DWixnQ0FuQ1ksRUFvQ1osNEJBcENZLEVBcUNaLDRDQXJDWSxFQXNDWiwyQ0F0Q1ksRUF1Q1osb0NBdkNZLEVBd0NaLGlDQXhDWSxFQXlDWixtQ0F6Q1ksRUEwQ1osZ0NBMUNZLEVBMkNaLDRCQTNDWSxDQUFoQjs7QUE2Q2UsTUFBTUMsZ0JBQU4sU0FBK0JDLGdDQUEvQixDQUErQztBQUMxREMsRUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBZTtBQUN0QixVQUFNRCxJQUFOLEVBQVlDLE1BQVo7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7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Q0FBaUIsU0FBakIsRUFBMkIsaUJBQTNCLEVBQThDO0FBQzdEQyxNQUFBQSxTQUFTLEVBQUVtQyxVQUFVLENBQUNuQztBQUR1QyxLQUE5QyxDQUFuQjs7QUFHQSxRQUFJd0MsSUFBSSxJQUFJQSxJQUFJLENBQUN0QyxJQUFiLElBQXFCLENBQUNzQyxJQUFJLENBQUNDLGFBQS9CLEVBQThDO0FBQzFDLFVBQUlGLE9BQU8sQ0FBQ3pFLFdBQVIsQ0FBb0JDLElBQXBCLEtBQTZCLFFBQTdCLEtBQTBDd0UsT0FBTyxDQUFDZixJQUFSLENBQWFnQixJQUFJLENBQUN0QyxJQUFsQixLQUEyQnNDLElBQUksQ0FBQ3RDLElBQUwsQ0FBVXdDLE9BQVYsQ0FBa0JILE9BQWxCLElBQTZCLENBQUMsQ0FBbkcsQ0FBSixFQUEyRztBQUN2RyxlQUFPLElBQVA7QUFDSCxPQUZELE1BR0s7QUFDRCxjQUFNRixPQUFPLEdBQUdILGNBQWMsSUFBSyxhQUFZNUIsR0FBSSxrQ0FBaUNpQyxPQUFRLEdBQTVGO0FBQ0EsY0FBTSxJQUFJMUIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JnQixZQUFoQyxFQUE4Q00sT0FBOUMsQ0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUF0V3lEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAnUGFnZS5maWxlQ2hvb3Nlck9wZW5lZCcsXHJcbiAgICAnUGFnZS5mcmFtZUF0dGFjaGVkJyxcclxuICAgICdQYWdlLmZyYW1lRGV0YWNoZWQnLFxyXG4gICAgJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgJ1BhZ2UuaW50ZXJzdGl0aWFsSGlkZGVuJyxcclxuICAgICdQYWdlLmludGVyc3RpdGlhbFNob3duJyxcclxuICAgICdQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgJ1BhZ2UuamF2YXNjcmlwdERpYWxvZ09wZW5pbmcnLFxyXG4gICAgJ1BhZ2UubGlmZWN5Y2xlRXZlbnQnLFxyXG4gICAgJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLFxyXG4gICAgJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAnUGFnZS5mcmFtZUNsZWFyZWRTY2hlZHVsZWROYXZpZ2F0aW9uJyxcclxuICAgICdQYWdlLmZyYW1lU2NoZWR1bGVkTmF2aWdhdGlvbicsXHJcbiAgICAnUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgJ1BhZ2UuZG93bmxvYWRQcm9ncmVzcycsXHJcbiAgICAnUGFnZS5kb3dubG9hZFdpbGxCZWdpbicsXHJcbiAgICAnUGFnZS5mcmFtZVJlcXVlc3RlZE5hdmlnYXRpb24nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsXHJcbiAgICAnUGFnZS5uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcsXHJcbiAgICAnUGFnZS5zY3JlZW5jYXN0RnJhbWUnLFxyXG4gICAgJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5ldmVudFNvdXJjZU1lc3NhZ2VSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5sb2FkaW5nRmFpbGVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGaW5pc2hlZCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JyxcclxuICAgICdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0Q2xvc2VkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0RnJhbWVFcnJvcicsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRGcmFtZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudEV4dHJhSW5mbycsXHJcbiAgICAnTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eScsXHJcbiAgICAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJyxcclxuICAgICdOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdEludGVyY2VwdGVkJ1xyXG5dO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrU3ViTW9kdWxlIGV4dGVuZHMgT3h5Z2VuU3ViTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHBhcmVudCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkZXZUb29scykge1xyXG4gICAgICAgIGlmICghZGV2VG9vbHMgfHwgIXRoaXMuX3BhcmVudCB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlciB8fCB0eXBlb2YgdGhpcy5fcGFyZW50LmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlcigpKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IGRldlRvb2xzO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IHRoaXMuX3BhcmVudC5nZXREcml2ZXIoKTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZS5mb3JFYWNoKG1ldGhvZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5vbihtZXRob2QsIHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMucHVzaCh7IG1ldGhvZCwgcGFyYW1zIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcml2ZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmZvckVhY2goYXN5bmMgbWV0aG9kID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucmVtb3ZlTGlzdGVuZXIobWV0aG9kLCAoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5kaXNhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5jbG9zZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC4gTmV0d29yayByZXF1ZXN0IGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgb24gQ2hyb21lIDYzIGFuZCBsYXRlci5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm5ldHdvcmsuc3RhcnQoKTtcclxuICAgICAqIHdlYi5vcGVuKFwiaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tXCIpO1xyXG4gICAgICogLy8gcHJpbnQgdGhlIGNvbGxlY3RlZCByZXF1ZXN0IHNvIGZhcjpcclxuICAgICAqIGxldCByZXF1ZXN0cyA9IHdlYi5uZXR3b3JrLmdldFJlcXVlc3RzKCk7XHJcbiAgICAgKiBmb3IgKGxldCByZXEgb2YgcmVxdWVzdHMpIHtcclxuICAgICAqICAgbG9nLmluZm8ocmVxKTtcclxuICAgICAqIH1cclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHZlcmJhdGltIFVSTCBtYXRjaDpcclxuICAgICAqIHdlYi5uZXR3b3JrLndhaXRGb3JVcmwoJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgvaHR0cHM6XFwvXFwvLipcXC9mb29cXC9iYXIvKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIGN1c3RvbSBtYXRjaGVyOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvcihmdW5jdGlvbiAocmVxdWVzdCkge1xyXG4gICAgICogICByZXR1cm4gcmVxdWVzdC5zdGF0dXNUZXh0ID09PSAnT0snICYmIHJlcXVlc3QudXJsID09PSAnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGFsbCB0aGUgY29sbGVjdGVkIG5ldHdvcmsgcmVxdWVzdHMgc28gZmFyLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlcXVlc3RzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gQXJyYXkgY29udGFpbmluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZXF1ZXN0cygpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRFbnRyaWVzKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyh0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhciAmJiBoYXIubG9nICYmIGhhci5sb2cuZW50cmllcyAmJiBoYXIubG9nLmVudHJpZXMubWFwKSB7XHJcbiAgICAgICAgICAgICAgICBoYXIubG9nLmVudHJpZXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGhhci5sb2cuZW50cmllcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZUJvZHkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVzcG9uc2VCb2R5Jywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVzcG9uc2VCb2R5IGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keSAmJiByZXNwb25zZUJvZHkuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlQm9keS5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhcnNlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdFBvc3REYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlcXVlc3RQb3N0RGF0YScsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbS5fcmVxdWVzdElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGdldFJlcXVlc3RQb3N0RGF0YSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXRlbS5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAtIEFuIFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRmFpbCB0aGUgdGVzdCBpZiByZXF1ZXN0IHdpdGggYSBtYXRjaGluZyBVUkwgd2FzIHJlY2VpdmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvck5vdFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yTm90VXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChwYXR0ZXJuLCAncGF0dGVybicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgQSByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIG5ldHdvcmtXYWl0Rm9yXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyIC0gTWF0Y2hpbmcgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBvbiBtYXRjaCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvcihtYXRjaGVyLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KG1hdGNoZXIsICdtYXRjaGVyJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIocmVxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSBtYXRjaGVkUmVxLnN0YXR1cykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBcIiR7c3RhdHVzQ29kZX1cIiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2hlZFJlcS5zdGF0dXN9XCIuYDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIEhUVFAgcmVzcG9uc2UgY29udGVudCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgcGF0dGVybi5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZUNvbnRlbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gY29udGVudCAtIEEgcmVzcG9uc2UgYm9keSBjb250ZW50IHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFJlc3BvbnNlQ29udGVudCh1cmwsIGNvbnRlbnQsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChjb250ZW50LCAnY29udGVudCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogbWF0Y2hlZFJlcS5yZXF1ZXN0SWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmJvZHkgJiYgIXJlc3AuYmFzZTY0RW5jb2RlZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiAoY29udGVudC50ZXN0KHJlc3AuYm9keSkgfHwgcmVzcC5ib2R5LmluZGV4T2YoY29udGVudCkgPiAtMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBSZXNwb25zZSBcIiR7dXJsfVwiIGJvZHkgY29udGVudCBkb2VzIG5vdCBtYXRjaCBcIiR7Y29udGVudH0uYDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iXX0=
257
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvYnNlcnZlIiwiTmV0d29ya1N1Yk1vZHVsZSIsIk94eWdlblN1Yk1vZHVsZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsInBhcmVudCIsIl9kZXZUb29scyIsIl9jb2xsZWN0RGF0YSIsIl9ldmVudHMiLCJpbml0IiwiZGV2VG9vbHMiLCJfcGFyZW50IiwiZ2V0RHJpdmVyIiwiX2RyaXZlciIsImZvckVhY2giLCJtZXRob2QiLCJvbiIsInBhcmFtcyIsInB1c2giLCJkaXNwb3NlIiwicmVtb3ZlTGlzdGVuZXIiLCJlbWl0IiwiZSIsInN0YXJ0Iiwic3RvcCIsImdldFJlcXVlc3RzIiwiX2dldEVudHJpZXMiLCJoYXIiLCJoYXJGcm9tTWVzc2FnZXMiLCJsb2ciLCJlbnRyaWVzIiwibWFwIiwicmV2ZXJzZSIsIlByb21pc2UiLCJhbGwiLCJpdGVtIiwicmVzcG9uc2VCb2R5IiwiY2RwIiwicmVxdWVzdElkIiwiX3JlcXVlc3RJZCIsImJvZHkiLCJKU09OIiwicGFyc2UiLCJyZXF1ZXN0UG9zdERhdGEiLCJ1cmwiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJ3YWl0Rm9yVXJsIiwicGF0dGVybiIsInRpbWVvdXQiLCJfaXNJbml0aWFsaXplZCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsIm5ldHdvcmtSZXF1ZXN0cyIsInJlcSIsInRlc3QiLCJwYXVzZSIsIlRJTUVPVVQiLCJ3YWl0Rm9yTm90VXJsIiwid2FpdEZvciIsIm1hdGNoZXIiLCJhc3NlcnRVcmwiLCJBU1NFUlRfRVJST1IiLCJhc3NlcnRTdGF0dXNDb2RlIiwic3RhdHVzQ29kZSIsImZhaWx1cmVNZXNzYWdlIiwibWF0Y2hlZFJlcSIsInN0YXR1cyIsIm1lc3NhZ2UiLCJhc3NlcnRSZXNwb25zZUNvbnRlbnQiLCJjb250ZW50IiwicmVzcCIsImJhc2U2NEVuY29kZWQiLCJpbmRleE9mIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL294X3NlcnZpY2VzL3NlcnZpY2UtZGV2dG9vbHMvc3VibW9kdWxlLW5ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAnUGFnZS5maWxlQ2hvb3Nlck9wZW5lZCcsXHJcbiAgICAnUGFnZS5mcmFtZUF0dGFjaGVkJyxcclxuICAgICdQYWdlLmZyYW1lRGV0YWNoZWQnLFxyXG4gICAgJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgJ1BhZ2UuaW50ZXJzdGl0aWFsSGlkZGVuJyxcclxuICAgICdQYWdlLmludGVyc3RpdGlhbFNob3duJyxcclxuICAgICdQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgJ1BhZ2UuamF2YXNjcmlwdERpYWxvZ09wZW5pbmcnLFxyXG4gICAgJ1BhZ2UubGlmZWN5Y2xlRXZlbnQnLFxyXG4gICAgJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLFxyXG4gICAgJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAnUGFnZS5mcmFtZUNsZWFyZWRTY2hlZHVsZWROYXZpZ2F0aW9uJyxcclxuICAgICdQYWdlLmZyYW1lU2NoZWR1bGVkTmF2aWdhdGlvbicsXHJcbiAgICAnUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgJ1BhZ2UuZG93bmxvYWRQcm9ncmVzcycsXHJcbiAgICAnUGFnZS5kb3dubG9hZFdpbGxCZWdpbicsXHJcbiAgICAnUGFnZS5mcmFtZVJlcXVlc3RlZE5hdmlnYXRpb24nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsXHJcbiAgICAnUGFnZS5uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcsXHJcbiAgICAnUGFnZS5zY3JlZW5jYXN0RnJhbWUnLFxyXG4gICAgJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5ldmVudFNvdXJjZU1lc3NhZ2VSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5sb2FkaW5nRmFpbGVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGaW5pc2hlZCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JyxcclxuICAgICdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0Q2xvc2VkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0RnJhbWVFcnJvcicsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRGcmFtZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudEV4dHJhSW5mbycsXHJcbiAgICAnTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eScsXHJcbiAgICAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJyxcclxuICAgICdOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdEludGVyY2VwdGVkJ1xyXG5dO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrU3ViTW9kdWxlIGV4dGVuZHMgT3h5Z2VuU3ViTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHBhcmVudCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkZXZUb29scykge1xyXG4gICAgICAgIGlmICghZGV2VG9vbHMgfHwgIXRoaXMuX3BhcmVudCB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlciB8fCB0eXBlb2YgdGhpcy5fcGFyZW50LmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlcigpKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IGRldlRvb2xzO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IHRoaXMuX3BhcmVudC5nZXREcml2ZXIoKTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZS5mb3JFYWNoKG1ldGhvZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5vbihtZXRob2QsIHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMucHVzaCh7IG1ldGhvZCwgcGFyYW1zIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcml2ZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmZvckVhY2goYXN5bmMgbWV0aG9kID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucmVtb3ZlTGlzdGVuZXIobWV0aG9kLCAoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5kaXNhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5jbG9zZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC4gTmV0d29yayByZXF1ZXN0IGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgb24gQ2hyb21lIDYzIGFuZCBsYXRlci5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm5ldHdvcmsuc3RhcnQoKTtcclxuICAgICAqIHdlYi5vcGVuKFwiaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tXCIpO1xyXG4gICAgICogLy8gcHJpbnQgdGhlIGNvbGxlY3RlZCByZXF1ZXN0IHNvIGZhcjpcclxuICAgICAqIGxldCByZXF1ZXN0cyA9IHdlYi5uZXR3b3JrLmdldFJlcXVlc3RzKCk7XHJcbiAgICAgKiBmb3IgKGxldCByZXEgb2YgcmVxdWVzdHMpIHtcclxuICAgICAqICAgbG9nLmluZm8ocmVxKTtcclxuICAgICAqIH1cclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHZlcmJhdGltIFVSTCBtYXRjaDpcclxuICAgICAqIHdlYi5uZXR3b3JrLndhaXRGb3JVcmwoJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgvaHR0cHM6XFwvXFwvLipcXC9mb29cXC9iYXIvKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIGN1c3RvbSBtYXRjaGVyOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvcihmdW5jdGlvbiAocmVxdWVzdCkge1xyXG4gICAgICogICByZXR1cm4gcmVxdWVzdC5zdGF0dXNUZXh0ID09PSAnT0snICYmIHJlcXVlc3QudXJsID09PSAnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGFsbCB0aGUgY29sbGVjdGVkIG5ldHdvcmsgcmVxdWVzdHMgc28gZmFyLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlcXVlc3RzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gQXJyYXkgY29udGFpbmluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZXF1ZXN0cygpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRFbnRyaWVzKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyh0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhciAmJiBoYXIubG9nICYmIGhhci5sb2cuZW50cmllcyAmJiBoYXIubG9nLmVudHJpZXMubWFwKSB7XHJcbiAgICAgICAgICAgICAgICBoYXIubG9nLmVudHJpZXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGhhci5sb2cuZW50cmllcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZUJvZHkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVzcG9uc2VCb2R5Jywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVzcG9uc2VCb2R5IGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keSAmJiByZXNwb25zZUJvZHkuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlQm9keS5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhcnNlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdFBvc3REYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlcXVlc3RQb3N0RGF0YScsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbS5fcmVxdWVzdElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGdldFJlcXVlc3RQb3N0RGF0YSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXRlbS5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAtIEFuIFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRmFpbCB0aGUgdGVzdCBpZiByZXF1ZXN0IHdpdGggYSBtYXRjaGluZyBVUkwgd2FzIHJlY2VpdmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvck5vdFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yTm90VXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChwYXR0ZXJuLCAncGF0dGVybicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgQSByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIG5ldHdvcmtXYWl0Rm9yXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyIC0gTWF0Y2hpbmcgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBvbiBtYXRjaCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvcihtYXRjaGVyLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KG1hdGNoZXIsICdtYXRjaGVyJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIocmVxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSBtYXRjaGVkUmVxLnN0YXR1cykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBcIiR7c3RhdHVzQ29kZX1cIiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2hlZFJlcS5zdGF0dXN9XCIuYDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIEhUVFAgcmVzcG9uc2UgY29udGVudCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgcGF0dGVybi5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZUNvbnRlbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gY29udGVudCAtIEEgcmVzcG9uc2UgYm9keSBjb250ZW50IHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFJlc3BvbnNlQ29udGVudCh1cmwsIGNvbnRlbnQsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChjb250ZW50LCAnY29udGVudCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogbWF0Y2hlZFJlcS5yZXF1ZXN0SWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmJvZHkgJiYgIXJlc3AuYmFzZTY0RW5jb2RlZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiAoY29udGVudC50ZXN0KHJlc3AuYm9keSkgfHwgcmVzcC5ib2R5LmluZGV4T2YoY29udGVudCkgPiAtMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBSZXNwb25zZSBcIiR7dXJsfVwiIGJvZHkgY29udGVudCBkb2VzIG5vdCBtYXRjaCBcIiR7Y29udGVudH0uYDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUErQztBQUUvQyxNQUFNQSxPQUFPLEdBQUcsQ0FDWiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsNkJBQTZCLEVBQzdCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixzQ0FBc0MsRUFDdEMsK0JBQStCLEVBQy9CLCtCQUErQixFQUMvQix1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLCtCQUErQixFQUMvQixtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQiw4QkFBOEIsRUFDOUIsc0JBQXNCLEVBQ3RCLGtDQUFr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
@@ -4,66 +4,49 @@ 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 _devtoolsService = _interopRequireDefault(require("@wdio/devtools-service"));
11
-
12
9
  var _OxygenService = _interopRequireDefault(require("../core/OxygenService"));
13
-
14
10
  var _submoduleNetwork = _interopRequireDefault(require("./service-devtools/submodule-network"));
15
-
16
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
12
  const CHROME_BROWSER = 'chrome';
19
-
20
13
  class DevToolsService extends _OxygenService.default {
21
14
  constructor(options, ctx, results, logger) {
22
15
  super(options, ctx, results, logger);
23
16
  this._subModules = {};
24
17
  this.isServiceInitialized = true;
25
18
  }
26
-
27
19
  onModuleLoaded(module) {
28
20
  if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
29
21
  return;
30
22
  }
31
-
32
23
  const networkSubmodule = new _submoduleNetwork.default('network', module);
33
24
  module.addSubModule('network', networkSubmodule);
34
25
  this._subModules[module.name] = networkSubmodule;
35
26
  }
36
-
37
27
  async onModuleInitialized(module) {
38
28
  if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
39
29
  return;
40
30
  }
41
-
42
31
  const submodule = this._subModules[module.name];
43
-
44
32
  if (!submodule || submodule.isInitialized) {
45
33
  return;
46
34
  }
47
-
48
35
  let options = {};
49
36
  const capabilities = module.getCapabilities() || {};
50
37
  const {
51
38
  browserName
52
39
  } = capabilities;
53
40
  this._driver = module.getDriver();
54
-
55
41
  if (this._driver && this._driver.capabilities && this._driver.capabilities['goog:chromeOptions'] && this._driver.capabilities['goog:chromeOptions']['debuggerAddress']) {
56
42
  options.debuggerAddress = this._driver.capabilities['goog:chromeOptions']['debuggerAddress'];
57
43
  }
58
-
59
44
  if (this._driver.provider === null && browserName && browserName.toLowerCase() === CHROME_BROWSER) {
60
45
  const devToolsSvc = new _devtoolsService.default(options);
61
46
  const UNSUPPORTED_ERROR_MESSAGE = devToolsSvc.beforeSession(null, capabilities);
62
-
63
47
  if (UNSUPPORTED_ERROR_MESSAGE) {
64
48
  console.log('UNSUPPORTED_ERROR_MESSAGE', UNSUPPORTED_ERROR_MESSAGE);
65
49
  }
66
-
67
50
  if (devToolsSvc._isSupported) {
68
51
  global.browser = module.getDriver();
69
52
  await devToolsSvc.before(null, null, this._driver);
@@ -71,18 +54,13 @@ class DevToolsService extends _OxygenService.default {
71
54
  }
72
55
  }
73
56
  }
74
-
75
57
  onModuleWillDispose(module) {
76
58
  const submodule = this._subModules[module.name];
77
-
78
59
  if (!submodule) {
79
60
  return;
80
61
  }
81
-
82
62
  submodule.dispose();
83
63
  }
84
-
85
64
  }
86
-
87
65
  exports.default = DevToolsService;
88
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzLmpzIl0sIm5hbWVzIjpbIkNIUk9NRV9CUk9XU0VSIiwiRGV2VG9vbHNTZXJ2aWNlIiwiT3h5Z2VuU2VydmljZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImN0eCIsInJlc3VsdHMiLCJsb2dnZXIiLCJfc3ViTW9kdWxlcyIsImlzU2VydmljZUluaXRpYWxpemVkIiwib25Nb2R1bGVMb2FkZWQiLCJtb2R1bGUiLCJnZXREcml2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJuZXR3b3JrU3VibW9kdWxlIiwiTmV0d29ya1N1Yk1vZHVsZSIsImFkZFN1Yk1vZHVsZSIsIm5hbWUiLCJvbk1vZHVsZUluaXRpYWxpemVkIiwic3VibW9kdWxlIiwiaXNJbml0aWFsaXplZCIsImNhcGFiaWxpdGllcyIsImJyb3dzZXJOYW1lIiwiX2RyaXZlciIsImRlYnVnZ2VyQWRkcmVzcyIsInByb3ZpZGVyIiwidG9Mb3dlckNhc2UiLCJkZXZUb29sc1N2YyIsIldESU9EZXZUb29sc1NlcnZpY2UiLCJVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFIiwiYmVmb3JlU2Vzc2lvbiIsImNvbnNvbGUiLCJsb2ciLCJfaXNTdXBwb3J0ZWQiLCJnbG9iYWwiLCJicm93c2VyIiwiYmVmb3JlIiwiaW5pdCIsIm9uTW9kdWxlV2lsbERpc3Bvc2UiLCJkaXNwb3NlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQUVBLE1BQU1BLGNBQWMsR0FBRyxRQUF2Qjs7QUFFZSxNQUFNQyxlQUFOLFNBQThCQyxzQkFBOUIsQ0FBNEM7QUFDdkRDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVQyxHQUFWLEVBQWVDLE9BQWYsRUFBd0JDLE1BQXhCLEVBQWdDO0FBQ3ZDLFVBQU1ILE9BQU4sRUFBZUMsR0FBZixFQUFvQkMsT0FBcEIsRUFBNkJDLE1BQTdCO0FBRUEsU0FBS0MsV0FBTCxHQUFtQixFQUFuQjtB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eEIsQ0FBbEI7O0FBQ0EsUUFBSSxDQUFDRSxTQUFMLEVBQWdCO0FBQ1o7QUFDSDs7QUFDREEsSUFBQUEsU0FBUyxDQUFDb0IsT0FBVjtBQUNIOztBQW5Fc0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnJlYWNoYWJsZSAqL1xyXG5pbXBvcnQgV0RJT0RldlRvb2xzU2VydmljZSBmcm9tICdAd2Rpby9kZXZ0b29scy1zZXJ2aWNlJztcclxuXHJcbmltcG9ydCBPeHlnZW5TZXJ2aWNlIGZyb20gJy4uL2NvcmUvT3h5Z2VuU2VydmljZSc7XHJcbmltcG9ydCBOZXR3b3JrU3ViTW9kdWxlIGZyb20gJy4vc2VydmljZS1kZXZ0b29scy9zdWJtb2R1bGUtbmV0d29yayc7XHJcblxyXG5jb25zdCBDSFJPTUVfQlJPV1NFUiA9ICdjaHJvbWUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNTZXJ2aWNlIGV4dGVuZHMgT3h5Z2VuU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjdHgsIHJlc3VsdHMsIGxvZ2dlcikge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGN0eCwgcmVzdWx0cywgbG9nZ2VyKTtcclxuICAgICAgICAvLyBoYXNoIG9mIHdlYmRyaXZlciBiYXNlZCBtb2R1bGVzXHJcbiAgICAgICAgdGhpcy5fc3ViTW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaXNTZXJ2aWNlSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgb25Nb2R1bGVMb2FkZWQobW9kdWxlKSB7XHJcbiAgICAgICAgLy8gc2tpcCBhbnkgbW9kdWxlIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IC5nZXREcml2ZXIoKSBtZXRob2QgKGUuZy4gbm90IHdlYmRyaXZlciBiYXNlZClcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlLmdldERyaXZlciB8fCB0eXBlb2YgbW9kdWxlLmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhbW9kdWxlLmdldENhcGFiaWxpdGllcyB8fCB0eXBlb2YgbW9kdWxlLmdldENhcGFiaWxpdGllcyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXR3b3JrU3VibW9kdWxlID0gbmV3IE5ldHdvcmtTdWJNb2R1bGUoJ25ldHdvcmsnLCBtb2R1bGUpO1xyXG4gICAgICAgIG1vZHVsZS5hZGRTdWJNb2R1bGUoJ25ldHdvcmsnLCBuZXR3b3JrU3VibW9kdWxlKTtcclxuICAgICAgICB0aGlzLl9zdWJNb2R1bGVzW21vZHVsZS5uYW1lXSA9IG5ldHdvcmtTdWJtb2R1bGU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSkge1xyXG4gICAgICAgIC8vIHNraXAgYW55IG1vZHVsZSB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBnZXREcml2ZXIgbWV0aG9kIChlLmcuIG5vdCB3ZWJkcml2ZXIgYmFzZWQpXHJcbiAgICAgICAgaWYgKCFtb2R1bGUgfHwgIW1vZHVsZS5nZXREcml2ZXIgfHwgdHlwZW9mIG1vZHVsZS5nZXREcml2ZXIgIT09ICdmdW5jdGlvbicgfHwgIW1vZHVsZS5nZXRDYXBhYmlsaXRpZXMgfHwgdHlwZW9mIG1vZHVsZS5nZXRDYXBhYmlsaXRpZXMgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdWJtb2R1bGUgPSB0aGlzLl9zdWJNb2R1bGVzW21vZHVsZS5uYW1lXTtcclxuICAgICAgICBpZiAoIXN1Ym1vZHVsZSB8fCBzdWJtb2R1bGUuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1vZHVsZS5nZXRDYXBhYmlsaXRpZXMoKSB8fCB7fTtcclxuICAgICAgICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBhYmlsaXRpZXM7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gbW9kdWxlLmdldERyaXZlcigpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlciAmJlxyXG4gICAgICAgICAgICB0aGlzLl9kcml2ZXIuY2FwYWJpbGl0aWVzICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXNbJ2dvb2c6Y2hyb21lT3B0aW9ucyddICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXNbJ2dvb2c6Y2hyb21lT3B0aW9ucyddWydkZWJ1Z2dlckFkZHJlc3MnXVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBvcHRpb25zLmRlYnVnZ2VyQWRkcmVzcyA9IHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXNbJ2dvb2c6Y2hyb21lT3B0aW9ucyddWydkZWJ1Z2dlckFkZHJlc3MnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgYW55IDNyZCBwYXJ0eSBwcm92aWRlclxyXG4gICAgICAgIGlmICh0aGlzLl9kcml2ZXIucHJvdmlkZXIgPT09IG51bGwgJiYgYnJvd3Nlck5hbWUgJiYgYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gQ0hST01FX0JST1dTRVIpIHtcclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBEZXZUb29sc1NlcnZpY2UgYW5kIGhvb2sgaXQgdG8gdGhlIGN1cnJlbnQgd2ViZHJpdmVyIG9iamVjdFxyXG4gICAgICAgICAgICBjb25zdCBkZXZUb29sc1N2YyA9IG5ldyBXRElPRGV2VG9vbHNTZXJ2aWNlKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCBVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFID0gZGV2VG9vbHNTdmMuYmVmb3JlU2Vzc2lvbihudWxsLCBjYXBhYmlsaXRpZXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKFVOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFJywgVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkZXZUb29sc1N2Yy5faXNTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBnbG9iYWwuYnJvd3NlciB0byB0aGUgY3VycmVudCBtb2R1bGUncyB3ZWJkcml2ZXIgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IG9yZ0dsb2JhbEJyb3dzZXIgPSBnbG9iYWwuYnJvd3NlcjtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5icm93c2VyID0gbW9kdWxlLmdldERyaXZlcigpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGV2VG9vbHNTdmMuYmVmb3JlKG51bGwsIG51bGwsIHRoaXMuX2RyaXZlcik7XHJcbiAgICAgICAgICAgICAgICBzdWJtb2R1bGUuaW5pdChkZXZUb29sc1N2Yyk7XHJcbiAgICAgICAgICAgICAgICAvLyBnbG9iYWwuYnJvd3NlciA9IG9yZ0dsb2JhbEJyb3dzZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBvbk1vZHVsZVdpbGxEaXNwb3NlKG1vZHVsZSkge1xyXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdO1xyXG4gICAgICAgIGlmICghc3VibW9kdWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VibW9kdWxlLmRpc3Bvc2UoKTtcclxuICAgIH1cclxufSJdfQ==
66
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVfQlJPV1NFUiIsIkRldlRvb2xzU2VydmljZSIsIk94eWdlblNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjdHgiLCJyZXN1bHRzIiwibG9nZ2VyIiwiX3N1Yk1vZHVsZXMiLCJpc1NlcnZpY2VJbml0aWFsaXplZCIsIm9uTW9kdWxlTG9hZGVkIiwibW9kdWxlIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwibmV0d29ya1N1Ym1vZHVsZSIsIk5ldHdvcmtTdWJNb2R1bGUiLCJhZGRTdWJNb2R1bGUiLCJuYW1lIiwib25Nb2R1bGVJbml0aWFsaXplZCIsInN1Ym1vZHVsZSIsImlzSW5pdGlhbGl6ZWQiLCJjYXBhYmlsaXRpZXMiLCJicm93c2VyTmFtZSIsIl9kcml2ZXIiLCJkZWJ1Z2dlckFkZHJlc3MiLCJwcm92aWRlciIsInRvTG93ZXJDYXNlIiwiZGV2VG9vbHNTdmMiLCJXRElPRGV2VG9vbHNTZXJ2aWNlIiwiVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSIsImJlZm9yZVNlc3Npb24iLCJjb25zb2xlIiwibG9nIiwiX2lzU3VwcG9ydGVkIiwiZ2xvYmFsIiwiYnJvd3NlciIsImJlZm9yZSIsImluaXQiLCJvbk1vZHVsZVdpbGxEaXNwb3NlIiwiZGlzcG9zZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVucmVhY2hhYmxlICovXHJcbmltcG9ydCBXRElPRGV2VG9vbHNTZXJ2aWNlIGZyb20gJ0B3ZGlvL2RldnRvb2xzLXNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IE94eWdlblNlcnZpY2UgZnJvbSAnLi4vY29yZS9PeHlnZW5TZXJ2aWNlJztcclxuaW1wb3J0IE5ldHdvcmtTdWJNb2R1bGUgZnJvbSAnLi9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrJztcclxuXHJcbmNvbnN0IENIUk9NRV9CUk9XU0VSID0gJ2Nocm9tZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZXZUb29sc1NlcnZpY2UgZXh0ZW5kcyBPeHlnZW5TZXJ2aWNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGN0eCwgcmVzdWx0cywgbG9nZ2VyKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY3R4LCByZXN1bHRzLCBsb2dnZXIpO1xyXG4gICAgICAgIC8vIGhhc2ggb2Ygd2ViZHJpdmVyIGJhc2VkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9zdWJNb2R1bGVzID0ge307XHJcbiAgICAgICAgdGhpcy5pc1NlcnZpY2VJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBvbk1vZHVsZUxvYWRlZChtb2R1bGUpIHtcclxuICAgICAgICAvLyBza2lwIGFueSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgLmdldERyaXZlcigpIG1ldGhvZCAoZS5nLiBub3Qgd2ViZHJpdmVyIGJhc2VkKVxyXG4gICAgICAgIGlmICghbW9kdWxlIHx8ICFtb2R1bGUuZ2V0RHJpdmVyIHx8IHR5cGVvZiBtb2R1bGUuZ2V0RHJpdmVyICE9PSAnZnVuY3Rpb24nIHx8ICFtb2R1bGUuZ2V0Q2FwYWJpbGl0aWVzIHx8IHR5cGVvZiBtb2R1bGUuZ2V0Q2FwYWJpbGl0aWVzICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ldHdvcmtTdWJtb2R1bGUgPSBuZXcgTmV0d29ya1N1Yk1vZHVsZSgnbmV0d29yaycsIG1vZHVsZSk7XHJcbiAgICAgICAgbW9kdWxlLmFkZFN1Yk1vZHVsZSgnbmV0d29yaycsIG5ldHdvcmtTdWJtb2R1bGUpO1xyXG4gICAgICAgIHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdID0gbmV0d29ya1N1Ym1vZHVsZTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKSB7XHJcbiAgICAgICAgLy8gc2tpcCBhbnkgbW9kdWxlIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGdldERyaXZlciBtZXRob2QgKGUuZy4gbm90IHdlYmRyaXZlciBiYXNlZClcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlLmdldERyaXZlciB8fCB0eXBlb2YgbW9kdWxlLmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhbW9kdWxlLmdldENhcGFiaWxpdGllcyB8fCB0eXBlb2YgbW9kdWxlLmdldENhcGFiaWxpdGllcyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdO1xyXG4gICAgICAgIGlmICghc3VibW9kdWxlIHx8IHN1Ym1vZHVsZS5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gbW9kdWxlLmdldENhcGFiaWxpdGllcygpIHx8IHt9O1xyXG4gICAgICAgIGNvbnN0IHsgYnJvd3Nlck5hbWUgfSA9IGNhcGFiaWxpdGllcztcclxuICAgICAgICB0aGlzLl9kcml2ZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ10gJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZGVidWdnZXJBZGRyZXNzID0gdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCB1c2luZyBhbnkgM3JkIHBhcnR5IHByb3ZpZGVyXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyaXZlci5wcm92aWRlciA9PT0gbnVsbCAmJiBicm93c2VyTmFtZSAmJiBicm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBDSFJPTUVfQlJPV1NFUikge1xyXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIERldlRvb2xzU2VydmljZSBhbmQgaG9vayBpdCB0byB0aGUgY3VycmVudCB3ZWJkcml2ZXIgb2JqZWN0XHJcbiAgICAgICAgICAgIGNvbnN0IGRldlRvb2xzU3ZjID0gbmV3IFdESU9EZXZUb29sc1NlcnZpY2Uob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IFVOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UgPSBkZXZUb29sc1N2Yy5iZWZvcmVTZXNzaW9uKG51bGwsIGNhcGFiaWxpdGllcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UnLCBVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRldlRvb2xzU3ZjLl9pc1N1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGdsb2JhbC5icm93c2VyIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHdlYmRyaXZlciBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc3Qgb3JnR2xvYmFsQnJvd3NlciA9IGdsb2JhbC5icm93c2VyO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLmJyb3dzZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkZXZUb29sc1N2Yy5iZWZvcmUobnVsbCwgbnVsbCwgdGhpcy5fZHJpdmVyKTtcclxuICAgICAgICAgICAgICAgIHN1Ym1vZHVsZS5pbml0KGRldlRvb2xzU3ZjKTtcclxuICAgICAgICAgICAgICAgIC8vIGdsb2JhbC5icm93c2VyID0gb3JnR2xvYmFsQnJvd3NlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKSB7XHJcbiAgICAgICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5fc3ViTW9kdWxlc1ttb2R1bGUubmFtZV07XHJcbiAgICAgICAgaWYgKCFzdWJtb2R1bGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdWJtb2R1bGUuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG59Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7QUFFQTtBQUNBO0FBQW9FO0FBRXBFLE1BQU1BLGNBQWMsR0FBRyxRQUFRO0FBRWhCLE1BQU1DLGVBQWUsU0FBU0Msc0JBQWEsQ0FBQztFQUN2REMsV0FBVyxDQUFDQyxPQUFPLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUU7SUFDdkMsS0FBSyxDQUFDSCxPQUFPLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLENBQUM7SUFFcEMsSUFBSSxDQUFDQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcsSUFBSTtFQUNwQztFQUNBQyxjQUFjLENBQUNDLE1BQU0sRUFBRTtJQUVuQixJQUFJLENBQUNBLE1BQU0sSUFBSSxDQUFDQSxNQUFNLENBQUNDLFNBQVMsSUFBSSxPQUFPRCxNQUFNLENB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