oxygen-cli 1.41.0 → 1.43.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 (285) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/build/core/OxygenCore.js +93 -283
  3. package/build/core/OxygenEvents.js +2 -12
  4. package/build/core/OxygenModule.js +1 -16
  5. package/build/core/OxygenService.js +1 -12
  6. package/build/core/OxygenSubModule.js +1 -10
  7. package/build/core/WebDriverModule.js +2 -32
  8. package/build/core/utils.js +22 -21
  9. package/build/errors/HookError.js +2 -8
  10. package/build/errors/ModuleError.js +2 -8
  11. package/build/errors/ModuleUnavailableError.js +1 -3
  12. package/build/errors/OxygenError.js +3 -36
  13. package/build/errors/ScriptNotFound.js +2 -8
  14. package/build/errors/helper.js +50 -82
  15. package/build/index.js +8 -22
  16. package/build/lib/cli-util.js +36 -105
  17. package/build/lib/cli.js +3 -30
  18. package/build/lib/debugger.js +2 -145
  19. package/build/lib/img-merge.js +2 -16
  20. package/build/lib/launcher.js +3 -31
  21. package/build/lib/moduleRequire.js +1 -4
  22. package/build/lib/parallel-launcher.js +44 -84
  23. package/build/lib/param-manager.js +2 -29
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/text-to-image.js +5 -26
  28. package/build/lib/util.js +13 -84
  29. package/build/model/case-result.js +1 -2
  30. package/build/model/failure.js +1 -2
  31. package/build/model/status.js +1 -2
  32. package/build/model/step-result.js +1 -2
  33. package/build/model/suite-result.js +1 -2
  34. package/build/model/test-result.js +1 -2
  35. package/build/model/testcase.js +1 -2
  36. package/build/model/testsuite.js +1 -2
  37. package/build/ox_modules/index.js +20 -41
  38. package/build/ox_modules/module-assert.js +9 -28
  39. package/build/ox_modules/module-date.js +3 -8
  40. package/build/ox_modules/module-db.js +8 -29
  41. package/build/ox_modules/module-email.js +14 -45
  42. package/build/ox_modules/module-eyes.js +6 -47
  43. package/build/ox_modules/module-http/ntlm-util.js +3 -7
  44. package/build/ox_modules/module-http/ntlm.js +9 -78
  45. package/build/ox_modules/module-http.js +69 -172
  46. package/build/ox_modules/module-log.js +10 -23
  47. package/build/ox_modules/module-mailinator.js +11 -33
  48. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
  49. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
  50. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
  51. package/build/ox_modules/module-mob/commands/assertText.js +1 -4
  52. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
  53. package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
  54. package/build/ox_modules/module-mob/commands/back.js +1 -3
  55. package/build/ox_modules/module-mob/commands/clear.js +1 -5
  56. package/build/ox_modules/module-mob/commands/click.js +3 -5
  57. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
  58. package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
  59. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
  60. package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
  61. package/build/ox_modules/module-mob/commands/debug.js +2 -3
  62. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
  63. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
  64. package/build/ox_modules/module-mob/commands/execute.js +1 -3
  65. package/build/ox_modules/module-mob/commands/findElement.js +1 -4
  66. package/build/ox_modules/module-mob/commands/findElements.js +1 -5
  67. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
  68. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
  69. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
  70. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
  71. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
  72. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
  73. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
  74. package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
  75. package/build/ox_modules/module-mob/commands/getSource.js +1 -3
  76. package/build/ox_modules/module-mob/commands/getText.js +1 -5
  77. package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
  78. package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
  79. package/build/ox_modules/module-mob/commands/getValue.js +5 -10
  80. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
  81. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
  82. package/build/ox_modules/module-mob/commands/index.js +1 -148
  83. package/build/ox_modules/module-mob/commands/installApp.js +1 -3
  84. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
  85. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
  87. package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isExist.js +1 -4
  89. package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
  90. package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
  91. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
  92. package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
  93. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
  94. package/build/ox_modules/module-mob/commands/open.js +1 -4
  95. package/build/ox_modules/module-mob/commands/pause.js +1 -3
  96. package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
  97. package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
  98. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
  99. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
  100. package/build/ox_modules/module-mob/commands/select.js +1 -5
  101. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
  102. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
  103. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
  104. package/build/ox_modules/module-mob/commands/setContext.js +1 -3
  105. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
  106. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
  107. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
  108. package/build/ox_modules/module-mob/commands/shake.js +1 -3
  109. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
  110. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
  111. package/build/ox_modules/module-mob/commands/swipe.js +1 -3
  112. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
  113. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
  114. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
  115. package/build/ox_modules/module-mob/commands/tap.js +1 -3
  116. package/build/ox_modules/module-mob/commands/type.js +3 -8
  117. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
  118. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
  119. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
  120. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
  121. package/build/ox_modules/module-mob.js +107 -217
  122. package/build/ox_modules/module-mongo.js +14 -51
  123. package/build/ox_modules/module-pdf.js +24 -65
  124. package/build/ox_modules/module-proxy.js +9 -69
  125. package/build/ox_modules/module-serial.js +8 -33
  126. package/build/ox_modules/module-shell.js +10 -30
  127. package/build/ox_modules/module-soap.js +17 -52
  128. package/build/ox_modules/module-twilio.js +11 -54
  129. package/build/ox_modules/module-utils.js +22 -58
  130. package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
  131. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
  133. package/build/ox_modules/module-web/commands/assertExist.js +1 -3
  134. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
  135. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
  136. package/build/ox_modules/module-web/commands/assertText.js +1 -4
  137. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
  138. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
  139. package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
  140. package/build/ox_modules/module-web/commands/assertValue.js +1 -4
  141. package/build/ox_modules/module-web/commands/back.js +1 -3
  142. package/build/ox_modules/module-web/commands/clear.js +1 -6
  143. package/build/ox_modules/module-web/commands/click.js +4 -15
  144. package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
  145. package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
  146. package/build/ox_modules/module-web/commands/debug.js +2 -3
  147. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
  148. package/build/ox_modules/module-web/commands/deselect.js +1 -3
  149. package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
  150. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
  151. package/build/ox_modules/module-web/commands/execute.js +1 -3
  152. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
  153. package/build/ox_modules/module-web/commands/findElement.js +1 -4
  154. package/build/ox_modules/module-web/commands/findElements.js +1 -5
  155. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
  156. package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
  157. package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
  158. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
  159. package/build/ox_modules/module-web/commands/getCookies.js +1 -3
  160. package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
  161. package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
  162. package/build/ox_modules/module-web/commands/getHTML.js +1 -3
  163. package/build/ox_modules/module-web/commands/getSource.js +1 -3
  164. package/build/ox_modules/module-web/commands/getText.js +1 -5
  165. package/build/ox_modules/module-web/commands/getTitle.js +1 -3
  166. package/build/ox_modules/module-web/commands/getUrl.js +1 -3
  167. package/build/ox_modules/module-web/commands/getValue.js +1 -6
  168. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
  169. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
  170. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
  171. package/build/ox_modules/module-web/commands/index.js +1 -184
  172. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
  173. package/build/ox_modules/module-web/commands/isChecked.js +1 -3
  174. package/build/ox_modules/module-web/commands/isExist.js +1 -4
  175. package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
  176. package/build/ox_modules/module-web/commands/isSelected.js +1 -3
  177. package/build/ox_modules/module-web/commands/isVisible.js +1 -4
  178. package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
  179. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
  180. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
  181. package/build/ox_modules/module-web/commands/mock.js +1 -3
  182. package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
  183. package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
  184. package/build/ox_modules/module-web/commands/newWindow.js +1 -3
  185. package/build/ox_modules/module-web/commands/open.js +1 -5
  186. package/build/ox_modules/module-web/commands/pause.js +1 -3
  187. package/build/ox_modules/module-web/commands/point.js +1 -3
  188. package/build/ox_modules/module-web/commands/pointJS.js +2 -9
  189. package/build/ox_modules/module-web/commands/refresh.js +1 -3
  190. package/build/ox_modules/module-web/commands/rightClick.js +3 -9
  191. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
  192. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
  193. package/build/ox_modules/module-web/commands/select.js +1 -6
  194. package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
  195. package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
  196. package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
  197. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
  198. package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
  199. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
  200. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
  201. package/build/ox_modules/module-web/commands/type.js +1 -6
  202. package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
  203. package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
  204. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
  205. package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
  206. package/build/ox_modules/module-web/commands/verifyText.js +1 -4
  207. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
  208. package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
  209. package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
  210. package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
  211. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
  212. package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
  213. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
  214. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
  215. package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
  216. package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
  217. package/build/ox_modules/module-web/commands/waitForText.js +1 -4
  218. package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
  219. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
  220. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
  221. package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
  222. package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
  223. package/build/ox_modules/module-web.js +169 -233
  224. package/build/ox_modules/module-win/commands/assertText.js +1 -4
  225. package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
  226. package/build/ox_modules/module-win/commands/assertValue.js +9 -17
  227. package/build/ox_modules/module-win/commands/back.js +1 -3
  228. package/build/ox_modules/module-win/commands/clear.js +1 -5
  229. package/build/ox_modules/module-win/commands/click.js +1 -3
  230. package/build/ox_modules/module-win/commands/clickLong.js +1 -3
  231. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
  232. package/build/ox_modules/module-win/commands/findElement.js +1 -4
  233. package/build/ox_modules/module-win/commands/findElements.js +1 -5
  234. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
  235. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
  236. package/build/ox_modules/module-win/commands/getLocation.js +1 -3
  237. package/build/ox_modules/module-win/commands/getSource.js +1 -3
  238. package/build/ox_modules/module-win/commands/getText.js +1 -5
  239. package/build/ox_modules/module-win/commands/getValue.js +5 -10
  240. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
  241. package/build/ox_modules/module-win/commands/index.js +1 -74
  242. package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
  243. package/build/ox_modules/module-win/commands/isChecked.js +1 -3
  244. package/build/ox_modules/module-win/commands/isClickable.js +1 -3
  245. package/build/ox_modules/module-win/commands/isExist.js +1 -4
  246. package/build/ox_modules/module-win/commands/isSelected.js +1 -3
  247. package/build/ox_modules/module-win/commands/isVisible.js +1 -4
  248. package/build/ox_modules/module-win/commands/open.js +1 -3
  249. package/build/ox_modules/module-win/commands/pause.js +1 -3
  250. package/build/ox_modules/module-win/commands/rightClick.js +1 -3
  251. package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
  252. package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
  253. package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
  254. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
  255. package/build/ox_modules/module-win/commands/tap.js +1 -3
  256. package/build/ox_modules/module-win/commands/type.js +1 -5
  257. package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
  258. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
  259. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
  260. package/build/ox_modules/module-win.js +54 -95
  261. package/build/ox_modules/utils.js +97 -79
  262. package/build/ox_reporters/reporter-excel.js +2 -59
  263. package/build/ox_reporters/reporter-html.js +2 -29
  264. package/build/ox_reporters/reporter-json.js +2 -15
  265. package/build/ox_reporters/reporter-junit.js +2 -25
  266. package/build/ox_reporters/reporter-pdf.js +2 -20
  267. package/build/ox_reporters/reporter-rp.js +4 -92
  268. package/build/ox_reporters/reporter-xml.js +2 -18
  269. package/build/ox_services/service-devtools/submodule-network.js +4 -86
  270. package/build/ox_services/service-devtools.js +2 -24
  271. package/build/reporter/FileReporterBase.js +6 -45
  272. package/build/reporter/ReportAggregator.js +7 -121
  273. package/build/reporter/ReporterBase.js +1 -6
  274. package/build/reporter/WebSocketReporter.js +1 -39
  275. package/build/runners/WorkerProcess.js +2 -107
  276. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  277. package/build/runners/cucumber/CucumberReporter.js +2 -57
  278. package/build/runners/cucumber/CucumberWorker.js +3 -69
  279. package/build/runners/cucumber/index.js +2 -31
  280. package/build/runners/cucumber/worker.js +2 -19
  281. package/build/runners/index.js +4 -11
  282. package/build/runners/oxygen/OxygenWorker.js +3 -61
  283. package/build/runners/oxygen/index.js +18 -179
  284. package/build/runners/oxygen/worker.js +3 -27
  285. package/package.json +4 -1
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  require("source-map-support/register");
4
-
5
4
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
6
-
7
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
-
5
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
6
  /*
10
7
  * Copyright (C) 2015-present CloudBeat Limited
11
8
  *
@@ -14,12 +11,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
14
11
  * the Free Software Foundation, either version 3 of the License, or
15
12
  * (at your option) any later version.
16
13
  */
17
- const errHelper = require('../errors/helper');
18
14
 
15
+ const errHelper = require('../errors/helper');
19
16
  const {
20
17
  v1
21
18
  } = require('uuid');
22
-
23
19
  const providers = {
24
20
  PERFECTO: 'perfecto',
25
21
  BROWSERSTACK: 'browserstack',
@@ -34,32 +30,21 @@ const contextList = {
34
30
  web: 'web'
35
31
  };
36
32
  const cmdsToOverwrite = ['$$', '$', 'addValue', 'clearValue', 'click', 'doubleClick', 'dragAndDrop', 'getAttribute', 'getCSSProperty', 'getComputedLabel', 'getComputedRole', 'getHTML', 'getLocation', 'getProperty', 'getSize', 'getTagName', 'getText', 'getValue', 'isClickable', 'isDisplayed', 'isDisplayedInViewport', 'isEnabled', 'isEqual', 'isExisting', 'isFocused', 'isSelected', 'moveTo', 'nextElement', 'parentElement', 'previousElement', 'react$$', 'react$', 'saveScreenshot', 'scrollIntoView', 'selectByAttribute', 'selectByIndex', 'selectByVisibleText', 'setValue', 'shadow$$', 'shadow$', 'touchAction', 'waitForClickable', 'waitForDisplayed', 'waitForEnabled', 'waitForExist', 'waitUntil'];
37
-
38
33
  const isElementNotFound = el => {
39
34
  let result = false;
40
-
41
- if (el.error && (el.error.error === 'no such element' || el.error.message &&
42
- /* winappdriver win.rightClick */
43
- el.error.message.startsWith('no such element') || el.error.message &&
44
- /* winappdriver */
45
- el.error.message.startsWith('An element could not be located'))) {
35
+ if (el.error && (el.error.error === 'no such element' || el.error.message && /* winappdriver win.rightClick */el.error.message.startsWith('no such element') || el.error.message && /* winappdriver */el.error.message.startsWith('An element could not be located'))) {
46
36
  result = true;
47
37
  }
48
-
49
38
  return result;
50
39
  };
51
-
52
40
  module.exports = {
53
41
  matchPattern: function (val, pattern) {
54
42
  if (!val && !pattern) {
55
43
  return true;
56
44
  }
57
-
58
45
  var globToRegex = require('glob-to-regexp');
59
-
60
46
  pattern = pattern.toString().replace(/\s+/g, ' ');
61
47
  var regex;
62
-
63
48
  if (pattern.indexOf('regex:') == 0) {
64
49
  // match using a regular-expression
65
50
  regex = new RegExp(pattern.substring('regex:'.length), 'g');
@@ -89,30 +74,23 @@ module.exports = {
89
74
  if (timeout) {
90
75
  await module.exports.setTimeoutImplicit.call(this, timeout);
91
76
  }
92
-
93
77
  var el;
94
-
95
78
  if (locator && locator.constructor && locator.constructor.name === 'Element') {
96
79
  el = locator;
97
80
  } else {
98
81
  locator = this.helpers.getWdioLocator(locator);
99
82
  el = await this.driver.$(locator);
100
83
  }
101
-
102
84
  const elementNotFound = isElementNotFound(el);
103
-
104
85
  if (elementNotFound) {
105
86
  if (timeout) {
106
87
  await module.exports.restoreTimeoutImplicit.call(this);
107
88
  }
108
-
109
89
  if (throwException) {
110
90
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_FOUND, `Unable to find element: ${locator}`);
111
91
  }
112
-
113
92
  return null;
114
93
  }
115
-
116
94
  if (waitForVisible) {
117
95
  try {
118
96
  await el.waitForDisplayed({
@@ -122,69 +100,55 @@ module.exports = {
122
100
  if (timeout) {
123
101
  await module.exports.restoreTimeoutImplicit.call(this);
124
102
  }
125
-
126
103
  if (throwException && e.message && e.message.includes('still not displayed')) {
127
104
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_VISIBLE, `Element not visible: ${locator}`);
128
105
  } else if (throwException) {
129
106
  throw e;
130
107
  }
131
-
132
108
  return null;
133
109
  }
134
110
  }
135
-
136
111
  if (timeout) {
137
112
  await module.exports.restoreTimeoutImplicit.call(this);
138
113
  }
139
-
140
114
  return el;
141
115
  },
142
116
  getElements: async function (locator, timeout) {
143
117
  if (timeout) {
144
118
  await module.exports.setTimeoutImplicit.call(this, timeout);
145
119
  }
146
-
147
120
  let els = [];
148
-
149
121
  try {
150
122
  els = await this.driver.$$(this.helpers.getWdioLocator(locator));
151
123
  } catch (e) {
152
124
  const elementsNotFound = isElementNotFound(els);
153
-
154
- if (elementsNotFound) {// ignore errors
125
+ if (elementsNotFound) {
126
+ // ignore errors
155
127
  } else {
156
128
  throw e;
157
129
  }
158
130
  }
159
-
160
131
  if (timeout) {
161
132
  await module.exports.restoreTimeoutImplicit.call(this);
162
133
  }
163
-
164
134
  return els;
165
135
  },
166
136
  getChildElement: async function (locator, parentElement, waitForVisible, timeout) {
167
137
  if (timeout) {
168
138
  await module.exports.setTimeoutImplicit.call(this, timeout);
169
139
  }
170
-
171
140
  locator = this.helpers.getWdioLocator(locator);
172
-
173
141
  if (!(parentElement && parentElement.$)) {
174
142
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - parentElement, must be a valid element');
175
143
  }
176
-
177
144
  var el = await parentElement.$(locator);
178
145
  const elementNotFound = isElementNotFound(el);
179
-
180
146
  if (elementNotFound) {
181
147
  if (timeout) {
182
148
  await module.exports.restoreTimeoutImplicit.call(this);
183
149
  }
184
-
185
150
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_FOUND, `Unable to find element: ${locator}`);
186
151
  }
187
-
188
152
  if (waitForVisible) {
189
153
  try {
190
154
  await el.waitForDisplayed({
@@ -194,73 +158,60 @@ module.exports = {
194
158
  if (timeout) {
195
159
  await module.exports.restoreTimeoutImplicit.call(this);
196
160
  }
197
-
198
161
  if (e.message && e.message.includes('still not displayed')) {
199
162
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_VISIBLE, `Element not visible: ${locator}`);
200
163
  }
201
-
202
164
  throw e;
203
165
  }
204
166
  }
205
-
206
167
  if (timeout) {
207
168
  await module.exports.restoreTimeoutImplicit.call(this);
208
169
  }
209
-
210
170
  return el;
211
171
  },
212
172
  getChildElements: async function (locator, parentElement, timeout) {
213
173
  if (timeout) {
214
174
  module.exports.setTimeoutImplicit.call(this, timeout);
215
175
  }
216
-
217
176
  locator = this.helpers.getWdioLocator(locator);
218
-
219
177
  if (!(parentElement && parentElement.$$)) {
220
178
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - parentElement, must be a valid element');
221
179
  }
222
-
223
180
  let els = [];
224
-
225
181
  try {
226
182
  els = await parentElement.$$(locator);
227
183
  } catch (e) {
228
184
  const elementsNotFound = isElementNotFound(els);
229
-
230
- if (elementsNotFound) {// ignore errors
185
+ if (elementsNotFound) {
186
+ // ignore errors
231
187
  } else {
232
188
  throw e;
233
189
  }
234
190
  }
235
-
236
191
  if (timeout) {
237
192
  await module.exports.restoreTimeoutImplicit.call(this);
238
193
  }
239
-
240
194
  return els;
241
195
  },
242
196
  setTimeoutImplicit: async function (timeout) {
243
197
  if (!this.driver) {
244
198
  return;
245
199
  }
246
-
247
200
  if (this.driver.seleniumTimeout && timeout > this.driver.seleniumTimeout * 1000) {
248
201
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `timeout must be less than ${this.driver.seleniumTimeout * 1000}`);
249
202
  }
250
-
251
203
  if (this.driver.seleniumBrowserTimeout && timeout > this.driver.seleniumBrowserTimeout * 1000) {
252
204
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `timeout must be less than ${this.driver.seleniumBrowserTimeout * 1000}`);
253
205
  }
254
-
255
206
  let timeouts;
256
-
257
207
  if (this.driver.capabilities && this.driver.capabilities.browserName === 'MicrosoftEdge') {
258
208
  // not supported on Edge
259
209
  return;
260
210
  } else if (this.driver.getTimeouts) {
261
211
  // chrome >= 75
262
212
  try {
263
- if (this.driver.capabilities && this.driver.capabilities.stopUrl && this.driver.capabilities.stopUrl.includes('perfectomobile.com')) {//ignore
213
+ if (this.driver.capabilities && this.driver.capabilities.stopUrl && this.driver.capabilities.stopUrl.includes('perfectomobile.com')) {
214
+ //ignore
264
215
  } else {
265
216
  timeouts = await this.driver.getTimeouts();
266
217
  }
@@ -272,15 +223,12 @@ module.exports = {
272
223
  // chrome >= 72 && chrome < 75
273
224
  timeouts = this.driver.capabilities.timeouts;
274
225
  }
275
-
276
226
  if (timeouts && timeouts.implicit) {
277
227
  this._prevImplicitTimeout = timeouts.implicit;
278
228
  }
279
-
280
229
  if (timeouts && timeouts.pageLoad) {
281
230
  this._prevPageLoadTimeout = timeouts.pageLoad;
282
231
  }
283
-
284
232
  if (this.driver.setTimeout) {
285
233
  if (this.driver.capabilities && this.driver.capabilities.browserName) {
286
234
  // browserName 'default' on android
@@ -301,7 +249,6 @@ module.exports = {
301
249
  'implicit': this._prevImplicitTimeout
302
250
  });
303
251
  }
304
-
305
252
  if (this._prevPageLoadTimeout && this.driver.setTimeout) {
306
253
  await this.driver.setTimeout({
307
254
  'pageLoad': this._prevPageLoadTimeout
@@ -352,14 +299,15 @@ module.exports = {
352
299
  assertContext: async function (...alowedContexts) {
353
300
  var context = await this.driver.getContext();
354
301
  const isWeb = context && (context.indexOf('WEBVIEW') > -1 || context.indexOf('CHROMIUM') > -1);
355
-
356
302
  if (isWeb) {
357
- if (alowedContexts.includes(contextList.web) || alowedContexts.includes(contextList.hybrid)) {// ignore, all is ok
303
+ if (alowedContexts.includes(contextList.web) || alowedContexts.includes(contextList.hybrid)) {
304
+ // ignore, all is ok
358
305
  } else {
359
306
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid context');
360
307
  }
361
308
  } else {
362
- if (alowedContexts.includes(contextList.android) || alowedContexts.includes(contextList.ios)) {// ignore, all is ok
309
+ if (alowedContexts.includes(contextList.android) || alowedContexts.includes(contextList.ios)) {
310
+ // ignore, all is ok
363
311
  } else {
364
312
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid context');
365
313
  }
@@ -368,15 +316,15 @@ module.exports = {
368
316
  getWdioLocator: function (locator) {
369
317
  if (!locator) throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - locator not specified');else if (typeof locator === 'object') return locator;else if (locator.indexOf('/') === 0) return locator; // leave xpath locator as is
370
318
  else if (locator.indexOf('id=') === 0) {
371
- // generate XPath instead of CSS for browser tests, since ID can contain illegal characters
372
- // and escaping doesn't work reliably or in identical manner in all browser
373
- if (this.driver.capabilities && this.driver.capabilities.browserName) {
374
- return `//*[@id="${locator.substr('id='.length)}"]`;
375
- } else {
376
- return '#' + locator.substr('id='.length);
377
- }
378
- } else if (locator.indexOf('name=') === 0) return '[name="' + locator.substr('name='.length) + '"]';else if (locator.indexOf('link=') === 0) return '=' + locator.substr('link='.length);else if (locator.indexOf('link-contains=') === 0) return '*=' + locator.substr('link='.length);else if (locator.indexOf('css=') === 0) return locator.substr('css='.length); // in case of css, just remove css= prefix
379
- else if (locator.indexOf('tag=') === 0) return '<' + locator.substr('tag='.length) + ' />';
319
+ // generate XPath instead of CSS for browser tests, since ID can contain illegal characters
320
+ // and escaping doesn't work reliably or in identical manner in all browser
321
+ if (this.driver.capabilities && this.driver.capabilities.browserName) {
322
+ return `//*[@id="${locator.substr('id='.length)}"]`;
323
+ } else {
324
+ return '#' + locator.substr('id='.length);
325
+ }
326
+ } else if (locator.indexOf('name=') === 0) return '[name="' + locator.substr('name='.length) + '"]';else if (locator.indexOf('link=') === 0) return '=' + locator.substr('link='.length);else if (locator.indexOf('link-contains=') === 0) return '*=' + locator.substr('link='.length);else if (locator.indexOf('css=') === 0) return locator.substr('css='.length); // in case of css, just remove css= prefix
327
+ else if (locator.indexOf('tag=') === 0) return '<' + locator.substr('tag='.length) + ' />';
380
328
  return locator;
381
329
  },
382
330
  getLogTypes: function (context) {
@@ -391,7 +339,6 @@ module.exports = {
391
339
  if (!wdioOpts || !wdioOpts.capabilities) {
392
340
  return null;
393
341
  }
394
-
395
342
  if (wdioOpts.capabilities['perfectoMobile:options'] || wdioOpts.hostname && wdioOpts.hostname.includes('perfectomobile.com')) {
396
343
  return providers.PERFECTO;
397
344
  } else if (wdioOpts.capabilities['bstack:options']) {
@@ -403,7 +350,6 @@ module.exports = {
403
350
  } else if (wdioOpts.capabilities['testingBot:options']) {
404
351
  return providers.TESTINGBOT;
405
352
  }
406
-
407
353
  return null;
408
354
  },
409
355
  hasCircularDependency: function (obj) {
@@ -414,12 +360,10 @@ module.exports = {
414
360
  return String(e);
415
361
  }
416
362
  }
417
-
418
363
  return false;
419
364
  },
420
365
  assertCircular: function (obj) {
421
366
  const hasCircularDependency = this.hasCircularDependency(obj);
422
-
423
367
  if (hasCircularDependency) {
424
368
  throw new _OxygenError.default(errHelper.errorCode.CIRCULAR_ERROR, hasCircularDependency);
425
369
  }
@@ -434,17 +378,91 @@ module.exports = {
434
378
  overwriteWdioCommands: async function (driver) {
435
379
  // if element command is invoked directly from user script and error happens,
436
380
  // it won't be caught and will lead to unhandledRejection (since it's executed in async manner without awaiting) and test results will be lost.
381
+
437
382
  // e.g.
438
383
  // var el = web.findElement('id=foo');
439
384
  // el.click(); // if element is not visible then click will throw eventually
385
+
440
386
  // therefore we wrap all wdio commands to make them execute synchronously.
441
387
  // P.S. it would be better to disallow users from using wdio element commands directly since they are not displayed in logs or results.
442
388
  // but we have no way determining whether command was executed from user script or from oxygen internals...
389
+
443
390
  for (let cmd of cmdsToOverwrite) {
444
391
  await driver.overwriteCommand(cmd, function (origFunc) {
445
392
  return origFunc.apply(undefined, [].slice.call(arguments, 1));
446
393
  }, true);
447
394
  }
395
+ },
396
+ enrichProviderWdioOptions: function (providerName, wdioOpts) {
397
+ let name = 'name';
398
+ if (providerName === providers.PERFECTO) {
399
+ wdioOpts.capabilities.maxInstances = 1;
400
+ wdioOpts.path = '/nexperience/perfectomobile/wd/hub';
401
+ wdioOpts.port = 80;
402
+ wdioOpts.protocol = 'http';
403
+ wdioOpts.openDeviceTimeout = 15;
404
+ delete wdioOpts.capabilities.manufacturer;
405
+ delete wdioOpts.capabilities.model;
406
+ delete wdioOpts.capabilities.browserName;
407
+ delete wdioOpts.capabilities.host;
408
+ name = wdioOpts.capabilities['perfectoMobile:options']['name'];
409
+ delete wdioOpts.capabilities['perfectoMobile:options'];
410
+ } else if (providerName === providers.BROWSERSTACK) {
411
+ const bsOptions = wdioOpts.capabilities['bstack:options'];
412
+ if (bsOptions) {
413
+ const deviceName = bsOptions.deviceName;
414
+ const osName = bsOptions.os;
415
+ if (deviceName) {
416
+ bsOptions.realMobile = true;
417
+ wdioOpts.capabilities['appium:deviceName'] = deviceName;
418
+ }
419
+
420
+ // for mobile browser test, both borwserName and appium:deviceName will be set
421
+ // however for BS to work it also expects bstack:options.deviceName
422
+ if (wdioOpts.capabilities.browserName && wdioOpts.capabilities['appium:deviceName']) {
423
+ bsOptions.deviceName = wdioOpts.capabilities['appium:deviceName'];
424
+ }
425
+
426
+ // set automationName Appium capability
427
+ if (osName && osName.toLowerCase() === 'android') {
428
+ wdioOpts.capabilities.platformName = 'Android';
429
+ wdioOpts.capabilities['appium:automationName'] = 'UIAutomator2';
430
+ } else if (osName && osName.toLowerCase() === 'ios') {
431
+ wdioOpts.capabilities.platformName = 'iOS';
432
+ wdioOpts.capabilities['appium:automationName'] = 'XCUITest';
433
+ }
434
+
435
+ // merge user-provided BS options into the final options object
436
+ for (const capName in wdioOpts.capabilities) {
437
+ if (capName.startsWith('bstack:')) {
438
+ const bsCapName = capName.substring('bstack:'.length);
439
+ if (bsCapName === 'options') {
440
+ continue;
441
+ }
442
+
443
+ // for backward compatibility... needs to be removed eventually
444
+ if (bsCapName === 'recordVideo') {
445
+ bsOptions.video = wdioOpts.capabilities[capName];
446
+ delete wdioOpts.capabilities[capName];
447
+ continue;
448
+ }
449
+ bsOptions[bsCapName] = wdioOpts.capabilities[capName];
450
+ delete wdioOpts.capabilities[capName];
451
+ }
452
+ }
453
+ }
454
+ } else if (wdioOpts.capabilities['lambda:options'] && wdioOpts.capabilities['lambda:options']['name']) {
455
+ name = wdioOpts.capabilities['lambda:options']['name'];
456
+ delete wdioOpts.capabilities['lambda:options'];
457
+ } else if (wdioOpts.capabilities['testingBot:options'] && wdioOpts.capabilities['testingBot:options']['name']) {
458
+ name = wdioOpts.capabilities['testingBot:options']['name'];
459
+ delete wdioOpts.capabilities['testingBot:options'];
460
+ }
461
+ if (wdioOpts.capabilities['bstack:options'] && wdioOpts.capabilities['bstack:options']['name']) {
462
+ name = wdioOpts.capabilities['bstack:options']['name'];
463
+ delete wdioOpts.capabilities['bstack:options'];
464
+ }
465
+ return name;
448
466
  }
449
467
  };
450
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL3V0aWxzLmpzIl0sIm5hbWVzIjpbImVyckhlbHBlciIsInJlcXVpcmUiLCJ2MSIsInByb3ZpZGVycyIsIlBFUkZFQ1RPIiwiQlJPV1NFUlNUQUNLIiwiU0FVQ0VMQUJTIiwiTEFNQkRBVEVTVCIsIlRFU1RJTkdCT1QiLCJjb250ZXh0TGlzdCIsImFuZHJvaWQiLCJpb3MiLCJoeWJyaWQiLCJ3ZWIiLCJjbWRzVG9PdmVyd3JpdGUiLCJpc0VsZW1lbnROb3RGb3VuZCIsImVsIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRzV2l0aCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtYXRjaFBhdHRlcm4iLCJ2YWwiLCJwYXR0ZXJuIiwiZ2xvYlRvUmVnZXgiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJyZWdleCIsImluZGV4T2YiLCJSZWdFeHAiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJ0ZXN0IiwiZmxhZ3MiLCJnZXRFbGVtZW50IiwibG9jYXRvciIsIndhaXRGb3JWaXNpYmxlIiwidGltZW91dCIsInRocm93RXhjZXB0aW9uIiwic2V0VGltZW91dEltcGxpY2l0IiwiY2FsbCIsImNvbnN0cnVjdG9yIiwibmFtZSIsImhlbHBlcnMiLCJnZXRXZGlvTG9jYXRvciIsImRyaXZlciIsIiQiLCJlbGVtZW50Tm90Rm91bmQiLCJyZXN0b3JlVGltZW91dEltcGxpY2l0IiwiT3hFcnJvciIsImVycm9yQ29kZSIsIkVMRU1FTlRfTk9UX0ZPVU5EIiwid2FpdEZvckRpc3BsYXllZCIsIndhaXRGb3JUaW1lb3V0IiwiZSIsImluY2x1ZGVzIiwiRUxFTUVOVF9OT1RfVklTSUJMRSIsImdldEVsZW1lbnRzIiwiZWxzIiwiJCQiLCJlbGVtZW50c05vdEZvdW5kIiwiZ2V0Q2hpbGRFbGVtZW50IiwicGFyZW50RWxlbWVudCIsIlNDUklQVF9FUlJPUiIsImdldENoaWxkRWxlbWVudHMiLCJzZWxlbml1bVRpbWVvdXQiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0IiwidGltZW91dHMiLCJjYXBhYmlsaXRpZXMiLCJicm93c2VyTmFtZSIsImdldFRpbWVvdXRzIiwic3RvcFVybCIsImNvbnNvbGUiLCJsb2ciLCJpbXBsaWNpdCIsIl9wcmV2SW1wbGljaXRUaW1lb3V0IiwicGFnZUxvYWQiLCJfcHJldlBhZ2VMb2FkVGltZW91dCIsInNldFRpbWVvdXQiLCJhc3NlcnRBcmd1bWVudCIsImFyZyIsInVuZGVmaW5lZCIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0Q29udGV4dCIsImFsb3dlZENvbnRleHRzIiwiY29udGV4dCIsImdldENvbnRleHQiLCJpc1dlYiIsInN1YnN0ciIsImdldExvZ1R5cGVzIiwicHJvdmlkZXIiLCJkZXRlcm1pbmVQcm92aWRlciIsIndkaW9PcHRzIiwiaG9zdG5hbWUiLCJoYXNDaXJjdWxhckRlcGVuZGVuY3kiLCJvYmoiLCJKU09OIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwiYXNzZXJ0Q2lyY3VsYXIiLCJDSVJDVUxBUl9FUlJPUiIsIm5ld1ZpZGVvQXR0YWNobWVudCIsImZpbGVOYW1lIiwidmlkZW9VcmwiLCJpZCIsInR5cGUiLCJzdWJ0eXBlIiwiX3VybCIsIm92ZXJ3cml0ZVdkaW9Db21tYW5kcyIsImNtZCIsIm92ZXJ3cml0ZUNvbW1hbmQiLCJvcmlnRnVuYyIsImFwcGx5Iiwic2xpY2UiLCJhcmd1bWVudHMiXSwibWFwcGluZ3MiOiI7Ozs7QUFVQTs7OztBQVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUF6Qjs7QUFF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VUFBVUUsUUFBVixFQUFvQjtBQUNuRCxlQUFPQSxRQUFRLENBQUNDLEtBQVQsQ0FBZXJDLFNBQWYsRUFBMEIsR0FBR3NDLEtBQUgsQ0FBUy9FLElBQVQsQ0FBY2dGLFNBQWQsRUFBeUIsQ0FBekIsQ0FBMUIsQ0FBUDtBQUNILE9BRkssRUFFSCxJQUZHLENBQU47QUFHSDtBQUNKO0FBaGFZLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG5jb25zdCBlcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmNvbnN0IHsgdjEgfSA9IHJlcXVpcmUoJ3V1aWQnKTtcclxuXHJcbmNvbnN0IHByb3ZpZGVycyA9IHtcclxuICAgIFBFUkZFQ1RPOiAncGVyZmVjdG8nLFxyXG4gICAgQlJPV1NFUlNUQUNLOiAnYnJvd3NlcnN0YWNrJyxcclxuICAgIFNBVUNFTEFCUzogJ3NhdWNlJyxcclxuICAgIExBTUJEQVRFU1Q6ICdsYW1iZGEnLFxyXG4gICAgVEVTVElOR0JPVDogJ3Rlc3Rpbmdib3QnXHJcbn07XHJcblxyXG5jb25zdCBjb250ZXh0TGlzdCA9IHtcclxuICAgIGFuZHJvaWQ6ICdhbmRyb2lkJyxcclxuICAgIGlvczogJ2lvcycsXHJcbiAgICBoeWJyaWQ6ICdoeWJyaWQnLFxyXG4gICAgd2ViOiAnd2ViJ1xyXG59O1xyXG5cclxuY29uc3QgY21kc1RvT3ZlcndyaXRlID0gWyckJCcsICckJywnYWRkVmFsdWUnLCdjbGVhclZhbHVlJywnY2xpY2snLCdkb3VibGVDbGljaycsJ2RyYWdBbmREcm9wJywnZ2V0QXR0cmlidXRlJywnZ2V0Q1NTUHJvcGVydHknLCdnZXRDb21wdXRlZExhYmVsJywnZ2V0Q29tcHV0ZWRSb2xlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRIVE1MJywnZ2V0TG9jYXRpb24nLCdnZXRQcm9wZXJ0eScsJ2dldFNpemUnLCdnZXRUYWdOYW1lJywnZ2V0VGV4dCcsJ2dldFZhbHVlJywnaXNDbGlja2FibGUnLCdpc0Rpc3BsYXllZCcsJ2lzRGlzcGxheWVkSW5WaWV3cG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFbmFibGVkJywnaXNFcXVhbCcsJ2lzRXhpc3RpbmcnLCdpc0ZvY3VzZWQnLCdpc1NlbGVjdGVkJywnbW92ZVRvJywnbmV4dEVsZW1lbnQnLCdwYXJlbnRFbGVtZW50JywncHJldmlvdXNFbGVtZW50JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICdyZWFjdCQkJywncmVhY3QkJywnc2F2ZVNjcmVlbnNob3QnLCdzY3JvbGxJbnRvVmlldycsJ3NlbGVjdEJ5QXR0cmlidXRlJywnc2VsZWN0QnlJbmRleCcsJ3NlbGVjdEJ5VmlzaWJsZVRleHQnLCdzZXRWYWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhZG93JCQnLCdzaGFkb3ckJywndG91Y2hBY3Rpb24nLCd3YWl0Rm9yQ2xpY2thYmxlJywnd2FpdEZvckRpc3BsYXllZCcsJ3dhaXRGb3JFbmFibGVkJywnd2FpdEZvckV4aXN0Jywnd2FpdFVudGlsJ107XHJcblxyXG5jb25zdCBpc0VsZW1lbnROb3RGb3VuZCA9IChlbCkgPT4ge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgaWYgKFxyXG4gICAgICAgIGVsLmVycm9yICYmIChcclxuICAgICAgICBlbC5lcnJvci5lcnJvciA9PT0gJ25vIHN1Y2ggZWxlbWVudCcgfHxcclxuICAgICAgICAoZWwuZXJyb3IubWVzc2FnZSAmJiAvKiB3aW5hcHBkcml2ZXIgd2luLnJpZ2h0Q2xpY2sgKi8gZWwuZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKCdubyBzdWNoIGVsZW1lbnQnKSB8fFxyXG4gICAgICAgIGVsLmVycm9yLm1lc3NhZ2UgJiYgLyogd2luYXBwZHJpdmVyICovIGVsLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbG9jYXRlZCcpKSlcclxuICAgICkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBtYXRjaFBhdHRlcm46IGZ1bmN0aW9uKHZhbCwgcGF0dGVybikge1xyXG4gICAgICAgIGlmICghdmFsICYmICFwYXR0ZXJuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGdsb2JUb1JlZ2V4ID0gcmVxdWlyZSgnZ2xvYi10by1yZWdleHAnKTtcclxuICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcclxuXHJcbiAgICAgICAgdmFyIHJlZ2V4O1xyXG4gICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ3JlZ2V4OicpID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCB1c2luZyBhIHJlZ3VsYXItZXhwcmVzc2lvblxyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybi5zdWJzdHJpbmcoJ3JlZ2V4OicubGVuZ3RoKSwgJ2cnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZigncmVnZXhpOicpID09IDApIHsgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdXNpbmcgYSBjYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXItZXhwcmVzc2lvblxyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybi5zdWJzdHJpbmcoJ3JlZ2V4aTonLmxlbmd0aCksICdpZycpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWwpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5pbmRleE9mKCdleGFjdDonKSA9PSAwIHx8IHBhdHRlcm4gPT09ICcnKSB7ICAvLyBtYXRjaCBhIHN0cmluZyBleGFjdGx5LCB2ZXJiYXRpbVxyXG4gICAgICAgICAgICByZXR1cm4gcGF0dGVybi5zdWJzdHJpbmcoJ2V4YWN0OicubGVuZ3RoKSA9PT0gdmFsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5pbmRleE9mKCdnbG9iOicpID09IDApIHsgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBhZ2FpbnN0IGEgY2FzZS1pbnNlbnNpdGl2ZSBcImdsb2JcIiBwYXR0ZXJuXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gZ2xvYlRvUmVnZXgocGF0dGVybi5zdWJzdHJpbmcoJ2dsb2I6Jy5sZW5ndGgpLCB7IGZsYWdzOiAnaWcnIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWwpO1xyXG4gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwcmVmaXggc2FtZSBhcyBnbG9iIG1hdGNoaW5nXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gZ2xvYlRvUmVnZXgocGF0dGVybiwgeyBmbGFnczogJ2lnJyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEVsZW1lbnQ6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHdhaXRGb3JWaXNpYmxlLCB0aW1lb3V0LCB0aHJvd0V4Y2VwdGlvbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5zZXRUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzLCB0aW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBlbDtcclxuICAgICAgICBpZiAobG9jYXRvciAmJiBsb2NhdG9yLmNvbnN0cnVjdG9yICYmIGxvY2F0b3IuY29uc3RydWN0b3IubmFtZSA9PT0gJ0VsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgIGVsID0gbG9jYXRvcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2NhdG9yID0gdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yKGxvY2F0b3IpO1xyXG4gICAgICAgICAgICBlbCA9IGF3YWl0IHRoaXMuZHJpdmVyLiQobG9jYXRvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50Tm90Rm91bmQgPSBpc0VsZW1lbnROb3RGb3VuZChlbCk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnROb3RGb3VuZCkge1xyXG4gICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9GT1VORCwgYFVuYWJsZSB0byBmaW5kIGVsZW1lbnQ6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3YWl0Rm9yVmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZWwud2FpdEZvckRpc3BsYXllZCh7IHRpbWVvdXQ6dGltZW91dCA/IHRpbWVvdXQgOiB0aGlzLndhaXRGb3JUaW1lb3V0fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRocm93RXhjZXB0aW9uICYmIGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0aWxsIG5vdCBkaXNwbGF5ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfVklTSUJMRSwgYEVsZW1lbnQgbm90IHZpc2libGU6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRocm93RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEVsZW1lbnRzOiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCB0aW1lb3V0KSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZWxzID0gW107XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVscyA9IGF3YWl0IHRoaXMuZHJpdmVyLiQkKHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c05vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWxzKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzTm90Rm91bmQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWxzO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDaGlsZEVsZW1lbnQ6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHBhcmVudEVsZW1lbnQsIHdhaXRGb3JWaXNpYmxlLCB0aW1lb3V0KSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhdG9yID0gdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yKGxvY2F0b3IpO1xyXG5cclxuICAgICAgICBpZiAoIShwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnQuJCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gcGFyZW50RWxlbWVudCwgbXVzdCBiZSBhIHZhbGlkIGVsZW1lbnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBlbCA9IGF3YWl0IHBhcmVudEVsZW1lbnQuJChsb2NhdG9yKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudE5vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWwpO1xyXG4gICAgICAgIGlmIChlbGVtZW50Tm90Rm91bmQpIHtcclxuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX0ZPVU5ELCBgVW5hYmxlIHRvIGZpbmQgZWxlbWVudDogJHtsb2NhdG9yfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdhaXRGb3JWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBlbC53YWl0Rm9yRGlzcGxheWVkKHsgdGltZW91dDogdGltZW91dCA/IHRpbWVvdXQgOiB0aGlzLndhaXRGb3JUaW1lb3V0fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0aWxsIG5vdCBkaXNwbGF5ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfVklTSUJMRSwgYEVsZW1lbnQgbm90IHZpc2libGU6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q2hpbGRFbGVtZW50czogYXN5bmMgZnVuY3Rpb24obG9jYXRvciwgcGFyZW50RWxlbWVudCwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuXHJcbiAgICAgICAgaWYgKCEocGFyZW50RWxlbWVudCAmJiBwYXJlbnRFbGVtZW50LiQkKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgYXJndW1lbnQgLSBwYXJlbnRFbGVtZW50LCBtdXN0IGJlIGEgdmFsaWQgZWxlbWVudCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVscyA9IFtdO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVscyA9IGF3YWl0IHBhcmVudEVsZW1lbnQuJCQobG9jYXRvcik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c05vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWxzKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzTm90Rm91bmQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbHM7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFRpbWVvdXRJbXBsaWNpdDogYXN5bmMgZnVuY3Rpb24odGltZW91dCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCAmJiB0aW1lb3V0ID4gdGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ICogMTAwMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgYHRpbWVvdXQgbXVzdCBiZSBsZXNzIHRoYW4gJHt0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgKiAxMDAwfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCAmJiB0aW1lb3V0ID4gdGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCAqIDEwMDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIGB0aW1lb3V0IG11c3QgYmUgbGVzcyB0aGFuICR7dGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCAqIDEwMDB9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGltZW91dHM7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmXHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gJ01pY3Jvc29mdEVkZ2UnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgb24gRWRnZVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5nZXRUaW1lb3V0cykge1xyXG4gICAgICAgICAgICAvLyBjaHJvbWUgPj0gNzVcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuc3RvcFVybCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5zdG9wVXJsLmluY2x1ZGVzKCdwZXJmZWN0b21vYmlsZS5jb20nKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dHMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRUaW1lb3V0cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBmYWlscyBvbiBwZXJmZWN0byBtb2JpbGVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnZXRUaW1lb3V0cyBlcnJvcicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiYgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLnRpbWVvdXRzKSB7XHJcbiAgICAgICAgICAgIC8vIGNocm9tZSA+PSA3MiAmJiBjaHJvbWUgPCA3NVxyXG4gICAgICAgICAgICB0aW1lb3V0cyA9IHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy50aW1lb3V0cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0cyAmJiB0aW1lb3V0cy5pbXBsaWNpdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2SW1wbGljaXRUaW1lb3V0ID0gdGltZW91dHMuaW1wbGljaXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aW1lb3V0cyAmJiB0aW1lb3V0cy5wYWdlTG9hZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2UGFnZUxvYWRUaW1lb3V0ID0gdGltZW91dHMucGFnZUxvYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiYgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBicm93c2VyTmFtZSAnZGVmYXVsdCcgb24gYW5kcm9pZCBcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICdpbXBsaWNpdCc6IHRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3BhZ2VMb2FkJzogdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHtcclxuICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQnOiB0aW1lb3V0LFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc3RvcmVUaW1lb3V0SW1wbGljaXQ6IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2SW1wbGljaXRUaW1lb3V0ICYmIHRoaXMuZHJpdmVyLnNldFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7ICdpbXBsaWNpdCc6IHRoaXMuX3ByZXZJbXBsaWNpdFRpbWVvdXQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2UGFnZUxvYWRUaW1lb3V0ICYmIHRoaXMuZHJpdmVyLnNldFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7ICdwYWdlTG9hZCc6IHRoaXMuX3ByZXZQYWdlTG9hZFRpbWVvdXQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudDogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkIHx8IGFyZyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBpcyByZXF1aXJlZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudFN0cmluZzogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIHN0cmluZy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50TnVtYmVyOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG51bWJlci5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT09ICdudW1iZXInIHx8IGFyZyA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudEJvb2w6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoYXJnKSAhPSB0eXBlb2YodHJ1ZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIHRydWUgb3IgZmFsc2UuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWw6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoYXJnKSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mKGFyZykgIT0gdHlwZW9mKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSB0cnVlIG9yIGZhbHNlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50VGltZW91dDogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKGFyZyAmJiAodHlwZW9mKGFyZykgIT09ICdudW1iZXInIHx8IGFyZyA8IDApKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbiBuZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY29udGV4dExpc3Q6IGNvbnRleHRMaXN0LFxyXG5cclxuICAgIGFzc2VydENvbnRleHQ6IGFzeW5jIGZ1bmN0aW9uKC4uLmFsb3dlZENvbnRleHRzKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRDb250ZXh0KCk7XHJcbiAgICAgICAgY29uc3QgaXNXZWIgPSAoY29udGV4dCAmJiAoY29udGV4dC5pbmRleE9mKCdXRUJWSUVXJykgPiAtMSB8fCBjb250ZXh0LmluZGV4T2YoJ0NIUk9NSVVNJykgPiAtMSkpO1xyXG5cclxuICAgICAgICBpZiAoaXNXZWIpIHtcclxuICAgICAgICAgICAgaWYgKGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LndlYikgfHwgYWxvd2VkQ29udGV4dHMuaW5jbHVkZXMoY29udGV4dExpc3QuaHlicmlkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlLCBhbGwgaXMgb2tcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBjb250ZXh0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoYWxvd2VkQ29udGV4dHMuaW5jbHVkZXMoY29udGV4dExpc3QuYW5kcm9pZCkgfHwgYWxvd2VkQ29udGV4dHMuaW5jbHVkZXMoY29udGV4dExpc3QuaW9zKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlLCBhbGwgaXMgb2tcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBjb250ZXh0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFdkaW9Mb2NhdG9yOiBmdW5jdGlvbihsb2NhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFsb2NhdG9yKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgYXJndW1lbnQgLSBsb2NhdG9yIG5vdCBzcGVjaWZpZWQnKTtcclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG9jYXRvciA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignLycpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSB4cGF0aCBsb2NhdG9yIGFzIGlzXHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdpZD0nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBYUGF0aCBpbnN0ZWFkIG9mIENTUyBmb3IgYnJvd3NlciB0ZXN0cywgc2luY2UgSUQgY2FuIGNvbnRhaW4gaWxsZWdhbCBjaGFyYWN0ZXJzXHJcbiAgICAgICAgICAgIC8vIGFuZCBlc2NhcGluZyBkb2Vzbid0IHdvcmsgcmVsaWFibHkgb3IgaW4gaWRlbnRpY2FsIG1hbm5lciBpbiBhbGwgYnJvd3NlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAvLypbQGlkPVwiJHtsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpfVwiXWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyMnICsgbG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ25hbWU9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnW25hbWU9XCInICsgbG9jYXRvci5zdWJzdHIoJ25hbWU9Jy5sZW5ndGgpICsgJ1wiXSc7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdsaW5rPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJz0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluay1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICcqPScgKyBsb2NhdG9yLnN1YnN0cignbGluaz0nLmxlbmd0aCk7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdjc3M9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yLnN1YnN0cignY3NzPScubGVuZ3RoKTsgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgY3NzLCBqdXN0IHJlbW92ZSBjc3M9IHByZWZpeFxyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZigndGFnPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJzwnICsgbG9jYXRvci5zdWJzdHIoJ3RhZz0nLmxlbmd0aCkgKyAnIC8+JztcclxuXHJcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldExvZ1R5cGVzOiBmdW5jdGlvbihjb250ZXh0KSB7XHJcbiAgICAgICAgaWYgKGNvbnRleHQgPT09ICdOQVRJVkVfQVBQJykge1xyXG4gICAgICAgICAgICByZXR1cm4gWydsb2djYXQnLCAnYnVncmVwb3J0JywgJ3NlcnZlciddO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbJ2Jyb3dzZXInLCAnZHJpdmVyJ107XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBwcm92aWRlcjogcHJvdmlkZXJzLFxyXG5cclxuICAgIGRldGVybWluZVByb3ZpZGVyOiBmdW5jdGlvbih3ZGlvT3B0cykge1xyXG4gICAgICAgIGlmICghd2Rpb09wdHMgfHwgIXdkaW9PcHRzLmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSB8fCAod2Rpb09wdHMuaG9zdG5hbWUgJiYgd2Rpb09wdHMuaG9zdG5hbWUuaW5jbHVkZXMoJ3BlcmZlY3RvbW9iaWxlLmNvbScpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLlBFUkZFQ1RPO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuQlJPV1NFUlNUQUNLO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5TQVVDRUxBQlM7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZGlvT3B0cy5ob3N0bmFtZS5pbmNsdWRlcygnbGFtYmRhdGVzdCcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuTEFNQkRBVEVTVDtcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5URVNUSU5HQk9UO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIGhhc0NpcmN1bGFyRGVwZW5kZW5jeTogZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9iaik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoU3RyaW5nKGUpLmluY2x1ZGVzKCdDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OJykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRDaXJjdWxhcjogZnVuY3Rpb24ob2JqKSB7XHJcbiAgICAgICAgY29uc3QgaGFzQ2lyY3VsYXJEZXBlbmRlbmN5ID0gdGhpcy5oYXNDaXJjdWxhckRlcGVuZGVuY3kob2JqKTtcclxuICAgICAgICBpZiAoaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQ0lSQ1VMQVJfRVJST1IsIGhhc0NpcmN1bGFyRGVwZW5kZW5jeSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBuZXdWaWRlb0F0dGFjaG1lbnQ6IChmaWxlTmFtZSwgdmlkZW9VcmwpID0+ICh7XHJcbiAgICAgICAgaWQ6IHYxKCksXHJcbiAgICAgICAgZmlsZU5hbWUsXHJcbiAgICAgICAgdHlwZTogJ3ZpZGVvJyxcclxuICAgICAgICBzdWJ0eXBlOiAnc2NyZWVuY2FzdCcsXHJcbiAgICAgICAgX3VybDogdmlkZW9VcmwsXHJcbiAgICB9KSxcclxuXHJcbiAgICBvdmVyd3JpdGVXZGlvQ29tbWFuZHM6IGFzeW5jIGZ1bmN0aW9uKGRyaXZlcikge1xyXG4gICAgICAgIC8vIGlmIGVsZW1lbnQgY29tbWFuZCBpcyBpbnZva2VkIGRpcmVjdGx5IGZyb20gdXNlciBzY3JpcHQgYW5kIGVycm9yIGhhcHBlbnMsXHJcbiAgICAgICAgLy8gaXQgd29uJ3QgYmUgY2F1Z2h0IGFuZCB3aWxsIGxlYWQgdG8gdW5oYW5kbGVkUmVqZWN0aW9uIChzaW5jZSBpdCdzIGV4ZWN1dGVkIGluIGFzeW5jIG1hbm5lciB3aXRob3V0IGF3YWl0aW5nKSBhbmQgdGVzdCByZXN1bHRzIHdpbGwgYmUgbG9zdC5cclxuXHJcbiAgICAgICAgLy8gZS5nLlxyXG4gICAgICAgIC8vIHZhciBlbCA9IHdlYi5maW5kRWxlbWVudCgnaWQ9Zm9vJyk7XHJcbiAgICAgICAgLy8gZWwuY2xpY2soKTsgLy8gaWYgZWxlbWVudCBpcyBub3QgdmlzaWJsZSB0aGVuIGNsaWNrIHdpbGwgdGhyb3cgZXZlbnR1YWxseVxyXG5cclxuICAgICAgICAvLyB0aGVyZWZvcmUgd2Ugd3JhcCBhbGwgd2RpbyBjb21tYW5kcyB0byBtYWtlIHRoZW0gZXhlY3V0ZSBzeW5jaHJvbm91c2x5LlxyXG4gICAgICAgIC8vIFAuUy4gaXQgd291bGQgYmUgYmV0dGVyIHRvIGRpc2FsbG93IHVzZXJzIGZyb20gdXNpbmcgd2RpbyBlbGVtZW50IGNvbW1hbmRzIGRpcmVjdGx5IHNpbmNlIHRoZXkgYXJlIG5vdCBkaXNwbGF5ZWQgaW4gbG9ncyBvciByZXN1bHRzLlxyXG4gICAgICAgIC8vIGJ1dCB3ZSBoYXZlIG5vIHdheSBkZXRlcm1pbmluZyB3aGV0aGVyIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGZyb20gdXNlciBzY3JpcHQgb3IgZnJvbSBveHlnZW4gaW50ZXJuYWxzLi4uXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNtZCBvZiBjbWRzVG9PdmVyd3JpdGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHJpdmVyLm92ZXJ3cml0ZUNvbW1hbmQoY21kLCBmdW5jdGlvbiAob3JpZ0Z1bmMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnRnVuYy5hcHBseSh1bmRlZmluZWQsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XHJcbiAgICAgICAgICAgIH0sIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuIl19
468
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfT3h5Z2VuRXJyb3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImVyckhlbHBlciIsInYxIiwicHJvdmlkZXJzIiwiUEVSRkVDVE8iLCJCUk9XU0VSU1RBQ0siLCJTQVVDRUxBQlMiLCJMQU1CREFURVNUIiwiVEVTVElOR0JPVCIsImNvbnRleHRMaXN0IiwiYW5kcm9pZCIsImlvcyIsImh5YnJpZCIsIndlYiIsImNtZHNUb092ZXJ3cml0ZSIsImlzRWxlbWVudE5vdEZvdW5kIiwiZWwiLCJyZXN1bHQiLCJlcnJvciIsIm1lc3NhZ2UiLCJzdGFydHNXaXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1hdGNoUGF0dGVybiIsInZhbCIsInBhdHRlcm4iLCJnbG9iVG9SZWdleCIsInRvU3RyaW5nIiwicmVwbGFjZSIsInJlZ2V4IiwiaW5kZXhPZiIsIlJlZ0V4cCIsInN1YnN0cmluZyIsImxlbmd0aCIsInRlc3QiLCJmbGFncyIsImdldEVsZW1lbnQiLCJsb2NhdG9yIiwid2FpdEZvclZpc2libGUiLCJ0aW1lb3V0IiwidGhyb3dFeGNlcHRpb24iLCJzZXRUaW1lb3V0SW1wbGljaXQiLCJjYWxsIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaGVscGVycyIsImdldFdkaW9Mb2NhdG9yIiwiZHJpdmVyIiwiJCIsImVsZW1lbnROb3RGb3VuZCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiRUxFTUVOVF9OT1RfRk9VTkQiLCJ3YWl0Rm9yRGlzcGxheWVkIiwid2FpdEZvclRpbWVvdXQiLCJpbmNsdWRlcyIsIkVMRU1FTlRfTk9UX1ZJU0lCTEUiLCJnZXRFbGVtZW50cyIsImVscyIsIiQkIiwiZWxlbWVudHNOb3RGb3VuZCIsImdldENoaWxkRWxlbWVudCIsInBhcmVudEVsZW1lbnQiLCJTQ1JJUFRfRVJST1IiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2VsZW5pdW1UaW1lb3V0Iiwic2VsZW5pdW1Ccm93c2VyVGltZW91dCIsInRpbWVvdXRzIiwiY2FwYWJpbGl0aWVzIiwiYnJvd3Nlck5hbWUiLCJnZXRUaW1lb3V0cyIsInN0b3BVcmwiLCJjb25zb2xlIiwibG9nIiwiaW1wbGljaXQiLCJfcHJldkltcGxpY2l0VGltZW91dCIsInBhZ2VMb2FkIiwiX3ByZXZQYWdlTG9hZFRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiYXNzZXJ0QXJndW1lbnQiLCJhcmciLCJ1bmRlZmluZWQiLCJhc3NlcnRBcmd1bWVudFN0cmluZyIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydENvbnRleHQiLCJhbG93ZWRDb250ZXh0cyIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwiaXNXZWIiLCJzdWJzdHIiLCJnZXRMb2dUeXBlcyIsInByb3ZpZGVyIiwiZGV0ZXJtaW5lUHJvdmlkZXIiLCJ3ZGlvT3B0cyIsImhvc3RuYW1lIiwiaGFzQ2lyY3VsYXJEZXBlbmRlbmN5Iiwib2JqIiwiSlNPTiIsInN0cmluZ2lmeSIsIlN0cmluZyIsImFzc2VydENpcmN1bGFyIiwiQ0lSQ1VMQVJfRVJST1IiLCJuZXdWaWRlb0F0dGFjaG1lbnQiLCJmaWxlTmFtZSIsInZpZGVvVXJsIiwiaWQiLCJ0eXBlIiwic3VidHlwZSIsIl91cmwiLCJvdmVyd3JpdGVXZGlvQ29tbWFuZHMiLCJjbWQiLCJvdmVyd3JpdGVDb21tYW5kIiwib3JpZ0Z1bmMiLCJhcHBseSIsInNsaWNlIiwiYXJndW1lbnRzIiwiZW5yaWNoUHJvdmlkZXJXZGlvT3B0aW9ucyIsInByb3ZpZGVyTmFtZSIsIm1heEluc3RhbmNlcyIsInBhdGgiLCJwb3J0IiwicHJvdG9jb2wiLCJvcGVuRGV2aWNlVGltZW91dCIsIm1hbnVmYWN0dXJlciIsIm1vZGVsIiwiaG9zdCIsImJzT3B0aW9ucyIsImRldmljZU5hbWUiLCJvc05hbWUiLCJvcyIsInJlYWxNb2JpbGUiLCJ0b0xvd2VyQ2FzZSIsInBsYXRmb3JtTmFtZSIsImNhcE5hbWUiLCJic0NhcE5hbWUiLCJ2aWRlbyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuY29uc3QgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5jb25zdCB7IHYxIH0gPSByZXF1aXJlKCd1dWlkJyk7XHJcblxyXG5jb25zdCBwcm92aWRlcnMgPSB7XHJcbiAgICBQRVJGRUNUTzogJ3BlcmZlY3RvJyxcclxuICAgIEJST1dTRVJTVEFDSzogJ2Jyb3dzZXJzdGFjaycsXHJcbiAgICBTQVVDRUxBQlM6ICdzYXVjZScsXHJcbiAgICBMQU1CREFURVNUOiAnbGFtYmRhJyxcclxuICAgIFRFU1RJTkdCT1Q6ICd0ZXN0aW5nYm90J1xyXG59O1xyXG5cclxuY29uc3QgY29udGV4dExpc3QgPSB7XHJcbiAgICBhbmRyb2lkOiAnYW5kcm9pZCcsXHJcbiAgICBpb3M6ICdpb3MnLFxyXG4gICAgaHlicmlkOiAnaHlicmlkJyxcclxuICAgIHdlYjogJ3dlYidcclxufTtcclxuXHJcbmNvbnN0IGNtZHNUb092ZXJ3cml0ZSA9IFsnJCQnLCAnJCcsJ2FkZFZhbHVlJywnY2xlYXJWYWx1ZScsJ2NsaWNrJywnZG91YmxlQ2xpY2snLCdkcmFnQW5kRHJvcCcsJ2dldEF0dHJpYnV0ZScsJ2dldENTU1Byb3BlcnR5JywnZ2V0Q29tcHV0ZWRMYWJlbCcsJ2dldENvbXB1dGVkUm9sZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAnZ2V0SFRNTCcsJ2dldExvY2F0aW9uJywnZ2V0UHJvcGVydHknLCdnZXRTaXplJywnZ2V0VGFnTmFtZScsJ2dldFRleHQnLCdnZXRWYWx1ZScsJ2lzQ2xpY2thYmxlJywnaXNEaXNwbGF5ZWQnLCdpc0Rpc3BsYXllZEluVmlld3BvcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRW5hYmxlZCcsJ2lzRXF1YWwnLCdpc0V4aXN0aW5nJywnaXNGb2N1c2VkJywnaXNTZWxlY3RlZCcsJ21vdmVUbycsJ25leHRFbGVtZW50JywncGFyZW50RWxlbWVudCcsJ3ByZXZpb3VzRWxlbWVudCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAncmVhY3QkJCcsJ3JlYWN0JCcsJ3NhdmVTY3JlZW5zaG90Jywnc2Nyb2xsSW50b1ZpZXcnLCdzZWxlY3RCeUF0dHJpYnV0ZScsJ3NlbGVjdEJ5SW5kZXgnLCdzZWxlY3RCeVZpc2libGVUZXh0Jywnc2V0VmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYWRvdyQkJywnc2hhZG93JCcsJ3RvdWNoQWN0aW9uJywnd2FpdEZvckNsaWNrYWJsZScsJ3dhaXRGb3JEaXNwbGF5ZWQnLCd3YWl0Rm9yRW5hYmxlZCcsJ3dhaXRGb3JFeGlzdCcsJ3dhaXRVbnRpbCddO1xyXG5cclxuY29uc3QgaXNFbGVtZW50Tm90Rm91bmQgPSAoZWwpID0+IHtcclxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuICAgIGlmIChcclxuICAgICAgICBlbC5lcnJvciAmJiAoXHJcbiAgICAgICAgZWwuZXJyb3IuZXJyb3IgPT09ICdubyBzdWNoIGVsZW1lbnQnIHx8XHJcbiAgICAgICAgKGVsLmVycm9yLm1lc3NhZ2UgJiYgLyogd2luYXBwZHJpdmVyIHdpbi5yaWdodENsaWNrICovIGVsLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnbm8gc3VjaCBlbGVtZW50JykgfHxcclxuICAgICAgICBlbC5lcnJvci5tZXNzYWdlICYmIC8qIHdpbmFwcGRyaXZlciAqLyBlbC5lcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0FuIGVsZW1lbnQgY291bGQgbm90IGJlIGxvY2F0ZWQnKSkpXHJcbiAgICApIHtcclxuICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgbWF0Y2hQYXR0ZXJuOiBmdW5jdGlvbih2YWwsIHBhdHRlcm4pIHtcclxuICAgICAgICBpZiAoIXZhbCAmJiAhcGF0dGVybikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBnbG9iVG9SZWdleCA9IHJlcXVpcmUoJ2dsb2ItdG8tcmVnZXhwJyk7XHJcbiAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4udG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XHJcblxyXG4gICAgICAgIHZhciByZWdleDtcclxuICAgICAgICBpZiAocGF0dGVybi5pbmRleE9mKCdyZWdleDonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdXNpbmcgYSByZWd1bGFyLWV4cHJlc3Npb25cclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4uc3Vic3RyaW5nKCdyZWdleDonLmxlbmd0aCksICdnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHZhbCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLmluZGV4T2YoJ3JlZ2V4aTonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIHVzaW5nIGEgY2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyLWV4cHJlc3Npb25cclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4uc3Vic3RyaW5nKCdyZWdleGk6Jy5sZW5ndGgpLCAnaWcnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZignZXhhY3Q6JykgPT0gMCB8fCBwYXR0ZXJuID09PSAnJykgeyAgLy8gbWF0Y2ggYSBzdHJpbmcgZXhhY3RseSwgdmVyYmF0aW1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4uc3Vic3RyaW5nKCdleGFjdDonLmxlbmd0aCkgPT09IHZhbDtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZignZ2xvYjonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIGNhc2UtaW5zZW5zaXRpdmUgXCJnbG9iXCIgcGF0dGVyblxyXG4gICAgICAgICAgICByZWdleCA9IGdsb2JUb1JlZ2V4KHBhdHRlcm4uc3Vic3RyaW5nKCdnbG9iOicubGVuZ3RoKSwgeyBmbGFnczogJ2lnJyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJlZml4IHNhbWUgYXMgZ2xvYiBtYXRjaGluZ1xyXG4gICAgICAgICAgICByZWdleCA9IGdsb2JUb1JlZ2V4KHBhdHRlcm4sIHsgZmxhZ3M6ICdpZycgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRFbGVtZW50OiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCB3YWl0Rm9yVmlzaWJsZSwgdGltZW91dCwgdGhyb3dFeGNlcHRpb24gPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZWw7XHJcbiAgICAgICAgaWYgKGxvY2F0b3IgJiYgbG9jYXRvci5jb25zdHJ1Y3RvciAmJiBsb2NhdG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdFbGVtZW50Jykge1xyXG4gICAgICAgICAgICBlbCA9IGxvY2F0b3I7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuICAgICAgICAgICAgZWwgPSBhd2FpdCB0aGlzLmRyaXZlci4kKGxvY2F0b3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudE5vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWwpO1xyXG4gICAgICAgIGlmIChlbGVtZW50Tm90Rm91bmQpIHtcclxuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfRk9VTkQsIGBVbmFibGUgdG8gZmluZCBlbGVtZW50OiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2FpdEZvclZpc2libGUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGVsLndhaXRGb3JEaXNwbGF5ZWQoeyB0aW1lb3V0OnRpbWVvdXQgPyB0aW1lb3V0IDogdGhpcy53YWl0Rm9yVGltZW91dH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbiAmJiBlLm1lc3NhZ2UgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdzdGlsbCBub3QgZGlzcGxheWVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX1ZJU0lCTEUsIGBFbGVtZW50IG5vdCB2aXNpYmxlOiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJvd0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVsO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRFbGVtZW50czogYXN5bmMgZnVuY3Rpb24obG9jYXRvciwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVscyA9IFtdO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbHMgPSBhd2FpdCB0aGlzLmRyaXZlci4kJCh0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcikpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNOb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVscyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50c05vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVscztcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q2hpbGRFbGVtZW50OiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCBwYXJlbnRFbGVtZW50LCB3YWl0Rm9yVmlzaWJsZSwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuXHJcbiAgICAgICAgaWYgKCEocGFyZW50RWxlbWVudCAmJiBwYXJlbnRFbGVtZW50LiQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBhcmd1bWVudCAtIHBhcmVudEVsZW1lbnQsIG11c3QgYmUgYSB2YWxpZCBlbGVtZW50Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZWwgPSBhd2FpdCBwYXJlbnRFbGVtZW50LiQobG9jYXRvcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnROb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVsKTtcclxuICAgICAgICBpZiAoZWxlbWVudE5vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9GT1VORCwgYFVuYWJsZSB0byBmaW5kIGVsZW1lbnQ6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3YWl0Rm9yVmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZWwud2FpdEZvckRpc3BsYXllZCh7IHRpbWVvdXQ6IHRpbWVvdXQgPyB0aW1lb3V0IDogdGhpcy53YWl0Rm9yVGltZW91dH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdzdGlsbCBub3QgZGlzcGxheWVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX1ZJU0lCTEUsIGBFbGVtZW50IG5vdCB2aXNpYmxlOiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENoaWxkRWxlbWVudHM6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHBhcmVudEVsZW1lbnQsIHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cy5zZXRUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzLCB0aW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2F0b3IgPSB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcik7XHJcblxyXG4gICAgICAgIGlmICghKHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudC4kJCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gcGFyZW50RWxlbWVudCwgbXVzdCBiZSBhIHZhbGlkIGVsZW1lbnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbHMgPSBbXTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbHMgPSBhd2FpdCBwYXJlbnRFbGVtZW50LiQkKGxvY2F0b3IpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNOb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVscyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50c05vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWxzO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRUaW1lb3V0SW1wbGljaXQ6IGFzeW5jIGZ1bmN0aW9uKHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZHJpdmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgJiYgdGltZW91dCA+IHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCAqIDEwMDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIGB0aW1lb3V0IG11c3QgYmUgbGVzcyB0aGFuICR7dGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ICogMTAwMH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgJiYgdGltZW91dCA+IHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgKiAxMDAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgdGltZW91dCBtdXN0IGJlIGxlc3MgdGhhbiAke3RoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgKiAxMDAwfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVvdXRzO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJlxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPT09ICdNaWNyb3NvZnRFZGdlJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIG9uIEVkZ2VcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIuZ2V0VGltZW91dHMpIHtcclxuICAgICAgICAgICAgLy8gY2hyb21lID49IDc1XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLnN0b3BVcmwgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuc3RvcFVybC5pbmNsdWRlcygncGVyZmVjdG9tb2JpbGUuY29tJylcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGltZW91dHMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gZmFpbHMgb24gcGVyZmVjdG8gbW9iaWxlXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0VGltZW91dHMgZXJyb3InLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy50aW1lb3V0cykge1xyXG4gICAgICAgICAgICAvLyBjaHJvbWUgPj0gNzIgJiYgY2hyb21lIDwgNzVcclxuICAgICAgICAgICAgdGltZW91dHMgPSB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMudGltZW91dHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dHMgJiYgdGltZW91dHMuaW1wbGljaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldkltcGxpY2l0VGltZW91dCA9IHRpbWVvdXRzLmltcGxpY2l0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZW91dHMgJiYgdGltZW91dHMucGFnZUxvYWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldlBhZ2VMb2FkVGltZW91dCA9IHRpbWVvdXRzLnBhZ2VMb2FkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIuc2V0VGltZW91dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYnJvd3Nlck5hbWUgJ2RlZmF1bHQnIG9uIGFuZHJvaWQgXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHtcclxuICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQnOiB0aW1lb3V0LFxyXG4gICAgICAgICAgICAgICAgICAgICdwYWdlTG9hZCc6IHRpbWVvdXRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGltZW91dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICByZXN0b3JlVGltZW91dEltcGxpY2l0OiBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5fcHJldkltcGxpY2l0VGltZW91dCAmJiB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLl9wcmV2SW1wbGljaXRUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcHJldlBhZ2VMb2FkVGltZW91dCAmJiB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAncGFnZUxvYWQnOiB0aGlzLl9wcmV2UGFnZUxvYWRUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnQ6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgaXMgcmVxdWlyZWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRTdHJpbmc6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBzdHJpbmcuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZzogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudE51bWJlcjogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRCb29sOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT0gdHlwZW9mKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSB0cnVlIG9yIGZhbHNlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZihhcmcpICE9IHR5cGVvZih0cnVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgdHJ1ZSBvciBmYWxzZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudFRpbWVvdXQ6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgJiYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24gbmVnYXRpdmUgbnVtYmVyLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNvbnRleHRMaXN0OiBjb250ZXh0TGlzdCxcclxuXHJcbiAgICBhc3NlcnRDb250ZXh0OiBhc3luYyBmdW5jdGlvbiguLi5hbG93ZWRDb250ZXh0cykge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0Q29udGV4dCgpO1xyXG4gICAgICAgIGNvbnN0IGlzV2ViID0gKGNvbnRleHQgJiYgKGNvbnRleHQuaW5kZXhPZignV0VCVklFVycpID4gLTEgfHwgY29udGV4dC5pbmRleE9mKCdDSFJPTUlVTScpID4gLTEpKTtcclxuXHJcbiAgICAgICAgaWYgKGlzV2ViKSB7XHJcbiAgICAgICAgICAgIGlmIChhbG93ZWRDb250ZXh0cy5pbmNsdWRlcyhjb250ZXh0TGlzdC53ZWIpIHx8IGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0Lmh5YnJpZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWxsIGlzIG9rXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgY29udGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LmFuZHJvaWQpIHx8IGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LmlvcykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWxsIGlzIG9rXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgY29udGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRXZGlvTG9jYXRvcjogZnVuY3Rpb24obG9jYXRvcikge1xyXG4gICAgICAgIGlmICghbG9jYXRvcilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gbG9jYXRvciBub3Qgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvY2F0b3IgPT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJy8nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgeHBhdGggbG9jYXRvciBhcyBpc1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignaWQ9JykgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgWFBhdGggaW5zdGVhZCBvZiBDU1MgZm9yIGJyb3dzZXIgdGVzdHMsIHNpbmNlIElEIGNhbiBjb250YWluIGlsbGVnYWwgY2hhcmFjdGVyc1xyXG4gICAgICAgICAgICAvLyBhbmQgZXNjYXBpbmcgZG9lc24ndCB3b3JrIHJlbGlhYmx5IG9yIGluIGlkZW50aWNhbCBtYW5uZXIgaW4gYWxsIGJyb3dzZXJcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJiB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgLy8qW0BpZD1cIiR7bG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKX1cIl1gO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcjJyArIGxvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCduYW1lPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJ1tuYW1lPVwiJyArIGxvY2F0b3Iuc3Vic3RyKCduYW1lPScubGVuZ3RoKSArICdcIl0nO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluaz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICc9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbmstY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnKj0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignY3NzPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvci5zdWJzdHIoJ2Nzcz0nLmxlbmd0aCk7ICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGNzcywganVzdCByZW1vdmUgY3NzPSBwcmVmaXhcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3RhZz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICc8JyArIGxvY2F0b3Iuc3Vic3RyKCd0YWc9Jy5sZW5ndGgpICsgJyAvPic7XHJcblxyXG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRMb2dUeXBlczogZnVuY3Rpb24oY29udGV4dCkge1xyXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnTkFUSVZFX0FQUCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsnbG9nY2F0JywgJ2J1Z3JlcG9ydCcsICdzZXJ2ZXInXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gWydicm93c2VyJywgJ2RyaXZlciddO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgcHJvdmlkZXI6IHByb3ZpZGVycyxcclxuXHJcbiAgICBkZXRlcm1pbmVQcm92aWRlcjogZnVuY3Rpb24od2Rpb09wdHMpIHtcclxuICAgICAgICBpZiAoIXdkaW9PcHRzIHx8ICF3ZGlvT3B0cy5jYXBhYmlsaXRpZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10gfHwgKHdkaW9PcHRzLmhvc3RuYW1lICYmIHdkaW9PcHRzLmhvc3RuYW1lLmluY2x1ZGVzKCdwZXJmZWN0b21vYmlsZS5jb20nKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5QRVJGRUNUTztcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLkJST1dTRVJTVEFDSztcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snc2F1Y2U6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuU0FVQ0VMQUJTO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuaG9zdG5hbWUuaW5jbHVkZXMoJ2xhbWJkYXRlc3QnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLkxBTUJEQVRFU1Q7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuVEVTVElOR0JPVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICBoYXNDaXJjdWxhckRlcGVuZGVuY3k6IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvYmopO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKFN0cmluZyhlKS5pbmNsdWRlcygnQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTicpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0Q2lyY3VsYXI6IGZ1bmN0aW9uKG9iaikge1xyXG4gICAgICAgIGNvbnN0IGhhc0NpcmN1bGFyRGVwZW5kZW5jeSA9IHRoaXMuaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KG9iaik7XHJcbiAgICAgICAgaWYgKGhhc0NpcmN1bGFyRGVwZW5kZW5jeSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkNJUkNVTEFSX0VSUk9SLCBoYXNDaXJjdWxhckRlcGVuZGVuY3kpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgbmV3VmlkZW9BdHRhY2htZW50OiAoZmlsZU5hbWUsIHZpZGVvVXJsKSA9PiAoe1xyXG4gICAgICAgIGlkOiB2MSgpLFxyXG4gICAgICAgIGZpbGVOYW1lLFxyXG4gICAgICAgIHR5cGU6ICd2aWRlbycsXHJcbiAgICAgICAgc3VidHlwZTogJ3NjcmVlbmNhc3QnLFxyXG4gICAgICAgIF91cmw6IHZpZGVvVXJsLFxyXG4gICAgfSksXHJcblxyXG4gICAgb3ZlcndyaXRlV2Rpb0NvbW1hbmRzOiBhc3luYyBmdW5jdGlvbihkcml2ZXIpIHtcclxuICAgICAgICAvLyBpZiBlbGVtZW50IGNvbW1hbmQgaXMgaW52b2tlZCBkaXJlY3RseSBmcm9tIHVzZXIgc2NyaXB0IGFuZCBlcnJvciBoYXBwZW5zLFxyXG4gICAgICAgIC8vIGl0IHdvbid0IGJlIGNhdWdodCBhbmQgd2lsbCBsZWFkIHRvIHVuaGFuZGxlZFJlamVjdGlvbiAoc2luY2UgaXQncyBleGVjdXRlZCBpbiBhc3luYyBtYW5uZXIgd2l0aG91dCBhd2FpdGluZykgYW5kIHRlc3QgcmVzdWx0cyB3aWxsIGJlIGxvc3QuXHJcblxyXG4gICAgICAgIC8vIGUuZy5cclxuICAgICAgICAvLyB2YXIgZWwgPSB3ZWIuZmluZEVsZW1lbnQoJ2lkPWZvbycpO1xyXG4gICAgICAgIC8vIGVsLmNsaWNrKCk7IC8vIGlmIGVsZW1lbnQgaXMgbm90IHZpc2libGUgdGhlbiBjbGljayB3aWxsIHRocm93IGV2ZW50dWFsbHlcclxuXHJcbiAgICAgICAgLy8gdGhlcmVmb3JlIHdlIHdyYXAgYWxsIHdkaW8gY29tbWFuZHMgdG8gbWFrZSB0aGVtIGV4ZWN1dGUgc3luY2hyb25vdXNseS5cclxuICAgICAgICAvLyBQLlMuIGl0IHdvdWxkIGJlIGJldHRlciB0byBkaXNhbGxvdyB1c2VycyBmcm9tIHVzaW5nIHdkaW8gZWxlbWVudCBjb21tYW5kcyBkaXJlY3RseSBzaW5jZSB0aGV5IGFyZSBub3QgZGlzcGxheWVkIGluIGxvZ3Mgb3IgcmVzdWx0cy5cclxuICAgICAgICAvLyBidXQgd2UgaGF2ZSBubyB3YXkgZGV0ZXJtaW5pbmcgd2hldGhlciBjb21tYW5kIHdhcyBleGVjdXRlZCBmcm9tIHVzZXIgc2NyaXB0IG9yIGZyb20gb3h5Z2VuIGludGVybmFscy4uLlxyXG5cclxuICAgICAgICBmb3IgKGxldCBjbWQgb2YgY21kc1RvT3ZlcndyaXRlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGRyaXZlci5vdmVyd3JpdGVDb21tYW5kKGNtZCwgZnVuY3Rpb24gKG9yaWdGdW5jKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ0Z1bmMuYXBwbHkodW5kZWZpbmVkLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xyXG4gICAgICAgICAgICB9LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGVucmljaFByb3ZpZGVyV2Rpb09wdGlvbnM6IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgd2Rpb09wdHMpIHtcclxuICAgICAgICBsZXQgbmFtZSA9ICduYW1lJztcclxuICAgICAgICBpZiAocHJvdmlkZXJOYW1lID09PSBwcm92aWRlcnMuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1heEluc3RhbmNlcyA9IDE7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBhdGggPSAnL25leHBlcmllbmNlL3BlcmZlY3RvbW9iaWxlL3dkL2h1Yic7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBvcnQgPSA4MDtcclxuICAgICAgICAgICAgd2Rpb09wdHMucHJvdG9jb2wgPSAnaHR0cCc7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLm9wZW5EZXZpY2VUaW1lb3V0ID0gMTU7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1hbnVmYWN0dXJlcjtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5tb2RlbDtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5ob3N0O1xyXG5cclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyTmFtZSA9PT0gcHJvdmlkZXJzLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICBjb25zdCBic09wdGlvbnMgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ107XHJcbiAgICAgICAgICAgIGlmIChic09wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZU5hbWUgPSBic09wdGlvbnMuZGV2aWNlTmFtZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9zTmFtZSA9IGJzT3B0aW9ucy5vcztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJzT3B0aW9ucy5yZWFsTW9iaWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10gPSBkZXZpY2VOYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGZvciBtb2JpbGUgYnJvd3NlciB0ZXN0LCBib3RoIGJvcndzZXJOYW1lIGFuZCBhcHBpdW06ZGV2aWNlTmFtZSB3aWxsIGJlIHNldFxyXG4gICAgICAgICAgICAgICAgLy8gaG93ZXZlciBmb3IgQlMgdG8gd29yayBpdCBhbHNvIGV4cGVjdHMgYnN0YWNrOm9wdGlvbnMuZGV2aWNlTmFtZVxyXG4gICAgICAgICAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2FwcGl1bTpkZXZpY2VOYW1lJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMuZGV2aWNlTmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmRldmljZU5hbWUnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgYXV0b21hdGlvbk5hbWUgQXBwaXVtIGNhcGFiaWxpdHlcclxuICAgICAgICAgICAgICAgIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhbmRyb2lkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWUgPSAnQW5kcm9pZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06YXV0b21hdGlvbk5hbWUnXSA9ICdVSUF1dG9tYXRvcjInO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpb3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZSA9ICdpT1MnO1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmF1dG9tYXRpb25OYW1lJ10gPSAnWENVSVRlc3QnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG1lcmdlIHVzZXItcHJvdmlkZWQgQlMgb3B0aW9ucyBpbnRvIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXBOYW1lIGluIHdkaW9PcHRzLmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXBOYW1lLnN0YXJ0c1dpdGgoJ2JzdGFjazonKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBic0NhcE5hbWUgPSBjYXBOYW1lLnN1YnN0cmluZygnYnN0YWNrOicubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChic0NhcE5hbWUgPT09ICdvcHRpb25zJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uIG5lZWRzIHRvIGJlIHJlbW92ZWQgZXZlbnR1YWxseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnNDYXBOYW1lID09PSAncmVjb3JkVmlkZW8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMudmlkZW8gPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbY2FwTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJzT3B0aW9uc1tic0NhcE5hbWVdID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddICYmIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcbn07XHJcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsSUFBQUEsWUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQTRDLFNBQUFELHVC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