oxygen-cli 1.40.2 → 1.42.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 +13 -0
  2. package/build/core/OxygenCore.js +41 -274
  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 +2 -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 +51 -82
  15. package/build/index.js +8 -22
  16. package/build/lib/cli-util.js +39 -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 +4 -75
  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 +21 -34
  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 +74 -216
  122. package/build/ox_modules/module-mongo.js +265 -0
  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 +112 -232
  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 +91 -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 +2 -91
  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 +14 -120
  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 +5 -1
@@ -3,60 +3,45 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.OXYGEN_PAGE_OBJECT_FILE_NAME = exports.OXYGEN_ENV_FILE_NAME = exports.OXYGEN_CONFIG_FILE_NAME = exports.DEFAULT_REPORTER = void 0;
6
7
  exports.generateTestOptions = generateTestOptions;
7
- exports.loadSuites = loadSuites;
8
- exports.loadSuiteDefinitionsFromFolder = loadSuiteDefinitionsFromFolder;
8
+ exports.getCommandLineOptions = getCommandLineOptions;
9
+ exports.getConfigurations = getConfigurations;
10
+ exports.getEnvironments = getEnvironments;
9
11
  exports.getPageObjectFilePath = getPageObjectFilePath;
10
12
  exports.loadEnvironmentVariables = loadEnvironmentVariables;
11
- exports.getEnvironments = getEnvironments;
12
- exports.getConfigurations = getConfigurations;
13
- exports.getCommandLineOptions = getCommandLineOptions;
13
+ exports.loadSuiteDefinitionsFromFolder = loadSuiteDefinitionsFromFolder;
14
+ exports.loadSuites = loadSuites;
14
15
  exports.processTargetPath = processTargetPath;
15
- exports.DEFAULT_REPORTER = exports.OXYGEN_PAGE_OBJECT_FILE_NAME = exports.OXYGEN_ENV_FILE_NAME = exports.OXYGEN_CONFIG_FILE_NAME = void 0;
16
-
17
16
  require("source-map-support/register");
18
-
19
17
  var _path = _interopRequireDefault(require("path"));
20
-
21
18
  var _fs = _interopRequireDefault(require("fs"));
22
-
23
19
  var _util = _interopRequireDefault(require("./util"));
24
-
25
20
  var _async = require("async");
26
-
27
21
  var _moduleRequire = _interopRequireDefault(require("./moduleRequire"));
28
-
29
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
30
-
31
- const OXYGEN_CONFIG_FILE_NAME = 'oxygen.conf';
32
- exports.OXYGEN_CONFIG_FILE_NAME = OXYGEN_CONFIG_FILE_NAME;
33
- const OXYGEN_ENV_FILE_NAME = 'oxygen.env';
34
- exports.OXYGEN_ENV_FILE_NAME = OXYGEN_ENV_FILE_NAME;
35
- const OXYGEN_PAGE_OBJECT_FILE_NAME = 'oxygen.po';
36
- exports.OXYGEN_PAGE_OBJECT_FILE_NAME = OXYGEN_PAGE_OBJECT_FILE_NAME;
37
- const DEFAULT_REPORTER = 'html';
38
- exports.DEFAULT_REPORTER = DEFAULT_REPORTER;
39
-
22
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
+ const OXYGEN_CONFIG_FILE_NAME = exports.OXYGEN_CONFIG_FILE_NAME = 'oxygen.conf';
24
+ const OXYGEN_ENV_FILE_NAME = exports.OXYGEN_ENV_FILE_NAME = 'oxygen.env';
25
+ const OXYGEN_PAGE_OBJECT_FILE_NAME = exports.OXYGEN_PAGE_OBJECT_FILE_NAME = 'oxygen.po';
26
+ const DEFAULT_REPORTER = exports.DEFAULT_REPORTER = 'html';
40
27
  async function generateTestOptions(config, argv) {
41
- const options = { ...config
28
+ const options = {
29
+ ...config
42
30
  };
43
31
  options.env = loadEnvironmentVariables(config, argv);
44
32
  options.po = getPageObjectFilePath(config, argv);
45
33
  options.suites = await loadSuites(config, argv);
46
34
  return options;
47
35
  }
48
-
49
36
  async function loadSuites(config, argv) {
50
37
  if (config.framework && typeof config.framework === 'string' && config.framework.toLowerCase() !== 'oxygen') {
51
38
  return;
52
39
  }
53
-
54
40
  const {
55
41
  target
56
42
  } = config;
57
43
  const isConfigFile = target && (target.name && target.name.indexOf(OXYGEN_CONFIG_FILE_NAME) === 0 || target.extension === '' && target.configPath && target.configPath.indexOf(OXYGEN_CONFIG_FILE_NAME) > -1);
58
44
  let suites = [];
59
-
60
45
  if (!isConfigFile) {
61
46
  if (target && target.extension === '.js') {
62
47
  suites.push(await _util.default.generateTestSuiteFromJSFile(target.path, config.parameters.file, config.parameters.mode, false, config.iterations || 1));
@@ -64,52 +49,39 @@ async function loadSuites(config, argv) {
64
49
  suites.push(await _util.default.generateTestSuiteFromJsonFile(target.path, config.parameters.file, config.parameters.mode, config));
65
50
  }
66
51
  } else {
67
- let suiteDefs = [];
68
-
69
- if (config.suites && Array.isArray(config.suites)) {
70
- suiteDefs = config.suites;
71
- }
72
-
73
- const suitesFolder = _path.default.join(target.cwd, 'suites');
74
-
75
- if (_fs.default.existsSync(suitesFolder)) {
76
- suiteDefs = [...suiteDefs, ...loadSuiteDefinitionsFromFolder(suitesFolder)];
77
- }
78
-
79
- suites = await Promise.all(suiteDefs.map(async suiteDef => await _util.default.generateTestSuiteFromJson(suiteDef, config)));
52
+ let suiteDefs = [];
53
+ if (config.suites && Array.isArray(config.suites)) {
54
+ suiteDefs = config.suites;
80
55
  }
81
-
56
+ const suitesFolder = _path.default.join(target.cwd, 'suites');
57
+ if (_fs.default.existsSync(suitesFolder)) {
58
+ suiteDefs = [...suiteDefs, ...loadSuiteDefinitionsFromFolder(suitesFolder)];
59
+ }
60
+ suites = await Promise.all(suiteDefs.map(async suiteDef => await _util.default.generateTestSuiteFromJson(suiteDef, config)));
61
+ }
82
62
  if (argv.suites && typeof argv.suites === 'string') {
83
63
  const selectedSuiteNames = argv.suites.split(',');
84
64
  suites = suites.filter(x => selectedSuiteNames.includes(x.name));
85
65
  }
86
-
87
66
  return suites;
88
67
  }
89
-
90
68
  function loadSuiteDefinitionsFromFolder(folderPath) {
91
69
  const files = _fs.default.readdirSync(folderPath);
92
-
93
70
  let suiteDefs = [];
94
71
  (0, _async.forEach)(files, file => {
95
72
  if (_path.default.extname(file) === '.json') {
96
73
  const fullPath = _path.default.join(folderPath, file);
97
-
98
74
  suiteDefs.push((0, _moduleRequire.default)(fullPath));
99
75
  }
100
76
  });
101
77
  return suiteDefs;
102
78
  }
103
-
104
79
  function getPageObjectFilePath(config, argv = {}) {
105
80
  const target = config.target || {};
106
81
  const poFileName = argv.po || `${OXYGEN_PAGE_OBJECT_FILE_NAME}.js`;
107
82
  const cwd = target.cwd || process.cwd();
108
-
109
83
  let poFilePath = _path.default.resolve(cwd, poFileName);
110
-
111
84
  poFilePath = _fs.default.existsSync(poFilePath) ? poFilePath : null;
112
-
113
85
  if (poFilePath) {
114
86
  try {
115
87
  (0, _moduleRequire.default)(poFilePath);
@@ -122,46 +94,33 @@ function getPageObjectFilePath(config, argv = {}) {
122
94
  return null;
123
95
  }
124
96
  }
125
-
126
97
  function loadEnvironmentVariables(config, argv) {
127
98
  const target = config.target || {};
128
99
  const envName = argv.env || config.environment || 'default';
129
100
  const cwd = target.cwd || process.cwd();
130
-
131
101
  const defaultEnvFile = _path.default.join(cwd, `${OXYGEN_ENV_FILE_NAME}.js`);
132
-
133
102
  if (_fs.default.existsSync(defaultEnvFile)) {
134
103
  const env = (0, _moduleRequire.default)(defaultEnvFile);
135
-
136
104
  if (env && typeof env === 'object' && Object.prototype.hasOwnProperty.call(env, envName)) {
137
105
  return env[envName];
138
106
  }
139
107
  }
140
-
141
108
  const dedicatedEnvFileJs = _path.default.join(cwd, 'env', `${envName}.js`);
142
-
143
109
  const dedicatedEnvFileJson = _path.default.join(cwd, 'env', `${envName}.json`);
144
-
145
110
  if (_fs.default.existsSync(dedicatedEnvFileJs)) {
146
111
  return (0, _moduleRequire.default)(dedicatedEnvFileJs);
147
112
  } else if (_fs.default.existsSync(dedicatedEnvFileJson)) {
148
113
  return (0, _moduleRequire.default)(dedicatedEnvFileJson);
149
114
  }
150
-
151
115
  return {};
152
116
  }
153
-
154
117
  function getEnvironments(target) {
155
118
  let targetCwd = null;
156
-
157
119
  if (target && target.cwd) {
158
120
  targetCwd = target.cwd;
159
121
  }
160
-
161
122
  const cwd = targetCwd || process.cwd();
162
-
163
123
  const defaultEnvFile = _path.default.join(cwd, `${OXYGEN_ENV_FILE_NAME}.js`);
164
-
165
124
  if (_fs.default.existsSync(defaultEnvFile)) {
166
125
  try {
167
126
  return (0, _moduleRequire.default)(defaultEnvFile);
@@ -170,17 +129,13 @@ function getEnvironments(target) {
170
129
  throw err;
171
130
  }
172
131
  }
173
-
174
132
  return {};
175
133
  }
176
-
177
134
  function getConfigurations(target, argv) {
178
135
  let targetCwd = null;
179
-
180
136
  if (target && target.cwd) {
181
137
  targetCwd = target.cwd;
182
138
  }
183
-
184
139
  const DEFAULT_OPTS = {
185
140
  cwd: target ? targetCwd || process.cwd() : process.cwd(),
186
141
  target: target,
@@ -205,7 +160,6 @@ function getConfigurations(target, argv) {
205
160
  };
206
161
  const cmdOpts = getCommandLineOptions(argv);
207
162
  let projConfigOpts = {};
208
-
209
163
  if (target && target.name === OXYGEN_CONFIG_FILE_NAME && (target.extension === '.js' || target.extension === '.json')) {
210
164
  try {
211
165
  projConfigOpts = (0, _moduleRequire.default)(target.path);
@@ -221,43 +175,37 @@ function getConfigurations(target, argv) {
221
175
  throw err;
222
176
  }
223
177
  }
224
-
225
178
  const envs = getEnvironments(target);
226
-
227
179
  if (projConfigOpts.envs) {
228
- projConfigOpts.envs = { ...projConfigOpts.envs,
180
+ projConfigOpts.envs = {
181
+ ...projConfigOpts.envs,
229
182
  ...envs
230
183
  };
231
184
  } else {
232
- projConfigOpts = { ...projConfigOpts,
185
+ projConfigOpts = {
186
+ ...projConfigOpts,
233
187
  envs: envs
234
188
  };
235
189
  }
236
-
237
190
  const isCmdOptsReportFormat = cmdOpts.reporting && cmdOpts.reporting.reporters;
238
191
  const isConfigReportFormat = projConfigOpts.reporting && projConfigOpts.reporting.reporters;
239
-
240
192
  if (!isCmdOptsReportFormat && !isConfigReportFormat) {
241
193
  if (!projConfigOpts.reporting) {
242
194
  projConfigOpts.reporting = {};
243
195
  }
244
-
245
196
  projConfigOpts.reporting.reporters = [DEFAULT_REPORTER];
246
197
  }
247
-
248
198
  let name = cmdOpts.name || projConfigOpts.name || null;
249
-
250
199
  if (!name && target) {
251
200
  name = target.name !== OXYGEN_CONFIG_FILE_NAME ? target.name : target.baseName;
252
201
  }
253
-
254
- return { ...DEFAULT_OPTS,
202
+ return {
203
+ ...DEFAULT_OPTS,
255
204
  ...projConfigOpts,
256
205
  ...cmdOpts,
257
206
  name: name
258
207
  };
259
208
  }
260
-
261
209
  function getCommandLineOptions(argv) {
262
210
  const opts = {
263
211
  name: argv.name || null,
@@ -268,46 +216,40 @@ function getCommandLineOptions(argv) {
268
216
  iterations: argv.i ? parseInt(argv.i) : argv.iter ? parseInt(argv.iter) : null,
269
217
  debugPort: argv.dbgport || null,
270
218
  wsPort: argv.wsport || null,
271
- delay: argv.d || argv.delay || null
219
+ delay: argv.d || argv.delay || null,
220
+ autoStartWebDriver: argv.autowd && argv.autowd === 'true' || false
272
221
  };
273
-
274
222
  if (argv.rf && typeof argv.rf === 'string' && argv.rf.length > 0) {
275
223
  const reportFormats = argv.rf.split(',');
276
224
  opts.reporting = {
277
225
  reporters: reportFormats
278
226
  };
279
-
280
227
  if (argv.ro && typeof argv.ro === 'string' && argv.ro.length > 0) {
281
228
  opts.reporting.outputDir = argv.ro;
282
229
  }
283
230
  }
284
-
285
231
  if (argv.p || argv.param) {
286
232
  opts.parameters = {
287
233
  file: argv.p || argv.param || null,
288
234
  mode: argv.pm || 'seq'
289
235
  };
290
236
  }
291
-
292
237
  if (argv.specs && typeof argv.specs === 'string' && argv.specs.length > 0) {
293
238
  const specs = argv.specs.split(',');
294
239
  opts.specs = specs;
295
240
  }
296
-
297
241
  if (argv.modules && typeof argv.modules === 'string' && argv.modules.length > 0) {
298
242
  const modules = argv.modules.split(',');
299
243
  opts.modules = modules;
300
244
  }
301
-
302
245
  return deleteNullProperties(opts);
303
246
  }
304
-
305
247
  function deleteNullProperties(obj) {
306
248
  if (typeof obj !== 'object') {
307
249
  return obj;
308
250
  }
309
-
310
- const clone = { ...obj
251
+ const clone = {
252
+ ...obj
311
253
  };
312
254
  const keys = Object.keys(obj);
313
255
  (0, _async.forEach)(keys, key => {
@@ -317,52 +259,44 @@ function deleteNullProperties(obj) {
317
259
  });
318
260
  return clone;
319
261
  }
320
-
321
262
  function processTargetPath(targetPath, userCwd) {
322
263
  let cwd = userCwd || process.cwd();
323
-
324
264
  if (typeof targetPath === 'undefined') {
325
265
  targetPath = cwd;
326
266
  } else {
327
- targetPath = _util.default.resolvePath(targetPath, cwd);
328
- }
329
-
267
+ targetPath = _util.default.resolvePath(targetPath, cwd);
268
+ }
330
269
  if (!_fs.default.existsSync(targetPath)) {
331
270
  return null;
332
271
  }
333
-
334
272
  const stats = _fs.default.lstatSync(targetPath);
335
-
336
273
  const isDirector = stats.isDirectory();
337
274
  let configFilePath;
338
-
339
275
  if (isDirector) {
340
276
  cwd = userCwd || targetPath;
341
277
  configFilePath = _path.default.join(targetPath, OXYGEN_CONFIG_FILE_NAME + '.js');
342
-
343
278
  if (!_fs.default.existsSync(configFilePath)) {
344
279
  configFilePath = _path.default.join(targetPath, OXYGEN_CONFIG_FILE_NAME + '.json');
345
-
346
280
  if (!_fs.default.existsSync(configFilePath)) {
347
281
  return null;
348
282
  }
349
283
  }
284
+ } else if (targetPath.endsWith(OXYGEN_CONFIG_FILE_NAME + '.js') || targetPath.endsWith(OXYGEN_CONFIG_FILE_NAME + '.json')) {
285
+ configFilePath = targetPath;
286
+ cwd = targetPath = _path.default.dirname(targetPath);
350
287
  } else {
288
+ cwd = userCwd || _path.default.dirname(targetPath);
351
289
  configFilePath = _path.default.join(cwd, OXYGEN_CONFIG_FILE_NAME + '.js');
352
-
353
290
  if (!_fs.default.existsSync(configFilePath)) {
354
291
  configFilePath = _path.default.join(cwd, OXYGEN_CONFIG_FILE_NAME + '.json');
355
-
356
292
  if (!_fs.default.existsSync(configFilePath)) {
357
293
  configFilePath = undefined;
358
294
  }
359
295
  }
360
296
  }
361
-
362
297
  if (!targetPath) {
363
298
  return null;
364
299
  }
365
-
366
300
  return {
367
301
  path: targetPath,
368
302
  configPath: configFilePath,
@@ -373,4 +307,4 @@ function processTargetPath(targetPath, userCwd) {
373
307
  extension: _path.default.extname(targetPath)
374
308
  };
375
309
  }
376
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpLXV0aWwuanMiXSwibmFtZXMiOlsiT1hZR0VOX0NPTkZJR19GSUxFX05BTUUiLCJPWFlHRU5fRU5WX0ZJTEVfTkFNRSIsIk9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUiLCJERUZBVUxUX1JFUE9SVEVSIiwiZ2VuZXJhdGVUZXN0T3B0aW9ucyIsImNvbmZpZyIsImFyZ3YiLCJvcHRpb25zIiwiZW52IiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzIiwicG8iLCJnZXRQYWdlT2JqZWN0RmlsZVBhdGgiLCJzdWl0ZXMiLCJsb2FkU3VpdGVzIiwiZnJhbWV3b3JrIiwidG9Mb3dlckNhc2UiLCJ0YXJnZXQiLCJpc0NvbmZpZ0ZpbGUiLCJuYW1lIiwiaW5kZXhPZiIsImV4dGVuc2lvbiIsImNvbmZpZ1BhdGgiLCJwdXNoIiwib3h1dGlsIiwiZ2VuZXJhdGVUZXN0U3VpdGVGcm9tSlNGaWxlIiwicGF0aCIsInBhcmFtZXRlcnMiLCJmaWxlIiwibW9kZSIsIml0ZXJhdGlvbnMiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uRmlsZSIsInN1aXRlRGVmcyIsIkFycmF5IiwiaXNBcnJheSIsInN1aXRlc0ZvbGRlciIsImpvaW4iLCJjd2QiLCJmcyIsImV4aXN0c1N5bmMiLCJsb2FkU3VpdGVEZWZpbml0aW9uc0Zyb21Gb2xkZXIiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwic3VpdGVEZWYiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21Kc29uIiwic2VsZWN0ZWRTdWl0ZU5hbWVzIiwic3BsaXQiLCJmaWx0ZXIiLCJ4IiwiaW5jbHVkZXMiLCJmb2xkZXJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImV4dG5hbWUiLCJmdWxsUGF0aCIsInBvRmlsZU5hbWUiLCJwcm9jZXNzIiwicG9GaWxlUGF0aCIsInJlc29sdmUiLCJlIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJlbnZOYW1lIiwiZW52aXJvbm1lbnQiLCJkZWZhdWx0RW52RmlsZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlZGljYXRlZEVudkZpbGVKcyIsImRlZGljYXRlZEVudkZpbGVKc29uIiwiZ2V0RW52aXJvbm1lbnRzIiwidGFyZ2V0Q3dkIiwiZ2V0Q29uZmlndXJhdGlvbnMiLCJERUZBVUxUX09QVFMiLCJicm93c2VyTmFtZSIsInNlbGVuaXVtVXJsIiwiYXBwaXVtVXJsIiwicmVvcGVuU2Vzc2lvbiIsInJlUnVuT25GYWlsZWQiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJyZXBvcnRlcnMiLCJjbWRPcHRzIiwiZ2V0Q29tbWFuZExpbmVPcHRpb25zIiwicHJvakNvbmZpZ09wdHMiLCJlbnZzIiwiaXNDbWRPcHRzUmVwb3J0Rm9ybWF0IiwiaXNDb25maWdSZXBvcnRGb3JtYXQiLCJiYXNlTmFtZSIsIm9wdHMiLCJiIiwiYnJvd3NlciIsInMiLCJzZXJ2ZXIiLCJyZW9wZW4iLCJpIiwicGFyc2VJbnQiLCJpdGVyIiwiZGJncG9ydCIsIndzUG9ydCIsIndzcG9ydCIsImQiLCJyZiIsImxlbmd0aCIsInJlcG9ydEZvcm1hdHMiLCJybyIsIm91dHB1dERpciIsInAiLCJwYXJhbSIsInBtIiwic3BlY3MiLCJtb2R1bGVzIiwiZGVsZXRlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJjbG9uZSIsImtleXMiLCJrZXkiLCJ1bmRlZmluZWQiLCJwcm9jZXNzVGFyZ2V0UGF0aCIsInRhcmdldFBhdGgiLCJ1c2VyQ3dkIiwicmVzb2x2ZVBhdGgiLCJzdGF0cyIsImxzdGF0U3luYyIsImlzRGlyZWN0b3IiLCJpc0RpcmVjdG9yeSIsImNvbmZpZ0ZpbGVQYXRoIiwiZGlybmFtZSIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsImZ1bGxOYW1lIiwiYmFzZW5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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LENBQUNxQyxZQUFHQyxVQUFILENBQWMrRixjQUFkLENBQUwsRUFBb0M7QUFDaENBLE1BQUFBLGNBQWMsR0FBRzVHLGNBQUtVLElBQUwsQ0FBVUMsR0FBVixFQUFlcEMsdUJBQXVCLEdBQUcsT0FBekMsQ0FBakI7O0FBQ0EsVUFBSSxDQUFDcUMsWUFBR0MsVUFBSCxDQUFjK0YsY0FBZCxDQUFMLEVBQW9DO0FBQ2hDQSxRQUFBQSxjQUFjLEdBQUdULFNBQWpCO0FBQ0g7QUFDSjtBQUNKOztBQUNELE1BQUksQ0FBQ0UsVUFBTCxFQUFpQjtBQUNiLFdBQU8sSUFBUDtBQUNIOztBQUNELFNBQU87QUFFSHJHLElBQUFBLElBQUksRUFBRXFHLFVBRkg7QUFHSHpHLElBQUFBLFVBQVUsRUFBRWdILGNBSFQ7QUFLSGpHLElBQUFBLEdBQUcsRUFBRUEsR0FBRyxJQUFJWCxjQUFLNkcsT0FBTCxDQUFhUixVQUFiLENBTFQ7QUFPSDVHLElBQUFBLElBQUksRUFBRUssY0FBT2dILHFCQUFQLENBQTZCVCxVQUE3QixDQVBIO0FBU0hVLElBQUFBLFFBQVEsRUFBRS9HLGNBQUtnSCxRQUFMLENBQWNYLFVBQWQsQ0FUUDtBQVdIL0IsSUFBQUEsUUFBUSxFQUFFdEUsY0FBS2dILFFBQUwsQ0FBY2hILGNBQUs2RyxPQUFMLENBQWFSLFVBQWIsQ0FBZCxDQVhQO0FBYUgxRyxJQUFBQSxTQUFTLEVBQUVLLGNBQUs0QixPQUFMLENBQWF5RSxVQUFiO0FBYlIsR0FBUDtBQWVIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2FzeW5jJztcclxuaW1wb3J0IG1vZHVsZVJlcXVpcmUgZnJvbSAnLi9tb2R1bGVSZXF1aXJlJztcclxuXHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSA9ICdveHlnZW4uY29uZic7XHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fRU5WX0ZJTEVfTkFNRSA9ICdveHlnZW4uZW52JztcclxuZXhwb3J0IGNvbnN0IE9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUgPSAnb3h5Z2VuLnBvJztcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVQT1JURVIgPSAnaHRtbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZXN0T3B0aW9ucyhjb25maWcsIGFyZ3YpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmNvbmZpZyB9O1xyXG4gICAgb3B0aW9ucy5lbnYgPSBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMucG8gPSBnZXRQYWdlT2JqZWN0RmlsZVBhdGgoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMuc3VpdGVzID0gYXdhaXQgbG9hZFN1aXRlcyhjb25maWcsIGFyZ3YpO1xyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU3VpdGVzKGNvbmZpZywgYXJndikge1xyXG4gICAgaWYgKGNvbmZpZy5mcmFtZXdvcmsgJiYgdHlwZW9mIGNvbmZpZy5mcmFtZXdvcmsgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5mcmFtZXdvcmsudG9Mb3dlckNhc2UoKSAhPT0gJ294eWdlbicpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gY29uZmlnO1xyXG4gICAgY29uc3QgaXNDb25maWdGaWxlID0gdGFyZ2V0ICYmIChcclxuICAgICAgICAodGFyZ2V0Lm5hbWUgJiYgdGFyZ2V0Lm5hbWUuaW5kZXhPZihPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSkgPT09IDApXHJcbiAgICAgICAgfHwgKHRhcmdldC5leHRlbnNpb24gPT09ICcnICYmIHRhcmdldC5jb25maWdQYXRoICYmIHRhcmdldC5jb25maWdQYXRoLmluZGV4T2YoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUpID4gLTEpXHJcbiAgICApO1xyXG4gICAgbGV0IHN1aXRlcyA9IFtdO1xyXG4gICAgLy8gaWYgYW4gaW5kaXZpZHVhbCBzY3JpcHQgb3Igc3VpdGUgZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBpZiAoIWlzQ29uZmlnRmlsZSkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpTRmlsZSh0YXJnZXQucGF0aCwgY29uZmlnLnBhcmFtZXRlcnMuZmlsZSwgY29uZmlnLnBhcmFtZXRlcnMubW9kZSwgZmFsc2UsIGNvbmZpZy5pdGVyYXRpb25zIHx8IDEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5leHRlbnNpb24gPT09ICcuanNvbicpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb25GaWxlKHRhcmdldC5wYXRoLCBjb25maWcucGFyYW1ldGVycy5maWxlLCBjb25maWcucGFyYW1ldGVycy5tb2RlLCBjb25maWcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhIGZvbGRlciBvciBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc3VpdGVEZWZzID0gW107XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zdWl0ZXMgJiYgQXJyYXkuaXNBcnJheShjb25maWcuc3VpdGVzKSkge1xyXG4gICAgICAgICAgICBzdWl0ZURlZnMgPSBjb25maWcuc3VpdGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjaGVjayBpZiBtb3JlIHN1aXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgJ3N1aXRlcycgZm9sZGVyXHJcbiAgICAgICAgY29uc3Qgc3VpdGVzRm9sZGVyID0gcGF0aC5qb2luKHRhcmdldC5jd2QsICdzdWl0ZXMnKTtcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhzdWl0ZXNGb2xkZXIpKSB7XHJcbiAgICAgICAgICAgIHN1aXRlRGVmcyA9IFtcclxuICAgICAgICAgICAgICAgIC4uLnN1aXRlRGVmcyxcclxuICAgICAgICAgICAgICAgIC4uLmxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihzdWl0ZXNGb2xkZXIpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1lcmdlIHN1aXRlcyBjb25maWd1cmVkIGluIHRoZSBwcm9qZWN0IGNvbmZpZyBmaWxlIGFuZCB0aG9zZSBmb3VuZCBpbiAnc3VpdGVzJyBmb2xkZXJcclxuICAgICAgICBzdWl0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChzdWl0ZURlZnMubWFwKGFzeW5jIChzdWl0ZURlZikgPT4gYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb24oc3VpdGVEZWYsIGNvbmZpZykpKTtcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBvdXQgc3VpdGVzIGlmICctLXN1aXRlcycgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWRcclxuICAgIGlmIChhcmd2LnN1aXRlcyAmJiB0eXBlb2YgYXJndi5zdWl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdWl0ZU5hbWVzID0gYXJndi5zdWl0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBzdWl0ZXMgPSBzdWl0ZXMuZmlsdGVyKHggPT4gc2VsZWN0ZWRTdWl0ZU5hbWVzLmluY2x1ZGVzKHgubmFtZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1aXRlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihmb2xkZXJQYXRoKSB7XHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGZvbGRlclBhdGgpO1xyXG4gICAgbGV0IHN1aXRlRGVmcyA9IFtdO1xyXG4gICAgZm9yRWFjaChmaWxlcywgZmlsZSA9PiB7XHJcbiAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5qc29uJykge1xyXG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihmb2xkZXJQYXRoLCBmaWxlKTtcclxuICAgICAgICAgICAgc3VpdGVEZWZzLnB1c2gobW9kdWxlUmVxdWlyZShmdWxsUGF0aCkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHN1aXRlRGVmcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VPYmplY3RGaWxlUGF0aChjb25maWcsIGFyZ3YgPSB7fSkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldCB8fCB7fTtcclxuICAgIGNvbnN0IHBvRmlsZU5hbWUgPSBhcmd2LnBvIHx8IGAke09YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUV9LmpzYDtcclxuICAgIGNvbnN0IGN3ZCA9IHRhcmdldC5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGxldCBwb0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgcG9GaWxlTmFtZSk7XHJcbiAgICBwb0ZpbGVQYXRoID0gZnMuZXhpc3RzU3luYyhwb0ZpbGVQYXRoKSA/IHBvRmlsZVBhdGggOiBudWxsO1xyXG5cclxuICAgIGlmIChwb0ZpbGVQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbW9kdWxlUmVxdWlyZShwb0ZpbGVQYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHBvRmlsZVBhdGg7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7cG9GaWxlUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0IHx8IHt9O1xyXG4gICAgY29uc3QgZW52TmFtZSA9IGFyZ3YuZW52IHx8IGNvbmZpZy5lbnZpcm9ubWVudCB8fCAnZGVmYXVsdCc7XHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXQuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICBjb25zdCBkZWZhdWx0RW52RmlsZSA9IHBhdGguam9pbihjd2QsIGAke09YWUdFTl9FTlZfRklMRV9OQU1FfS5qc2ApO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudkZpbGUpKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgaWYgKGVudiAmJiB0eXBlb2YgZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52LCBlbnZOYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZW52W2Vudk5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRyeSB0byByZXNvbHZlIGEgZGVkaWNhdGVkIGVudmlyb25tZW50IGZpbGUgaW4gJ2Vudicgc3ViIGZvbGRlclxyXG4gICAgY29uc3QgZGVkaWNhdGVkRW52RmlsZUpzID0gcGF0aC5qb2luKGN3ZCwgJ2VudicsIGAke2Vudk5hbWV9LmpzYCk7XHJcbiAgICBjb25zdCBkZWRpY2F0ZWRFbnZGaWxlSnNvbiA9IHBhdGguam9pbihjd2QsICdlbnYnLCBgJHtlbnZOYW1lfS5qc29uYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWRpY2F0ZWRFbnZGaWxlSnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZzLmV4aXN0c1N5bmMoZGVkaWNhdGVkRW52RmlsZUpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRzKHRhcmdldCkge1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGNvbnN0IGRlZmF1bHRFbnZGaWxlID0gcGF0aC5qb2luKGN3ZCwgYCR7T1hZR0VOX0VOVl9GSUxFX05BTUV9LmpzYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW52RmlsZSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7ZGVmYXVsdEVudkZpbGV9LiBSZWFzb246ICR7ZS5tZXNzYWdlfSAke2Uuc3RhY2t9YCk7XHJcbiAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWd1cmF0aW9ucyh0YXJnZXQsIGFyZ3YpIHtcclxuICAgIC8vIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuICAgIGNvbnN0IERFRkFVTFRfT1BUUyA9IHtcclxuICAgICAgICBjd2Q6IHRhcmdldCA/ICh0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKSkgOiBwcm9jZXNzLmN3ZCgpLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgIGJyb3dzZXJOYW1lOiAnY2hyb21lJyxcclxuICAgICAgICBzZWxlbml1bVVybCA6ICdodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViJyxcclxuICAgICAgICBhcHBpdW1VcmwgOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YicsXHJcbiAgICAgICAgcmVvcGVuU2Vzc2lvbjogZmFsc2UsXHJcbiAgICAgICAgcmVSdW5PbkZhaWxlZDogZmFsc2UsXHJcbiAgICAgICAgaXRlcmF0aW9ucyA6IDEsXHJcbiAgICAgICAgZGVidWdQb3J0OiBudWxsLFxyXG4gICAgICAgIGRlbGF5OiBudWxsLFxyXG4gICAgICAgIGNvbGxlY3REZXZpY2VMb2dzOiBmYWxzZSxcclxuICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogZmFsc2UsXHJcbiAgICAgICAgY29sbGVjdEJyb3dzZXJMb2dzOiBmYWxzZSxcclxuICAgICAgICByZXBvcnRpbmc6IHtcclxuICAgICAgICAgICAgcmVwb3J0ZXJzOiBbREVGQVVMVF9SRVBPUlRFUl1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtZXRlcnMgOiB7XHJcbiAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6ICdzZXEnXHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbiAgICAvLyByZXRyaWV2ZSBvcHRpb25zIHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXHJcbiAgICBjb25zdCBjbWRPcHRzID0gZ2V0Q29tbWFuZExpbmVPcHRpb25zKGFyZ3YpO1xyXG4gICAgLy8gaWYgdGhlIHRhcmdldCBpcyBveHlnZW4gY29uZmlnIGZpbGUsIG1lcmdlIGl0cyBjb250ZW50IHdpdGggdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgbGV0IHByb2pDb25maWdPcHRzID0ge307XHJcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5uYW1lID09PSBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSAmJiAodGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycgfHwgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qc29uJykpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IG1vZHVsZVJlcXVpcmUodGFyZ2V0LnBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBmaWxlOiAke3RhcmdldC5wYXRofS4gUmVhc29uOiAke2UubWVzc2FnZX0gJHtlLnN0YWNrfWApO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5jb25maWdQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcHJvakNvbmZpZ09wdHMgPSBtb2R1bGVSZXF1aXJlKHRhcmdldC5jb25maWdQYXRoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHt0YXJnZXQuY29uZmlnUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGVudnMgPSBnZXRFbnZpcm9ubWVudHModGFyZ2V0KTtcclxuXHJcbiAgICBpZiAocHJvakNvbmZpZ09wdHMuZW52cykge1xyXG4gICAgICAgIC8vIG1lcmdlIGV4dGVybmFsIGVudmlyb25tZW50cyBkZWZpbml0aW9uIHdpdGggdGhlIG9uZSBpbiB0aGUgY29uZmlnIGZpbGVcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5lbnZzID0geyAuLi5wcm9qQ29uZmlnT3B0cy5lbnZzLCAuLi5lbnZzIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IHsgLi4ucHJvakNvbmZpZ09wdHMsIGVudnM6IGVudnMgfTtcclxuICAgIH1cclxuICAgIC8vIG1ha2Ugc3VyZSB0byBzZXQgZGVmYXVsdCBIVE1MIHJlcG9ydGVyIGlmIHJlcG9ydGluZyBvcHRpb25zIGFyZSBub3QgcHJvdmlkZWQgaW4gb3h5Z2VuLmNvbmYgZmlsZSBhbmQgdmlhIGNvbW1hbmQgbGluZVxyXG4gICAgY29uc3QgaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ID0gY21kT3B0cy5yZXBvcnRpbmcgJiYgY21kT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzO1xyXG4gICAgY29uc3QgaXNDb25maWdSZXBvcnRGb3JtYXQgPSBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcgJiYgcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nLnJlcG9ydGVycztcclxuICAgIGlmICghaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ICYmICFpc0NvbmZpZ1JlcG9ydEZvcm1hdCkge1xyXG4gICAgICAgIGlmICghcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nKSB7XHJcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzLnJlcG9ydGluZyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzID0gW0RFRkFVTFRfUkVQT1JURVJdO1xyXG4gICAgfVxyXG4gICAgLy8gZGV0ZXJtaW5lIHRlc3QgbmFtZVxyXG4gICAgbGV0IG5hbWUgPSBjbWRPcHRzLm5hbWUgfHwgcHJvakNvbmZpZ09wdHMubmFtZSB8fCBudWxsO1xyXG4gICAgaWYgKCFuYW1lICYmIHRhcmdldCkge1xyXG4gICAgICAgIG5hbWUgPSB0YXJnZXQubmFtZSAhPT0gT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5iYXNlTmFtZTtcclxuICAgIH1cclxuICAgIC8vIG1lcmdlIG9wdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHRoZSBsYXN0IG9uZSBvdmVycmlkZXMgdGhlIHByZXZpb3VzIG9uZSk6XHJcbiAgICAvLyBkZWZhdWx0IG9wdGlvbnMsIHByb2plY3QgY29uZmlnIGZpbGUsIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcclxuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfT1BUUywgLi4ucHJvakNvbmZpZ09wdHMsIC4uLmNtZE9wdHMsIG5hbWU6IG5hbWUgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lT3B0aW9ucyhhcmd2KSB7XHJcbiAgICBjb25zdCBvcHRzID0ge1xyXG4gICAgICAgIC8vIHN3aXRjaDogLS1uYW1lIFxyXG4gICAgICAgIG5hbWU6IGFyZ3YubmFtZSB8fCBudWxsLFxyXG4gICAgICAgIC8vIHN3aXRjaDogLWIgb3IgLS1icm93c2VyXHJcbiAgICAgICAgYnJvd3Nlck5hbWUgOiBhcmd2LmIgfHwgYXJndi5icm93c2VyIHx8IG51bGwsXHJcbiAgICAgICAgc2VsZW5pdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICBhcHBpdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICByZW9wZW5TZXNzaW9uOiBhcmd2LnJlb3BlbiA/IGFyZ3YucmVvcGVuID09PSAndHJ1ZScgOiBudWxsLFxyXG4gICAgICAgIGl0ZXJhdGlvbnMgOiBhcmd2LmkgPyBwYXJzZUludChhcmd2LmkpIDogKGFyZ3YuaXRlciA/IHBhcnNlSW50KGFyZ3YuaXRlcikgOiBudWxsKSxcclxuICAgICAgICBkZWJ1Z1BvcnQ6IGFyZ3YuZGJncG9ydCB8fCBudWxsLFxyXG4gICAgICAgIHdzUG9ydDogYXJndi53c3BvcnQgfHwgbnVsbCxcclxuICAgICAgICBkZWxheTogYXJndi5kIHx8IGFyZ3YuZGVsYXkgfHwgbnVsbCxcclxuICAgIH07XHJcbiAgICAvLyBzd2l0Y2g6IC0tcmYgZmxhZ1xyXG4gICAgaWYgKGFyZ3YucmYgJiYgdHlwZW9mIGFyZ3YucmYgPT09ICdzdHJpbmcnICYmIGFyZ3YucmYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlcG9ydEZvcm1hdHMgPSBhcmd2LnJmLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgb3B0cy5yZXBvcnRpbmcgPSB7XHJcbiAgICAgICAgICAgIHJlcG9ydGVyczogcmVwb3J0Rm9ybWF0c1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gc3dpdGNoOiAtLXJvIC0gc2V0IHJlcG9ydGVyIG91dHB1dCBkaXJlY3RvcnkgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgICAgICAvLyBOT1RFOiAtLXJvIHN3aXRjaCBtdXN0IGJlIHNwZWNpZmllZCB0b2dldGhlciB3aXRoIC0tcmZcclxuICAgICAgICBpZiAoYXJndi5ybyAmJiB0eXBlb2YgYXJndi5ybyA9PT0gJ3N0cmluZycgJiYgYXJndi5yby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9wdHMucmVwb3J0aW5nLm91dHB1dERpciA9IGFyZ3Yucm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gb3B0aW9uOiAtcCBvciAtLXBhcmFtIGFuZCAtLXBtXHJcbiAgICBpZiAoYXJndi5wIHx8IGFyZ3YucGFyYW0pIHtcclxuICAgICAgICBvcHRzLnBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgIGZpbGU6IGFyZ3YucCB8fCBhcmd2LnBhcmFtIHx8IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6IGFyZ3YucG0gfHwgJ3NlcSdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN3aXRjaDogLS1zcGVjcyAtIHNldCBzcGVjcyBpZiBzZXQgYnkgdXNlciB0aHJvdWdoIGNvbW5hbmQgbGluZVxyXG4gICAgaWYgKGFyZ3Yuc3BlY3MgJiYgdHlwZW9mIGFyZ3Yuc3BlY3MgPT09ICdzdHJpbmcnICYmIGFyZ3Yuc3BlY3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHNwZWNzID0gYXJndi5zcGVjcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIG9wdHMuc3BlY3MgPSBzcGVjcztcclxuICAgIH1cclxuICAgIC8vIHN3aXRjaDogLS1tb2R1bGVzIC0gc2V0IGEgbGlzdCBvZiBtb2R1bGVzIHRvIGJlIGxvYWRlZCwgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgIGlmIChhcmd2Lm1vZHVsZXMgJiYgdHlwZW9mIGFyZ3YubW9kdWxlcyA9PT0gJ3N0cmluZycgJiYgYXJndi5tb2R1bGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBtb2R1bGVzID0gYXJndi5tb2R1bGVzLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgb3B0cy5tb2R1bGVzID0gbW9kdWxlcztcclxuICAgIH1cclxuICAgIC8vIHJlbW92ZSBhbnkgcHJvcGVydHkgd2l0aCBudWxsIHZhbHVlIChzbyBpdCB3b24ndCBvdmVycmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBpdCdzIG51bGwpXHJcbiAgICByZXR1cm4gZGVsZXRlTnVsbFByb3BlcnRpZXMob3B0cyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlbGV0ZU51bGxQcm9wZXJ0aWVzKG9iaikge1xyXG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIGNvbnN0IGNsb25lID0geyAuLi5vYmogfTtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xyXG4gICAgZm9yRWFjaCAoa2V5cywga2V5ID0+IHtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSAmJiAob2JqW2tleV0gPT0gbnVsbCB8fCBvYmpba2V5XSA9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNsb25lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1RhcmdldFBhdGgodGFyZ2V0UGF0aCwgdXNlckN3ZCkge1xyXG4gICAgbGV0IGN3ZCA9IHVzZXJDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIC8vIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlmIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBwYXRoXHJcbiAgICBpZiAodHlwZW9mKHRhcmdldFBhdGgpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRhcmdldFBhdGggPSBjd2Q7XHJcbiAgICB9XHJcbiAgICAvLyB1c2VyJ3MgcGF0aCBtaWdodCBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIG1ha2Ugc3VyZSB0aGUgcmVsYXRpdmUgcGF0aCB3aWxsIHdvcmtcclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRhcmdldFBhdGggPSBveHV0aWwucmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgY3dkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0YXJnZXRQYXRoKTtcclxuICAgIGNvbnN0IGlzRGlyZWN0b3IgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xyXG4gICAgbGV0IGNvbmZpZ0ZpbGVQYXRoO1xyXG4gICAgaWYgKGlzRGlyZWN0b3IpIHtcclxuICAgICAgICAvLyBpZiBcInRhcmdldFwiIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGlzIGEgZGlyZWN0b3J5LFxyXG4gICAgICAgIC8vIHRoZW4gdW5sZXNzIFwiY3dkXCIgaXMgcHJvdmlkZWQgZXhwbGljaXRseSBieSB0aGUgdXNlclxyXG4gICAgICAgIC8vIHVzZSB0YXJnZXQgZGlyZWN0b3J5IGFzIGN3ZFxyXG4gICAgICAgIGN3ZCA9IHVzZXJDd2QgfHwgdGFyZ2V0UGF0aDtcclxuICAgICAgICAvLyBhcHBlbmQgb3h5Z2VuIGNvbmZpZyBmaWxlIG5hbWUgdG8gdGhlIGRpcmVjdG9yeSwgaWYgbm8gdGVzdCBjYXNlIGZpbGUgd2FzIHByb3ZpZGVkXHJcbiAgICAgICAgY29uZmlnRmlsZVBhdGggPSBwYXRoLmpvaW4odGFyZ2V0UGF0aCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzJyk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbih0YXJnZXRQYXRoLCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSArICcuanNvbicpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKGN3ZCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzJyk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjd2QsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qc29uJyk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdGaWxlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0YXJnZXRQYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIC8vIHBhdGggdG8gdGhlIGNvbmZpZyBvciAuanMgZmlsZVxyXG4gICAgICAgIHBhdGg6IHRhcmdldFBhdGgsXHJcbiAgICAgICAgY29uZmlnUGF0aDogY29uZmlnRmlsZVBhdGgsXHJcbiAgICAgICAgLy8gd29ya2luZyBkaXJlY3RvcnlcclxuICAgICAgICBjd2Q6IGN3ZCB8fCBwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCksXHJcbiAgICAgICAgLy8gbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgd2l0aG91dCBleHRlbnNpb25cclxuICAgICAgICBuYW1lOiBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KHRhcmdldFBhdGgpLFxyXG4gICAgICAgIC8vIG5hbWUgaW5jbHVkaW5nIGV4dGVuc2lvblxyXG4gICAgICAgIGZ1bGxOYW1lOiBwYXRoLmJhc2VuYW1lKHRhcmdldFBhdGgpLFxyXG4gICAgICAgIC8vIHBhcmVudCBmb2xkZXIncyBuYW1lXHJcbiAgICAgICAgYmFzZU5hbWU6IHBhdGguYmFzZW5hbWUocGF0aC5kaXJuYW1lKHRhcmdldFBhdGgpKSxcclxuICAgICAgICAvLyB0YXJnZXQgZmlsZSBleHRlbnNpb25cclxuICAgICAgICBleHRlbnNpb246IHBhdGguZXh0bmFtZSh0YXJnZXRQYXRoKVxyXG4gICAgfTtcclxufSJdfQ==
310
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX3V0aWwiLCJfYXN5bmMiLCJfbW9kdWxlUmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIk9YWUdFTl9DT05GSUdfRklMRV9OQU1FIiwiZXhwb3J0cyIsIk9YWUdFTl9FTlZfRklMRV9OQU1FIiwiT1hZR0VOX1BBR0VfT0JKRUNUX0ZJTEVfTkFNRSIsIkRFRkFVTFRfUkVQT1JURVIiLCJnZW5lcmF0ZVRlc3RPcHRpb25zIiwiY29uZmlnIiwiYXJndiIsIm9wdGlvbnMiLCJlbnYiLCJsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwbyIsImdldFBhZ2VPYmplY3RGaWxlUGF0aCIsInN1aXRlcyIsImxvYWRTdWl0ZXMiLCJmcmFtZXdvcmsiLCJ0b0xvd2VyQ2FzZSIsInRhcmdldCIsImlzQ29uZmlnRmlsZSIsIm5hbWUiLCJpbmRleE9mIiwiZXh0ZW5zaW9uIiwiY29uZmlnUGF0aCIsInB1c2giLCJveHV0aWwiLCJnZW5lcmF0ZVRlc3RTdWl0ZUZyb21KU0ZpbGUiLCJwYXRoIiwicGFyYW1ldGVycyIsImZpbGUiLCJtb2RlIiwiaXRlcmF0aW9ucyIsImdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb25GaWxlIiwic3VpdGVEZWZzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3VpdGVzRm9sZGVyIiwiam9pbiIsImN3ZCIsImZzIiwiZXhpc3RzU3luYyIsImxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlciIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJzdWl0ZURlZiIsImdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb24iLCJzZWxlY3RlZFN1aXRlTmFtZXMiLCJzcGxpdCIsImZpbHRlciIsIngiLCJpbmNsdWRlcyIsImZvbGRlclBhdGgiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwiZm9yRWFjaCIsImV4dG5hbWUiLCJmdWxsUGF0aCIsIm1vZHVsZVJlcXVpcmUiLCJwb0ZpbGVOYW1lIiwicHJvY2VzcyIsInBvRmlsZVBhdGgiLCJyZXNvbHZlIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJlbnZOYW1lIiwiZW52aXJvbm1lbnQiLCJkZWZhdWx0RW52RmlsZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlZGljYXRlZEVudkZpbGVKcyIsImRlZGljYXRlZEVudkZpbGVKc29uIiwiZ2V0RW52aXJvbm1lbnRzIiwidGFyZ2V0Q3dkIiwiZ2V0Q29uZmlndXJhdGlvbnMiLCJERUZBVUxUX09QVFMiLCJicm93c2VyTmFtZSIsInNlbGVuaXVtVXJsIiwiYXBwaXVtVXJsIiwicmVvcGVuU2Vzc2lvbiIsInJlUnVuT25GYWlsZWQiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJyZXBvcnRlcnMiLCJjbWRPcHRzIiwiZ2V0Q29tbWFuZExpbmVPcHRpb25zIiwicHJvakNvbmZpZ09wdHMiLCJlbnZzIiwiaXNDbWRPcHRzUmVwb3J0Rm9ybWF0IiwiaXNDb25maWdSZXBvcnRGb3JtYXQiLCJiYXNlTmFtZSIsIm9wdHMiLCJiIiwiYnJvd3NlciIsInMiLCJzZXJ2ZXIiLCJyZW9wZW4iLCJpIiwicGFyc2VJbnQiLCJpdGVyIiwiZGJncG9ydCIsIndzUG9ydCIsIndzcG9ydCIsImQiLCJhdXRvU3RhcnRXZWJEcml2ZXIiLCJhdXRvd2QiLCJyZiIsImxlbmd0aCIsInJlcG9ydEZvcm1hdHMiLCJybyIsIm91dHB1dERpciIsInAiLCJwYXJhbSIsInBtIiwic3BlY3MiLCJtb2R1bGVzIiwiZGVsZXRlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJjbG9uZSIsImtleXMiLCJrZXkiLCJ1bmRlZmluZWQiLCJwcm9jZXNzVGFyZ2V0UGF0aCIsInRhcmdldFBhdGgiLCJ1c2VyQ3dkIiwicmVzb2x2ZVBhdGgiLCJzdGF0cyIsImxzdGF0U3luYyIsImlzRGlyZWN0b3IiLCJpc0RpcmVjdG9yeSIsImNvbmZpZ0ZpbGVQYXRoIiwiZW5kc1dpdGgiLCJkaXJuYW1lIiwiZ2V0RmlsZU5hbWVXaXRob3V0RXh0IiwiZnVsbE5hbWUiLCJiYXNlbmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpLXV0aWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2FzeW5jJztcclxuaW1wb3J0IG1vZHVsZVJlcXVpcmUgZnJvbSAnLi9tb2R1bGVSZXF1aXJlJztcclxuXHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSA9ICdveHlnZW4uY29uZic7XHJcbmV4cG9ydCBjb25zdCBPWFlHRU5fRU5WX0ZJTEVfTkFNRSA9ICdveHlnZW4uZW52JztcclxuZXhwb3J0IGNvbnN0IE9YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUUgPSAnb3h5Z2VuLnBvJztcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVQT1JURVIgPSAnaHRtbCc7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZXN0T3B0aW9ucyhjb25maWcsIGFyZ3YpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmNvbmZpZyB9O1xyXG4gICAgb3B0aW9ucy5lbnYgPSBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMucG8gPSBnZXRQYWdlT2JqZWN0RmlsZVBhdGgoY29uZmlnLCBhcmd2KTtcclxuICAgIG9wdGlvbnMuc3VpdGVzID0gYXdhaXQgbG9hZFN1aXRlcyhjb25maWcsIGFyZ3YpO1xyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU3VpdGVzKGNvbmZpZywgYXJndikge1xyXG4gICAgaWYgKGNvbmZpZy5mcmFtZXdvcmsgJiYgdHlwZW9mIGNvbmZpZy5mcmFtZXdvcmsgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5mcmFtZXdvcmsudG9Mb3dlckNhc2UoKSAhPT0gJ294eWdlbicpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gY29uZmlnO1xyXG4gICAgY29uc3QgaXNDb25maWdGaWxlID0gdGFyZ2V0ICYmIChcclxuICAgICAgICAodGFyZ2V0Lm5hbWUgJiYgdGFyZ2V0Lm5hbWUuaW5kZXhPZihPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSkgPT09IDApXHJcbiAgICAgICAgfHwgKHRhcmdldC5leHRlbnNpb24gPT09ICcnICYmIHRhcmdldC5jb25maWdQYXRoICYmIHRhcmdldC5jb25maWdQYXRoLmluZGV4T2YoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUpID4gLTEpXHJcbiAgICApO1xyXG4gICAgbGV0IHN1aXRlcyA9IFtdO1xyXG4gICAgLy8gaWYgYW4gaW5kaXZpZHVhbCBzY3JpcHQgb3Igc3VpdGUgZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBpZiAoIWlzQ29uZmlnRmlsZSkge1xyXG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpTRmlsZSh0YXJnZXQucGF0aCwgY29uZmlnLnBhcmFtZXRlcnMuZmlsZSwgY29uZmlnLnBhcmFtZXRlcnMubW9kZSwgZmFsc2UsIGNvbmZpZy5pdGVyYXRpb25zIHx8IDEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5leHRlbnNpb24gPT09ICcuanNvbicpIHtcclxuICAgICAgICAgICAgc3VpdGVzLnB1c2goYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb25GaWxlKHRhcmdldC5wYXRoLCBjb25maWcucGFyYW1ldGVycy5maWxlLCBjb25maWcucGFyYW1ldGVycy5tb2RlLCBjb25maWcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhIGZvbGRlciBvciBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgcGFzc2VkXHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc3VpdGVEZWZzID0gW107XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zdWl0ZXMgJiYgQXJyYXkuaXNBcnJheShjb25maWcuc3VpdGVzKSkge1xyXG4gICAgICAgICAgICBzdWl0ZURlZnMgPSBjb25maWcuc3VpdGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjaGVjayBpZiBtb3JlIHN1aXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgJ3N1aXRlcycgZm9sZGVyXHJcbiAgICAgICAgY29uc3Qgc3VpdGVzRm9sZGVyID0gcGF0aC5qb2luKHRhcmdldC5jd2QsICdzdWl0ZXMnKTtcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhzdWl0ZXNGb2xkZXIpKSB7XHJcbiAgICAgICAgICAgIHN1aXRlRGVmcyA9IFtcclxuICAgICAgICAgICAgICAgIC4uLnN1aXRlRGVmcyxcclxuICAgICAgICAgICAgICAgIC4uLmxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihzdWl0ZXNGb2xkZXIpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1lcmdlIHN1aXRlcyBjb25maWd1cmVkIGluIHRoZSBwcm9qZWN0IGNvbmZpZyBmaWxlIGFuZCB0aG9zZSBmb3VuZCBpbiAnc3VpdGVzJyBmb2xkZXJcclxuICAgICAgICBzdWl0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChzdWl0ZURlZnMubWFwKGFzeW5jIChzdWl0ZURlZikgPT4gYXdhaXQgb3h1dGlsLmdlbmVyYXRlVGVzdFN1aXRlRnJvbUpzb24oc3VpdGVEZWYsIGNvbmZpZykpKTtcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBvdXQgc3VpdGVzIGlmICctLXN1aXRlcycgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWRcclxuICAgIGlmIChhcmd2LnN1aXRlcyAmJiB0eXBlb2YgYXJndi5zdWl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdWl0ZU5hbWVzID0gYXJndi5zdWl0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBzdWl0ZXMgPSBzdWl0ZXMuZmlsdGVyKHggPT4gc2VsZWN0ZWRTdWl0ZU5hbWVzLmluY2x1ZGVzKHgubmFtZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1aXRlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRTdWl0ZURlZmluaXRpb25zRnJvbUZvbGRlcihmb2xkZXJQYXRoKSB7XHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGZvbGRlclBhdGgpO1xyXG4gICAgbGV0IHN1aXRlRGVmcyA9IFtdO1xyXG4gICAgZm9yRWFjaChmaWxlcywgZmlsZSA9PiB7XHJcbiAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5qc29uJykge1xyXG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihmb2xkZXJQYXRoLCBmaWxlKTtcclxuICAgICAgICAgICAgc3VpdGVEZWZzLnB1c2gobW9kdWxlUmVxdWlyZShmdWxsUGF0aCkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHN1aXRlRGVmcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VPYmplY3RGaWxlUGF0aChjb25maWcsIGFyZ3YgPSB7fSkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldCB8fCB7fTtcclxuICAgIGNvbnN0IHBvRmlsZU5hbWUgPSBhcmd2LnBvIHx8IGAke09YWUdFTl9QQUdFX09CSkVDVF9GSUxFX05BTUV9LmpzYDtcclxuICAgIGNvbnN0IGN3ZCA9IHRhcmdldC5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGxldCBwb0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgcG9GaWxlTmFtZSk7XHJcbiAgICBwb0ZpbGVQYXRoID0gZnMuZXhpc3RzU3luYyhwb0ZpbGVQYXRoKSA/IHBvRmlsZVBhdGggOiBudWxsO1xyXG5cclxuICAgIGlmIChwb0ZpbGVQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbW9kdWxlUmVxdWlyZShwb0ZpbGVQYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHBvRmlsZVBhdGg7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7cG9GaWxlUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXMoY29uZmlnLCBhcmd2KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0IHx8IHt9O1xyXG4gICAgY29uc3QgZW52TmFtZSA9IGFyZ3YuZW52IHx8IGNvbmZpZy5lbnZpcm9ubWVudCB8fCAnZGVmYXVsdCc7XHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXQuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICBjb25zdCBkZWZhdWx0RW52RmlsZSA9IHBhdGguam9pbihjd2QsIGAke09YWUdFTl9FTlZfRklMRV9OQU1FfS5qc2ApO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudkZpbGUpKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgaWYgKGVudiAmJiB0eXBlb2YgZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52LCBlbnZOYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZW52W2Vudk5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRyeSB0byByZXNvbHZlIGEgZGVkaWNhdGVkIGVudmlyb25tZW50IGZpbGUgaW4gJ2Vudicgc3ViIGZvbGRlclxyXG4gICAgY29uc3QgZGVkaWNhdGVkRW52RmlsZUpzID0gcGF0aC5qb2luKGN3ZCwgJ2VudicsIGAke2Vudk5hbWV9LmpzYCk7XHJcbiAgICBjb25zdCBkZWRpY2F0ZWRFbnZGaWxlSnNvbiA9IHBhdGguam9pbihjd2QsICdlbnYnLCBgJHtlbnZOYW1lfS5qc29uYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWRpY2F0ZWRFbnZGaWxlSnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZzLmV4aXN0c1N5bmMoZGVkaWNhdGVkRW52RmlsZUpzb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vZHVsZVJlcXVpcmUoZGVkaWNhdGVkRW52RmlsZUpzb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRzKHRhcmdldCkge1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjd2QgPSB0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKTtcclxuICAgIGNvbnN0IGRlZmF1bHRFbnZGaWxlID0gcGF0aC5qb2luKGN3ZCwgYCR7T1hZR0VOX0VOVl9GSUxFX05BTUV9LmpzYCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW52RmlsZSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlUmVxdWlyZShkZWZhdWx0RW52RmlsZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZpbGU6ICR7ZGVmYXVsdEVudkZpbGV9LiBSZWFzb246ICR7ZS5tZXNzYWdlfSAke2Uuc3RhY2t9YCk7XHJcbiAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWd1cmF0aW9ucyh0YXJnZXQsIGFyZ3YpIHtcclxuICAgIC8vIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xyXG4gICAgbGV0IHRhcmdldEN3ZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY3dkKSB7XHJcbiAgICAgICAgdGFyZ2V0Q3dkID0gdGFyZ2V0LmN3ZDtcclxuICAgIH1cclxuICAgIGNvbnN0IERFRkFVTFRfT1BUUyA9IHtcclxuICAgICAgICBjd2Q6IHRhcmdldCA/ICh0YXJnZXRDd2QgfHwgcHJvY2Vzcy5jd2QoKSkgOiBwcm9jZXNzLmN3ZCgpLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgIGJyb3dzZXJOYW1lOiAnY2hyb21lJyxcclxuICAgICAgICBzZWxlbml1bVVybCA6ICdodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViJyxcclxuICAgICAgICBhcHBpdW1VcmwgOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YicsXHJcbiAgICAgICAgcmVvcGVuU2Vzc2lvbjogZmFsc2UsXHJcbiAgICAgICAgcmVSdW5PbkZhaWxlZDogZmFsc2UsXHJcbiAgICAgICAgaXRlcmF0aW9ucyA6IDEsXHJcbiAgICAgICAgZGVidWdQb3J0OiBudWxsLFxyXG4gICAgICAgIGRlbGF5OiBudWxsLFxyXG4gICAgICAgIGNvbGxlY3REZXZpY2VMb2dzOiBmYWxzZSxcclxuICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogZmFsc2UsXHJcbiAgICAgICAgY29sbGVjdEJyb3dzZXJMb2dzOiBmYWxzZSxcclxuICAgICAgICByZXBvcnRpbmc6IHtcclxuICAgICAgICAgICAgcmVwb3J0ZXJzOiBbREVGQVVMVF9SRVBPUlRFUl1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtZXRlcnMgOiB7XHJcbiAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgIG1vZGU6ICdzZXEnXHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbiAgICAvLyByZXRyaWV2ZSBvcHRpb25zIHByb3ZpZGVkIHZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXHJcbiAgICBjb25zdCBjbWRPcHRzID0gZ2V0Q29tbWFuZExpbmVPcHRpb25zKGFyZ3YpO1xyXG4gICAgLy8gaWYgdGhlIHRhcmdldCBpcyBveHlnZW4gY29uZmlnIGZpbGUsIG1lcmdlIGl0cyBjb250ZW50IHdpdGggdGhlIGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgbGV0IHByb2pDb25maWdPcHRzID0ge307XHJcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5uYW1lID09PSBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSAmJiAodGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qcycgfHwgdGFyZ2V0LmV4dGVuc2lvbiA9PT0gJy5qc29uJykpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IG1vZHVsZVJlcXVpcmUodGFyZ2V0LnBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBmaWxlOiAke3RhcmdldC5wYXRofS4gUmVhc29uOiAke2UubWVzc2FnZX0gJHtlLnN0YWNrfWApO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5jb25maWdQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcHJvakNvbmZpZ09wdHMgPSBtb2R1bGVSZXF1aXJlKHRhcmdldC5jb25maWdQYXRoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZmlsZTogJHt0YXJnZXQuY29uZmlnUGF0aH0uIFJlYXNvbjogJHtlLm1lc3NhZ2V9ICR7ZS5zdGFja31gKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGVudnMgPSBnZXRFbnZpcm9ubWVudHModGFyZ2V0KTtcclxuXHJcbiAgICBpZiAocHJvakNvbmZpZ09wdHMuZW52cykge1xyXG4gICAgICAgIC8vIG1lcmdlIGV4dGVybmFsIGVudmlyb25tZW50cyBkZWZpbml0aW9uIHdpdGggdGhlIG9uZSBpbiB0aGUgY29uZmlnIGZpbGVcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5lbnZzID0geyAuLi5wcm9qQ29uZmlnT3B0cy5lbnZzLCAuLi5lbnZzIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBwcm9qQ29uZmlnT3B0cyA9IHsgLi4ucHJvakNvbmZpZ09wdHMsIGVudnM6IGVudnMgfTtcclxuICAgIH1cclxuICAgIC8vIG1ha2Ugc3VyZSB0byBzZXQgZGVmYXVsdCBIVE1MIHJlcG9ydGVyIGlmIHJlcG9ydGluZyBvcHRpb25zIGFyZSBub3QgcHJvdmlkZWQgaW4gb3h5Z2VuLmNvbmYgZmlsZSBhbmQgdmlhIGNvbW1hbmQgbGluZVxyXG4gICAgY29uc3QgaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ID0gY21kT3B0cy5yZXBvcnRpbmcgJiYgY21kT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzO1xyXG4gICAgY29uc3QgaXNDb25maWdSZXBvcnRGb3JtYXQgPSBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcgJiYgcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nLnJlcG9ydGVycztcclxuICAgIGlmICghaXNDbWRPcHRzUmVwb3J0Rm9ybWF0ICYmICFpc0NvbmZpZ1JlcG9ydEZvcm1hdCkge1xyXG4gICAgICAgIGlmICghcHJvakNvbmZpZ09wdHMucmVwb3J0aW5nKSB7XHJcbiAgICAgICAgICAgIHByb2pDb25maWdPcHRzLnJlcG9ydGluZyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9qQ29uZmlnT3B0cy5yZXBvcnRpbmcucmVwb3J0ZXJzID0gW0RFRkFVTFRfUkVQT1JURVJdO1xyXG4gICAgfVxyXG4gICAgLy8gZGV0ZXJtaW5lIHRlc3QgbmFtZVxyXG4gICAgbGV0IG5hbWUgPSBjbWRPcHRzLm5hbWUgfHwgcHJvakNvbmZpZ09wdHMubmFtZSB8fCBudWxsO1xyXG4gICAgaWYgKCFuYW1lICYmIHRhcmdldCkge1xyXG4gICAgICAgIG5hbWUgPSB0YXJnZXQubmFtZSAhPT0gT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5iYXNlTmFtZTtcclxuICAgIH1cclxuICAgIC8vIG1lcmdlIG9wdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHRoZSBsYXN0IG9uZSBvdmVycmlkZXMgdGhlIHByZXZpb3VzIG9uZSk6XHJcbiAgICAvLyBkZWZhdWx0IG9wdGlvbnMsIHByb2plY3QgY29uZmlnIGZpbGUsIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcclxuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfT1BUUywgLi4ucHJvakNvbmZpZ09wdHMsIC4uLmNtZE9wdHMsIG5hbWU6IG5hbWUgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1hbmRMaW5lT3B0aW9ucyhhcmd2KSB7XHJcbiAgICBjb25zdCBvcHRzID0ge1xyXG4gICAgICAgIC8vIHN3aXRjaDogLS1uYW1lIFxyXG4gICAgICAgIG5hbWU6IGFyZ3YubmFtZSB8fCBudWxsLFxyXG4gICAgICAgIC8vIHN3aXRjaDogLWIgb3IgLS1icm93c2VyXHJcbiAgICAgICAgYnJvd3Nlck5hbWUgOiBhcmd2LmIgfHwgYXJndi5icm93c2VyIHx8IG51bGwsXHJcbiAgICAgICAgc2VsZW5pdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICBhcHBpdW1VcmwgOiBhcmd2LnMgfHwgYXJndi5zZXJ2ZXIgfHwgbnVsbCxcclxuICAgICAgICByZW9wZW5TZXNzaW9uOiBhcmd2LnJlb3BlbiA/IGFyZ3YucmVvcGVuID09PSAndHJ1ZScgOiBudWxsLFxyXG4gICAgICAgIGl0ZXJhdGlvbnMgOiBhcmd2LmkgPyBwYXJzZUludChhcmd2LmkpIDogKGFyZ3YuaXRlciA/IHBhcnNlSW50KGFyZ3YuaXRlcikgOiBudWxsKSxcclxuICAgICAgICBkZWJ1Z1BvcnQ6IGFyZ3YuZGJncG9ydCB8fCBudWxsLFxyXG4gICAgICAgIHdzUG9ydDogYXJndi53c3BvcnQgfHwgbnVsbCxcclxuICAgICAgICBkZWxheTogYXJndi5kIHx8IGFyZ3YuZGVsYXkgfHwgbnVsbCxcclxuICAgICAgICBhdXRvU3RhcnRXZWJEcml2ZXI6IGFyZ3YuYXV0b3dkICYmIGFyZ3YuYXV0b3dkID09PSAndHJ1ZScgfHwgZmFsc2UsXHJcbiAgICB9O1xyXG4gICAgLy8gc3dpdGNoOiAtLXJmIGZsYWdcclxuICAgIGlmIChhcmd2LnJmICYmIHR5cGVvZiBhcmd2LnJmID09PSAnc3RyaW5nJyAmJiBhcmd2LnJmLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByZXBvcnRGb3JtYXRzID0gYXJndi5yZi5zcGxpdCgnLCcpO1xyXG4gICAgICAgIG9wdHMucmVwb3J0aW5nID0ge1xyXG4gICAgICAgICAgICByZXBvcnRlcnM6IHJlcG9ydEZvcm1hdHNcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIHN3aXRjaDogLS1ybyAtIHNldCByZXBvcnRlciBvdXRwdXQgZGlyZWN0b3J5IGlmIHNldCBieSB1c2VyIHRocm91Z2ggY29tbmFuZCBsaW5lXHJcbiAgICAgICAgLy8gTk9URTogLS1ybyBzd2l0Y2ggbXVzdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXIgd2l0aCAtLXJmXHJcbiAgICAgICAgaWYgKGFyZ3Yucm8gJiYgdHlwZW9mIGFyZ3Yucm8gPT09ICdzdHJpbmcnICYmIGFyZ3Yucm8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvcHRzLnJlcG9ydGluZy5vdXRwdXREaXIgPSBhcmd2LnJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIG9wdGlvbjogLXAgb3IgLS1wYXJhbSBhbmQgLS1wbVxyXG4gICAgaWYgKGFyZ3YucCB8fCBhcmd2LnBhcmFtKSB7XHJcbiAgICAgICAgb3B0cy5wYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICBmaWxlOiBhcmd2LnAgfHwgYXJndi5wYXJhbSB8fCBudWxsLFxyXG4gICAgICAgICAgICBtb2RlOiBhcmd2LnBtIHx8ICdzZXEnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzd2l0Y2g6IC0tc3BlY3MgLSBzZXQgc3BlY3MgaWYgc2V0IGJ5IHVzZXIgdGhyb3VnaCBjb21uYW5kIGxpbmVcclxuICAgIGlmIChhcmd2LnNwZWNzICYmIHR5cGVvZiBhcmd2LnNwZWNzID09PSAnc3RyaW5nJyAmJiBhcmd2LnNwZWNzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBzcGVjcyA9IGFyZ3Yuc3BlY3Muc3BsaXQoJywnKTtcclxuICAgICAgICBvcHRzLnNwZWNzID0gc3BlY3M7XHJcbiAgICB9XHJcbiAgICAvLyBzd2l0Y2g6IC0tbW9kdWxlcyAtIHNldCBhIGxpc3Qgb2YgbW9kdWxlcyB0byBiZSBsb2FkZWQsIGlmIHNldCBieSB1c2VyIHRocm91Z2ggY29tbmFuZCBsaW5lXHJcbiAgICBpZiAoYXJndi5tb2R1bGVzICYmIHR5cGVvZiBhcmd2Lm1vZHVsZXMgPT09ICdzdHJpbmcnICYmIGFyZ3YubW9kdWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlcyA9IGFyZ3YubW9kdWxlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIG9wdHMubW9kdWxlcyA9IG1vZHVsZXM7XHJcbiAgICB9XHJcbiAgICAvLyByZW1vdmUgYW55IHByb3BlcnR5IHdpdGggbnVsbCB2YWx1ZSAoc28gaXQgd29uJ3Qgb3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZXMgaWYgaXQncyBudWxsKVxyXG4gICAgcmV0dXJuIGRlbGV0ZU51bGxQcm9wZXJ0aWVzKG9wdHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWxldGVOdWxsUHJvcGVydGllcyhvYmopIHtcclxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbG9uZSA9IHsgLi4ub2JqIH07XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcclxuICAgIGZvckVhY2ggKGtleXMsIGtleSA9PiB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgKG9ialtrZXldID09IG51bGwgfHwgb2JqW2tleV0gPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICBkZWxldGUgY2xvbmVba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjbG9uZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUYXJnZXRQYXRoKHRhcmdldFBhdGgsIHVzZXJDd2QpIHtcclxuICAgIGxldCBjd2QgPSB1c2VyQ3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICAvLyBnZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiB1c2VyIGhhcyBub3QgcHJvdmlkZWQgcGF0aFxyXG4gICAgaWYgKHR5cGVvZih0YXJnZXRQYXRoKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICB0YXJnZXRQYXRoID0gY3dkO1xyXG4gICAgfVxyXG4gICAgLy8gdXNlcidzIHBhdGggbWlnaHQgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgLSBtYWtlIHN1cmUgdGhlIHJlbGF0aXZlIHBhdGggd2lsbCB3b3JrXHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0YXJnZXRQYXRoID0gb3h1dGlsLnJlc29sdmVQYXRoKHRhcmdldFBhdGgsIGN3ZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RhdHMgPSBmcy5sc3RhdFN5bmModGFyZ2V0UGF0aCk7XHJcbiAgICBjb25zdCBpc0RpcmVjdG9yID0gc3RhdHMuaXNEaXJlY3RvcnkoKTtcclxuICAgIGxldCBjb25maWdGaWxlUGF0aDtcclxuICAgIGlmIChpc0RpcmVjdG9yKSB7XHJcbiAgICAgICAgLy8gaWYgXCJ0YXJnZXRcIiBwcm92aWRlZCBieSB0aGUgdXNlciBpcyBhIGRpcmVjdG9yeSxcclxuICAgICAgICAvLyB0aGVuIHVubGVzcyBcImN3ZFwiIGlzIHByb3ZpZGVkIGV4cGxpY2l0bHkgYnkgdGhlIHVzZXJcclxuICAgICAgICAvLyB1c2UgdGFyZ2V0IGRpcmVjdG9yeSBhcyBjd2RcclxuICAgICAgICBjd2QgPSB1c2VyQ3dkIHx8IHRhcmdldFBhdGg7XHJcbiAgICAgICAgLy8gYXBwZW5kIG94eWdlbiBjb25maWcgZmlsZSBuYW1lIHRvIHRoZSBkaXJlY3RvcnksIGlmIG5vIHRlc3QgY2FzZSBmaWxlIHdhcyBwcm92aWRlZFxyXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHRhcmdldFBhdGgsIE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qcycpO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdGaWxlUGF0aCkpIHtcclxuICAgICAgICAgICAgY29uZmlnRmlsZVBhdGggPSBwYXRoLmpvaW4odGFyZ2V0UGF0aCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzb24nKTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0YXJnZXRQYXRoLmVuZHNXaXRoKE9YWUdFTl9DT05GSUdfRklMRV9OQU1FICsgJy5qcycpIHx8IHRhcmdldFBhdGguZW5kc1dpdGgoT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzb24nKSkge1xyXG4gICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gdGFyZ2V0UGF0aDtcclxuICAgICAgICBjd2QgPSB0YXJnZXRQYXRoID0gcGF0aC5kaXJuYW1lKHRhcmdldFBhdGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY3dkID0gdXNlckN3ZCB8fCBwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCk7XHJcbiAgICAgICAgY29uZmlnRmlsZVBhdGggPSBwYXRoLmpvaW4oY3dkLCBPWFlHRU5fQ09ORklHX0ZJTEVfTkFNRSArICcuanMnKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5qb2luKGN3ZCwgT1hZR0VOX0NPTkZJR19GSUxFX05BTUUgKyAnLmpzb24nKTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGVQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZVBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXRhcmdldFBhdGgpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgLy8gcGF0aCB0byB0aGUgY29uZmlnIG9yIC5qcyBmaWxlXHJcbiAgICAgICAgcGF0aDogdGFyZ2V0UGF0aCxcclxuICAgICAgICBjb25maWdQYXRoOiBjb25maWdGaWxlUGF0aCxcclxuICAgICAgICAvLyB3b3JraW5nIGRpcmVjdG9yeVxyXG4gICAgICAgIGN3ZDogY3dkIHx8IHBhdGguZGlybmFtZSh0YXJnZXRQYXRoKSxcclxuICAgICAgICAvLyBuYW1lIG9mIHRoZSB0YXJnZXQgZmlsZSB3aXRob3V0IGV4dGVuc2lvblxyXG4gICAgICAgIG5hbWU6IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQodGFyZ2V0UGF0aCksXHJcbiAgICAgICAgLy8gbmFtZSBpbmNsdWRpbmcgZXh0ZW5zaW9uXHJcbiAgICAgICAgZnVsbE5hbWU6IHBhdGguYmFzZW5hbWUodGFyZ2V0UGF0aCksXHJcbiAgICAgICAgLy8gcGFyZW50IGZvbGRlcidzIG5hbWVcclxuICAgICAgICBiYXNlTmFtZTogcGF0aC5iYXNlbmFtZShwYXRoLmRpcm5hbWUodGFyZ2V0UGF0aCkpLFxyXG4gICAgICAgIC8vIHRhcmdldCBmaWxlIGV4dGVuc2lvblxyXG4gICAgICAgIGV4dGVuc2lvbjogcGF0aC5leHRuYW1lKHRhcmdldFBhdGgpXHJcbiAgICB9O1xyXG59Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsR0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0Es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