oxygen-cli 1.25.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/core/OxygenCore.js +266 -37
  3. package/build/core/OxygenEvents.js +11 -1
  4. package/build/core/OxygenModule.js +14 -1
  5. package/build/core/OxygenService.js +12 -1
  6. package/build/core/OxygenSubModule.js +10 -1
  7. package/build/core/WebDriverModule.js +30 -1
  8. package/build/core/utils.js +17 -1
  9. package/build/errors/HookError.js +7 -1
  10. package/build/errors/ModuleError.js +7 -1
  11. package/build/errors/ModuleUnavailableError.js +3 -1
  12. package/build/errors/OxygenError.js +33 -1
  13. package/build/errors/ScriptNotFound.js +7 -1
  14. package/build/errors/helper.js +77 -45
  15. package/build/index.js +18 -6
  16. package/build/lib/cli-util.js +90 -28
  17. package/build/lib/cli.js +23 -1
  18. package/build/lib/debugger.js +144 -1
  19. package/build/lib/img-merge.js +15 -1
  20. package/build/lib/launcher.js +28 -1
  21. package/build/lib/moduleRequire.js +4 -1
  22. package/build/lib/param-manager.js +28 -1
  23. package/build/lib/param-reader-csv.js +15 -1
  24. package/build/lib/param-reader-excel.js +14 -1
  25. package/build/lib/param-reader-json.js +10 -1
  26. package/build/lib/text-to-image.js +183 -0
  27. package/build/lib/util.js +58 -3
  28. package/build/model/case-result.js +4 -2
  29. package/build/model/failure.js +2 -1
  30. package/build/model/status.js +2 -1
  31. package/build/model/step-result.js +2 -1
  32. package/build/model/suite-result.js +2 -1
  33. package/build/model/test-result.js +2 -1
  34. package/build/model/testcase.js +2 -1
  35. package/build/model/testsuite.js +2 -1
  36. package/build/ox_modules/index.js +33 -13
  37. package/build/ox_modules/module-assert.js +24 -8
  38. package/build/ox_modules/module-date.js +8 -3
  39. package/build/ox_modules/module-db.js +28 -7
  40. package/build/ox_modules/module-email.js +36 -10
  41. package/build/ox_modules/module-eyes.js +46 -5
  42. package/build/ox_modules/module-http.js +102 -41
  43. package/build/ox_modules/module-log.js +22 -5
  44. package/build/ox_modules/module-mailinator.js +32 -10
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
  48. package/build/ox_modules/module-mob/commands/assertText.js +3 -1
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
  50. package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
  51. package/build/ox_modules/module-mob/commands/back.js +2 -1
  52. package/build/ox_modules/module-mob/commands/clear.js +4 -1
  53. package/build/ox_modules/module-mob/commands/click.js +4 -3
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
  55. package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
  57. package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
  61. package/build/ox_modules/module-mob/commands/execute.js +2 -1
  62. package/build/ox_modules/module-mob/commands/findElement.js +3 -1
  63. package/build/ox_modules/module-mob/commands/findElements.js +4 -1
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
  71. package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
  72. package/build/ox_modules/module-mob/commands/getSource.js +2 -1
  73. package/build/ox_modules/module-mob/commands/getText.js +4 -1
  74. package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
  75. package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
  76. package/build/ox_modules/module-mob/commands/getValue.js +9 -5
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
  79. package/build/ox_modules/module-mob/commands/index.js +94 -19
  80. package/build/ox_modules/module-mob/commands/installApp.js +2 -1
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
  83. package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
  84. package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
  85. package/build/ox_modules/module-mob/commands/isExist.js +3 -1
  86. package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
  87. package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
  89. package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
  91. package/build/ox_modules/module-mob/commands/open.js +3 -1
  92. package/build/ox_modules/module-mob/commands/pause.js +2 -1
  93. package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
  94. package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
  97. package/build/ox_modules/module-mob/commands/select.js +4 -1
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
  101. package/build/ox_modules/module-mob/commands/setContext.js +2 -1
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
  105. package/build/ox_modules/module-mob/commands/shake.js +2 -1
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
  108. package/build/ox_modules/module-mob/commands/swipe.js +2 -1
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
  112. package/build/ox_modules/module-mob/commands/tap.js +2 -1
  113. package/build/ox_modules/module-mob/commands/type.js +7 -3
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
  118. package/build/ox_modules/module-mob.js +141 -72
  119. package/build/ox_modules/module-pdf.js +62 -23
  120. package/build/ox_modules/module-proxy.js +68 -8
  121. package/build/ox_modules/module-serial.js +32 -7
  122. package/build/ox_modules/module-shell.js +27 -8
  123. package/build/ox_modules/module-soap.js +47 -14
  124. package/build/ox_modules/module-twilio.js +53 -10
  125. package/build/ox_modules/module-utils.js +51 -16
  126. package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
  128. package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
  129. package/build/ox_modules/module-web/commands/assertExist.js +2 -1
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
  132. package/build/ox_modules/module-web/commands/assertText.js +3 -1
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
  135. package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
  136. package/build/ox_modules/module-web/commands/assertValue.js +3 -1
  137. package/build/ox_modules/module-web/commands/back.js +2 -1
  138. package/build/ox_modules/module-web/commands/clear.js +5 -1
  139. package/build/ox_modules/module-web/commands/click.js +13 -4
  140. package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
  141. package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
  144. package/build/ox_modules/module-web/commands/deselect.js +2 -1
  145. package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
  147. package/build/ox_modules/module-web/commands/execute.js +2 -1
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
  149. package/build/ox_modules/module-web/commands/findElement.js +3 -1
  150. package/build/ox_modules/module-web/commands/findElements.js +4 -1
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
  152. package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
  153. package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
  155. package/build/ox_modules/module-web/commands/getCookies.js +2 -1
  156. package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
  157. package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
  158. package/build/ox_modules/module-web/commands/getHTML.js +2 -1
  159. package/build/ox_modules/module-web/commands/getSource.js +2 -1
  160. package/build/ox_modules/module-web/commands/getText.js +4 -1
  161. package/build/ox_modules/module-web/commands/getTitle.js +2 -1
  162. package/build/ox_modules/module-web/commands/getUrl.js +2 -1
  163. package/build/ox_modules/module-web/commands/getValue.js +5 -1
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
  167. package/build/ox_modules/module-web/commands/index.js +100 -19
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
  169. package/build/ox_modules/module-web/commands/isChecked.js +2 -1
  170. package/build/ox_modules/module-web/commands/isExist.js +3 -1
  171. package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
  172. package/build/ox_modules/module-web/commands/isSelected.js +2 -1
  173. package/build/ox_modules/module-web/commands/isVisible.js +3 -1
  174. package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
  177. package/build/ox_modules/module-web/commands/newWindow.js +2 -1
  178. package/build/ox_modules/module-web/commands/open.js +4 -1
  179. package/build/ox_modules/module-web/commands/pause.js +2 -1
  180. package/build/ox_modules/module-web/commands/point.js +2 -1
  181. package/build/ox_modules/module-web/commands/pointJS.js +8 -2
  182. package/build/ox_modules/module-web/commands/refresh.js +2 -1
  183. package/build/ox_modules/module-web/commands/rightClick.js +8 -3
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
  186. package/build/ox_modules/module-web/commands/select.js +5 -1
  187. package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
  188. package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
  189. package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
  194. package/build/ox_modules/module-web/commands/type.js +5 -1
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
  196. package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -1
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
  205. package/build/ox_modules/module-web.js +181 -82
  206. package/build/ox_modules/module-win/commands/assertText.js +3 -1
  207. package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
  208. package/build/ox_modules/module-win/commands/assertValue.js +15 -9
  209. package/build/ox_modules/module-win/commands/back.js +2 -1
  210. package/build/ox_modules/module-win/commands/clear.js +4 -1
  211. package/build/ox_modules/module-win/commands/click.js +2 -1
  212. package/build/ox_modules/module-win/commands/clickLong.js +2 -1
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
  214. package/build/ox_modules/module-win/commands/findElement.js +3 -1
  215. package/build/ox_modules/module-win/commands/findElements.js +4 -1
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
  218. package/build/ox_modules/module-win/commands/getLocation.js +2 -1
  219. package/build/ox_modules/module-win/commands/getSource.js +2 -1
  220. package/build/ox_modules/module-win/commands/getText.js +4 -1
  221. package/build/ox_modules/module-win/commands/getValue.js +9 -5
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
  223. package/build/ox_modules/module-win/commands/index.js +43 -5
  224. package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
  225. package/build/ox_modules/module-win/commands/isChecked.js +2 -1
  226. package/build/ox_modules/module-win/commands/isClickable.js +2 -1
  227. package/build/ox_modules/module-win/commands/isExist.js +3 -1
  228. package/build/ox_modules/module-win/commands/isSelected.js +2 -1
  229. package/build/ox_modules/module-win/commands/isVisible.js +3 -1
  230. package/build/ox_modules/module-win/commands/open.js +2 -1
  231. package/build/ox_modules/module-win/commands/pause.js +2 -1
  232. package/build/ox_modules/module-win/commands/rightClick.js +2 -1
  233. package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
  234. package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
  235. package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
  237. package/build/ox_modules/module-win/commands/tap.js +2 -1
  238. package/build/ox_modules/module-win/commands/type.js +4 -1
  239. package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
  242. package/build/ox_modules/module-win.js +87 -48
  243. package/build/ox_modules/utils.js +76 -22
  244. package/build/ox_reporters/reporter-excel.js +58 -1
  245. package/build/ox_reporters/reporter-html.js +28 -1
  246. package/build/ox_reporters/reporter-json.js +14 -1
  247. package/build/ox_reporters/reporter-junit.js +24 -1
  248. package/build/ox_reporters/reporter-pdf.js +19 -1
  249. package/build/ox_reporters/reporter-xml.js +17 -1
  250. package/build/ox_services/service-devtools/submodule-network.js +91 -4
  251. package/build/ox_services/service-devtools.js +23 -1
  252. package/build/reporter/FileReporterBase.js +44 -5
  253. package/build/reporter/ReportAggregator.js +65 -1
  254. package/build/reporter/ReporterBase.js +6 -1
  255. package/build/runners/WorkerProcess.js +99 -1
  256. package/build/runners/cucumber/CucumberEventListener.js +29 -4
  257. package/build/runners/cucumber/CucumberReporter.js +56 -1
  258. package/build/runners/cucumber/CucumberWorker.js +66 -1
  259. package/build/runners/cucumber/index.js +30 -1
  260. package/build/runners/cucumber/worker.js +18 -1
  261. package/build/runners/index.js +6 -1
  262. package/build/runners/oxygen/OxygenWorker.js +60 -3
  263. package/build/runners/oxygen/index.js +178 -17
  264. package/build/runners/oxygen/worker.js +25 -2
  265. package/package.json +8 -8
  266. package/.babelrc +0 -28
  267. package/.eslintrc.json +0 -25
  268. package/.husky/pre-commit +0 -4
  269. package/CONTRIBUTE.md +0 -1
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  require("source-map-support/register");
4
+
4
5
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
6
+
5
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+
6
9
  /*
7
10
  * Copyright (C) 2015-present CloudBeat Limited
8
11
  *
@@ -11,8 +14,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
11
14
  * the Free Software Foundation, either version 3 of the License, or
12
15
  * (at your option) any later version.
13
16
  */
14
-
15
17
  const errHelper = require('../errors/helper');
18
+
16
19
  const providers = {
17
20
  PERFECTO: 'perfecto',
18
21
  BROWSERSTACK: 'browserstack',
@@ -26,21 +29,32 @@ const contextList = {
26
29
  hybrid: 'hybrid',
27
30
  web: 'web'
28
31
  };
32
+
29
33
  const isElementNotFound = el => {
30
34
  let result = false;
31
- 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'))) {
35
+
36
+ if (el.error && (el.error.error === 'no such element' || el.error.message &&
37
+ /* winappdriver win.rightClick */
38
+ el.error.message.startsWith('no such element') || el.error.message &&
39
+ /* winappdriver */
40
+ el.error.message.startsWith('An element could not be located'))) {
32
41
  result = true;
33
42
  }
43
+
34
44
  return result;
35
45
  };
46
+
36
47
  module.exports = {
37
48
  matchPattern: function (val, pattern) {
38
49
  if (!val && !pattern) {
39
50
  return true;
40
51
  }
52
+
41
53
  var globToRegex = require('glob-to-regexp');
54
+
42
55
  pattern = pattern.toString().replace(/\s+/g, ' ');
43
56
  var regex;
57
+
44
58
  if (pattern.indexOf('regex:') == 0) {
45
59
  // match using a regular-expression
46
60
  regex = new RegExp(pattern.substring('regex:'.length), 'g');
@@ -70,20 +84,26 @@ module.exports = {
70
84
  if (timeout) {
71
85
  await module.exports.setTimeoutImplicit.call(this, timeout);
72
86
  }
87
+
73
88
  var el;
89
+
74
90
  if (locator && locator.constructor && locator.constructor.name === 'Element') {
75
91
  el = locator;
76
92
  } else {
77
93
  locator = this.helpers.getWdioLocator(locator);
78
94
  el = await this.driver.$(locator);
79
95
  }
96
+
80
97
  const elementNotFound = isElementNotFound(el);
98
+
81
99
  if (elementNotFound) {
82
100
  if (timeout) {
83
101
  await module.exports.restoreTimeoutImplicit.call(this);
84
102
  }
103
+
85
104
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_FOUND, `Unable to find element: ${locator}`);
86
105
  }
106
+
87
107
  if (waitForVisible) {
88
108
  try {
89
109
  await el.waitForDisplayed({
@@ -93,53 +113,67 @@ module.exports = {
93
113
  if (timeout) {
94
114
  await module.exports.restoreTimeoutImplicit.call(this);
95
115
  }
116
+
96
117
  if (e.message && e.message.includes('still not displayed')) {
97
118
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_VISIBLE, `Element not visible: ${locator}`);
98
119
  }
120
+
99
121
  throw e;
100
122
  }
101
123
  }
124
+
102
125
  if (timeout) {
103
126
  await module.exports.restoreTimeoutImplicit.call(this);
104
127
  }
128
+
105
129
  return el;
106
130
  },
107
131
  getElements: async function (locator, timeout) {
108
132
  if (timeout) {
109
133
  await module.exports.setTimeoutImplicit.call(this, timeout);
110
134
  }
135
+
111
136
  let els = [];
137
+
112
138
  try {
113
139
  els = await this.driver.$$(this.helpers.getWdioLocator(locator));
114
140
  } catch (e) {
115
141
  const elementsNotFound = isElementNotFound(els);
116
- if (elementsNotFound) {
117
- // ignore errors
142
+
143
+ if (elementsNotFound) {// ignore errors
118
144
  } else {
119
145
  throw e;
120
146
  }
121
147
  }
148
+
122
149
  if (timeout) {
123
150
  await module.exports.restoreTimeoutImplicit.call(this);
124
151
  }
152
+
125
153
  return els;
126
154
  },
127
155
  getChildElement: async function (locator, parentElement, waitForVisible, timeout) {
128
156
  if (timeout) {
129
157
  await module.exports.setTimeoutImplicit.call(this, timeout);
130
158
  }
159
+
131
160
  locator = this.helpers.getWdioLocator(locator);
161
+
132
162
  if (!(parentElement && parentElement.$)) {
133
163
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - parentElement, must be a valid element');
134
164
  }
165
+
135
166
  var el = await parentElement.$(locator);
136
167
  const elementNotFound = isElementNotFound(el);
168
+
137
169
  if (elementNotFound) {
138
170
  if (timeout) {
139
171
  await module.exports.restoreTimeoutImplicit.call(this);
140
172
  }
173
+
141
174
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_FOUND, `Unable to find element: ${locator}`);
142
175
  }
176
+
143
177
  if (waitForVisible) {
144
178
  try {
145
179
  await el.waitForDisplayed({
@@ -149,60 +183,73 @@ module.exports = {
149
183
  if (timeout) {
150
184
  await module.exports.restoreTimeoutImplicit.call(this);
151
185
  }
186
+
152
187
  if (e.message && e.message.includes('still not displayed')) {
153
188
  throw new _OxygenError.default(errHelper.errorCode.ELEMENT_NOT_VISIBLE, `Element not visible: ${locator}`);
154
189
  }
190
+
155
191
  throw e;
156
192
  }
157
193
  }
194
+
158
195
  if (timeout) {
159
196
  await module.exports.restoreTimeoutImplicit.call(this);
160
197
  }
198
+
161
199
  return el;
162
200
  },
163
201
  getChildElements: async function (locator, parentElement, timeout) {
164
202
  if (timeout) {
165
203
  module.exports.setTimeoutImplicit.call(this, timeout);
166
204
  }
205
+
167
206
  locator = this.helpers.getWdioLocator(locator);
207
+
168
208
  if (!(parentElement && parentElement.$$)) {
169
209
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid argument - parentElement, must be a valid element');
170
210
  }
211
+
171
212
  let els = [];
213
+
172
214
  try {
173
215
  els = await parentElement.$$(locator);
174
216
  } catch (e) {
175
217
  const elementsNotFound = isElementNotFound(els);
176
- if (elementsNotFound) {
177
- // ignore errors
218
+
219
+ if (elementsNotFound) {// ignore errors
178
220
  } else {
179
221
  throw e;
180
222
  }
181
223
  }
224
+
182
225
  if (timeout) {
183
226
  await module.exports.restoreTimeoutImplicit.call(this);
184
227
  }
228
+
185
229
  return els;
186
230
  },
187
231
  setTimeoutImplicit: async function (timeout) {
188
232
  if (!this.driver) {
189
233
  return;
190
234
  }
235
+
191
236
  if (this.driver.seleniumTimeout && timeout > this.driver.seleniumTimeout * 1000) {
192
237
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `timeout must be less than ${this.driver.seleniumTimeout * 1000}`);
193
238
  }
239
+
194
240
  if (this.driver.seleniumBrowserTimeout && timeout > this.driver.seleniumBrowserTimeout * 1000) {
195
241
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, `timeout must be less than ${this.driver.seleniumBrowserTimeout * 1000}`);
196
242
  }
243
+
197
244
  let timeouts;
245
+
198
246
  if (this.driver.capabilities && this.driver.capabilities.browserName === 'MicrosoftEdge') {
199
247
  // not supported on Edge
200
248
  return;
201
249
  } else if (this.driver.getTimeouts) {
202
250
  // chrome >= 75
203
251
  try {
204
- if (this.driver.capabilities && this.driver.capabilities.stopUrl && this.driver.capabilities.stopUrl.includes('perfectomobile.com')) {
205
- //ignore
252
+ if (this.driver.capabilities && this.driver.capabilities.stopUrl && this.driver.capabilities.stopUrl.includes('perfectomobile.com')) {//ignore
206
253
  } else {
207
254
  timeouts = await this.driver.getTimeouts();
208
255
  }
@@ -214,12 +261,15 @@ module.exports = {
214
261
  // chrome >= 72 && chrome < 75
215
262
  timeouts = this.driver.capabilities.timeouts;
216
263
  }
264
+
217
265
  if (timeouts && timeouts.implicit) {
218
266
  this._prevImplicitTimeout = timeouts.implicit;
219
267
  }
268
+
220
269
  if (timeouts && timeouts.pageLoad) {
221
270
  this._prevPageLoadTimeout = timeouts.pageLoad;
222
271
  }
272
+
223
273
  if (this.driver.setTimeout) {
224
274
  if (this.driver.capabilities && this.driver.capabilities.browserName) {
225
275
  // browserName 'default' on android
@@ -240,6 +290,7 @@ module.exports = {
240
290
  'implicit': this._prevImplicitTimeout
241
291
  });
242
292
  }
293
+
243
294
  if (this._prevPageLoadTimeout && this.driver.setTimeout) {
244
295
  await this.driver.setTimeout({
245
296
  'pageLoad': this._prevPageLoadTimeout
@@ -290,15 +341,14 @@ module.exports = {
290
341
  assertContext: async function (...alowedContexts) {
291
342
  var context = await this.driver.getContext();
292
343
  const isWeb = context && (context.indexOf('WEBVIEW') > -1 || context.indexOf('CHROMIUM') > -1);
344
+
293
345
  if (isWeb) {
294
- if (alowedContexts.includes(contextList.web) || alowedContexts.includes(contextList.hybrid)) {
295
- // ignore, all is ok
346
+ if (alowedContexts.includes(contextList.web) || alowedContexts.includes(contextList.hybrid)) {// ignore, all is ok
296
347
  } else {
297
348
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid context');
298
349
  }
299
350
  } else {
300
- if (alowedContexts.includes(contextList.android) || alowedContexts.includes(contextList.ios)) {
301
- // ignore, all is ok
351
+ if (alowedContexts.includes(contextList.android) || alowedContexts.includes(contextList.ios)) {// ignore, all is ok
302
352
  } else {
303
353
  throw new _OxygenError.default(errHelper.errorCode.SCRIPT_ERROR, 'Invalid context');
304
354
  }
@@ -307,15 +357,15 @@ module.exports = {
307
357
  getWdioLocator: function (locator) {
308
358
  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
309
359
  else if (locator.indexOf('id=') === 0) {
310
- // generate XPath instead of CSS for browser tests, since ID can contain illegal characters
311
- // and escaping doesn't work reliably or in identical manner in all browser
312
- if (this.driver.capabilities && this.driver.capabilities.browserName) {
313
- return `//*[@id="${locator.substr('id='.length)}"]`;
314
- } else {
315
- return '#' + locator.substr('id='.length);
316
- }
317
- } 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
318
- else if (locator.indexOf('tag=') === 0) return '<' + locator.substr('tag='.length) + ' />';
360
+ // generate XPath instead of CSS for browser tests, since ID can contain illegal characters
361
+ // and escaping doesn't work reliably or in identical manner in all browser
362
+ if (this.driver.capabilities && this.driver.capabilities.browserName) {
363
+ return `//*[@id="${locator.substr('id='.length)}"]`;
364
+ } else {
365
+ return '#' + locator.substr('id='.length);
366
+ }
367
+ } 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
368
+ else if (locator.indexOf('tag=') === 0) return '<' + locator.substr('tag='.length) + ' />';
319
369
  return locator;
320
370
  },
321
371
  getLogTypes: function (context) {
@@ -330,6 +380,7 @@ module.exports = {
330
380
  if (!wdioOpts || !wdioOpts.capabilities) {
331
381
  return null;
332
382
  }
383
+
333
384
  if (wdioOpts.capabilities['perfectoMobile:options'] || wdioOpts.hostname && wdioOpts.hostname.includes('perfectomobile.com')) {
334
385
  return providers.PERFECTO;
335
386
  } else if (wdioOpts.capabilities['bstack:options']) {
@@ -341,6 +392,7 @@ module.exports = {
341
392
  } else if (wdioOpts.capabilities['testingBot:options']) {
342
393
  return providers.TESTINGBOT;
343
394
  }
395
+
344
396
  return null;
345
397
  },
346
398
  hasCircularDependency: function (obj) {
@@ -351,13 +403,15 @@ module.exports = {
351
403
  return String(e);
352
404
  }
353
405
  }
406
+
354
407
  return false;
355
408
  },
356
409
  assertCircular: function (obj) {
357
410
  const hasCircularDependency = this.hasCircularDependency(obj);
411
+
358
412
  if (hasCircularDependency) {
359
413
  throw new _OxygenError.default(errHelper.errorCode.CIRCULAR_ERROR, hasCircularDependency);
360
414
  }
361
415
  }
362
416
  };
363
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJIZWxwZXIiLCJyZXF1aXJlIiwicHJvdmlkZXJzIiwiUEVSRkVDVE8iLCJCUk9XU0VSU1RBQ0siLCJTQVVDRUxBQlMiLCJMQU1CREFURVNUIiwiVEVTVElOR0JPVCIsImNvbnRleHRMaXN0IiwiYW5kcm9pZCIsImlvcyIsImh5YnJpZCIsIndlYiIsImlzRWxlbWVudE5vdEZvdW5kIiwiZWwiLCJyZXN1bHQiLCJlcnJvciIsIm1lc3NhZ2UiLCJzdGFydHNXaXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1hdGNoUGF0dGVybiIsInZhbCIsInBhdHRlcm4iLCJnbG9iVG9SZWdleCIsInRvU3RyaW5nIiwicmVwbGFjZSIsInJlZ2V4IiwiaW5kZXhPZiIsIlJlZ0V4cCIsInN1YnN0cmluZyIsImxlbmd0aCIsInRlc3QiLCJmbGFncyIsImdldEVsZW1lbnQiLCJsb2NhdG9yIiwid2FpdEZvclZpc2libGUiLCJ0aW1lb3V0Iiwic2V0VGltZW91dEltcGxpY2l0IiwiY2FsbCIsImNvbnN0cnVjdG9yIiwibmFtZSIsImhlbHBlcnMiLCJnZXRXZGlvTG9jYXRvciIsImRyaXZlciIsIiQiLCJlbGVtZW50Tm90Rm91bmQiLCJyZXN0b3JlVGltZW91dEltcGxpY2l0IiwiT3hFcnJvciIsImVycm9yQ29kZSIsIkVMRU1FTlRfTk9UX0ZPVU5EIiwid2FpdEZvckRpc3BsYXllZCIsIndhaXRGb3JUaW1lb3V0IiwiZSIsImluY2x1ZGVzIiwiRUxFTUVOVF9OT1RfVklTSUJMRSIsImdldEVsZW1lbnRzIiwiZWxzIiwiJCQiLCJlbGVtZW50c05vdEZvdW5kIiwiZ2V0Q2hpbGRFbGVtZW50IiwicGFyZW50RWxlbWVudCIsIlNDUklQVF9FUlJPUiIsImdldENoaWxkRWxlbWVudHMiLCJzZWxlbml1bVRpbWVvdXQiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0IiwidGltZW91dHMiLCJjYXBhYmlsaXRpZXMiLCJicm93c2VyTmFtZSIsImdldFRpbWVvdXRzIiwic3RvcFVybCIsImNvbnNvbGUiLCJsb2ciLCJpbXBsaWNpdCIsIl9wcmV2SW1wbGljaXRUaW1lb3V0IiwicGFnZUxvYWQiLCJfcHJldlBhZ2VMb2FkVGltZW91dCIsInNldFRpbWVvdXQiLCJhc3NlcnRBcmd1bWVudCIsImFyZyIsInVuZGVmaW5lZCIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0Q29udGV4dCIsImFsb3dlZENvbnRleHRzIiwiY29udGV4dCIsImdldENvbnRleHQiLCJpc1dlYiIsInN1YnN0ciIsImdldExvZ1R5cGVzIiwicHJvdmlkZXIiLCJkZXRlcm1pbmVQcm92aWRlciIsIndkaW9PcHRzIiwiaG9zdG5hbWUiLCJoYXNDaXJjdWxhckRlcGVuZGVuY3kiLCJvYmoiLCJKU09OIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwiYXNzZXJ0Q2lyY3VsYXIiLCJDSVJDVUxBUl9FUlJPUiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuY29uc3QgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5cclxuY29uc3QgcHJvdmlkZXJzID0ge1xyXG4gICAgUEVSRkVDVE86ICdwZXJmZWN0bycsXHJcbiAgICBCUk9XU0VSU1RBQ0s6ICdicm93c2Vyc3RhY2snLFxyXG4gICAgU0FVQ0VMQUJTOiAnc2F1Y2UnLFxyXG4gICAgTEFNQkRBVEVTVDogJ2xhbWJkYScsXHJcbiAgICBURVNUSU5HQk9UOiAndGVzdGluZ2JvdCdcclxufTtcclxuXHJcbmNvbnN0IGNvbnRleHRMaXN0ID0ge1xyXG4gICAgYW5kcm9pZDogJ2FuZHJvaWQnLFxyXG4gICAgaW9zOiAnaW9zJyxcclxuICAgIGh5YnJpZDogJ2h5YnJpZCcsXHJcbiAgICB3ZWI6ICd3ZWInXHJcbn07XHJcblxyXG5jb25zdCBpc0VsZW1lbnROb3RGb3VuZCA9IChlbCkgPT4ge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgaWYgKFxyXG4gICAgICAgIGVsLmVycm9yICYmIChcclxuICAgICAgICBlbC5lcnJvci5lcnJvciA9PT0gJ25vIHN1Y2ggZWxlbWVudCcgfHxcclxuICAgICAgICAoZWwuZXJyb3IubWVzc2FnZSAmJiAvKiB3aW5hcHBkcml2ZXIgd2luLnJpZ2h0Q2xpY2sgKi8gZWwuZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKCdubyBzdWNoIGVsZW1lbnQnKSB8fFxyXG4gICAgICAgIGVsLmVycm9yLm1lc3NhZ2UgJiYgLyogd2luYXBwZHJpdmVyICovIGVsLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbG9jYXRlZCcpKSlcclxuICAgICkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBtYXRjaFBhdHRlcm46IGZ1bmN0aW9uKHZhbCwgcGF0dGVybikge1xyXG4gICAgICAgIGlmICghdmFsICYmICFwYXR0ZXJuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGdsb2JUb1JlZ2V4ID0gcmVxdWlyZSgnZ2xvYi10by1yZWdleHAnKTtcclxuICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcclxuXHJcbiAgICAgICAgdmFyIHJlZ2V4O1xyXG4gICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ3JlZ2V4OicpID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCB1c2luZyBhIHJlZ3VsYXItZXhwcmVzc2lvblxyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybi5zdWJzdHJpbmcoJ3JlZ2V4OicubGVuZ3RoKSwgJ2cnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZigncmVnZXhpOicpID09IDApIHsgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdXNpbmcgYSBjYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXItZXhwcmVzc2lvblxyXG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybi5zdWJzdHJpbmcoJ3JlZ2V4aTonLmxlbmd0aCksICdpZycpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWwpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5pbmRleE9mKCdleGFjdDonKSA9PSAwIHx8IHBhdHRlcm4gPT09ICcnKSB7ICAvLyBtYXRjaCBhIHN0cmluZyBleGFjdGx5LCB2ZXJiYXRpbVxyXG4gICAgICAgICAgICByZXR1cm4gcGF0dGVybi5zdWJzdHJpbmcoJ2V4YWN0OicubGVuZ3RoKSA9PT0gdmFsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5pbmRleE9mKCdnbG9iOicpID09IDApIHsgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBhZ2FpbnN0IGEgY2FzZS1pbnNlbnNpdGl2ZSBcImdsb2JcIiBwYXR0ZXJuXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gZ2xvYlRvUmVnZXgocGF0dGVybi5zdWJzdHJpbmcoJ2dsb2I6Jy5sZW5ndGgpLCB7IGZsYWdzOiAnaWcnIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWwpO1xyXG4gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwcmVmaXggc2FtZSBhcyBnbG9iIG1hdGNoaW5nXHJcbiAgICAgICAgICAgIHJlZ2V4ID0gZ2xvYlRvUmVnZXgocGF0dGVybiwgeyBmbGFnczogJ2lnJyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEVsZW1lbnQ6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHdhaXRGb3JWaXNpYmxlLCB0aW1lb3V0KSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZWw7XHJcbiAgICAgICAgaWYgKGxvY2F0b3IgJiYgbG9jYXRvci5jb25zdHJ1Y3RvciAmJiBsb2NhdG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdFbGVtZW50Jykge1xyXG4gICAgICAgICAgICBlbCA9IGxvY2F0b3I7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuICAgICAgICAgICAgZWwgPSBhd2FpdCB0aGlzLmRyaXZlci4kKGxvY2F0b3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudE5vdEZvdW5kID0gaXNFbGVtZW50Tm90Rm91bmQoZWwpO1xyXG4gICAgICAgIGlmIChlbGVtZW50Tm90Rm91bmQpIHtcclxuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX0ZPVU5ELCBgVW5hYmxlIHRvIGZpbmQgZWxlbWVudDogJHtsb2NhdG9yfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdhaXRGb3JWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBlbC53YWl0Rm9yRGlzcGxheWVkKHsgdGltZW91dDp0aW1lb3V0ID8gdGltZW91dCA6IHRoaXMud2FpdEZvclRpbWVvdXR9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5tZXNzYWdlICYmIGUubWVzc2FnZS5pbmNsdWRlcygnc3RpbGwgbm90IGRpc3BsYXllZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9WSVNJQkxFLCBgRWxlbWVudCBub3QgdmlzaWJsZTogJHtsb2NhdG9yfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVsO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRFbGVtZW50czogYXN5bmMgZnVuY3Rpb24obG9jYXRvciwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVscyA9IFtdO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbHMgPSBhd2FpdCB0aGlzLmRyaXZlci4kJCh0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcikpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNOb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVscyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50c05vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVscztcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q2hpbGRFbGVtZW50OiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCBwYXJlbnRFbGVtZW50LCB3YWl0Rm9yVmlzaWJsZSwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYXRvciA9IHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvcihsb2NhdG9yKTtcclxuXHJcbiAgICAgICAgaWYgKCEocGFyZW50RWxlbWVudCAmJiBwYXJlbnRFbGVtZW50LiQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBhcmd1bWVudCAtIHBhcmVudEVsZW1lbnQsIG11c3QgYmUgYSB2YWxpZCBlbGVtZW50Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZWwgPSBhd2FpdCBwYXJlbnRFbGVtZW50LiQobG9jYXRvcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnROb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVsKTtcclxuICAgICAgICBpZiAoZWxlbWVudE5vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9GT1VORCwgYFVuYWJsZSB0byBmaW5kIGVsZW1lbnQ6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3YWl0Rm9yVmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZWwud2FpdEZvckRpc3BsYXllZCh7IHRpbWVvdXQ6IHRpbWVvdXQgPyB0aW1lb3V0IDogdGhpcy53YWl0Rm9yVGltZW91dH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdzdGlsbCBub3QgZGlzcGxheWVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkVMRU1FTlRfTk9UX1ZJU0lCTEUsIGBFbGVtZW50IG5vdCB2aXNpYmxlOiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENoaWxkRWxlbWVudHM6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHBhcmVudEVsZW1lbnQsIHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cy5zZXRUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzLCB0aW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2F0b3IgPSB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcik7XHJcblxyXG4gICAgICAgIGlmICghKHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudC4kJCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gcGFyZW50RWxlbWVudCwgbXVzdCBiZSBhIHZhbGlkIGVsZW1lbnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbHMgPSBbXTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbHMgPSBhd2FpdCBwYXJlbnRFbGVtZW50LiQkKGxvY2F0b3IpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNOb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVscyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50c05vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWxzO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRUaW1lb3V0SW1wbGljaXQ6IGFzeW5jIGZ1bmN0aW9uKHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZHJpdmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgJiYgdGltZW91dCA+IHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCAqIDEwMDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIGB0aW1lb3V0IG11c3QgYmUgbGVzcyB0aGFuICR7dGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ICogMTAwMH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgJiYgdGltZW91dCA+IHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgKiAxMDAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgdGltZW91dCBtdXN0IGJlIGxlc3MgdGhhbiAke3RoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgKiAxMDAwfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVvdXRzO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJlxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPT09ICdNaWNyb3NvZnRFZGdlJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIG9uIEVkZ2VcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIuZ2V0VGltZW91dHMpIHtcclxuICAgICAgICAgICAgLy8gY2hyb21lID49IDc1XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLnN0b3BVcmwgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuc3RvcFVybC5pbmNsdWRlcygncGVyZmVjdG9tb2JpbGUuY29tJylcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGltZW91dHMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gZmFpbHMgb24gcGVyZmVjdG8gbW9iaWxlXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0VGltZW91dHMgZXJyb3InLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy50aW1lb3V0cykge1xyXG4gICAgICAgICAgICAvLyBjaHJvbWUgPj0gNzIgJiYgY2hyb21lIDwgNzVcclxuICAgICAgICAgICAgdGltZW91dHMgPSB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMudGltZW91dHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZW91dHMgJiYgdGltZW91dHMuaW1wbGljaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldkltcGxpY2l0VGltZW91dCA9IHRpbWVvdXRzLmltcGxpY2l0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZW91dHMgJiYgdGltZW91dHMucGFnZUxvYWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldlBhZ2VMb2FkVGltZW91dCA9IHRpbWVvdXRzLnBhZ2VMb2FkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIuc2V0VGltZW91dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzICYmIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYnJvd3Nlck5hbWUgJ2RlZmF1bHQnIG9uIGFuZHJvaWQgXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHtcclxuICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQnOiB0aW1lb3V0LFxyXG4gICAgICAgICAgICAgICAgICAgICdwYWdlTG9hZCc6IHRpbWVvdXRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGltZW91dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICByZXN0b3JlVGltZW91dEltcGxpY2l0OiBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5fcHJldkltcGxpY2l0VGltZW91dCAmJiB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLl9wcmV2SW1wbGljaXRUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcHJldlBhZ2VMb2FkVGltZW91dCAmJiB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAncGFnZUxvYWQnOiB0aGlzLl9wcmV2UGFnZUxvYWRUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnQ6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgaXMgcmVxdWlyZWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRTdHJpbmc6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBzdHJpbmcuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZzogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudE51bWJlcjogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRCb29sOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT0gdHlwZW9mKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSB0cnVlIG9yIGZhbHNlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGFyZykgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZihhcmcpICE9IHR5cGVvZih0cnVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgdHJ1ZSBvciBmYWxzZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudFRpbWVvdXQ6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgJiYgKHR5cGVvZihhcmcpICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24gbmVnYXRpdmUgbnVtYmVyLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNvbnRleHRMaXN0OiBjb250ZXh0TGlzdCxcclxuXHJcbiAgICBhc3NlcnRDb250ZXh0OiBhc3luYyBmdW5jdGlvbiguLi5hbG93ZWRDb250ZXh0cykge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0Q29udGV4dCgpO1xyXG4gICAgICAgIGNvbnN0IGlzV2ViID0gKGNvbnRleHQgJiYgKGNvbnRleHQuaW5kZXhPZignV0VCVklFVycpID4gLTEgfHwgY29udGV4dC5pbmRleE9mKCdDSFJPTUlVTScpID4gLTEpKTtcclxuXHJcbiAgICAgICAgaWYgKGlzV2ViKSB7XHJcbiAgICAgICAgICAgIGlmIChhbG93ZWRDb250ZXh0cy5pbmNsdWRlcyhjb250ZXh0TGlzdC53ZWIpIHx8IGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0Lmh5YnJpZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWxsIGlzIG9rXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgY29udGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LmFuZHJvaWQpIHx8IGFsb3dlZENvbnRleHRzLmluY2x1ZGVzKGNvbnRleHRMaXN0LmlvcykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWxsIGlzIG9rXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgY29udGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRXZGlvTG9jYXRvcjogZnVuY3Rpb24obG9jYXRvcikge1xyXG4gICAgICAgIGlmICghbG9jYXRvcilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gbG9jYXRvciBub3Qgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvY2F0b3IgPT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJy8nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgeHBhdGggbG9jYXRvciBhcyBpc1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignaWQ9JykgPT09IDApIHtcclxuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgWFBhdGggaW5zdGVhZCBvZiBDU1MgZm9yIGJyb3dzZXIgdGVzdHMsIHNpbmNlIElEIGNhbiBjb250YWluIGlsbGVnYWwgY2hhcmFjdGVyc1xyXG4gICAgICAgICAgICAvLyBhbmQgZXNjYXBpbmcgZG9lc24ndCB3b3JrIHJlbGlhYmx5IG9yIGluIGlkZW50aWNhbCBtYW5uZXIgaW4gYWxsIGJyb3dzZXJcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJiB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgLy8qW0BpZD1cIiR7bG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKX1cIl1gO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcjJyArIGxvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCduYW1lPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJ1tuYW1lPVwiJyArIGxvY2F0b3Iuc3Vic3RyKCduYW1lPScubGVuZ3RoKSArICdcIl0nO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluaz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICc9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbmstY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnKj0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignY3NzPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvci5zdWJzdHIoJ2Nzcz0nLmxlbmd0aCk7ICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGNzcywganVzdCByZW1vdmUgY3NzPSBwcmVmaXhcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3RhZz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICc8JyArIGxvY2F0b3Iuc3Vic3RyKCd0YWc9Jy5sZW5ndGgpICsgJyAvPic7XHJcblxyXG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRMb2dUeXBlczogZnVuY3Rpb24oY29udGV4dCkge1xyXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnTkFUSVZFX0FQUCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsnbG9nY2F0JywgJ2J1Z3JlcG9ydCcsICdzZXJ2ZXInXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gWydicm93c2VyJywgJ2RyaXZlciddO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgcHJvdmlkZXI6IHByb3ZpZGVycyxcclxuXHJcbiAgICBkZXRlcm1pbmVQcm92aWRlcjogZnVuY3Rpb24od2Rpb09wdHMpIHtcclxuICAgICAgICBpZiAoIXdkaW9PcHRzIHx8ICF3ZGlvT3B0cy5jYXBhYmlsaXRpZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10gfHwgKHdkaW9PcHRzLmhvc3RuYW1lICYmIHdkaW9PcHRzLmhvc3RuYW1lLmluY2x1ZGVzKCdwZXJmZWN0b21vYmlsZS5jb20nKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5QRVJGRUNUTztcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLkJST1dTRVJTVEFDSztcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snc2F1Y2U6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuU0FVQ0VMQUJTO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuaG9zdG5hbWUuaW5jbHVkZXMoJ2xhbWJkYXRlc3QnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLkxBTUJEQVRFU1Q7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuVEVTVElOR0JPVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICBoYXNDaXJjdWxhckRlcGVuZGVuY3k6IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvYmopO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKFN0cmluZyhlKS5pbmNsdWRlcygnQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTicpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0Q2lyY3VsYXI6IGZ1bmN0aW9uKG9iaikge1xyXG4gICAgICAgIGNvbnN0IGhhc0NpcmN1bGFyRGVwZW5kZW5jeSA9IHRoaXMuaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KG9iaik7XHJcbiAgICAgICAgaWYgKGhhc0NpcmN1bGFyRGVwZW5kZW5jeSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkNJUkNVTEFSX0VSUk9SLCBoYXNDaXJjdWxhckRlcGVuZGVuY3kpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbn07XHJcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBVUE7QUFBNEM7QUFWNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUc3QyxNQUFNQyxTQUFTLEdBQUc7RUFDZEMsUUFBUSxFQUFFLFVBQVU7RUFDcEJDLFlBQVksRUFBRSxjQUFjO0VBQzVCQyxTQUFTLEVBQUUsT0FBTztFQUNsQkMsVUFBVSxFQUFFLFFBQVE7RUFDcEJDLFVBQVUsRUFBRTtBQUNoQixDQUFDO0FBRUQsTUFBTUMsV0FBVyxHQUFHO0VBQ2hCQyxPQUFPLEVBQUUsU0FBUztFQUNsQkMsR0FBRyxFQUFFLEtBQUs7RUFDVkMsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEdBQUcsRUFBRTtBQUNULENBQUM7QUFFRCxNQUFNQyxpQkFBaUIsR0FBSUMsRUFBRSxJQUFLO0VBQzlCLElBQUlDLE1BQU0sR0FBRyxLQUFLO0VBQ2xCLElBQ0lELEVBQUUsQ0FBQ0UsS0FBSyxLQUNSRixFQUFFLENBQUNFLEtBQUssQ0FBQ0EsS0FBSyxLQUFLLGlCQUFpQixJQUNuQ0YsRUFBRSxDQUFDRSxLQUFLLENBQUNDLE9BQU8sSUFBSSxpQ0FBa0NILEVBQUUsQ0FBQ0UsS0FBSyxDQUFDQyxPQUFPLENBQUNDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUNyR0osRUFBRSxDQUFDRSxLQUFLLENBQUNDLE9BQU8sSUFBSSxrQkFBbUJILEVBQUUsQ0FBQ0UsS0FBSyxDQUFDQyxPQUFP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
417
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL3V0aWxzLmpzIl0sIm5hbWVzIjpbImVyckhlbHBlciIsInJlcXVpcmUiLCJwcm92aWRlcnMiLCJQRVJGRUNUTyIsIkJST1dTRVJTVEFDSyIsIlNBVUNFTEFCUyIsIkxBTUJEQVRFU1QiLCJURVNUSU5HQk9UIiwiY29udGV4dExpc3QiLCJhbmRyb2lkIiwiaW9zIiwiaHlicmlkIiwid2ViIiwiaXNFbGVtZW50Tm90Rm91bmQiLCJlbCIsInJlc3VsdCIsImVycm9yIiwibWVzc2FnZSIsInN0YXJ0c1dpdGgiLCJtb2R1bGUiLCJleHBvcnRzIiwibWF0Y2hQYXR0ZXJuIiwidmFsIiwicGF0dGVybiIsImdsb2JUb1JlZ2V4IiwidG9TdHJpbmciLCJyZXBsYWNlIiwicmVnZXgiLCJpbmRleE9mIiwiUmVnRXhwIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwidGVzdCIsImZsYWdzIiwiZ2V0RWxlbWVudCIsImxvY2F0b3IiLCJ3YWl0Rm9yVmlzaWJsZSIsInRpbWVvdXQiLCJzZXRUaW1lb3V0SW1wbGljaXQiLCJjYWxsIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaGVscGVycyIsImdldFdkaW9Mb2NhdG9yIiwiZHJpdmVyIiwiJCIsImVsZW1lbnROb3RGb3VuZCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiRUxFTUVOVF9OT1RfRk9VTkQiLCJ3YWl0Rm9yRGlzcGxheWVkIiwid2FpdEZvclRpbWVvdXQiLCJlIiwiaW5jbHVkZXMiLCJFTEVNRU5UX05PVF9WSVNJQkxFIiwiZ2V0RWxlbWVudHMiLCJlbHMiLCIkJCIsImVsZW1lbnRzTm90Rm91bmQiLCJnZXRDaGlsZEVsZW1lbnQiLCJwYXJlbnRFbGVtZW50IiwiU0NSSVBUX0VSUk9SIiwiZ2V0Q2hpbGRFbGVtZW50cyIsInNlbGVuaXVtVGltZW91dCIsInNlbGVuaXVtQnJvd3NlclRpbWVvdXQiLCJ0aW1lb3V0cyIsImNhcGFiaWxpdGllcyIsImJyb3dzZXJOYW1lIiwiZ2V0VGltZW91dHMiLCJzdG9wVXJsIiwiY29uc29sZSIsImxvZyIsImltcGxpY2l0IiwiX3ByZXZJbXBsaWNpdFRpbWVvdXQiLCJwYWdlTG9hZCIsIl9wcmV2UGFnZUxvYWRUaW1lb3V0Iiwic2V0VGltZW91dCIsImFzc2VydEFyZ3VtZW50IiwiYXJnIiwidW5kZWZpbmVkIiwiYXNzZXJ0QXJndW1lbnRTdHJpbmciLCJhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROdW1iZXIiLCJhc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlIiwiYXNzZXJ0QXJndW1lbnRCb29sIiwiYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJhc3NlcnRDb250ZXh0IiwiYWxvd2VkQ29udGV4dHMiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsImlzV2ViIiwic3Vic3RyIiwiZ2V0TG9nVHlwZXMiLCJwcm92aWRlciIsImRldGVybWluZVByb3ZpZGVyIiwid2Rpb09wdHMiLCJob3N0bmFtZSIsImhhc0NpcmN1bGFyRGVwZW5kZW5jeSIsIm9iaiIsIkpTT04iLCJzdHJpbmdpZnkiLCJTdHJpbmciLCJhc3NlcnRDaXJjdWxhciIsIkNJUkNVTEFSX0VSUk9SIl0sIm1hcHBpbmdzIjoiOzs7O0FBVUE7Ozs7QUFWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsa0JBQUQsQ0FBekI7O0FBR0EsTUFBTUMsU0FBUyxHQUFHO0FBQ2RDLEVBQUFBLFFBQVEsRUFBRSxVQURJO0FBRWRDLEVBQUFBLFlBQVksRUFBRSxjQUZBO0FBR2RDLEVBQUFBLFNBQVMsRUFBRSxPQUhHO0FBSWRDLEVBQUFBLFVBQVUsRUFBRSxRQUpFO0FBS2RDLEVBQUFBLFVBQVUsRUFBRTtBQUxFLENBQWxCO0FBUUEsTUFBTUMsV0FBVyxHQUFHO0FBQ2hCQyxFQUFBQSxPQUFPLEVB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LFVBQVVDLEdBQVYsRUFBZTtBQUNsQyxRQUFJO0FBQ0FDLE1BQUFBLElBQUksQ0FBQ0MsU0FBTCxDQUFlRixHQUFmO0FBQ0gsS0FGRCxDQUVFLE9BQU8vQyxDQUFQLEVBQVU7QUFDUixVQUFJa0QsTUFBTSxDQUFDbEQsQ0FBRCxDQUFOLENBQVVDLFFBQVYsQ0FBbUIsdUNBQW5CLENBQUosRUFBaUU7QUFDN0QsZUFBT2lELE1BQU0sQ0FBQ2xELENBQUQsQ0FBYjtBQUNIO0FBQ0o7O0FBQ0QsV0FBTyxLQUFQO0FBQ0gsR0F4WFk7QUEwWGJtRCxFQUFBQSxjQUFjLEVBQUUsVUFBU0osR0FBVCxFQUFjO0FBQzFCLFVBQU1ELHFCQUFxQixHQUFHLEtBQUtBLHFCQUFMLENBQTJCQyxHQUEzQixDQUE5Qjs7QUFDQSxRQUFJRCxxQkFBSixFQUEyQjtBQUN2QixZQUFNLElBQUluRCxvQkFBSixDQUFZaEQsU0FBUyxDQUFDaUQsU0FBVixDQUFvQndELGNBQWhDLEVBQWdETixxQkFBaEQsQ0FBTjtBQUNIO0FBQ0o7QUEvWFksQ0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbmNvbnN0IGVyckhlbHBlciA9IHJlcXVpcmUoJy4uL2Vycm9ycy9oZWxwZXInKTtcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbmNvbnN0IHByb3ZpZGVycyA9IHtcclxuICAgIFBFUkZFQ1RPOiAncGVyZmVjdG8nLFxyXG4gICAgQlJPV1NFUlNUQUNLOiAnYnJvd3NlcnN0YWNrJyxcclxuICAgIFNBVUNFTEFCUzogJ3NhdWNlJyxcclxuICAgIExBTUJEQVRFU1Q6ICdsYW1iZGEnLFxyXG4gICAgVEVTVElOR0JPVDogJ3Rlc3Rpbmdib3QnXHJcbn07XHJcblxyXG5jb25zdCBjb250ZXh0TGlzdCA9IHtcclxuICAgIGFuZHJvaWQ6ICdhbmRyb2lkJyxcclxuICAgIGlvczogJ2lvcycsXHJcbiAgICBoeWJyaWQ6ICdoeWJyaWQnLFxyXG4gICAgd2ViOiAnd2ViJ1xyXG59O1xyXG5cclxuY29uc3QgaXNFbGVtZW50Tm90Rm91bmQgPSAoZWwpID0+IHtcclxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuICAgIGlmIChcclxuICAgICAgICBlbC5lcnJvciAmJiAoXHJcbiAgICAgICAgZWwuZXJyb3IuZXJyb3IgPT09ICdubyBzdWNoIGVsZW1lbnQnIHx8XHJcbiAgICAgICAgKGVsLmVycm9yLm1lc3NhZ2UgJiYgLyogd2luYXBwZHJpdmVyIHdpbi5yaWdodENsaWNrICovIGVsLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnbm8gc3VjaCBlbGVtZW50JykgfHxcclxuICAgICAgICBlbC5lcnJvci5tZXNzYWdlICYmIC8qIHdpbmFwcGRyaXZlciAqLyBlbC5lcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0FuIGVsZW1lbnQgY291bGQgbm90IGJlIGxvY2F0ZWQnKSkpXHJcbiAgICApIHtcclxuICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgbWF0Y2hQYXR0ZXJuOiBmdW5jdGlvbih2YWwsIHBhdHRlcm4pIHtcclxuICAgICAgICBpZiAoIXZhbCAmJiAhcGF0dGVybikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBnbG9iVG9SZWdleCA9IHJlcXVpcmUoJ2dsb2ItdG8tcmVnZXhwJyk7XHJcbiAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4udG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XHJcblxyXG4gICAgICAgIHZhciByZWdleDtcclxuICAgICAgICBpZiAocGF0dGVybi5pbmRleE9mKCdyZWdleDonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggdXNpbmcgYSByZWd1bGFyLWV4cHJlc3Npb25cclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4uc3Vic3RyaW5nKCdyZWdleDonLmxlbmd0aCksICdnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHZhbCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLmluZGV4T2YoJ3JlZ2V4aTonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoIHVzaW5nIGEgY2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyLWV4cHJlc3Npb25cclxuICAgICAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4uc3Vic3RyaW5nKCdyZWdleGk6Jy5sZW5ndGgpLCAnaWcnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZignZXhhY3Q6JykgPT0gMCB8fCBwYXR0ZXJuID09PSAnJykgeyAgLy8gbWF0Y2ggYSBzdHJpbmcgZXhhY3RseSwgdmVyYmF0aW1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4uc3Vic3RyaW5nKCdleGFjdDonLmxlbmd0aCkgPT09IHZhbDtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uaW5kZXhPZignZ2xvYjonKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIGNhc2UtaW5zZW5zaXRpdmUgXCJnbG9iXCIgcGF0dGVyblxyXG4gICAgICAgICAgICByZWdleCA9IGdsb2JUb1JlZ2V4KHBhdHRlcm4uc3Vic3RyaW5nKCdnbG9iOicubGVuZ3RoKSwgeyBmbGFnczogJ2lnJyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsKTtcclxuICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJlZml4IHNhbWUgYXMgZ2xvYiBtYXRjaGluZ1xyXG4gICAgICAgICAgICByZWdleCA9IGdsb2JUb1JlZ2V4KHBhdHRlcm4sIHsgZmxhZ3M6ICdpZycgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRFbGVtZW50OiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCB3YWl0Rm9yVmlzaWJsZSwgdGltZW91dCkge1xyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnNldFRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMsIHRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGVsO1xyXG4gICAgICAgIGlmIChsb2NhdG9yICYmIGxvY2F0b3IuY29uc3RydWN0b3IgJiYgbG9jYXRvci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnRWxlbWVudCcpIHtcclxuICAgICAgICAgICAgZWwgPSBsb2NhdG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxvY2F0b3IgPSB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcik7XHJcbiAgICAgICAgICAgIGVsID0gYXdhaXQgdGhpcy5kcml2ZXIuJChsb2NhdG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnROb3RGb3VuZCA9IGlzRWxlbWVudE5vdEZvdW5kKGVsKTtcclxuICAgICAgICBpZiAoZWxlbWVudE5vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9GT1VORCwgYFVuYWJsZSB0byBmaW5kIGVsZW1lbnQ6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3YWl0Rm9yVmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZWwud2FpdEZvckRpc3BsYXllZCh7IHRpbWVvdXQ6dGltZW91dCA/IHRpbWVvdXQgOiB0aGlzLndhaXRGb3JUaW1lb3V0fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0aWxsIG5vdCBkaXNwbGF5ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfVklTSUJMRSwgYEVsZW1lbnQgbm90IHZpc2libGU6ICR7bG9jYXRvcn1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0RWxlbWVudHM6IGFzeW5jIGZ1bmN0aW9uKGxvY2F0b3IsIHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5zZXRUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzLCB0aW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbHMgPSBbXTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZWxzID0gYXdhaXQgdGhpcy5kcml2ZXIuJCQodGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yKGxvY2F0b3IpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzTm90Rm91bmQgPSBpc0VsZW1lbnROb3RGb3VuZChlbHMpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNOb3RGb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZS5leHBvcnRzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbHM7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldENoaWxkRWxlbWVudDogYXN5bmMgZnVuY3Rpb24obG9jYXRvciwgcGFyZW50RWxlbWVudCwgd2FpdEZvclZpc2libGUsIHRpbWVvdXQpIHtcclxuICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5zZXRUaW1lb3V0SW1wbGljaXQuY2FsbCh0aGlzLCB0aW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2F0b3IgPSB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcik7XHJcblxyXG4gICAgICAgIGlmICghKHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudC4kKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgYXJndW1lbnQgLSBwYXJlbnRFbGVtZW50LCBtdXN0IGJlIGEgdmFsaWQgZWxlbWVudCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGVsID0gYXdhaXQgcGFyZW50RWxlbWVudC4kKGxvY2F0b3IpO1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50Tm90Rm91bmQgPSBpc0VsZW1lbnROb3RGb3VuZChlbCk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnROb3RGb3VuZCkge1xyXG4gICAgICAgICAgICBpZiAodGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuRUxFTUVOVF9OT1RfRk9VTkQsIGBVbmFibGUgdG8gZmluZCBlbGVtZW50OiAke2xvY2F0b3J9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2FpdEZvclZpc2libGUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGVsLndhaXRGb3JEaXNwbGF5ZWQoeyB0aW1lb3V0OiB0aW1lb3V0ID8gdGltZW91dCA6IHRoaXMud2FpdEZvclRpbWVvdXR9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBtb2R1bGUuZXhwb3J0cy5yZXN0b3JlVGltZW91dEltcGxpY2l0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5tZXNzYWdlICYmIGUubWVzc2FnZS5pbmNsdWRlcygnc3RpbGwgbm90IGRpc3BsYXllZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5FTEVNRU5UX05PVF9WSVNJQkxFLCBgRWxlbWVudCBub3QgdmlzaWJsZTogJHtsb2NhdG9yfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVsO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDaGlsZEVsZW1lbnRzOiBhc3luYyBmdW5jdGlvbihsb2NhdG9yLCBwYXJlbnRFbGVtZW50LCB0aW1lb3V0KSB7XHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMuc2V0VGltZW91dEltcGxpY2l0LmNhbGwodGhpcywgdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhdG9yID0gdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yKGxvY2F0b3IpO1xyXG5cclxuICAgICAgICBpZiAoIShwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnQuJCQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBhcmd1bWVudCAtIHBhcmVudEVsZW1lbnQsIG11c3QgYmUgYSB2YWxpZCBlbGVtZW50Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZWxzID0gW107XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZWxzID0gYXdhaXQgcGFyZW50RWxlbWVudC4kJChsb2NhdG9yKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzTm90Rm91bmQgPSBpc0VsZW1lbnROb3RGb3VuZChlbHMpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNOb3RGb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgYXdhaXQgbW9kdWxlLmV4cG9ydHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdC5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVscztcclxuICAgIH0sXHJcblxyXG4gICAgc2V0VGltZW91dEltcGxpY2l0OiBhc3luYyBmdW5jdGlvbih0aW1lb3V0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRyaXZlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ICYmIHRpbWVvdXQgPiB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgKiAxMDAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgdGltZW91dCBtdXN0IGJlIGxlc3MgdGhhbiAke3RoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCAqIDEwMDB9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ICYmIHRpbWVvdXQgPiB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ICogMTAwMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgYHRpbWVvdXQgbXVzdCBiZSBsZXNzIHRoYW4gJHt0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ICogMTAwMH1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0aW1lb3V0cztcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID09PSAnTWljcm9zb2Z0RWRnZSdcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBvbiBFZGdlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLmdldFRpbWVvdXRzKSB7XHJcbiAgICAgICAgICAgIC8vIGNocm9tZSA+PSA3NVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcy5zdG9wVXJsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLnN0b3BVcmwuaW5jbHVkZXMoJ3BlcmZlY3RvbW9iaWxlLmNvbScpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0cyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFRpbWVvdXRzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGZhaWxzIG9uIHBlcmZlY3RvIG1vYmlsZVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2dldFRpbWVvdXRzIGVycm9yJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJiB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMudGltZW91dHMpIHtcclxuICAgICAgICAgICAgLy8gY2hyb21lID49IDcyICYmIGNocm9tZSA8IDc1XHJcbiAgICAgICAgICAgIHRpbWVvdXRzID0gdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLnRpbWVvdXRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXRzICYmIHRpbWVvdXRzLmltcGxpY2l0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZJbXBsaWNpdFRpbWVvdXQgPSB0aW1lb3V0cy5pbXBsaWNpdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbWVvdXRzICYmIHRpbWVvdXRzLnBhZ2VMb2FkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZQYWdlTG9hZFRpbWVvdXQgPSB0aW1lb3V0cy5wYWdlTG9hZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnNldFRpbWVvdXQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLmNhcGFiaWxpdGllcyAmJiB0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGJyb3dzZXJOYW1lICdkZWZhdWx0JyBvbiBhbmRyb2lkIFxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICAncGFnZUxvYWQnOiB0aW1lb3V0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICdpbXBsaWNpdCc6IHRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgcmVzdG9yZVRpbWVvdXRJbXBsaWNpdDogYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZJbXBsaWNpdFRpbWVvdXQgJiYgdGhpcy5kcml2ZXIuc2V0VGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHsgJ2ltcGxpY2l0JzogdGhpcy5fcHJldkltcGxpY2l0VGltZW91dCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZQYWdlTG9hZFRpbWVvdXQgJiYgdGhpcy5kcml2ZXIuc2V0VGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zZXRUaW1lb3V0KHsgJ3BhZ2VMb2FkJzogdGhpcy5fcHJldlBhZ2VMb2FkVGltZW91dCB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50OiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAoYXJnID09PSB1bmRlZmluZWQgfHwgYXJnID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIGlzIHJlcXVpcmVkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50U3RyaW5nOiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgc3RyaW5nLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmc6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICghYXJnIHx8IHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBcIkludmFsaWQgYXJndW1lbnQgLSAnXCIgKyBuYW1lICsgXCInIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnROdW1iZXI6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoYXJnKSAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbnVtYmVyLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmU6IGZ1bmN0aW9uKGFyZywgbmFtZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoYXJnKSAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydEFyZ3VtZW50Qm9vbDogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9IHR5cGVvZih0cnVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCJJbnZhbGlkIGFyZ3VtZW50IC0gJ1wiICsgbmFtZSArIFwiJyBzaG91bGQgYmUgdHJ1ZSBvciBmYWxzZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbDogZnVuY3Rpb24oYXJnLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihhcmcpICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YoYXJnKSAhPSB0eXBlb2YodHJ1ZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIHRydWUgb3IgZmFsc2UuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYXNzZXJ0QXJndW1lbnRUaW1lb3V0OiBmdW5jdGlvbihhcmcsIG5hbWUpIHtcclxuICAgICAgICBpZiAoYXJnICYmICh0eXBlb2YoYXJnKSAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiSW52YWxpZCBhcmd1bWVudCAtICdcIiArIG5hbWUgKyBcIicgc2hvdWxkIGJlIGEgbm9uIG5lZ2F0aXZlIG51bWJlci5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBjb250ZXh0TGlzdDogY29udGV4dExpc3QsXHJcblxyXG4gICAgYXNzZXJ0Q29udGV4dDogYXN5bmMgZnVuY3Rpb24oLi4uYWxvd2VkQ29udGV4dHMpIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldENvbnRleHQoKTtcclxuICAgICAgICBjb25zdCBpc1dlYiA9IChjb250ZXh0ICYmIChjb250ZXh0LmluZGV4T2YoJ1dFQlZJRVcnKSA+IC0xIHx8IGNvbnRleHQuaW5kZXhPZignQ0hST01JVU0nKSA+IC0xKSk7XHJcblxyXG4gICAgICAgIGlmIChpc1dlYikge1xyXG4gICAgICAgICAgICBpZiAoYWxvd2VkQ29udGV4dHMuaW5jbHVkZXMoY29udGV4dExpc3Qud2ViKSB8fCBhbG93ZWRDb250ZXh0cy5pbmNsdWRlcyhjb250ZXh0TGlzdC5oeWJyaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIGFsbCBpcyBva1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGNvbnRleHQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhbG93ZWRDb250ZXh0cy5pbmNsdWRlcyhjb250ZXh0TGlzdC5hbmRyb2lkKSB8fCBhbG93ZWRDb250ZXh0cy5pbmNsdWRlcyhjb250ZXh0TGlzdC5pb3MpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIGFsbCBpcyBva1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGNvbnRleHQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0V2Rpb0xvY2F0b3I6IGZ1bmN0aW9uKGxvY2F0b3IpIHtcclxuICAgICAgICBpZiAoIWxvY2F0b3IpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBhcmd1bWVudCAtIGxvY2F0b3Igbm90IHNwZWNpZmllZCcpO1xyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsb2NhdG9yID09PSAnb2JqZWN0JylcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCcvJykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIHhwYXRoIGxvY2F0b3IgYXMgaXNcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2lkPScpID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIGdlbmVyYXRlIFhQYXRoIGluc3RlYWQgb2YgQ1NTIGZvciBicm93c2VyIHRlc3RzLCBzaW5jZSBJRCBjYW4gY29udGFpbiBpbGxlZ2FsIGNoYXJhY3RlcnNcclxuICAgICAgICAgICAgLy8gYW5kIGVzY2FwaW5nIGRvZXNuJ3Qgd29yayByZWxpYWJseSBvciBpbiBpZGVudGljYWwgbWFubmVyIGluIGFsbCBicm93c2VyXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMgJiYgdGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYC8vKltAaWQ9XCIke2xvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCl9XCJdYDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnIycgKyBsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbmFtZT0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuICdbbmFtZT1cIicgKyBsb2NhdG9yLnN1YnN0cignbmFtZT0nLmxlbmd0aCkgKyAnXCJdJztcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbms9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnPScgKyBsb2NhdG9yLnN1YnN0cignbGluaz0nLmxlbmd0aCk7XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdsaW5rLWNvbnRhaW5zPScpID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gJyo9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2Nzcz0nKSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3Iuc3Vic3RyKCdjc3M9Jy5sZW5ndGgpOyAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBjc3MsIGp1c3QgcmVtb3ZlIGNzcz0gcHJlZml4XHJcbiAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCd0YWc9JykgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAnPCcgKyBsb2NhdG9yLnN1YnN0cigndGFnPScubGVuZ3RoKSArICcgLz4nO1xyXG5cclxuICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0TG9nVHlwZXM6IGZ1bmN0aW9uKGNvbnRleHQpIHtcclxuICAgICAgICBpZiAoY29udGV4dCA9PT0gJ05BVElWRV9BUFAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbJ2xvZ2NhdCcsICdidWdyZXBvcnQnLCAnc2VydmVyJ107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsnYnJvd3NlcicsICdkcml2ZXInXTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHByb3ZpZGVyOiBwcm92aWRlcnMsXHJcblxyXG4gICAgZGV0ZXJtaW5lUHJvdmlkZXI6IGZ1bmN0aW9uKHdkaW9PcHRzKSB7XHJcbiAgICAgICAgaWYgKCF3ZGlvT3B0cyB8fCAhd2Rpb09wdHMuY2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddIHx8ICh3ZGlvT3B0cy5ob3N0bmFtZSAmJiB3ZGlvT3B0cy5ob3N0bmFtZS5pbmNsdWRlcygncGVyZmVjdG9tb2JpbGUuY29tJykpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuUEVSRkVDVE87XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5CUk9XU0VSU1RBQ0s7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3NhdWNlOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLlNBVUNFTEFCUztcclxuICAgICAgICB9IGVsc2UgaWYgKHdkaW9PcHRzLmhvc3RuYW1lLmluY2x1ZGVzKCdsYW1iZGF0ZXN0JykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5MQU1CREFURVNUO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLlRFU1RJTkdCT1Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgaGFzQ2lyY3VsYXJEZXBlbmRlbmN5OiBmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob2JqKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChTdHJpbmcoZSkuaW5jbHVkZXMoJ0NvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04nKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIGFzc2VydENpcmN1bGFyOiBmdW5jdGlvbihvYmopIHtcclxuICAgICAgICBjb25zdCBoYXNDaXJjdWxhckRlcGVuZGVuY3kgPSB0aGlzLmhhc0NpcmN1bGFyRGVwZW5kZW5jeShvYmopO1xyXG4gICAgICAgIGlmIChoYXNDaXJjdWxhckRlcGVuZGVuY3kpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5DSVJDVUxBUl9FUlJPUiwgaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG59O1xyXG4iXX0=