oxygen-cli 1.25.0 → 1.27.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 (269) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/core/OxygenCore.js +266 -37
  3. package/build/core/OxygenEvents.js +11 -1
  4. package/build/core/OxygenModule.js +14 -1
  5. package/build/core/OxygenService.js +12 -1
  6. package/build/core/OxygenSubModule.js +10 -1
  7. package/build/core/WebDriverModule.js +30 -1
  8. package/build/core/utils.js +17 -1
  9. package/build/errors/HookError.js +7 -1
  10. package/build/errors/ModuleError.js +7 -1
  11. package/build/errors/ModuleUnavailableError.js +3 -1
  12. package/build/errors/OxygenError.js +33 -1
  13. package/build/errors/ScriptNotFound.js +7 -1
  14. package/build/errors/helper.js +77 -45
  15. package/build/index.js +18 -6
  16. package/build/lib/cli-util.js +90 -28
  17. package/build/lib/cli.js +23 -1
  18. package/build/lib/debugger.js +144 -1
  19. package/build/lib/img-merge.js +15 -1
  20. package/build/lib/launcher.js +28 -1
  21. package/build/lib/moduleRequire.js +4 -1
  22. package/build/lib/param-manager.js +28 -1
  23. package/build/lib/param-reader-csv.js +15 -1
  24. package/build/lib/param-reader-excel.js +14 -1
  25. package/build/lib/param-reader-json.js +10 -1
  26. package/build/lib/text-to-image.js +183 -0
  27. package/build/lib/util.js +58 -3
  28. package/build/model/case-result.js +4 -2
  29. package/build/model/failure.js +2 -1
  30. package/build/model/status.js +2 -1
  31. package/build/model/step-result.js +2 -1
  32. package/build/model/suite-result.js +2 -1
  33. package/build/model/test-result.js +2 -1
  34. package/build/model/testcase.js +2 -1
  35. package/build/model/testsuite.js +2 -1
  36. package/build/ox_modules/index.js +33 -13
  37. package/build/ox_modules/module-assert.js +24 -8
  38. package/build/ox_modules/module-date.js +8 -3
  39. package/build/ox_modules/module-db.js +28 -7
  40. package/build/ox_modules/module-email.js +36 -10
  41. package/build/ox_modules/module-eyes.js +46 -5
  42. package/build/ox_modules/module-http.js +102 -41
  43. package/build/ox_modules/module-log.js +22 -5
  44. package/build/ox_modules/module-mailinator.js +32 -10
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
  48. package/build/ox_modules/module-mob/commands/assertText.js +3 -1
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
  50. package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
  51. package/build/ox_modules/module-mob/commands/back.js +2 -1
  52. package/build/ox_modules/module-mob/commands/clear.js +4 -1
  53. package/build/ox_modules/module-mob/commands/click.js +4 -3
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
  55. package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
  57. package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
  61. package/build/ox_modules/module-mob/commands/execute.js +2 -1
  62. package/build/ox_modules/module-mob/commands/findElement.js +3 -1
  63. package/build/ox_modules/module-mob/commands/findElements.js +4 -1
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
  71. package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
  72. package/build/ox_modules/module-mob/commands/getSource.js +2 -1
  73. package/build/ox_modules/module-mob/commands/getText.js +4 -1
  74. package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
  75. package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
  76. package/build/ox_modules/module-mob/commands/getValue.js +9 -5
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
  79. package/build/ox_modules/module-mob/commands/index.js +94 -19
  80. package/build/ox_modules/module-mob/commands/installApp.js +2 -1
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
  83. package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
  84. package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
  85. package/build/ox_modules/module-mob/commands/isExist.js +3 -1
  86. package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
  87. package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
  89. package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
  91. package/build/ox_modules/module-mob/commands/open.js +3 -1
  92. package/build/ox_modules/module-mob/commands/pause.js +2 -1
  93. package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
  94. package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
  97. package/build/ox_modules/module-mob/commands/select.js +4 -1
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
  101. package/build/ox_modules/module-mob/commands/setContext.js +2 -1
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
  105. package/build/ox_modules/module-mob/commands/shake.js +2 -1
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
  108. package/build/ox_modules/module-mob/commands/swipe.js +2 -1
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
  112. package/build/ox_modules/module-mob/commands/tap.js +2 -1
  113. package/build/ox_modules/module-mob/commands/type.js +7 -3
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
  118. package/build/ox_modules/module-mob.js +141 -72
  119. package/build/ox_modules/module-pdf.js +62 -23
  120. package/build/ox_modules/module-proxy.js +68 -8
  121. package/build/ox_modules/module-serial.js +32 -7
  122. package/build/ox_modules/module-shell.js +27 -8
  123. package/build/ox_modules/module-soap.js +47 -14
  124. package/build/ox_modules/module-twilio.js +53 -10
  125. package/build/ox_modules/module-utils.js +51 -16
  126. package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
  128. package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
  129. package/build/ox_modules/module-web/commands/assertExist.js +2 -1
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
  132. package/build/ox_modules/module-web/commands/assertText.js +3 -1
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
  135. package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
  136. package/build/ox_modules/module-web/commands/assertValue.js +3 -1
  137. package/build/ox_modules/module-web/commands/back.js +2 -1
  138. package/build/ox_modules/module-web/commands/clear.js +5 -1
  139. package/build/ox_modules/module-web/commands/click.js +13 -4
  140. package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
  141. package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
  144. package/build/ox_modules/module-web/commands/deselect.js +2 -1
  145. package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
  147. package/build/ox_modules/module-web/commands/execute.js +2 -1
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
  149. package/build/ox_modules/module-web/commands/findElement.js +3 -1
  150. package/build/ox_modules/module-web/commands/findElements.js +4 -1
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
  152. package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
  153. package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
  155. package/build/ox_modules/module-web/commands/getCookies.js +2 -1
  156. package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
  157. package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
  158. package/build/ox_modules/module-web/commands/getHTML.js +2 -1
  159. package/build/ox_modules/module-web/commands/getSource.js +2 -1
  160. package/build/ox_modules/module-web/commands/getText.js +4 -1
  161. package/build/ox_modules/module-web/commands/getTitle.js +2 -1
  162. package/build/ox_modules/module-web/commands/getUrl.js +2 -1
  163. package/build/ox_modules/module-web/commands/getValue.js +5 -1
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
  167. package/build/ox_modules/module-web/commands/index.js +100 -19
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
  169. package/build/ox_modules/module-web/commands/isChecked.js +2 -1
  170. package/build/ox_modules/module-web/commands/isExist.js +3 -1
  171. package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
  172. package/build/ox_modules/module-web/commands/isSelected.js +2 -1
  173. package/build/ox_modules/module-web/commands/isVisible.js +3 -1
  174. package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
  177. package/build/ox_modules/module-web/commands/newWindow.js +2 -1
  178. package/build/ox_modules/module-web/commands/open.js +4 -1
  179. package/build/ox_modules/module-web/commands/pause.js +2 -1
  180. package/build/ox_modules/module-web/commands/point.js +2 -1
  181. package/build/ox_modules/module-web/commands/pointJS.js +8 -2
  182. package/build/ox_modules/module-web/commands/refresh.js +2 -1
  183. package/build/ox_modules/module-web/commands/rightClick.js +8 -3
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
  186. package/build/ox_modules/module-web/commands/select.js +5 -1
  187. package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
  188. package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
  189. package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
  194. package/build/ox_modules/module-web/commands/type.js +5 -1
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
  196. package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -1
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
  205. package/build/ox_modules/module-web.js +181 -82
  206. package/build/ox_modules/module-win/commands/assertText.js +3 -1
  207. package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
  208. package/build/ox_modules/module-win/commands/assertValue.js +15 -9
  209. package/build/ox_modules/module-win/commands/back.js +2 -1
  210. package/build/ox_modules/module-win/commands/clear.js +4 -1
  211. package/build/ox_modules/module-win/commands/click.js +2 -1
  212. package/build/ox_modules/module-win/commands/clickLong.js +2 -1
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
  214. package/build/ox_modules/module-win/commands/findElement.js +3 -1
  215. package/build/ox_modules/module-win/commands/findElements.js +4 -1
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
  218. package/build/ox_modules/module-win/commands/getLocation.js +2 -1
  219. package/build/ox_modules/module-win/commands/getSource.js +2 -1
  220. package/build/ox_modules/module-win/commands/getText.js +4 -1
  221. package/build/ox_modules/module-win/commands/getValue.js +9 -5
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
  223. package/build/ox_modules/module-win/commands/index.js +43 -5
  224. package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
  225. package/build/ox_modules/module-win/commands/isChecked.js +2 -1
  226. package/build/ox_modules/module-win/commands/isClickable.js +2 -1
  227. package/build/ox_modules/module-win/commands/isExist.js +3 -1
  228. package/build/ox_modules/module-win/commands/isSelected.js +2 -1
  229. package/build/ox_modules/module-win/commands/isVisible.js +3 -1
  230. package/build/ox_modules/module-win/commands/open.js +2 -1
  231. package/build/ox_modules/module-win/commands/pause.js +2 -1
  232. package/build/ox_modules/module-win/commands/rightClick.js +2 -1
  233. package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
  234. package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
  235. package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
  237. package/build/ox_modules/module-win/commands/tap.js +2 -1
  238. package/build/ox_modules/module-win/commands/type.js +4 -1
  239. package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
  242. package/build/ox_modules/module-win.js +87 -48
  243. package/build/ox_modules/utils.js +76 -22
  244. package/build/ox_reporters/reporter-excel.js +58 -1
  245. package/build/ox_reporters/reporter-html.js +28 -1
  246. package/build/ox_reporters/reporter-json.js +14 -1
  247. package/build/ox_reporters/reporter-junit.js +24 -1
  248. package/build/ox_reporters/reporter-pdf.js +19 -1
  249. package/build/ox_reporters/reporter-xml.js +17 -1
  250. package/build/ox_services/service-devtools/submodule-network.js +91 -4
  251. package/build/ox_services/service-devtools.js +23 -1
  252. package/build/reporter/FileReporterBase.js +44 -5
  253. package/build/reporter/ReportAggregator.js +65 -1
  254. package/build/reporter/ReporterBase.js +6 -1
  255. package/build/runners/WorkerProcess.js +99 -1
  256. package/build/runners/cucumber/CucumberEventListener.js +29 -4
  257. package/build/runners/cucumber/CucumberReporter.js +56 -1
  258. package/build/runners/cucumber/CucumberWorker.js +66 -1
  259. package/build/runners/cucumber/index.js +30 -1
  260. package/build/runners/cucumber/worker.js +18 -1
  261. package/build/runners/index.js +6 -1
  262. package/build/runners/oxygen/OxygenWorker.js +60 -3
  263. package/build/runners/oxygen/index.js +178 -17
  264. package/build/runners/oxygen/worker.js +25 -2
  265. package/package.json +8 -8
  266. package/.babelrc +0 -28
  267. package/.eslintrc.json +0 -25
  268. package/.husky/pre-commit +0 -4
  269. package/CONTRIBUTE.md +0 -1
@@ -4,13 +4,21 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+
7
8
  require("source-map-support/register");
9
+
8
10
  var _OxygenSubModule = require("../../core/OxygenSubModule");
11
+
9
12
  var _chromeHar = require("chrome-har");
13
+
10
14
  var _helper = _interopRequireDefault(require("../../errors/helper"));
15
+
11
16
  var _OxygenError = _interopRequireDefault(require("../../errors/OxygenError"));
17
+
12
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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'];
19
+
20
+ const observe = ['Page.domContentEventFired', 'Page.frameAttached', 'Page.loadEventFired', 'Page.frameRequestedNavigation', 'Page.frameStartedLoading', 'Page.navigatedWithinDocument', 'Network.dataReceived', 'Network.loadingFailed', 'Network.loadingFinished', 'Network.requestServedFromCache', 'Network.requestWillBeSent', 'Network.responseReceived', 'Network.requestWillBeSentExtraInfo', 'Network.resourceChangedPriority', 'Network.responseReceivedExtraInfo'];
21
+
14
22
  class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
15
23
  constructor(name, parent) {
16
24
  super(name, parent);
@@ -18,11 +26,13 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
18
26
  this._collectData = false;
19
27
  this._events = [];
20
28
  }
29
+
21
30
  init(devTools) {
22
31
  if (!devTools || !this._parent || !this._parent.getDriver || typeof this._parent.getDriver !== 'function' || !this._parent.getDriver()) {
23
32
  super.init();
24
33
  return false;
25
34
  }
35
+
26
36
  this._devTools = devTools;
27
37
  this._driver = this._parent.getDriver();
28
38
  observe.forEach(method => {
@@ -38,6 +48,7 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
38
48
  super.init();
39
49
  return true;
40
50
  }
51
+
41
52
  async dispose() {
42
53
  try {
43
54
  if (this._driver) {
@@ -48,46 +59,56 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
48
59
  await this._driver.emit('Network.close');
49
60
  }
50
61
  } catch (e) {}
62
+
51
63
  this._devTools = null;
52
64
  this._driver = null;
53
65
  this._events = [];
54
66
  super.dispose();
55
67
  }
68
+
56
69
  start() {
57
70
  this._collectData = true;
58
71
  this._events = [];
59
72
  }
73
+
60
74
  stop() {
61
75
  this._collectData = false;
62
76
  }
77
+
63
78
  async getRequests() {
64
79
  return await this._getEntries();
65
80
  }
81
+
66
82
  async _getEntries() {
67
83
  try {
68
84
  const har = (0, _chromeHar.harFromMessages)(this._events);
85
+
69
86
  if (har && har.log && har.log.entries && har.log.entries.map) {
70
87
  har.log.entries.reverse();
71
88
  return await Promise.all(har.log.entries.map(async item => {
72
89
  let responseBody = {};
90
+
73
91
  try {
74
92
  responseBody = await this._driver.cdp('Network', 'getResponseBody', {
75
93
  requestId: item._requestId
76
94
  });
77
95
  } catch (e) {}
96
+
78
97
  if (responseBody && responseBody.body) {
79
98
  try {
80
99
  responseBody.body = JSON.parse(responseBody.body);
81
100
  } catch (e) {}
82
101
  }
102
+
83
103
  let requestPostData = {};
104
+
84
105
  try {
85
106
  requestPostData = await this._driver.cdp('Network', 'getRequestPostData', {
86
107
  requestId: item._requestId
87
108
  });
88
109
  } catch (e) {}
89
- return {
90
- ...item,
110
+
111
+ return { ...item,
91
112
  url: item.request.url,
92
113
  requestId: item._requestId,
93
114
  ...item.response,
@@ -102,147 +123,205 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
102
123
  return [];
103
124
  }
104
125
  }
126
+
105
127
  async waitForUrl(pattern, timeout = 60 * 1000) {
106
128
  if (!this._driver || !this._isInitialized || !this._parent) {
107
129
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
108
130
  }
131
+
109
132
  if (!this._collectData) {
110
133
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
111
134
  }
135
+
112
136
  this._parent.helpers.assertArgument(pattern, 'pattern');
137
+
113
138
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
139
+
114
140
  const start = Date.now();
141
+
115
142
  while (Date.now() - start < timeout) {
116
143
  const networkRequests = await this._getEntries();
144
+
117
145
  for (let req of networkRequests) {
118
146
  if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
119
147
  return req;
120
148
  }
121
149
  }
150
+
122
151
  await this._driver.pause(500);
123
152
  }
153
+
124
154
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
125
155
  }
156
+
126
157
  async waitForNotUrl(pattern, timeout = 60 * 1000) {
127
158
  if (!this._driver || !this._isInitialized || !this._parent) {
128
159
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
129
160
  }
161
+
130
162
  if (!this._collectData) {
131
163
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
132
164
  }
165
+
133
166
  this._parent.helpers.assertArgument(pattern, 'pattern');
167
+
134
168
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
169
+
135
170
  const start = Date.now();
171
+
136
172
  while (Date.now() - start < timeout) {
137
173
  const networkRequests = await this._getEntries();
174
+
138
175
  for (let req of networkRequests) {
139
176
  if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
140
177
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `A request matching the URL "${pattern}" was found.`);
141
178
  }
142
179
  }
180
+
143
181
  await this._driver.pause(500);
144
182
  }
145
183
  }
184
+
146
185
  async waitFor(matcher, timeout = 60 * 1000) {
147
186
  if (!this._driver || !this._isInitialized || !this._parent) {
148
187
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` module is not initialized.');
149
188
  }
189
+
150
190
  if (!this._collectData) {
151
191
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
152
192
  }
193
+
153
194
  this._parent.helpers.assertArgument(matcher, 'matcher');
195
+
154
196
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
197
+
155
198
  const start = Date.now();
199
+
156
200
  while (Date.now() - start < timeout) {
157
201
  const networkRequests = await this._getEntries();
202
+
158
203
  for (var req of networkRequests) {
159
204
  if (matcher(req)) {
160
205
  return req;
161
206
  }
162
207
  }
208
+
163
209
  await this._driver.pause(500);
164
210
  }
211
+
165
212
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
166
213
  }
214
+
167
215
  async assertUrl(url, timeout = 60 * 1000) {
168
216
  if (!this._driver || !this._isInitialized || !this._parent) {
169
217
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
170
218
  }
219
+
171
220
  if (!this._collectData) {
172
221
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
173
222
  }
223
+
174
224
  this._parent.helpers.assertArgument(url, 'url');
225
+
175
226
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
227
+
176
228
  const start = Date.now();
229
+
177
230
  while (Date.now() - start < timeout) {
178
231
  const networkRequests = await this._getEntries();
232
+
179
233
  for (let req of networkRequests) {
180
234
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
181
235
  return req;
182
236
  }
183
237
  }
238
+
184
239
  await this._driver.pause(500);
185
240
  }
241
+
186
242
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
187
243
  }
244
+
188
245
  async assertStatusCode(url, statusCode, failureMessage = null, timeout = 60 * 1000) {
189
246
  if (!this._driver || !this._isInitialized || !this._parent) {
190
247
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
191
248
  }
249
+
192
250
  if (!this._collectData) {
193
251
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
194
252
  }
253
+
195
254
  this._parent.helpers.assertArgument(url, 'url');
255
+
196
256
  this._parent.helpers.assertArgument(statusCode, 'statusCode');
257
+
197
258
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
259
+
198
260
  const start = Date.now();
199
261
  let matchedReq = null;
262
+
200
263
  while (Date.now() - start < timeout && !matchedReq) {
201
264
  const networkRequests = await this._getEntries();
265
+
202
266
  for (let req of networkRequests) {
203
267
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
204
268
  matchedReq = req;
205
269
  break;
206
270
  }
207
271
  }
272
+
208
273
  !matchedReq && (await this._driver.pause(500));
209
274
  }
275
+
210
276
  if (!matchedReq) {
211
277
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
212
278
  }
279
+
213
280
  if (statusCode !== matchedReq.status) {
214
281
  const message = failureMessage || `The expected status code "${statusCode}" does not match "${matchedReq.status}".`;
215
282
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
216
283
  }
217
284
  }
285
+
218
286
  async assertResponseContent(url, content, failureMessage = null, timeout = 60 * 1000) {
219
287
  if (!this._driver || !this._isInitialized || !this._parent) {
220
288
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
221
289
  }
290
+
222
291
  if (!this._collectData) {
223
292
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
224
293
  }
294
+
225
295
  this._parent.helpers.assertArgument(url, 'url');
296
+
226
297
  this._parent.helpers.assertArgument(content, 'content');
298
+
227
299
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
300
+
228
301
  const start = Date.now();
229
302
  let matchedReq = null;
303
+
230
304
  while (Date.now() - start < timeout && !matchedReq) {
231
305
  const networkRequests = await this._getEntries();
306
+
232
307
  for (let req of networkRequests) {
233
308
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
234
309
  matchedReq = req;
235
310
  break;
236
311
  }
237
312
  }
313
+
238
314
  !matchedReq && (await this._driver.pause(500));
239
315
  }
316
+
240
317
  if (!matchedReq) {
241
318
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
242
319
  }
320
+
243
321
  const resp = await this._driver.cdp('Network', 'getResponseBody', {
244
322
  requestId: matchedReq.requestId
245
323
  });
324
+
246
325
  if (resp && resp.body && !resp.base64Encoded) {
247
326
  if (content.constructor.name === 'RegExp' && (content.test(resp.body) || resp.body.indexOf(content) > -1)) {
248
327
  return true;
@@ -252,6 +331,14 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
252
331
  }
253
332
  }
254
333
  }
334
+
335
+ async blockUrls(urls) {
336
+ await this._driver.cdp('Network', 'setBlockedURLs', {
337
+ urls
338
+ });
339
+ }
340
+
255
341
  }
342
+
256
343
  exports.default = NetworkSubModule;
257
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvYnNlcnZlIiwiTmV0d29ya1N1Yk1vZHVsZSIsIk94eWdlblN1Yk1vZHVsZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsInBhcmVudCIsIl9kZXZUb29scyIsIl9jb2xsZWN0RGF0YSIsIl9ldmVudHMiLCJpbml0IiwiZGV2VG9vbHMiLCJfcGFyZW50IiwiZ2V0RHJpdmVyIiwiX2RyaXZlciIsImZvckVhY2giLCJtZXRob2QiLCJvbiIsInBhcmFtcyIsInB1c2giLCJkaXNwb3NlIiwicmVtb3ZlTGlzdGVuZXIiLCJlbWl0IiwiZSIsInN0YXJ0Iiwic3RvcCIsImdldFJlcXVlc3RzIiwiX2dldEVudHJpZXMiLCJoYXIiLCJoYXJGcm9tTWVzc2FnZXMiLCJsb2ciLCJlbnRyaWVzIiwibWFwIiwicmV2ZXJzZSIsIlByb21pc2UiLCJhbGwiLCJpdGVtIiwicmVzcG9uc2VCb2R5IiwiY2RwIiwicmVxdWVzdElkIiwiX3JlcXVlc3RJZCIsImJvZHkiLCJKU09OIiwicGFyc2UiLCJyZXF1ZXN0UG9zdERhdGEiLCJ1cmwiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJ3YWl0Rm9yVXJsIiwicGF0dGVybiIsInRpbWVvdXQiLCJfaXNJbml0aWFsaXplZCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsIm5ldHdvcmtSZXF1ZXN0cyIsInJlcSIsInRlc3QiLCJwYXVzZSIsIlRJTUVPVVQiLCJ3YWl0Rm9yTm90VXJsIiwid2FpdEZvciIsIm1hdGNoZXIiLCJhc3NlcnRVcmwiLCJBU1NFUlRfRVJST1IiLCJhc3NlcnRTdGF0dXNDb2RlIiwic3RhdHVzQ29kZSIsImZhaWx1cmVNZXNzYWdlIiwibWF0Y2hlZFJlcSIsInN0YXR1cyIsIm1lc3NhZ2UiLCJhc3NlcnRSZXNwb25zZUNvbnRlbnQiLCJjb250ZW50IiwicmVzcCIsImJhc2U2NEVuY29kZWQiLCJpbmRleE9mIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL294X3NlcnZpY2VzL3NlcnZpY2UtZGV2dG9vbHMvc3VibW9kdWxlLW5ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAnUGFnZS5maWxlQ2hvb3Nlck9wZW5lZCcsXHJcbiAgICAnUGFnZS5mcmFtZUF0dGFjaGVkJyxcclxuICAgICdQYWdlLmZyYW1lRGV0YWNoZWQnLFxyXG4gICAgJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgJ1BhZ2UuaW50ZXJzdGl0aWFsSGlkZGVuJyxcclxuICAgICdQYWdlLmludGVyc3RpdGlhbFNob3duJyxcclxuICAgICdQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgJ1BhZ2UuamF2YXNjcmlwdERpYWxvZ09wZW5pbmcnLFxyXG4gICAgJ1BhZ2UubGlmZWN5Y2xlRXZlbnQnLFxyXG4gICAgJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLFxyXG4gICAgJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAnUGFnZS5mcmFtZUNsZWFyZWRTY2hlZHVsZWROYXZpZ2F0aW9uJyxcclxuICAgICdQYWdlLmZyYW1lU2NoZWR1bGVkTmF2aWdhdGlvbicsXHJcbiAgICAnUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgJ1BhZ2UuZG93bmxvYWRQcm9ncmVzcycsXHJcbiAgICAnUGFnZS5kb3dubG9hZFdpbGxCZWdpbicsXHJcbiAgICAnUGFnZS5mcmFtZVJlcXVlc3RlZE5hdmlnYXRpb24nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsXHJcbiAgICAnUGFnZS5uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcsXHJcbiAgICAnUGFnZS5zY3JlZW5jYXN0RnJhbWUnLFxyXG4gICAgJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5ldmVudFNvdXJjZU1lc3NhZ2VSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5sb2FkaW5nRmFpbGVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGaW5pc2hlZCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JyxcclxuICAgICdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0Q2xvc2VkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0RnJhbWVFcnJvcicsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRGcmFtZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudEV4dHJhSW5mbycsXHJcbiAgICAnTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eScsXHJcbiAgICAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJyxcclxuICAgICdOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdEludGVyY2VwdGVkJ1xyXG5dO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrU3ViTW9kdWxlIGV4dGVuZHMgT3h5Z2VuU3ViTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHBhcmVudCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkZXZUb29scykge1xyXG4gICAgICAgIGlmICghZGV2VG9vbHMgfHwgIXRoaXMuX3BhcmVudCB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlciB8fCB0eXBlb2YgdGhpcy5fcGFyZW50LmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlcigpKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IGRldlRvb2xzO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IHRoaXMuX3BhcmVudC5nZXREcml2ZXIoKTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZS5mb3JFYWNoKG1ldGhvZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5vbihtZXRob2QsIHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMucHVzaCh7IG1ldGhvZCwgcGFyYW1zIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcml2ZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmZvckVhY2goYXN5bmMgbWV0aG9kID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucmVtb3ZlTGlzdGVuZXIobWV0aG9kLCAoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5kaXNhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5jbG9zZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC4gTmV0d29yayByZXF1ZXN0IGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgb24gQ2hyb21lIDYzIGFuZCBsYXRlci5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm5ldHdvcmsuc3RhcnQoKTtcclxuICAgICAqIHdlYi5vcGVuKFwiaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tXCIpO1xyXG4gICAgICogLy8gcHJpbnQgdGhlIGNvbGxlY3RlZCByZXF1ZXN0IHNvIGZhcjpcclxuICAgICAqIGxldCByZXF1ZXN0cyA9IHdlYi5uZXR3b3JrLmdldFJlcXVlc3RzKCk7XHJcbiAgICAgKiBmb3IgKGxldCByZXEgb2YgcmVxdWVzdHMpIHtcclxuICAgICAqICAgbG9nLmluZm8ocmVxKTtcclxuICAgICAqIH1cclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHZlcmJhdGltIFVSTCBtYXRjaDpcclxuICAgICAqIHdlYi5uZXR3b3JrLndhaXRGb3JVcmwoJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgvaHR0cHM6XFwvXFwvLipcXC9mb29cXC9iYXIvKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIGN1c3RvbSBtYXRjaGVyOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvcihmdW5jdGlvbiAocmVxdWVzdCkge1xyXG4gICAgICogICByZXR1cm4gcmVxdWVzdC5zdGF0dXNUZXh0ID09PSAnT0snICYmIHJlcXVlc3QudXJsID09PSAnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGFsbCB0aGUgY29sbGVjdGVkIG5ldHdvcmsgcmVxdWVzdHMgc28gZmFyLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlcXVlc3RzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gQXJyYXkgY29udGFpbmluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZXF1ZXN0cygpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRFbnRyaWVzKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyh0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhciAmJiBoYXIubG9nICYmIGhhci5sb2cuZW50cmllcyAmJiBoYXIubG9nLmVudHJpZXMubWFwKSB7XHJcbiAgICAgICAgICAgICAgICBoYXIubG9nLmVudHJpZXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGhhci5sb2cuZW50cmllcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZUJvZHkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVzcG9uc2VCb2R5Jywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVzcG9uc2VCb2R5IGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keSAmJiByZXNwb25zZUJvZHkuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlQm9keS5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhcnNlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdFBvc3REYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlcXVlc3RQb3N0RGF0YScsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbS5fcmVxdWVzdElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGdldFJlcXVlc3RQb3N0RGF0YSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXRlbS5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAtIEFuIFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRmFpbCB0aGUgdGVzdCBpZiByZXF1ZXN0IHdpdGggYSBtYXRjaGluZyBVUkwgd2FzIHJlY2VpdmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvck5vdFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yTm90VXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChwYXR0ZXJuLCAncGF0dGVybicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgQSByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIG5ldHdvcmtXYWl0Rm9yXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyIC0gTWF0Y2hpbmcgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBvbiBtYXRjaCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvcihtYXRjaGVyLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KG1hdGNoZXIsICdtYXRjaGVyJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIocmVxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSBtYXRjaGVkUmVxLnN0YXR1cykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBcIiR7c3RhdHVzQ29kZX1cIiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2hlZFJlcS5zdGF0dXN9XCIuYDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIEhUVFAgcmVzcG9uc2UgY29udGVudCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgcGF0dGVybi5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZUNvbnRlbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gY29udGVudCAtIEEgcmVzcG9uc2UgYm9keSBjb250ZW50IHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFJlc3BvbnNlQ29udGVudCh1cmwsIGNvbnRlbnQsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChjb250ZW50LCAnY29udGVudCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogbWF0Y2hlZFJlcS5yZXF1ZXN0SWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmJvZHkgJiYgIXJlc3AuYmFzZTY0RW5jb2RlZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiAoY29udGVudC50ZXN0KHJlc3AuYm9keSkgfHwgcmVzcC5ib2R5LmluZGV4T2YoY29udGVudCkgPiAtMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBSZXNwb25zZSBcIiR7dXJsfVwiIGJvZHkgY29udGVudCBkb2VzIG5vdCBtYXRjaCBcIiR7Y29udGVudH0uYDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUErQztBQUUvQyxNQUFNQSxPQUFPLEdBQUcsQ0FDWiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsNkJBQTZCLEVBQzdCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixzQ0FBc0MsRUFDdEMsK0JBQStCLEVBQy9CLCtCQUErQixFQUMvQix1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLCtCQUErQixFQUMvQixtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQiw4QkFBOEIsRUFDOUIsc0JBQXNCLEVBQ3RCLGtDQUFr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
344
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrLmpzIl0sIm5hbWVzIjpbIm9ic2VydmUiLCJOZXR3b3JrU3ViTW9kdWxlIiwiT3h5Z2VuU3ViTW9kdWxlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicGFyZW50IiwiX2RldlRvb2xzIiwiX2NvbGxlY3REYXRhIiwiX2V2ZW50cyIsImluaXQiLCJkZXZUb29scyIsIl9wYXJlbnQiLCJnZXREcml2ZXIiLCJfZHJpdmVyIiwiZm9yRWFjaCIsIm1ldGhvZCIsIm9uIiwicGFyYW1zIiwicHVzaCIsImRpc3Bvc2UiLCJyZW1vdmVMaXN0ZW5lciIsImVtaXQiLCJlIiwic3RhcnQiLCJzdG9wIiwiZ2V0UmVxdWVzdHMiLCJfZ2V0RW50cmllcyIsImhhciIsImxvZyIsImVudHJpZXMiLCJtYXAiLCJyZXZlcnNlIiwiUHJvbWlzZSIsImFsbCIsIml0ZW0iLCJyZXNwb25zZUJvZHkiLCJjZHAiLCJyZXF1ZXN0SWQiLCJfcmVxdWVzdElkIiwiYm9keSIsIkpTT04iLCJwYXJzZSIsInJlcXVlc3RQb3N0RGF0YSIsInVybCIsInJlcXVlc3QiLCJyZXNwb25zZSIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIl9pc0luaXRpYWxpemVkIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IiLCJoZWxwZXJzIiwiYXNzZXJ0QXJndW1lbnQiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJEYXRlIiwibm93IiwibmV0d29ya1JlcXVlc3RzIiwicmVxIiwidGVzdCIsInBhdXNlIiwiVElNRU9VVCIsIndhaXRGb3JOb3RVcmwiLCJ3YWl0Rm9yIiwibWF0Y2hlciIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwic3RhdHVzIiwibWVzc2FnZSIsImFzc2VydFJlc3BvbnNlQ29udGVudCIsImNvbnRlbnQiLCJyZXNwIiwiYmFzZTY0RW5jb2RlZCIsImluZGV4T2YiLCJibG9ja1VybHMiLCJ1cmxzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUdBLE1BQU1BLE9BQU8sR0FBRyxDQUNaLDJCQURZLEVBR1osb0JBSFksRUFXWixxQkFYWSxFQWtCWiwrQkFsQlksRUFvQlosMEJBcEJZLEVBc0JaLDhCQXRCWSxFQXlCWixzQkF6QlksRUEyQlosdUJBM0JZLEVBNEJaLHlCQTVCWSxFQTZCWixnQ0E3QlksRUE4QlosMkJBOUJZLEVBK0JaLDBCQS9CWSxFQXVDWixvQ0F2Q1ksRUF3Q1osaUNBeENZLEVBeUNaLG1DQXpDWSxDQUFoQjs7QUE2Q2UsTUFBTUMsZ0JBQU4sU0FBK0JDLGdDQUEvQixDQUErQztBQUMxREMsRUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBZTtBQUN0QixVQUFNRCxJQUFOLEVBQVlDLE1BQVo7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7O0FBRURDLEVBQUFBLElBQUksQ0FBQ0MsUUFBRCxFQUFXO0FBQ1gsUUFBSSxDQUFDQSxRQUFELElBQWEsQ0FBQyxLQUFLQyxPQUFuQixJQUE4QixDQUFDLEtBQUtBLE9BQUwsQ0FBYUMsU0FBNUMsSUFBeUQsT0FBTyxLQUFLRCxPQUFMLENBQWFDLFNBQXBCLEtBQWtDLFVBQTNGLElBQXlHLENBQUMsS0FBS0QsT0FBTCxDQUFhQyxTQUFiLEVBQTlHLEVBQXdJO0FBQ3BJLFlBQU1ILElBQU47QUFDQSxhQUFPLEtBQVA7QUFDSDs7QUFDRCxTQUFLSCxTQUFMLEdBQWlCSSxRQUFqQjtBQUNBLFNBQUtHLE9BQUwsR0FBZSxLQUFLRixPQUFMLENBQWFDLFNBQWIsRUFBZjtBQUVB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LENBQUMsQ0FBbkcsQ0FBSixFQUEyRztBQUN2RyxlQUFPLElBQVA7QUFDSCxPQUZELE1BR0s7QUFDRCxjQUFNRixPQUFPLEdBQUdILGNBQWMsSUFBSyxhQUFZNUIsR0FBSSxrQ0FBaUNpQyxPQUFRLEdBQTVGO0FBQ0EsY0FBTSxJQUFJMUIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JnQixZQUFoQyxFQUE4Q00sT0FBOUMsQ0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUFPYyxRQUFUTSxTQUFTLENBQUNDLElBQUQsRUFBTztBQUNsQixVQUFNLEtBQUtwRSxPQUFMLENBQWF1QixHQUFiLENBQWlCLFNBQWpCLEVBQTJCLGdCQUEzQixFQUE2QztBQUMvQzZDLE1BQUFBO0FBRCtDLEtBQTdDLENBQU47QUFHSDs7QUFqWHlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbi8vIGJlbG93IGFyZSB0aGUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBvYnNlcnZlZCBmb3IgXCJjaHJvbWUtaGFyXCIgbW9kdWxlIHRvIGdlbmVyYXRlIGEgcHJvcGVyIEhBUiBmaWxlXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAvLydQYWdlLmZpbGVDaG9vc2VyT3BlbmVkJyxcclxuICAgICdQYWdlLmZyYW1lQXR0YWNoZWQnLFxyXG4gICAgLy8nUGFnZS5mcmFtZURldGFjaGVkJyxcclxuICAgIC8vJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgLy8nUGFnZS5pbnRlcnN0aXRpYWxIaWRkZW4nLFxyXG4gICAgLy8nUGFnZS5pbnRlcnN0aXRpYWxTaG93bicsXHJcbiAgICAvLydQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgLy8nUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsXHJcbiAgICAvLydQYWdlLmxpZmVjeWNsZUV2ZW50JyxcclxuICAgICdQYWdlLmxvYWRFdmVudEZpcmVkJyxcclxuICAgIC8vJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAvLydQYWdlLmZyYW1lQ2xlYXJlZFNjaGVkdWxlZE5hdmlnYXRpb24nLFxyXG4gICAgLy8nUGFnZS5mcmFtZVNjaGVkdWxlZE5hdmlnYXRpb24nLFxyXG4gICAgLy8nUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgLy8nUGFnZS5kb3dubG9hZFByb2dyZXNzJyxcclxuICAgIC8vJ1BhZ2UuZG93bmxvYWRXaWxsQmVnaW4nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXF1ZXN0ZWROYXZpZ2F0aW9uJyxcclxuICAgIC8vJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgLy8nUGFnZS5mcmFtZVN0b3BwZWRMb2FkaW5nJyxcclxuICAgICdQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50JyxcclxuICAgIC8vJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lJyxcclxuICAgIC8vJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLmV2ZW50U291cmNlTWVzc2FnZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGYWlsZWQnLFxyXG4gICAgJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQnLFxyXG4gICAgJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldENsb3NlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgLy8nTmV0d29yay53ZWJTb2NrZXRGcmFtZUVycm9yJyxcclxuICAgIC8vJ05ldHdvcmsud2ViU29ja2V0RnJhbWVSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldEhhbmRzaGFrZVJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgLy8nTmV0d29yay53ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3QnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnRFeHRyYUluZm8nLFxyXG4gICAgJ05ldHdvcmsucmVzb3VyY2VDaGFuZ2VkUHJpb3JpdHknLFxyXG4gICAgJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mbycsXHJcbiAgICAvLydOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgLy8nTmV0d29yay5yZXF1ZXN0SW50ZXJjZXB0ZWQnXHJcbl07XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5ldHdvcmtTdWJNb2R1bGUgZXh0ZW5kcyBPeHlnZW5TdWJNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IobmFtZSwgcGFyZW50KSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgcGFyZW50KTtcclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KGRldlRvb2xzKSB7XHJcbiAgICAgICAgaWYgKCFkZXZUb29scyB8fCAhdGhpcy5fcGFyZW50IHx8ICF0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyIHx8IHR5cGVvZiB0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyKCkpIHtcclxuICAgICAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RldlRvb2xzID0gZGV2VG9vbHM7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gdGhpcy5fcGFyZW50LmdldERyaXZlcigpO1xyXG5cclxuICAgICAgICBvYnNlcnZlLmZvckVhY2gobWV0aG9kID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLm9uKG1ldGhvZCwgcGFyYW1zID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5wdXNoKHsgbWV0aG9kLCBwYXJhbXMgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZSgpIHtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyaXZlcikge1xyXG5cclxuICAgICAgICAgICAgICAgIG9ic2VydmUuZm9yRWFjaChhc3luYyBtZXRob2QgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5yZW1vdmVMaXN0ZW5lcihtZXRob2QsICgpID0+IHt9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5lbWl0KCdOZXR3b3JrLmRpc2FibGUnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5lbWl0KCdOZXR3b3JrLmNsb3NlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBCZWdpbiBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQW55IHByZXZpb3VzbHkgY29sbGVjdGVkIHJlcXVlc3RzIHdpbGwgYmUgZGlzY2FyZGVkLiBOZXR3b3JrIHJlcXVlc3QgY29sbGVjdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBvbiBDaHJvbWUgNjMgYW5kIGxhdGVyLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0YXJ0XHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIHdlYi5pbml0KCk7XHJcbiAgICAgKiB3ZWIubmV0d29yay5zdGFydCgpO1xyXG4gICAgICogd2ViLm9wZW4oXCJodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb21cIik7XHJcbiAgICAgKiAvLyBwcmludCB0aGUgY29sbGVjdGVkIHJlcXVlc3Qgc28gZmFyOlxyXG4gICAgICogbGV0IHJlcXVlc3RzID0gd2ViLm5ldHdvcmsuZ2V0UmVxdWVzdHMoKTtcclxuICAgICAqIGZvciAobGV0IHJlcSBvZiByZXF1ZXN0cykge1xyXG4gICAgICogICBsb2cuaW5mbyhyZXEpO1xyXG4gICAgICogfVxyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgdmVyYmF0aW0gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkwgbWF0Y2g6XHJcbiAgICAgKiB3ZWIubmV0d29yay53YWl0Rm9yVXJsKC9odHRwczpcXC9cXC8uKlxcL2Zvb1xcL2Jhci8pO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgY3VzdG9tIG1hdGNoZXI6XHJcbiAgICAgKiB3ZWIubmV0d29yay53YWl0Rm9yKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgKiAgIHJldHVybiByZXF1ZXN0LnN0YXR1c1RleHQgPT09ICdPSycgJiYgcmVxdWVzdC51cmwgPT09ICdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2Jhcic7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU3RvcCBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RvcFxyXG4gICAgICovXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYWxsIHRoZSBjb2xsZWN0ZWQgbmV0d29yayByZXF1ZXN0cyBzbyBmYXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVxdWVzdHNcclxuICAgICAqIEByZXR1cm4ge09iamVjdFtdfSBBcnJheSBjb250YWluaW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFJlcXVlc3RzKCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEVudHJpZXMoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaGFyID0gaGFyRnJvbU1lc3NhZ2VzKHRoaXMuX2V2ZW50cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFyICYmIGhhci5sb2cgJiYgaGFyLmxvZy5lbnRyaWVzICYmIGhhci5sb2cuZW50cmllcy5tYXApIHtcclxuICAgICAgICAgICAgICAgIGhhci5sb2cuZW50cmllcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoaGFyLmxvZy5lbnRyaWVzLm1hcChhc3luYyAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlQm9keSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGl0ZW0uX3JlcXVlc3RJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBnZXRSZXNwb25zZUJvZHkgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VCb2R5ICYmIHJlc3BvbnNlQm9keS5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkuYm9keSA9IEpTT04ucGFyc2UocmVzcG9uc2VCb2R5LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgcGFyc2UgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0UG9zdERhdGEgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9zdERhdGEgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVxdWVzdFBvc3REYXRhJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVxdWVzdFBvc3REYXRhIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpdGVtLnJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGl0ZW0uX3JlcXVlc3RJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbS5yZXNwb25zZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9zdERhdGFcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvclVybChwYXR0ZXJuLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQocGF0dGVybiwgJ3BhdHRlcm4nKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiBwYXR0ZXJuLnRlc3QocmVxLnVybCkgfHwgcGF0dGVybiA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7cGF0dGVybn1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBGYWlsIHRoZSB0ZXN0IGlmIHJlcXVlc3Qgd2l0aCBhIG1hdGNoaW5nIFVSTCB3YXMgcmVjZWl2ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSBmcmFtZS5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yTm90VXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gLSBBbiBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JOb3RVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBBIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7cGF0dGVybn1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QuXHJcbiAgICAgKiBAZnVuY3Rpb24gbmV0d29ya1dhaXRGb3JcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1hdGNoZXIgLSBNYXRjaGluZyBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiB0cnVlIG9uIG1hdGNoLCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yKG1hdGNoZXIsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2AgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQobWF0Y2hlciwgJ21hdGNoZXInKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcihyZXEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCAnTm8gcmVxdWVzdCBmb3VuZCB1c2luZyB0aGUgcHJvdmlkZWQgbWF0Y2hlci4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBhc3NlcnRVcmwodXJsLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHVybCwgJ3VybCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1cmwuY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgdXJsLnRlc3QocmVxLnVybCkgfHwgdXJsID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNDb2RlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzQ29kZSAtIEEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0U3RhdHVzQ29kZSh1cmwsIHN0YXR1c0NvZGUsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChzdGF0dXNDb2RlLCAnc3RhdHVzQ29kZScpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IG1hdGNoZWRSZXEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmYWlsdXJlTWVzc2FnZSB8fCBgVGhlIGV4cGVjdGVkIHN0YXR1cyBjb2RlIFwiJHtzdGF0dXNDb2RlfVwiIGRvZXMgbm90IG1hdGNoIFwiJHttYXRjaGVkUmVxLnN0YXR1c31cIi5gO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBjb250ZW50IG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBvciBwYXR0ZXJuLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlQ29udGVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBjb250ZW50IC0gQSByZXNwb25zZSBib2R5IGNvbnRlbnQgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0UmVzcG9uc2VDb250ZW50KHVybCwgY29udGVudCwgZmFpbHVyZU1lc3NhZ2UgPSBudWxsLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHVybCwgJ3VybCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KGNvbnRlbnQsICdjb250ZW50Jyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGxldCBtYXRjaGVkUmVxID0gbnVsbDtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCAmJiAhbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1cmwuY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgdXJsLnRlc3QocmVxLnVybCkgfHwgdXJsID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlcSA9IHJlcTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAhbWF0Y2hlZFJlcSAmJiBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlc3BvbnNlQm9keScsIHtcclxuICAgICAgICAgICAgcmVxdWVzdElkOiBtYXRjaGVkUmVxLnJlcXVlc3RJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChyZXNwICYmIHJlc3AuYm9keSAmJiAhcmVzcC5iYXNlNjRFbmNvZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIChjb250ZW50LnRlc3QocmVzcC5ib2R5KSB8fCByZXNwLmJvZHkuaW5kZXhPZihjb250ZW50KSA+IC0xKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFJlc3BvbnNlIFwiJHt1cmx9XCIgYm9keSBjb250ZW50IGRvZXMgbm90IG1hdGNoIFwiJHtjb250ZW50fS5gO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBhIGxpc3Qgb2YgcmVxdWVzdCBVUkxzIHRvIGJlIGJsb2NrZWQgZnJvbSBsb2FkaW5nLlxyXG4gICAgICogQGZ1bmN0aW9uIGJsb2NrVXJsc1xyXG4gICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSB1cmxzIC0gQSBsaXN0IG9mIFVSTHMgdGhhdCBtYXRjaCB0aGUgcmVxdWVzdHMgdG8gYmUgYmxvY2tlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYmxvY2tVcmxzKHVybHMpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnc2V0QmxvY2tlZFVSTHMnLCB7XHJcbiAgICAgICAgICAgIHVybHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSJdfQ==
@@ -4,49 +4,66 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+
7
8
  require("source-map-support/register");
9
+
8
10
  var _devtoolsService = _interopRequireDefault(require("@wdio/devtools-service"));
11
+
9
12
  var _OxygenService = _interopRequireDefault(require("../core/OxygenService"));
13
+
10
14
  var _submoduleNetwork = _interopRequireDefault(require("./service-devtools/submodule-network"));
15
+
11
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
12
18
  const CHROME_BROWSER = 'chrome';
19
+
13
20
  class DevToolsService extends _OxygenService.default {
14
21
  constructor(options, ctx, results, logger) {
15
22
  super(options, ctx, results, logger);
16
23
  this._subModules = {};
17
24
  this.isServiceInitialized = true;
18
25
  }
26
+
19
27
  onModuleLoaded(module) {
20
28
  if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
21
29
  return;
22
30
  }
31
+
23
32
  const networkSubmodule = new _submoduleNetwork.default('network', module);
24
33
  module.addSubModule('network', networkSubmodule);
25
34
  this._subModules[module.name] = networkSubmodule;
26
35
  }
36
+
27
37
  async onModuleInitialized(module) {
28
38
  if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
29
39
  return;
30
40
  }
41
+
31
42
  const submodule = this._subModules[module.name];
43
+
32
44
  if (!submodule || submodule.isInitialized) {
33
45
  return;
34
46
  }
47
+
35
48
  let options = {};
36
49
  const capabilities = module.getCapabilities() || {};
37
50
  const {
38
51
  browserName
39
52
  } = capabilities;
40
53
  this._driver = module.getDriver();
54
+
41
55
  if (this._driver && this._driver.capabilities && this._driver.capabilities['goog:chromeOptions'] && this._driver.capabilities['goog:chromeOptions']['debuggerAddress']) {
42
56
  options.debuggerAddress = this._driver.capabilities['goog:chromeOptions']['debuggerAddress'];
43
57
  }
58
+
44
59
  if (this._driver.provider === null && browserName && browserName.toLowerCase() === CHROME_BROWSER) {
45
60
  const devToolsSvc = new _devtoolsService.default(options);
46
61
  const UNSUPPORTED_ERROR_MESSAGE = devToolsSvc.beforeSession(null, capabilities);
62
+
47
63
  if (UNSUPPORTED_ERROR_MESSAGE) {
48
64
  console.log('UNSUPPORTED_ERROR_MESSAGE', UNSUPPORTED_ERROR_MESSAGE);
49
65
  }
66
+
50
67
  if (devToolsSvc._isSupported) {
51
68
  global.browser = module.getDriver();
52
69
  await devToolsSvc.before(null, null, this._driver);
@@ -54,13 +71,18 @@ class DevToolsService extends _OxygenService.default {
54
71
  }
55
72
  }
56
73
  }
74
+
57
75
  onModuleWillDispose(module) {
58
76
  const submodule = this._subModules[module.name];
77
+
59
78
  if (!submodule) {
60
79
  return;
61
80
  }
81
+
62
82
  submodule.dispose();
63
83
  }
84
+
64
85
  }
86
+
65
87
  exports.default = DevToolsService;
66
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVfQlJPV1NFUiIsIkRldlRvb2xzU2VydmljZSIsIk94eWdlblNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjdHgiLCJyZXN1bHRzIiwibG9nZ2VyIiwiX3N1Yk1vZHVsZXMiLCJpc1NlcnZpY2VJbml0aWFsaXplZCIsIm9uTW9kdWxlTG9hZGVkIiwibW9kdWxlIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwibmV0d29ya1N1Ym1vZHVsZSIsIk5ldHdvcmtTdWJNb2R1bGUiLCJhZGRTdWJNb2R1bGUiLCJuYW1lIiwib25Nb2R1bGVJbml0aWFsaXplZCIsInN1Ym1vZHVsZSIsImlzSW5pdGlhbGl6ZWQiLCJjYXBhYmlsaXRpZXMiLCJicm93c2VyTmFtZSIsIl9kcml2ZXIiLCJkZWJ1Z2dlckFkZHJlc3MiLCJwcm92aWRlciIsInRvTG93ZXJDYXNlIiwiZGV2VG9vbHNTdmMiLCJXRElPRGV2VG9vbHNTZXJ2aWNlIiwiVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSIsImJlZm9yZVNlc3Npb24iLCJjb25zb2xlIiwibG9nIiwiX2lzU3VwcG9ydGVkIiwiZ2xvYmFsIiwiYnJvd3NlciIsImJlZm9yZSIsImluaXQiLCJvbk1vZHVsZVdpbGxEaXNwb3NlIiwiZGlzcG9zZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVucmVhY2hhYmxlICovXHJcbmltcG9ydCBXRElPRGV2VG9vbHNTZXJ2aWNlIGZyb20gJ0B3ZGlvL2RldnRvb2xzLXNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IE94eWdlblNlcnZpY2UgZnJvbSAnLi4vY29yZS9PeHlnZW5TZXJ2aWNlJztcclxuaW1wb3J0IE5ldHdvcmtTdWJNb2R1bGUgZnJvbSAnLi9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrJztcclxuXHJcbmNvbnN0IENIUk9NRV9CUk9XU0VSID0gJ2Nocm9tZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZXZUb29sc1NlcnZpY2UgZXh0ZW5kcyBPeHlnZW5TZXJ2aWNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGN0eCwgcmVzdWx0cywgbG9nZ2VyKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY3R4LCByZXN1bHRzLCBsb2dnZXIpO1xyXG4gICAgICAgIC8vIGhhc2ggb2Ygd2ViZHJpdmVyIGJhc2VkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9zdWJNb2R1bGVzID0ge307XHJcbiAgICAgICAgdGhpcy5pc1NlcnZpY2VJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBvbk1vZHVsZUxvYWRlZChtb2R1bGUpIHtcclxuICAgICAgICAvLyBza2lwIGFueSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgLmdldERyaXZlcigpIG1ldGhvZCAoZS5nLiBub3Qgd2ViZHJpdmVyIGJhc2VkKVxyXG4gICAgICAgIGlmICghbW9kdWxlIHx8ICFtb2R1bGUuZ2V0RHJpdmVyIHx8IHR5cGVvZiBtb2R1bGUuZ2V0RHJpdmVyICE9PSAnZnVuY3Rpb24nIHx8ICFtb2R1bGUuZ2V0Q2FwYWJpbGl0aWVzIHx8IHR5cGVvZiBtb2R1bGUuZ2V0Q2FwYWJpbGl0aWVzICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ldHdvcmtTdWJtb2R1bGUgPSBuZXcgTmV0d29ya1N1Yk1vZHVsZSgnbmV0d29yaycsIG1vZHVsZSk7XHJcbiAgICAgICAgbW9kdWxlLmFkZFN1Yk1vZHVsZSgnbmV0d29yaycsIG5ldHdvcmtTdWJtb2R1bGUpO1xyXG4gICAgICAgIHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdID0gbmV0d29ya1N1Ym1vZHVsZTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKSB7XHJcbiAgICAgICAgLy8gc2tpcCBhbnkgbW9kdWxlIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGdldERyaXZlciBtZXRob2QgKGUuZy4gbm90IHdlYmRyaXZlciBiYXNlZClcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlLmdldERyaXZlciB8fCB0eXBlb2YgbW9kdWxlLmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhbW9kdWxlLmdldENhcGFiaWxpdGllcyB8fCB0eXBlb2YgbW9kdWxlLmdldENhcGFiaWxpdGllcyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdO1xyXG4gICAgICAgIGlmICghc3VibW9kdWxlIHx8IHN1Ym1vZHVsZS5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gbW9kdWxlLmdldENhcGFiaWxpdGllcygpIHx8IHt9O1xyXG4gICAgICAgIGNvbnN0IHsgYnJvd3Nlck5hbWUgfSA9IGNhcGFiaWxpdGllcztcclxuICAgICAgICB0aGlzLl9kcml2ZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ10gJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZGVidWdnZXJBZGRyZXNzID0gdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCB1c2luZyBhbnkgM3JkIHBhcnR5IHByb3ZpZGVyXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyaXZlci5wcm92aWRlciA9PT0gbnVsbCAmJiBicm93c2VyTmFtZSAmJiBicm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBDSFJPTUVfQlJPV1NFUikge1xyXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIERldlRvb2xzU2VydmljZSBhbmQgaG9vayBpdCB0byB0aGUgY3VycmVudCB3ZWJkcml2ZXIgb2JqZWN0XHJcbiAgICAgICAgICAgIGNvbnN0IGRldlRvb2xzU3ZjID0gbmV3IFdESU9EZXZUb29sc1NlcnZpY2Uob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IFVOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UgPSBkZXZUb29sc1N2Yy5iZWZvcmVTZXNzaW9uKG51bGwsIGNhcGFiaWxpdGllcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UnLCBVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRldlRvb2xzU3ZjLl9pc1N1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGdsb2JhbC5icm93c2VyIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHdlYmRyaXZlciBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc3Qgb3JnR2xvYmFsQnJvd3NlciA9IGdsb2JhbC5icm93c2VyO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLmJyb3dzZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkZXZUb29sc1N2Yy5iZWZvcmUobnVsbCwgbnVsbCwgdGhpcy5fZHJpdmVyKTtcclxuICAgICAgICAgICAgICAgIHN1Ym1vZHVsZS5pbml0KGRldlRvb2xzU3ZjKTtcclxuICAgICAgICAgICAgICAgIC8vIGdsb2JhbC5icm93c2VyID0gb3JnR2xvYmFsQnJvd3NlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKSB7XHJcbiAgICAgICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5fc3ViTW9kdWxlc1ttb2R1bGUubmFtZV07XHJcbiAgICAgICAgaWYgKCFzdWJtb2R1bGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdWJtb2R1bGUuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG59Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7QUFFQTtBQUNBO0FBQW9FO0FBRXBFLE1BQU1BLGNBQWMsR0FBRyxRQUFRO0FBRWhCLE1BQU1DLGVBQWUsU0FBU0Msc0JBQWEsQ0FBQztFQUN2REMsV0FBVyxDQUFDQyxPQUFPLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUU7SUFDdkMsS0FBSyxDQUFDSCxPQUFPLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLENBQUM7SUFFcEMsSUFBSSxDQUFDQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcsSUFBSTtFQUNwQztFQUNBQyxjQUFjLENBQUNDLE1BQU0sRUFBRTtJQUVuQixJQUFJLENBQUNBLE1BQU0sSUFBSSxDQUFDQSxNQUFNLENBQUNDLFNBQVMsSUFBSSxPQUFPRCxNQUFNLENB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
88
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzLmpzIl0sIm5hbWVzIjpbIkNIUk9NRV9CUk9XU0VSIiwiRGV2VG9vbHNTZXJ2aWNlIiwiT3h5Z2VuU2VydmljZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImN0eCIsInJlc3VsdHMiLCJsb2dnZXIiLCJfc3ViTW9kdWxlcyIsImlzU2VydmljZUluaXRpYWxpemVkIiwib25Nb2R1bGVMb2FkZWQiLCJtb2R1bGUiLCJnZXREcml2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJuZXR3b3JrU3VibW9kdWxlIiwiTmV0d29ya1N1Yk1vZHVsZSIsImFkZFN1Yk1vZHVsZSIsIm5hbWUiLCJvbk1vZHVsZUluaXRpYWxpemVkIiwic3VibW9kdWxlIiwiaXNJbml0aWFsaXplZCIsImNhcGFiaWxpdGllcyIsImJyb3dzZXJOYW1lIiwiX2RyaXZlciIsImRlYnVnZ2VyQWRkcmVzcyIsInByb3ZpZGVyIiwidG9Mb3dlckNhc2UiLCJkZXZUb29sc1N2YyIsIldESU9EZXZUb29sc1NlcnZpY2UiLCJVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFIiwiYmVmb3JlU2Vzc2lvbiIsImNvbnNvbGUiLCJsb2ciLCJfaXNTdXBwb3J0ZWQiLCJnbG9iYWwiLCJicm93c2VyIiwiYmVmb3JlIiwiaW5pdCIsIm9uTW9kdWxlV2lsbERpc3Bvc2UiLCJkaXNwb3NlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQUVBLE1BQU1BLGNBQWMsR0FBRyxRQUF2Qjs7QUFFZSxNQUFNQyxlQUFOLFNBQThCQyxzQkFBOUIsQ0FBNEM7QUFDdkRDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVQyxHQUFWLEVBQWVDLE9BQWYsRUFBd0JDLE1BQXhCLEVBQWdDO0FBQ3ZDLFVBQU1ILE9BQU4sRUFBZUMsR0FBZixFQUFvQkMsT0FBcEIsRUFBNkJDLE1BQTdCO0FBRUEsU0FBS0MsV0FBTCxHQUFtQixFQUFuQjtB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eEIsQ0FBbEI7O0FBQ0EsUUFBSSxDQUFDRSxTQUFMLEVBQWdCO0FBQ1o7QUFDSDs7QUFDREEsSUFBQUEsU0FBUyxDQUFDb0IsT0FBVjtBQUNIOztBQW5Fc0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnJlYWNoYWJsZSAqL1xyXG5pbXBvcnQgV0RJT0RldlRvb2xzU2VydmljZSBmcm9tICdAd2Rpby9kZXZ0b29scy1zZXJ2aWNlJztcclxuXHJcbmltcG9ydCBPeHlnZW5TZXJ2aWNlIGZyb20gJy4uL2NvcmUvT3h5Z2VuU2VydmljZSc7XHJcbmltcG9ydCBOZXR3b3JrU3ViTW9kdWxlIGZyb20gJy4vc2VydmljZS1kZXZ0b29scy9zdWJtb2R1bGUtbmV0d29yayc7XHJcblxyXG5jb25zdCBDSFJPTUVfQlJPV1NFUiA9ICdjaHJvbWUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNTZXJ2aWNlIGV4dGVuZHMgT3h5Z2VuU2VydmljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjdHgsIHJlc3VsdHMsIGxvZ2dlcikge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGN0eCwgcmVzdWx0cywgbG9nZ2VyKTtcclxuICAgICAgICAvLyBoYXNoIG9mIHdlYmRyaXZlciBiYXNlZCBtb2R1bGVzXHJcbiAgICAgICAgdGhpcy5fc3ViTW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaXNTZXJ2aWNlSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgb25Nb2R1bGVMb2FkZWQobW9kdWxlKSB7XHJcbiAgICAgICAgLy8gc2tpcCBhbnkgbW9kdWxlIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IC5nZXREcml2ZXIoKSBtZXRob2QgKGUuZy4gbm90IHdlYmRyaXZlciBiYXNlZClcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlLmdldERyaXZlciB8fCB0eXBlb2YgbW9kdWxlLmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhbW9kdWxlLmdldENhcGFiaWxpdGllcyB8fCB0eXBlb2YgbW9kdWxlLmdldENhcGFiaWxpdGllcyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXR3b3JrU3VibW9kdWxlID0gbmV3IE5ldHdvcmtTdWJNb2R1bGUoJ25ldHdvcmsnLCBtb2R1bGUpO1xyXG4gICAgICAgIG1vZHVsZS5hZGRTdWJNb2R1bGUoJ25ldHdvcmsnLCBuZXR3b3JrU3VibW9kdWxlKTtcclxuICAgICAgICB0aGlzLl9zdWJNb2R1bGVzW21vZHVsZS5uYW1lXSA9IG5ldHdvcmtTdWJtb2R1bGU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSkge1xyXG4gICAgICAgIC8vIHNraXAgYW55IG1vZHVsZSB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBnZXREcml2ZXIgbWV0aG9kIChlLmcuIG5vdCB3ZWJkcml2ZXIgYmFzZWQpXHJcbiAgICAgICAgaWYgKCFtb2R1bGUgfHwgIW1vZHVsZS5nZXREcml2ZXIgfHwgdHlwZW9mIG1vZHVsZS5nZXREcml2ZXIgIT09ICdmdW5jdGlvbicgfHwgIW1vZHVsZS5nZXRDYXBhYmlsaXRpZXMgfHwgdHlwZW9mIG1vZHVsZS5nZXRDYXBhYmlsaXRpZXMgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdWJtb2R1bGUgPSB0aGlzLl9zdWJNb2R1bGVzW21vZHVsZS5uYW1lXTtcclxuICAgICAgICBpZiAoIXN1Ym1vZHVsZSB8fCBzdWJtb2R1bGUuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1vZHVsZS5nZXRDYXBhYmlsaXRpZXMoKSB8fCB7fTtcclxuICAgICAgICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBhYmlsaXRpZXM7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gbW9kdWxlLmdldERyaXZlcigpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlciAmJlxyXG4gICAgICAgICAgICB0aGlzLl9kcml2ZXIuY2FwYWJpbGl0aWVzICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXNbJ2dvb2c6Y2hyb21lT3B0aW9ucyddICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXNbJ2dvb2c6Y2hyb21lT3B0aW9ucyddWydkZWJ1Z2dlckFkZHJlc3MnXVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBvcHRpb25zLmRlYnVnZ2VyQWRkcmVzcyA9IHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXNbJ2dvb2c6Y2hyb21lT3B0aW9ucyddWydkZWJ1Z2dlckFkZHJlc3MnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgYW55IDNyZCBwYXJ0eSBwcm92aWRlclxyXG4gICAgICAgIGlmICh0aGlzLl9kcml2ZXIucHJvdmlkZXIgPT09IG51bGwgJiYgYnJvd3Nlck5hbWUgJiYgYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gQ0hST01FX0JST1dTRVIpIHtcclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBEZXZUb29sc1NlcnZpY2UgYW5kIGhvb2sgaXQgdG8gdGhlIGN1cnJlbnQgd2ViZHJpdmVyIG9iamVjdFxyXG4gICAgICAgICAgICBjb25zdCBkZXZUb29sc1N2YyA9IG5ldyBXRElPRGV2VG9vbHNTZXJ2aWNlKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCBVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFID0gZGV2VG9vbHNTdmMuYmVmb3JlU2Vzc2lvbihudWxsLCBjYXBhYmlsaXRpZXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKFVOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFJywgVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkZXZUb29sc1N2Yy5faXNTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBnbG9iYWwuYnJvd3NlciB0byB0aGUgY3VycmVudCBtb2R1bGUncyB3ZWJkcml2ZXIgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IG9yZ0dsb2JhbEJyb3dzZXIgPSBnbG9iYWwuYnJvd3NlcjtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5icm93c2VyID0gbW9kdWxlLmdldERyaXZlcigpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGV2VG9vbHNTdmMuYmVmb3JlKG51bGwsIG51bGwsIHRoaXMuX2RyaXZlcik7XHJcbiAgICAgICAgICAgICAgICBzdWJtb2R1bGUuaW5pdChkZXZUb29sc1N2Yyk7XHJcbiAgICAgICAgICAgICAgICAvLyBnbG9iYWwuYnJvd3NlciA9IG9yZ0dsb2JhbEJyb3dzZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBvbk1vZHVsZVdpbGxEaXNwb3NlKG1vZHVsZSkge1xyXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdO1xyXG4gICAgICAgIGlmICghc3VibW9kdWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VibW9kdWxlLmRpc3Bvc2UoKTtcclxuICAgIH1cclxufSJdfQ==