oxygen-cli 1.41.0 → 1.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/build/core/OxygenCore.js +93 -283
  3. package/build/core/OxygenEvents.js +2 -12
  4. package/build/core/OxygenModule.js +1 -16
  5. package/build/core/OxygenService.js +1 -12
  6. package/build/core/OxygenSubModule.js +1 -10
  7. package/build/core/WebDriverModule.js +2 -32
  8. package/build/core/utils.js +22 -21
  9. package/build/errors/HookError.js +2 -8
  10. package/build/errors/ModuleError.js +2 -8
  11. package/build/errors/ModuleUnavailableError.js +1 -3
  12. package/build/errors/OxygenError.js +3 -36
  13. package/build/errors/ScriptNotFound.js +2 -8
  14. package/build/errors/helper.js +50 -82
  15. package/build/index.js +8 -22
  16. package/build/lib/cli-util.js +36 -105
  17. package/build/lib/cli.js +3 -30
  18. package/build/lib/debugger.js +2 -145
  19. package/build/lib/img-merge.js +2 -16
  20. package/build/lib/launcher.js +3 -31
  21. package/build/lib/moduleRequire.js +1 -4
  22. package/build/lib/parallel-launcher.js +44 -84
  23. package/build/lib/param-manager.js +2 -29
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/text-to-image.js +5 -26
  28. package/build/lib/util.js +13 -84
  29. package/build/model/case-result.js +1 -2
  30. package/build/model/failure.js +1 -2
  31. package/build/model/status.js +1 -2
  32. package/build/model/step-result.js +1 -2
  33. package/build/model/suite-result.js +1 -2
  34. package/build/model/test-result.js +1 -2
  35. package/build/model/testcase.js +1 -2
  36. package/build/model/testsuite.js +1 -2
  37. package/build/ox_modules/index.js +20 -41
  38. package/build/ox_modules/module-assert.js +9 -28
  39. package/build/ox_modules/module-date.js +3 -8
  40. package/build/ox_modules/module-db.js +8 -29
  41. package/build/ox_modules/module-email.js +14 -45
  42. package/build/ox_modules/module-eyes.js +6 -47
  43. package/build/ox_modules/module-http/ntlm-util.js +3 -7
  44. package/build/ox_modules/module-http/ntlm.js +9 -78
  45. package/build/ox_modules/module-http.js +69 -172
  46. package/build/ox_modules/module-log.js +10 -23
  47. package/build/ox_modules/module-mailinator.js +11 -33
  48. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
  49. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
  50. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
  51. package/build/ox_modules/module-mob/commands/assertText.js +1 -4
  52. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
  53. package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
  54. package/build/ox_modules/module-mob/commands/back.js +1 -3
  55. package/build/ox_modules/module-mob/commands/clear.js +1 -5
  56. package/build/ox_modules/module-mob/commands/click.js +3 -5
  57. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
  58. package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
  59. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
  60. package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
  61. package/build/ox_modules/module-mob/commands/debug.js +2 -3
  62. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
  63. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
  64. package/build/ox_modules/module-mob/commands/execute.js +1 -3
  65. package/build/ox_modules/module-mob/commands/findElement.js +1 -4
  66. package/build/ox_modules/module-mob/commands/findElements.js +1 -5
  67. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
  68. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
  69. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
  70. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
  71. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
  72. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
  73. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
  74. package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
  75. package/build/ox_modules/module-mob/commands/getSource.js +1 -3
  76. package/build/ox_modules/module-mob/commands/getText.js +1 -5
  77. package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
  78. package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
  79. package/build/ox_modules/module-mob/commands/getValue.js +5 -10
  80. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
  81. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
  82. package/build/ox_modules/module-mob/commands/index.js +1 -148
  83. package/build/ox_modules/module-mob/commands/installApp.js +1 -3
  84. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
  85. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
  87. package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isExist.js +1 -4
  89. package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
  90. package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
  91. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
  92. package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
  93. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
  94. package/build/ox_modules/module-mob/commands/open.js +1 -4
  95. package/build/ox_modules/module-mob/commands/pause.js +1 -3
  96. package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
  97. package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
  98. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
  99. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
  100. package/build/ox_modules/module-mob/commands/select.js +1 -5
  101. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
  102. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
  103. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
  104. package/build/ox_modules/module-mob/commands/setContext.js +1 -3
  105. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
  106. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
  107. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
  108. package/build/ox_modules/module-mob/commands/shake.js +1 -3
  109. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
  110. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
  111. package/build/ox_modules/module-mob/commands/swipe.js +1 -3
  112. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
  113. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
  114. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
  115. package/build/ox_modules/module-mob/commands/tap.js +1 -3
  116. package/build/ox_modules/module-mob/commands/type.js +3 -8
  117. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
  118. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
  119. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
  120. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
  121. package/build/ox_modules/module-mob.js +107 -217
  122. package/build/ox_modules/module-mongo.js +14 -51
  123. package/build/ox_modules/module-pdf.js +24 -65
  124. package/build/ox_modules/module-proxy.js +9 -69
  125. package/build/ox_modules/module-serial.js +8 -33
  126. package/build/ox_modules/module-shell.js +10 -30
  127. package/build/ox_modules/module-soap.js +17 -52
  128. package/build/ox_modules/module-twilio.js +11 -54
  129. package/build/ox_modules/module-utils.js +22 -58
  130. package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
  131. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
  133. package/build/ox_modules/module-web/commands/assertExist.js +1 -3
  134. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
  135. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
  136. package/build/ox_modules/module-web/commands/assertText.js +1 -4
  137. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
  138. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
  139. package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
  140. package/build/ox_modules/module-web/commands/assertValue.js +1 -4
  141. package/build/ox_modules/module-web/commands/back.js +1 -3
  142. package/build/ox_modules/module-web/commands/clear.js +1 -6
  143. package/build/ox_modules/module-web/commands/click.js +4 -15
  144. package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
  145. package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
  146. package/build/ox_modules/module-web/commands/debug.js +2 -3
  147. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
  148. package/build/ox_modules/module-web/commands/deselect.js +1 -3
  149. package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
  150. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
  151. package/build/ox_modules/module-web/commands/execute.js +1 -3
  152. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
  153. package/build/ox_modules/module-web/commands/findElement.js +1 -4
  154. package/build/ox_modules/module-web/commands/findElements.js +1 -5
  155. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
  156. package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
  157. package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
  158. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
  159. package/build/ox_modules/module-web/commands/getCookies.js +1 -3
  160. package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
  161. package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
  162. package/build/ox_modules/module-web/commands/getHTML.js +1 -3
  163. package/build/ox_modules/module-web/commands/getSource.js +1 -3
  164. package/build/ox_modules/module-web/commands/getText.js +1 -5
  165. package/build/ox_modules/module-web/commands/getTitle.js +1 -3
  166. package/build/ox_modules/module-web/commands/getUrl.js +1 -3
  167. package/build/ox_modules/module-web/commands/getValue.js +1 -6
  168. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
  169. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
  170. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
  171. package/build/ox_modules/module-web/commands/index.js +1 -184
  172. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
  173. package/build/ox_modules/module-web/commands/isChecked.js +1 -3
  174. package/build/ox_modules/module-web/commands/isExist.js +1 -4
  175. package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
  176. package/build/ox_modules/module-web/commands/isSelected.js +1 -3
  177. package/build/ox_modules/module-web/commands/isVisible.js +1 -4
  178. package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
  179. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
  180. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
  181. package/build/ox_modules/module-web/commands/mock.js +1 -3
  182. package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
  183. package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
  184. package/build/ox_modules/module-web/commands/newWindow.js +1 -3
  185. package/build/ox_modules/module-web/commands/open.js +1 -5
  186. package/build/ox_modules/module-web/commands/pause.js +1 -3
  187. package/build/ox_modules/module-web/commands/point.js +1 -3
  188. package/build/ox_modules/module-web/commands/pointJS.js +2 -9
  189. package/build/ox_modules/module-web/commands/refresh.js +1 -3
  190. package/build/ox_modules/module-web/commands/rightClick.js +3 -9
  191. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
  192. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
  193. package/build/ox_modules/module-web/commands/select.js +1 -6
  194. package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
  195. package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
  196. package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
  197. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
  198. package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
  199. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
  200. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
  201. package/build/ox_modules/module-web/commands/type.js +1 -6
  202. package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
  203. package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
  204. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
  205. package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
  206. package/build/ox_modules/module-web/commands/verifyText.js +1 -4
  207. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
  208. package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
  209. package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
  210. package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
  211. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
  212. package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
  213. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
  214. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
  215. package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
  216. package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
  217. package/build/ox_modules/module-web/commands/waitForText.js +1 -4
  218. package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
  219. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
  220. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
  221. package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
  222. package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
  223. package/build/ox_modules/module-web.js +169 -233
  224. package/build/ox_modules/module-win/commands/assertText.js +1 -4
  225. package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
  226. package/build/ox_modules/module-win/commands/assertValue.js +9 -17
  227. package/build/ox_modules/module-win/commands/back.js +1 -3
  228. package/build/ox_modules/module-win/commands/clear.js +1 -5
  229. package/build/ox_modules/module-win/commands/click.js +1 -3
  230. package/build/ox_modules/module-win/commands/clickLong.js +1 -3
  231. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
  232. package/build/ox_modules/module-win/commands/findElement.js +1 -4
  233. package/build/ox_modules/module-win/commands/findElements.js +1 -5
  234. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
  235. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
  236. package/build/ox_modules/module-win/commands/getLocation.js +1 -3
  237. package/build/ox_modules/module-win/commands/getSource.js +1 -3
  238. package/build/ox_modules/module-win/commands/getText.js +1 -5
  239. package/build/ox_modules/module-win/commands/getValue.js +5 -10
  240. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
  241. package/build/ox_modules/module-win/commands/index.js +1 -74
  242. package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
  243. package/build/ox_modules/module-win/commands/isChecked.js +1 -3
  244. package/build/ox_modules/module-win/commands/isClickable.js +1 -3
  245. package/build/ox_modules/module-win/commands/isExist.js +1 -4
  246. package/build/ox_modules/module-win/commands/isSelected.js +1 -3
  247. package/build/ox_modules/module-win/commands/isVisible.js +1 -4
  248. package/build/ox_modules/module-win/commands/open.js +1 -3
  249. package/build/ox_modules/module-win/commands/pause.js +1 -3
  250. package/build/ox_modules/module-win/commands/rightClick.js +1 -3
  251. package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
  252. package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
  253. package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
  254. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
  255. package/build/ox_modules/module-win/commands/tap.js +1 -3
  256. package/build/ox_modules/module-win/commands/type.js +1 -5
  257. package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
  258. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
  259. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
  260. package/build/ox_modules/module-win.js +54 -95
  261. package/build/ox_modules/utils.js +97 -79
  262. package/build/ox_reporters/reporter-excel.js +2 -59
  263. package/build/ox_reporters/reporter-html.js +2 -29
  264. package/build/ox_reporters/reporter-json.js +2 -15
  265. package/build/ox_reporters/reporter-junit.js +2 -25
  266. package/build/ox_reporters/reporter-pdf.js +2 -20
  267. package/build/ox_reporters/reporter-rp.js +4 -92
  268. package/build/ox_reporters/reporter-xml.js +2 -18
  269. package/build/ox_services/service-devtools/submodule-network.js +4 -86
  270. package/build/ox_services/service-devtools.js +2 -24
  271. package/build/reporter/FileReporterBase.js +6 -45
  272. package/build/reporter/ReportAggregator.js +7 -121
  273. package/build/reporter/ReporterBase.js +1 -6
  274. package/build/reporter/WebSocketReporter.js +1 -39
  275. package/build/runners/WorkerProcess.js +2 -107
  276. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  277. package/build/runners/cucumber/CucumberReporter.js +2 -57
  278. package/build/runners/cucumber/CucumberWorker.js +3 -69
  279. package/build/runners/cucumber/index.js +2 -31
  280. package/build/runners/cucumber/worker.js +2 -19
  281. package/build/runners/index.js +4 -11
  282. package/build/runners/oxygen/OxygenWorker.js +3 -61
  283. package/build/runners/oxygen/index.js +18 -179
  284. package/build/runners/oxygen/worker.js +3 -27
  285. package/package.json +4 -1
@@ -6,7 +6,9 @@
6
6
  * the Free Software Foundation, either version 3 of the License, or
7
7
  * (at your option) any later version.
8
8
  */
9
+
9
10
  'use strict';
11
+
10
12
  /**
11
13
  * @name mob
12
14
  * @description Provides methods for mobile automation.
@@ -49,42 +51,27 @@
49
51
  * * `PATTERN` - Verbatim matching.
50
52
  *
51
53
  */
52
-
53
54
  Object.defineProperty(exports, "__esModule", {
54
55
  value: true
55
56
  });
56
57
  exports.default = void 0;
57
-
58
58
  require("source-map-support/register");
59
-
60
59
  var _url = _interopRequireDefault(require("url"));
61
-
62
60
  var wdio = _interopRequireWildcard(require("webdriverio"));
63
-
64
61
  var _WebDriverModule = _interopRequireDefault(require("../core/WebDriverModule"));
65
-
66
62
  var _utils = _interopRequireDefault(require("./utils"));
67
-
68
63
  var _helper = _interopRequireDefault(require("../errors/helper"));
69
-
70
64
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
71
-
72
65
  var _perfectoReporting = _interopRequireDefault(require("perfecto-reporting"));
73
-
74
66
  var _request = _interopRequireDefault(require("request"));
75
-
76
67
  var _imgMerge = _interopRequireDefault(require("../lib/img-merge"));
77
-
78
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
79
-
80
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
81
-
82
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
83
-
68
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
69
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
84
70
  const MODULE_NAME = 'mob';
85
71
  const DEFAULT_APPIUM_URL = 'http://localhost:4723/wd/hub';
86
72
  const DEFAULT_BROWSER_NAME = 'default';
87
- const NO_SCREENSHOT_COMMANDS = ['init', 'assertAlert'];
73
+ const NO_SCREENSHOT_COMMANDS = ['init', 'assertAlert', 'dispose'];
74
+ const NO_SNAPSHOT_COMMANDS = ['init', 'assertAlert', 'dispose'];
88
75
  const ACTION_COMMANDS = ['open', 'tap', 'click', 'swipe', 'submit', 'setValue'];
89
76
  const DEFAULT_WAIT_TIMEOUT = 60 * 1000; // default 60s wait timeout
90
77
 
@@ -96,47 +83,41 @@ class MobileModule extends _WebDriverModule.default {
96
83
  this.networkRequests = null;
97
84
  this.helpers = {};
98
85
  this.appContext = 'NATIVE_APP';
99
-
100
- this._loadHelperFunctions(); // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
101
-
102
-
86
+ this._loadHelperFunctions();
87
+ // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
103
88
  this.OxError = _OxygenError.default;
104
- this.errHelper = _helper.default; // holds element operation timeout value
105
-
89
+ this.errHelper = _helper.default;
90
+ // holds element operation timeout value
106
91
  this.waitForTimeout = DEFAULT_WAIT_TIMEOUT;
107
92
  }
108
-
109
93
  get name() {
110
94
  return MODULE_NAME;
111
95
  }
96
+
112
97
  /**
113
98
  * @function getDriver
114
99
  * @summary Returns the underlying WDIO driver.
115
100
  * @return {Object} WDIO driver.
116
101
  */
117
-
118
-
119
102
  getDriver() {
120
103
  return super.getDriver();
121
104
  }
105
+
122
106
  /**
123
107
  * @function getCapabilities
124
108
  * @summary Returns currently defined capabilities.
125
109
  * @return {Object} Current capabilities object.
126
110
  */
127
-
128
-
129
111
  getCapabilities() {
130
112
  return this.caps || super.getCapabilities();
131
113
  }
114
+
132
115
  /**
133
116
  * @function init
134
117
  * @summary Initializes a new Appium session.
135
118
  * @param {String=} caps - Desired capabilities. If not specified capabilities will be taken from suite definition.
136
119
  * @param {String=} appiumUrl - Remote Appium server URL (default: http://localhost:4723/wd/hub).
137
120
  */
138
-
139
-
140
121
  async init(caps, appiumUrl) {
141
122
  // if reopenSession is true - reinitilize the module
142
123
  if (this.isInitialized) {
@@ -148,11 +129,10 @@ class MobileModule extends _WebDriverModule.default {
148
129
  } else {
149
130
  this.logger.debug('mob.init was called for already initialized module. reopenSession is false so the call is ignored.');
150
131
  }
151
-
152
132
  return;
153
- } // FIXME: this should be refactored
154
-
133
+ }
155
134
 
135
+ // FIXME: this should be refactored
156
136
  if (this.ctx.caps && this.ctx.caps['perfectoMobile:options']) {
157
137
  if (caps) {
158
138
  delete caps.platformName;
@@ -161,7 +141,6 @@ class MobileModule extends _WebDriverModule.default {
161
141
  delete caps.browserName;
162
142
  delete caps.automationName;
163
143
  delete caps.udid;
164
-
165
144
  if (caps.app) {
166
145
  caps.enableAppiumBehavior = true;
167
146
  } else {
@@ -173,60 +152,58 @@ class MobileModule extends _WebDriverModule.default {
173
152
  this.ctx.caps.enableAppiumBehavior = true;
174
153
  }
175
154
  }
176
-
177
155
  if (!appiumUrl) {
178
156
  appiumUrl = this.options.appiumUrl || DEFAULT_APPIUM_URL;
179
- } // merge capabilities from context and from init function argument, give preference to context-passed capabilities
180
-
157
+ }
181
158
 
159
+ // merge capabilities from context and from init function argument, give preference to context-passed capabilities
182
160
  this.caps = {};
183
-
184
161
  if (this.ctx.caps) {
185
- this.caps = { ...this.ctx.caps
162
+ this.caps = {
163
+ ...this.ctx.caps
186
164
  };
187
165
  }
188
-
189
166
  if (caps) {
190
- this.caps = { ...this.caps,
167
+ this.caps = {
168
+ ...this.caps,
191
169
  ...caps
192
170
  };
193
- } // make sure to clear the existing device logs, if collectDeviceLogs option is true (we want to include logs only relevant for this session)
194
-
171
+ }
195
172
 
173
+ // make sure to clear the existing device logs, if collectDeviceLogs option is true (we want to include logs only relevant for this session)
196
174
  if (this.options.collectDeviceLogs) {
197
175
  this.caps['clearDeviceLogsOnStart'] = true;
198
- } // if both browserName and appPackage/app/bundleId were specified - assume we want to run the application and remove browserName
199
-
176
+ }
200
177
 
178
+ // if both browserName and appPackage/app/bundleId were specified - assume we want to run the application and remove browserName
201
179
  if (this.caps.browserName && (this.caps.appPackage || this.caps.app || this.caps.bundleId)) {
202
180
  delete this.caps.browserName;
203
- } // if no appPackage/app/bundleId capability nor browserName are defined, assume we want to run the test against default browser
181
+ }
182
+ // if no appPackage/app/bundleId capability nor browserName are defined, assume we want to run the test against default browser
204
183
  else if (!this.caps.browserName && !this.caps.appPackage && !this.caps.app && !this.caps.bundleId) {
205
- this.caps.browserName = DEFAULT_BROWSER_NAME;
206
- } // webdriver expects lower case names
207
-
208
-
184
+ this.caps.browserName = DEFAULT_BROWSER_NAME;
185
+ }
186
+ // webdriver expects lower case names
209
187
  if (this.caps.browserName && typeof this.caps.browserName === 'string') {
210
188
  this.caps.browserName = this.caps.browserName.toLowerCase();
211
- } // adjust capabilities to enable collecting browser and performance stats in Chrome
212
-
213
-
189
+ }
190
+ // adjust capabilities to enable collecting browser and performance stats in Chrome
214
191
  if (this.options.recordHAR && this.caps.browserName === 'chrome') {
215
192
  this.caps['goog:loggingPrefs'] = {
216
193
  // for ChromeDriver >= 75
217
194
  browser: 'ALL',
218
195
  performance: 'ALL'
219
196
  };
220
- } // populate WDIO options
221
-
197
+ }
222
198
 
199
+ // populate WDIO options
223
200
  const url = _url.default.parse(appiumUrl);
224
-
225
201
  const protocol = url.protocol.replace(/:$/, '');
226
202
  const host = url.hostname;
227
203
  const port = parseInt(url.port || (protocol === 'https' ? 443 : 80));
228
- const path = url.pathname; // auth is needed mostly for cloud providers such as LambdaTest
204
+ const path = url.pathname;
229
205
 
206
+ // auth is needed mostly for cloud providers such as LambdaTest
230
207
  if (url.auth) {
231
208
  const auth = url.auth.split(':');
232
209
  this.options.wdioOpts = {
@@ -234,8 +211,8 @@ class MobileModule extends _WebDriverModule.default {
234
211
  key: auth[1]
235
212
  };
236
213
  }
237
-
238
- var wdioOpts = { ...(this.options.wdioOpts || {}),
214
+ var wdioOpts = {
215
+ ...(this.options.wdioOpts || {}),
239
216
  protocol: protocol,
240
217
  hostname: host,
241
218
  port: port,
@@ -248,86 +225,20 @@ class MobileModule extends _WebDriverModule.default {
248
225
  connectionRetryTimeout: 310 * 1000,
249
226
  connectionRetryCount: 1
250
227
  };
251
-
252
228
  let provider = _utils.default.determineProvider(wdioOpts);
229
+ const name = _utils.default.enrichProviderWdioOptions(provider, wdioOpts);
230
+ this.wdioOpts = wdioOpts;
253
231
 
254
- let name = 'name';
255
-
256
- if (provider === _utils.default.provider.PERFECTO) {
257
- wdioOpts.capabilities.maxInstances = 1;
258
- wdioOpts.path = '/nexperience/perfectomobile/wd/hub';
259
- wdioOpts.port = 80;
260
- wdioOpts.protocol = 'http';
261
- wdioOpts.openDeviceTimeout = 15;
262
- delete wdioOpts.capabilities.manufacturer;
263
- delete wdioOpts.capabilities.model;
264
- delete wdioOpts.capabilities.browserName;
265
- delete wdioOpts.capabilities.host;
266
- name = wdioOpts.capabilities['perfectoMobile:options']['name'];
267
- delete wdioOpts.capabilities['perfectoMobile:options'];
268
- } else if (provider === _utils.default.provider.BROWSERSTACK) {
269
- const bsOptions = wdioOpts.capabilities['bstack:options'];
270
-
271
- if (bsOptions) {
272
- const deviceName = bsOptions.deviceName;
273
- const osName = bsOptions.os;
274
-
275
- if (deviceName) {
276
- bsOptions.realMobile = true;
277
- wdioOpts.capabilities['appium:deviceName'] = deviceName;
278
- } // set automationName Appium capability
279
-
280
-
281
- if (osName && osName.toLowerCase() === 'android') {
282
- wdioOpts.capabilities.platformName = 'Android';
283
- wdioOpts.capabilities['appium:automationName'] = 'UIAutomator2';
284
- } else if (osName && osName.toLowerCase() === 'ios') {
285
- wdioOpts.capabilities.platformName = 'iOS';
286
- wdioOpts.capabilities['appium:automationName'] = 'XCUITest';
287
- } // merge user-provided BS options into the final options object
288
-
289
-
290
- for (const capName in wdioOpts.capabilities) {
291
- if (capName.startsWith('bstack:')) {
292
- const bsCapName = capName.substring('bstack:'.length);
293
-
294
- if (bsCapName === 'options') {
295
- continue;
296
- } // for backward compatibility... needs to be removed eventually
297
-
298
-
299
- if (bsCapName === 'recordVideo') {
300
- bsOptions.video = wdioOpts.capabilities[capName];
301
- delete wdioOpts.capabilities[capName];
302
- continue;
303
- }
304
-
305
- bsOptions[bsCapName] = wdioOpts.capabilities[capName];
306
- delete wdioOpts.capabilities[capName];
307
- }
308
- }
309
- }
310
- }
311
-
312
- if (wdioOpts.capabilities['bstack:options'] && wdioOpts.capabilities['bstack:options']['name']) {
313
- name = wdioOpts.capabilities['bstack:options']['name'];
314
- delete wdioOpts.capabilities['bstack:options'];
315
- }
316
-
317
- this.wdioOpts = wdioOpts; // init webdriver
318
-
232
+ // init webdriver
319
233
  try {
320
234
  this.driver = await wdio.remote(wdioOpts);
321
235
  this.driver.provider = provider;
322
-
323
236
  if (this.options.seleniumBrowserTimeout) {
324
237
  this.driver.seleniumBrowserTimeout = this.options.seleniumBrowserTimeout;
325
238
  }
326
-
327
239
  if (this.options.seleniumTimeout) {
328
240
  this.driver.seleniumTimeout = this.options.seleniumTimeout;
329
241
  }
330
-
331
242
  if (provider === _utils.default.provider.PERFECTO) {
332
243
  const perfectoExecutionContext = await new _perfectoReporting.default.Perfecto.PerfectoExecutionContext({
333
244
  webdriver: {
@@ -342,49 +253,43 @@ class MobileModule extends _WebDriverModule.default {
342
253
  } catch (e) {
343
254
  throw _helper.default.getAppiumInitError(e);
344
255
  }
256
+ this.appContext = await this.driver.getContext();
345
257
 
346
- this.appContext = await this.driver.getContext(); // if we are running on Android 7+ emulator, and thus/or using a WebView Browser Tester -
258
+ // if we are running on Android 7+ emulator, and thus/or using a WebView Browser Tester -
347
259
  // perform an actual appContext switch to WEB
348
260
  // so Appium will delegate commands to Chrome Driver instead of Appium Driver
349
-
350
261
  if (this.caps.browserName === 'chromium-webview') {
351
262
  await this.setWebViewContext();
352
263
  }
353
-
354
- if (provider === _utils.default.provider.BROWSERSTACK) {// ignore
264
+ if (provider === _utils.default.provider.BROWSERSTACK) {
265
+ // ignore
355
266
  // fails on browserstack
356
267
  } else {
357
268
  await this.driver.setTimeout({
358
269
  'implicit': this.waitForTimeout
359
270
  });
360
271
  }
361
-
362
272
  await _utils.default.overwriteWdioCommands(this.driver);
363
273
  super.init(this.driver);
364
274
  }
275
+
365
276
  /**
366
277
  * @function dispose
367
278
  * @summary Ends the current session.
368
279
  * @param {String=} status - Test status, either `passed` or `failed`.
369
280
  */
370
-
371
-
372
281
  async dispose(status) {
373
282
  if (!status) {
374
283
  status = 'passed';
375
-
376
284
  if (this.rs.steps && Array.isArray(this.rs.steps) && this.rs.steps.length > 0) {
377
285
  const failedFinded = this.rs.steps.find(item => item.status === 'failed');
378
-
379
286
  if (failedFinded) {
380
287
  status = 'failed';
381
288
  }
382
289
  }
383
290
  }
384
-
385
291
  if (this.driver && this.isInitialized) {
386
292
  status = status.toUpperCase();
387
-
388
293
  if (this.driver.provider === _utils.default.provider.PERFECTO) {
389
294
  await this.reportingClient.testStop({
390
295
  status: status === 'PASSED' ? _perfectoReporting.default.Constants.results.passed : _perfectoReporting.default.Constants.results.failed
@@ -393,10 +298,10 @@ class MobileModule extends _WebDriverModule.default {
393
298
  await this._setBrowserStackResultStatus(status);
394
299
  await this.deleteSession();
395
300
  }
396
-
397
301
  try {
398
302
  if (!['CANCELED', 'FAILED'].includes(status)) {
399
- if (this.seleniumSessionTimeout) {// ignore
303
+ if (this.seleniumSessionTimeout) {
304
+ // ignore
400
305
  // deleteSession will take 5 min to call
401
306
  } else {
402
307
  await this.driver.deleteSession();
@@ -405,7 +310,6 @@ class MobileModule extends _WebDriverModule.default {
405
310
  } catch (e) {
406
311
  this.logger.warn('Error disposing driver: ' + e); // ignore any errors at disposal stage
407
312
  }
408
-
409
313
  this.driver = null;
410
314
  this.lastNavigationStartTime = null;
411
315
  super.dispose();
@@ -413,6 +317,7 @@ class MobileModule extends _WebDriverModule.default {
413
317
  return;
414
318
  }
415
319
  }
320
+
416
321
  /**
417
322
  * @summary Opens new transaction.
418
323
  * @description The transaction will persist till a new one is opened. Transaction names must be unique.
@@ -420,35 +325,30 @@ class MobileModule extends _WebDriverModule.default {
420
325
  * @param {String} name - The transaction name.
421
326
  * @for android, ios, hybrid, web
422
327
  */
423
-
424
-
425
328
  transaction(name) {
426
329
  if (!name) {
427
330
  return;
428
- } // just in case user passed a complex object by mistake
429
-
430
-
431
- name = name.toString(); // limit the name length (since we can't store values larger than 512B in the database)
331
+ }
332
+ // just in case user passed a complex object by mistake
333
+ name = name.toString();
432
334
 
335
+ // limit the name length (since we can't store values larger than 512B in the database)
433
336
  name = name.slice(0, 512);
434
337
  global._lastTransactionName = name;
435
338
  }
339
+
436
340
  /*
437
341
  * Private
438
342
  */
439
343
 
440
-
441
344
  _isAction(name) {
442
345
  return ACTION_COMMANDS.includes(name);
443
346
  }
444
-
445
347
  _takeScreenshotSilent(name) {
446
348
  if (!NO_SCREENSHOT_COMMANDS.includes(name)) {
447
349
  let error;
448
-
449
350
  try {
450
351
  var _this$driver;
451
-
452
352
  if ((_this$driver = this.driver) !== null && _this$driver !== void 0 && _this$driver.takeScreenshot) {
453
353
  let retval;
454
354
  this.driver.call(() => {
@@ -456,34 +356,25 @@ class MobileModule extends _WebDriverModule.default {
456
356
  const waitUntilRetVal = this.driver.waitUntil(async () => {
457
357
  try {
458
358
  let images = [];
459
-
460
359
  const pushImageToImages = async (fetchTitle = true) => {
461
360
  const image = await this.driver.takeScreenshot();
462
-
463
361
  if (fetchTitle) {
464
362
  const title = await this.driver.getTitle();
465
-
466
363
  if (title) {
467
364
  const textToImage = require('../lib/text-to-image');
468
-
469
365
  let titleImage = await textToImage.generate(title);
470
-
471
366
  if (titleImage && typeof titleImage === 'string') {
472
367
  titleImage = titleImage.replace('data:image/png;base64,', '');
473
368
  images.push(titleImage);
474
369
  }
475
370
  }
476
371
  }
477
-
478
372
  images.push(image);
479
373
  };
480
-
481
374
  const isWebViewContext = await this.isWebViewContext();
482
-
483
375
  if (isWebViewContext) {
484
376
  // collect all (screenshot and title) images
485
377
  const handles = await this.driver.getWindowHandles();
486
-
487
378
  if (handles && Array.isArray(handles) && handles.length > 0) {
488
379
  for (const handle of handles) {
489
380
  await this.driver.switchToWindow(handle);
@@ -492,17 +383,15 @@ class MobileModule extends _WebDriverModule.default {
492
383
  }
493
384
  } else {
494
385
  await pushImageToImages(false);
495
- } // merge all images into one
496
-
386
+ }
497
387
 
388
+ // merge all images into one
498
389
  const mergedImage = await (0, _imgMerge.default)(images, {
499
390
  direction: true
500
391
  });
501
-
502
392
  if (mergedImage && typeof mergedImage === 'string') {
503
393
  retval = mergedImage.replace('data:image/jpeg;base64,', '');
504
394
  }
505
-
506
395
  return true;
507
396
  } catch (e) {
508
397
  error = e;
@@ -511,7 +400,6 @@ class MobileModule extends _WebDriverModule.default {
511
400
  }, {
512
401
  timeout: 30 * 1000
513
402
  });
514
-
515
403
  if (waitUntilRetVal && waitUntilRetVal.then) {
516
404
  waitUntilRetVal.then(() => {
517
405
  resolve();
@@ -523,35 +411,63 @@ class MobileModule extends _WebDriverModule.default {
523
411
  }
524
412
  });
525
413
  });
526
-
527
414
  if (error) {
528
415
  this.logger.error('Cannot get screenshot', error);
529
416
  }
530
-
531
417
  return retval;
532
418
  }
533
419
  } catch (e) {
534
420
  this.logger.error('Cannot get screenshot', e);
535
-
536
421
  if (error) {
537
422
  this.logger.error('Cannot get screenshot inner error', error);
538
- } // ignore
539
-
423
+ }
424
+ // ignore
540
425
  }
541
426
  }
542
- } // _getLogs(name) {
427
+ }
428
+ _takeSnapshotSilent(name) {
429
+ if (!NO_SNAPSHOT_COMMANDS.includes(name)) {
430
+ let error;
431
+ try {
432
+ if (this.driver && this.driver.getPageSource) {
433
+ let retval;
434
+ this.driver.call(() => {
435
+ return new Promise((resolve, reject) => {
436
+ this.driver.getPageSource().then(result => {
437
+ retval = result;
438
+ resolve();
439
+ }).catch(error => {
440
+ this.logger.error('Cannot get snapshot (1)', error);
441
+ reject();
442
+ });
443
+ });
444
+ });
445
+ if (error) {
446
+ this.logger.error('Cannot get snapshot (2)', error);
447
+ }
448
+ return retval;
449
+ }
450
+ } catch (e) {
451
+ this.logger.error('Cannot get snapshot (3)', e);
452
+ if (error) {
453
+ this.logger.error('Cannot get snapshot inner error', error);
454
+ }
455
+ // ignore
456
+ }
457
+ }
458
+ }
459
+
460
+ // _getLogs(name) {
543
461
  // if (!NO_LOGS_COMMANDS.includes(name)) {
544
462
  // return this.getLogs();
545
463
  // }
546
464
  // }
547
465
 
548
-
549
466
  _adjustAppiumLog(log, src) {
550
467
  if (!log || typeof log !== 'object') {
551
468
  return null;
552
- } // TODO: convert log.timestamp from the device time zone to the local one (so we can later correlate between steps and logs)
553
-
554
-
469
+ }
470
+ // TODO: convert log.timestamp from the device time zone to the local one (so we can later correlate between steps and logs)
555
471
  return {
556
472
  time: log.timestamp,
557
473
  msg: log.message,
@@ -559,30 +475,25 @@ class MobileModule extends _WebDriverModule.default {
559
475
  src: src
560
476
  };
561
477
  }
562
-
563
478
  _iterationStart() {
564
479
  // clear transaction name saved in previous iteration if any
565
480
  global._lastTransactionName = null;
566
481
  }
567
-
568
482
  async _iterationEnd(error) {
569
483
  if (error && error.type === _helper.default.errorCode.APPIUM_SESSION_TIMEOUT) {
570
484
  this.seleniumSessionTimeout = true;
571
485
  return;
572
486
  } else {
573
487
  this.seleniumSessionTimeout = false;
574
- } // ignore the rest if mob module is not initialized
575
-
576
-
488
+ }
489
+ // ignore the rest if mob module is not initialized
577
490
  if (!this.isInitialized) {
578
491
  return;
579
- } // collect all the device logs for this session
580
-
581
-
492
+ }
493
+ // collect all the device logs for this session
582
494
  if (this.options.collectDeviceLogs) {
583
495
  try {
584
496
  const logs = await this.getDeviceLogs();
585
-
586
497
  if (logs && Array.isArray(logs)) {
587
498
  for (let log of logs) {
588
499
  this.rs.logs.push(this._adjustAppiumLog(log, 'device'));
@@ -592,13 +503,12 @@ class MobileModule extends _WebDriverModule.default {
592
503
  // ignore errors
593
504
  this.logger.error('Cannot retrieve device logs.', e);
594
505
  }
595
- } // collect all the browser logs for this session
596
-
506
+ }
597
507
 
508
+ // collect all the browser logs for this session
598
509
  if (this.options.collectBrowserLogs) {
599
510
  try {
600
511
  const logs = await this.getBrowserLogs();
601
-
602
512
  if (logs && Array.isArray(logs)) {
603
513
  for (let log of logs) {
604
514
  this.rs.logs.push(this._adjustAppiumLog(log, 'browser'));
@@ -608,13 +518,12 @@ class MobileModule extends _WebDriverModule.default {
608
518
  // ignore errors
609
519
  this.logger.error('Cannot retrieve browser logs.', e);
610
520
  }
611
- } // collect all Appium logs for this session
612
-
521
+ }
613
522
 
523
+ // collect all Appium logs for this session
614
524
  if (this.options.collectAppiumLogs) {
615
525
  try {
616
526
  const logs = this.getAppiumLogs();
617
-
618
527
  if (logs && Array.isArray(logs)) {
619
528
  for (var logEntry of logs) {
620
529
  this.rs.logs.push(this._adjustAppiumLog(logEntry, 'appium'));
@@ -625,58 +534,49 @@ class MobileModule extends _WebDriverModule.default {
625
534
  this.logger.error('Cannot retrieve Appium logs.', e);
626
535
  }
627
536
  }
628
-
629
537
  if (this.driver.provider === _utils.default.provider.BROWSERSTACK) {
630
538
  var resultUrl = await this._getBrowserStackResultUrl();
631
-
632
539
  if (resultUrl) {
633
540
  // FIXME: this should be written to context.resultData instead
634
541
  this.rs.attributes['BrowserStackUrl'] = resultUrl;
635
542
  }
636
543
  }
637
544
  }
638
-
639
545
  _getWdioLocator(locator) {
640
546
  if (!locator) {
641
547
  throw new _OxygenError.default(_helper.default.errorCode.SCRIPT_ERROR, 'Invalid argument - locator not specified');
642
548
  }
643
-
644
549
  if (typeof locator !== 'string') {
645
550
  return locator;
646
551
  }
647
-
648
552
  if (locator.indexOf('/') === 0) {
649
553
  return locator; // leave xpath locator as is
650
554
  }
651
-
652
555
  const platform = this.caps && this.caps.platformName ? this.caps.platformName.toLowerCase() : null;
653
-
654
556
  if (this.appContext === 'NATIVE_APP' && platform === 'android') {
655
557
  if (locator.indexOf('id=') === 0) {
656
558
  // prepend package name if it's not specified
657
559
  // NOTE: getCurrentPackage() seems to crash possibly due to a wdio bug.
658
560
  // so we get package name from caps instead.
659
561
  locator = locator.substr('id='.length);
660
-
661
562
  if (locator.indexOf(':id/') === -1) {
662
563
  locator = this.caps.appPackage + ':id/' + locator;
663
564
  }
664
-
665
565
  return 'android=new UiSelector().resourceId("' + locator + '")';
666
- } else if (locator.indexOf('class=') === 0) return 'android=new UiSelector().className("' + locator.substr('class='.length) + '")';else if (locator.indexOf('text=') === 0) return 'android=new UiSelector().text("' + locator.substr('text='.length) + '")';else if (locator.indexOf('text-contains=') === 0) return 'android=new UiSelector().textContains("' + locator.substr('text-contains='.length) + '")';else if (locator.indexOf('desc=') === 0) return 'android=new UiSelector().description("' + locator.substr('desc='.length) + '")';else if (locator.indexOf('desc-contains=') === 0) return 'android=new UiSelector().descriptionContains("' + locator.substr('desc-contains='.length) + '")';else if (locator.indexOf('scrollable') === 0) return 'android=new UiSelector().scrollable(true)';else if (locator.indexOf('~') === 0) // accessibility id
566
+ } else if (locator.indexOf('class=') === 0) return 'android=new UiSelector().className("' + locator.substr('class='.length) + '")';else if (locator.indexOf('text=') === 0) return 'android=new UiSelector().text("' + locator.substr('text='.length) + '")';else if (locator.indexOf('text-contains=') === 0) return 'android=new UiSelector().textContains("' + locator.substr('text-contains='.length) + '")';else if (locator.indexOf('desc=') === 0) return 'android=new UiSelector().description("' + locator.substr('desc='.length) + '")';else if (locator.indexOf('desc-contains=') === 0) return 'android=new UiSelector().descriptionContains("' + locator.substr('desc-contains='.length) + '")';else if (locator.indexOf('scrollable') === 0) return 'android=new UiSelector().scrollable(true)';else if (locator.indexOf('~') === 0)
567
+ // accessibility id
667
568
  return locator;
668
569
  } else if (this.appContext === 'NATIVE_APP' && platform === 'ios') {
669
- if (locator.indexOf('~') === 0) // accessibility id
570
+ if (locator.indexOf('~') === 0)
571
+ // accessibility id
670
572
  return locator;
671
573
  } else if (this.appContext !== 'NATIVE_APP') {
672
574
  // Hybrid or Web application
673
575
  if (locator.indexOf('id=') === 0) return '#' + locator.substr('id='.length); // convert 'id=' to '#'
674
576
  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
675
577
  }
676
-
677
578
  return locator;
678
579
  }
679
-
680
580
  _loadHelperFunctions() {
681
581
  this.helpers.getWdioLocator = this._getWdioLocator;
682
582
  this.helpers.matchPattern = _utils.default.matchPattern;
@@ -697,7 +597,6 @@ class MobileModule extends _WebDriverModule.default {
697
597
  this.helpers.contextList = _utils.default.contextList;
698
598
  this.helpers.getLogTypes = _utils.default.getLogTypes;
699
599
  }
700
-
701
600
  async deleteSession() {
702
601
  try {
703
602
  if (this.driver && this.driver.deleteSession) {
@@ -707,14 +606,12 @@ class MobileModule extends _WebDriverModule.default {
707
606
  this.logger.error('deleteSession error', e);
708
607
  }
709
608
  }
710
-
711
609
  async _setBrowserStackResultStatus(status) {
712
610
  return new Promise((resolve, reject) => {
713
611
  // different APIs are used depending on test type.
714
612
  // https://www.browserstack.com/docs/automate/api-reference/selenium/session#set-test-status
715
613
  // https://www.browserstack.com/docs/app-automate/api-reference/appium/sessions#update-session-status
716
614
  const bsApiUrl = this.wdioOpts.capabilities['appium:app'] ? `https://api-cloud.browserstack.com/app-automate/sessions/${this.driver.sessionId}.json` : `https://api.browserstack.com/automate/sessions/${this.driver.sessionId}.json`;
717
-
718
615
  try {
719
616
  // set test status
720
617
  (0, _request.default)({
@@ -734,7 +631,6 @@ class MobileModule extends _WebDriverModule.default {
734
631
  if (err) {
735
632
  this.logger.error('Error setting BrowserStack test result status: ' + err.toString());
736
633
  }
737
-
738
634
  resolve();
739
635
  });
740
636
  } catch (e) {
@@ -743,14 +639,12 @@ class MobileModule extends _WebDriverModule.default {
743
639
  }
744
640
  });
745
641
  }
746
-
747
642
  async _getBrowserStackResultUrl() {
748
643
  return new Promise((resolve, reject) => {
749
644
  // different APIs are used depending on test type.
750
645
  // https://www.browserstack.com/docs/automate/api-reference/selenium/session#set-test-status
751
646
  // https://www.browserstack.com/docs/app-automate/api-reference/appium/sessions#update-session-status
752
647
  const bsApiUrl = this.wdioOpts.capabilities['appium:app'] ? `https://api-cloud.browserstack.com/app-automate/sessions/${this.driver.sessionId}.json` : `https://api.browserstack.com/automate/sessions/${this.driver.sessionId}.json`;
753
-
754
648
  try {
755
649
  // retreive BS test result url
756
650
  (0, _request.default)({
@@ -765,11 +659,9 @@ class MobileModule extends _WebDriverModule.default {
765
659
  }
766
660
  }, (err, res, body) => {
767
661
  var _body$automation_sess;
768
-
769
662
  if (err) {
770
663
  this.logger.error('Error getting BrowserStack test result url: ' + err.toString());
771
664
  }
772
-
773
665
  resolve(body === null || body === void 0 ? void 0 : (_body$automation_sess = body.automation_session) === null || _body$automation_sess === void 0 ? void 0 : _body$automation_sess.browser_url);
774
666
  });
775
667
  } catch (e) {
@@ -778,8 +670,6 @@ class MobileModule extends _WebDriverModule.default {
778
670
  }
779
671
  });
780
672
  }
781
-
782
673
  }
783
-
784
674
  exports.default = MobileModule;
785
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1tb2IuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX0FQUElVTV9VUkwiLCJERUZBVUxUX0JST1dTRVJfTkFNRSIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIk1vYmlsZU1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwibmV0d29ya1JlcXVlc3RzIiwiaGVscGVycyIsImFwcENvbnRleHQiLCJfbG9hZEhlbHBlckZ1bmN0aW9ucyIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJ3YWl0Rm9yVGltZW91dCIsIm5hbWUiLCJnZXREcml2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJjYXBzIiwiaW5pdCIsImFwcGl1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJyZW9wZW5TZXNzaW9uIiwiZGVidWciLCJkcml2ZXIiLCJyZWxvYWRTZXNzaW9uIiwiX2lzSW5pdGlhbGl6ZWQiLCJjdHgiLCJwbGF0Zm9ybU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VOYW1lIiwiYnJvd3Nlck5hbWUiLCJhdXRvbWF0aW9uTmFtZSIsInVkaWQiLCJhcHAiLCJlbmFibGVBcHBpdW1CZWhhdmlvciIsInVzZUFwcGl1bUZvcldlYiIsImNvbGxlY3REZXZpY2VMb2dzIiwiYXBwUGFja2FnZSIsImJ1bmRsZUlkIiwidG9Mb3dlckNhc2UiLCJyZWNvcmRIQVIiLCJicm93c2VyIiwicGVyZm9ybWFuY2UiLCJ1cmwiLCJVUkwiLCJwYXJzZSIsInByb3RvY29sIiwicmVwbGFjZSIsImhvc3QiLCJob3N0bmFtZSIsInBvcnQiLCJwYXJzZUludCIsInBhdGgiLCJwYXRobmFtZSIsImF1dGgiLCJzcGxpdCIsIndkaW9PcHRzIiwidXNlciIsImtleSIsImNhcGFiaWxpdGllcyIsImxvZ0xldmVsIiwicnVubmVyIiwid2FpdGZvclRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5Q291bnQiLCJwcm92aWRlciIsIm1vZFV0aWxzIiwiZGV0ZXJtaW5lUHJvdmlkZXIiLCJQRVJGRUNUTyIsIm1heEluc3RhbmNlcyIsIm9wZW5EZXZpY2VUaW1lb3V0IiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJCUk9XU0VSU1RBQ0siLCJic09wdGlvbnMiLCJvc05hbWUiLCJvcyIsInJlYWxNb2JpbGUiLCJjYXBOYW1lIiwic3RhcnRzV2l0aCIsImJzQ2FwTmFtZSIsInN1YnN0cmluZyIsImxlbmd0aCIsInZpZGVvIiwid2RpbyIsInJlbW90ZSIsInNlbGVuaXVtQnJvd3NlclRpbWVvdXQiLCJzZWxlbml1bVRpbWVvdXQiLCJwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJwZXJmZWN0b1JlcG9ydGluZyIsIlBlcmZlY3RvIiwiUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0Iiwid2ViZHJpdmVyIiwiZXhlY3V0ZVNjcmlwdCIsImNvbW1hbmQiLCJwYXJhbXMiLCJleGVjdXRlIiwicmVwb3J0aW5nQ2xpZW50IiwiUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQiLCJ0ZXN0U3RhcnQiLCJlIiwiZ2V0QXBwaXVtSW5pdEVycm9yIiwiZ2V0Q29udGV4dCIsInNldFdlYlZpZXdDb250ZXh0Iiwic2V0VGltZW91dCIsIm92ZXJ3cml0ZVdkaW9Db21tYW5kcyIsImRpc3Bvc2UiLCJzdGF0dXMiLCJzdGVwcyIsIkFycmF5IiwiaXNBcnJheSIsImZhaWxlZEZpbmRlZCIsImZpbmQiLCJpdGVtIiwidG9VcHBlckNhc2UiLCJ0ZXN0U3RvcCIsIkNvbnN0YW50cyIsInJlc3VsdHMiLCJwYXNzZWQiLCJmYWlsZWQiLCJfc2V0QnJvd3NlclN0YWNrUmVzdWx0U3RhdHVzIiwiZGVsZXRlU2Vzc2lvbiIsImluY2x1ZGVzIiwic2VsZW5pdW1TZXNzaW9uVGltZW91dCIsIndhcm4iLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2UiLCJnbG9iYWwiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsIl9pc0FjdGlvbiIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsImVycm9yIiwidGFrZVNjcmVlbnNob3QiLCJyZXR2YWwiLCJjYWxsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ3YWl0VW50aWxSZXRWYWwiLCJ3YWl0VW50aWwiLCJpbWFnZXMiLCJwdXNoSW1hZ2VUb0ltYWdlcyIsImZldGNoVGl0bGUiLCJpbWFnZSIsInRpdGxlIiwiZ2V0VGl0bGUiLCJ0ZXh0VG9JbWFnZSIsInJlcXVpcmUiLCJ0aXRsZUltYWdlIiwiZ2VuZXJhdGUiLCJwdXNoIiwiaXNXZWJWaWV3Q29udGV4dCIsImhhbmRsZXMiLCJnZXRXaW5kb3dIYW5kbGVzIiwiaGFuZGxlIiwic3dpdGNoVG9XaW5kb3ciLCJtZXJnZWRJbWFnZSIsImRpcmVjdGlvbiIsInRpbWVvdXQiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJfYWRqdXN0QXBwaXVtTG9nIiwibG9nIiwic3JjIiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsIm1lc3NhZ2UiLCJsZXZlbCIsIl9pdGVyYXRpb25TdGFydCIsIl9pdGVyYXRpb25FbmQiLCJ0eXBlIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJBUFBJVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImdldERldmljZUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJnZXRCcm93c2VyTG9ncyIsImNvbGxlY3RBcHBpdW1Mb2dzIiwiZ2V0QXBwaXVtTG9ncyIsImxvZ0VudHJ5IiwicmVzdWx0VXJsIiwiX2dldEJyb3dzZXJTdGFja1Jlc3VsdFVybCIsImF0dHJpYnV0ZXMiLCJfZ2V0V2Rpb0xvY2F0b3IiLCJsb2NhdG9yIiwiU0NSSVBUX0VSUk9SIiwiaW5kZXhPZiIsInBsYXRmb3JtIiwic3Vic3RyIiwiZ2V0V2Rpb0xvY2F0b3IiLCJtYXRjaFBhdHRlcm4iLCJnZXRFbGVtZW50IiwiZ2V0RWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnQiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2V0VGltZW91dEltcGxpY2l0IiwicmVzdG9yZVRpbWVvdXRJbXBsaWNpdCIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0Q29udGV4dCIsImNvbnRleHRMaXN0IiwiZ2V0TG9nVHlwZXMiLCJic0FwaVVybCIsInNlc3Npb25JZCIsIm1ldGhvZCIsImpzb24iLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJib2R5IiwidXNlck5hbWUiLCJhY2Nlc3NLZXkiLCJyZXMiLCJhdXRvbWF0aW9uX3Nlc3Npb24iLCJicm93c2VyX3VybCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFHQSxNQUFNQSxXQUFXLEdBQUcsS0FBcEI7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyw4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WWtJLEtBQVosQ0FBa0IsaURBQWlEOEIsR0FBRyxDQUFDcEMsUUFBSixFQUFuRTtBQUNIOztBQUVEVyxVQUFBQSxPQUFPLENBQUMrRSxJQUFELGFBQUNBLElBQUQsZ0RBQUNBLElBQUksQ0FBRUksa0JBQVAsMERBQUMsc0JBQTBCQyxXQUEzQixDQUFQO0FBQ0gsU0FoQkQ7QUFrQkgsT0FwQkQsQ0FvQkUsT0FBT3pILENBQVAsRUFBVTtBQUNSLGFBQUtsRyxNQUFMLENBQVlrSSxLQUFaLENBQWtCLGlEQUFpRGhDLENBQUMsQ0FBQzBCLFFBQUYsRUFBbkU7QUFDQVcsUUFBQUEsT0FBTztBQUNWO0FBQ0osS0FoQ00sQ0FBUDtBQWlDSDs7QUEzcUJxRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgbW9iXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBtb2JpbGUgYXV0b21hdGlvbi5cclxuICogQHNhbXBsZSAqKkxvY2F0b3JzOioqICBcclxuICogXHJcbiAqIE5hdGl2ZSBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FuZHJvaWQucG5nKSAgXHJcbiAqICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICogYH5BQ0NFU1NJQklMSVRZX0lEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgQWNjZXNzaWJpbGl0eSBJZC5cclxuICogKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBpZC5cclxuICogKiBgY2xhc3M9Q0xBU1NgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBjbGFzcy5cclxuICogKiBgdGV4dD1URVhUYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdmlzaWJsZSB0ZXh0LlxyXG4gKiAqIGB0ZXh0LWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgZGVzYz1ERVNDUklQVElPTmAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGRlc2NyaXB0aW9uLlxyXG4gKiAqIGBkZXNjLWNvbnRhaW5zPURFU0NSSVBUSU9OYCAtIExvY2F0ZXMgZWxlbWVudCB3aG9zZSBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgc2Nyb2xsYWJsZWAgLSBMb2NhdGVzIGVsZW1lbnRzIHRoYXQgYXJlIHNjcm9sbGFibGUuICBcclxuICogIFxyXG4gKiBOYXRpdmUgYXBwbGljYXRpb24gbG9jYXRvcnMgZm9yIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hcHBsZS5wbmcpICBcclxuICogIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIElELlxyXG4gKiAqIGB+QUNDRVNTSUJJTElUWV9JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIEFjY2Vzc2liaWxpdHkgSWQuICBcclxuICogKiBgLWlvcyBwcmVkaWNhdGUgc3RyaW5nOlBSRURJQ0FURV9TVFJJTkdgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgW3ByZWRpY2F0ZSBxdWVyeV0oaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9XZWJEcml2ZXJBZ2VudC93aWtpL1ByZWRpY2F0ZS1RdWVyaWVzLUNvbnN0cnVjdGlvbi1SdWxlcykuICBcclxuICogKiBgLWlvcyBjbGFzcyBjaGFpbjpDTEFTU19DSEFJTmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBbY2xhc3MgY2hhaW4gZXhwcmVzc2lvbl0oaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9XZWJEcml2ZXJBZ2VudC93aWtpL0NsYXNzLUNoYWluLVF1ZXJpZXMtQ29uc3RydWN0aW9uLVJ1bGVzKS4gIFxyXG4gKiAgXHJcbiAqIEh5YnJpZCFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvaHlicmlkLnBuZykgIGFuZCBXZWIhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL3dlYi5wbmcpICBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FuZHJvaWQucG5nKSAgIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hcHBsZS5wbmcpICBcclxuICogIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGlkLlxyXG4gKiAqIGBuYW1lPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBuYW1lIGF0dHJpYnV0ZS5cclxuICogKiBgdGFnPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyB0YWcgbmFtZS5cclxuICogKiBgbGluaz1URVhUYCAtIExvY2F0ZXMgYW5jaG9yIGVsZW1lbnQgd2hvc2UgdGV4dCBtYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICogYGxpbmstY29udGFpbnM9VEVYVGAgLSBMb2NhdGVzIGFuY2hvciBlbGVtZW50IHdob3NlIHRleHQgY29udGFpbnMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogKiBgY3NzPUNTU19TRUxFQ1RPUmAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBDU1Mgc2VsZWN0b3IuXHJcbiAqIFxyXG4gKiAqKlBhdHRlcm4gYXJndW1lbnRzOioqXHJcbiAqIFxyXG4gKiBDb21tYW5kcyB3aGljaCBleHBlY3QgYSBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybiBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIHBhdHRlcm5zIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlOlxyXG4gKiBcclxuICogKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICogYFBBVFRFUk5gIC0gVmVyYmF0aW0gbWF0Y2hpbmcuXHJcbiAqIFxyXG4gKi9cclxuaW1wb3J0IFVSTCBmcm9tICd1cmwnO1xyXG5pbXBvcnQgKiBhcyB3ZGlvIGZyb20gJ3dlYmRyaXZlcmlvJztcclxuaW1wb3J0IFdlYkRyaXZlck1vZHVsZSBmcm9tICcuLi9jb3JlL1dlYkRyaXZlck1vZHVsZSc7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IHBlcmZlY3RvUmVwb3J0aW5nIGZyb20gJ3BlcmZlY3RvLXJlcG9ydGluZyc7XHJcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3JlcXVlc3QnO1xyXG5pbXBvcnQgbWVyZ2VJbWFnZXMgZnJvbSAnLi4vbGliL2ltZy1tZXJnZSc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ21vYic7XHJcbmNvbnN0IERFRkFVTFRfQVBQSVVNX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMvd2QvaHViJztcclxuY29uc3QgREVGQVVMVF9CUk9XU0VSX05BTUUgPSAnZGVmYXVsdCc7XHJcbmNvbnN0IE5PX1NDUkVFTlNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnXTtcclxuY29uc3QgQUNUSU9OX0NPTU1BTkRTID0gWydvcGVuJywndGFwJywnY2xpY2snLCdzd2lwZScsJ3N1Ym1pdCcsJ3NldFZhbHVlJ107XHJcbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUID0gNjAgKiAxMDAwOyAgICAgICAgICAgIC8vIGRlZmF1bHQgNjBzIHdhaXQgdGltZW91dFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9iaWxlTW9kdWxlIGV4dGVuZHMgV2ViRHJpdmVyTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5uZXR3b3JrUmVxdWVzdHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9ICdOQVRJVkVfQVBQJztcclxuICAgICAgICB0aGlzLl9sb2FkSGVscGVyRnVuY3Rpb25zKCk7XHJcbiAgICAgICAgLy8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChzb21lIG1vZHVsZSBjb21tYW5kcyBtaWdodCByZWZlciB0byB0aGlzLk94RXJyb3IgYW5kIHRoaXMuZXJySGVscGVyKVxyXG4gICAgICAgIHRoaXMuT3hFcnJvciA9IE94RXJyb3I7XHJcbiAgICAgICAgdGhpcy5lcnJIZWxwZXIgPSBlcnJIZWxwZXI7XHJcbiAgICAgICAgLy8gaG9sZHMgZWxlbWVudCBvcGVyYXRpb24gdGltZW91dCB2YWx1ZVxyXG4gICAgICAgIHRoaXMud2FpdEZvclRpbWVvdXQgPSBERUZBVUxUX1dBSVRfVElNRU9VVDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0RHJpdmVyXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFdESU8gZHJpdmVyLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBXRElPIGRyaXZlci5cclxuICAgICAqL1xyXG4gICAgZ2V0RHJpdmVyKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcml2ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXNcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgY3VycmVudGx5IGRlZmluZWQgY2FwYWJpbGl0aWVzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBzIHx8IHN1cGVyLmdldENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IEFwcGl1bSBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMuIElmIG5vdCBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIHdpbGwgYmUgdGFrZW4gZnJvbSBzdWl0ZSBkZWZpbml0aW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBhcHBpdW1VcmwgLSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgKGRlZmF1bHQ6IGh0dHA6Ly9sb2NhbGhvc3Q6NDcyMy93ZC9odWIpLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KGNhcHMsIGFwcGl1bVVybCkge1xyXG4gICAgICAgIC8vIGlmIHJlb3BlblNlc3Npb24gaXMgdHJ1ZSAtIHJlaW5pdGlsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVvcGVuU2Vzc2lvbiAhPT0gZmFsc2UpIHsgLy8gdHJ1ZSBvciBmYWxzZSBpZiBleHBsaXNpdGx5IHNldC4gdHJ1ZSBvbiBudWxsIG9yIHVuZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdyZW9wZW5TZXNzaW9uIGlzIHRydWUgLSByZWxvYWRpbmcgdGhlIHNlc3Npb24uLi4nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnJlbG9hZFNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ21vYi5pbml0IHdhcyBjYWxsZWQgZm9yIGFscmVhZHkgaW5pdGlhbGl6ZWQgbW9kdWxlLiByZW9wZW5TZXNzaW9uIGlzIGZhbHNlIHNvIHRoZSBjYWxsIGlzIGlnbm9yZWQuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWRcclxuICAgICAgICBpZiAodGhpcy5jdHguY2FwcyAmJiB0aGlzLmN0eC5jYXBzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgaWYgKGNhcHMpIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLnBsYXRmb3JtTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLnBsYXRmb3JtVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmRldmljZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmF1dG9tYXRpb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMudWRpZDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2Fwcy5hcHApIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXBzLmVuYWJsZUFwcGl1bUJlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Fwcy51c2VBcHBpdW1Gb3JXZWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcHMuZW5hYmxlQXBwaXVtQmVoYXZpb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguY2Fwcy51c2VBcHBpdW1Gb3JXZWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguY2Fwcy5lbmFibGVBcHBpdW1CZWhhdmlvciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYXBwaXVtVXJsKSB7XHJcbiAgICAgICAgICAgIGFwcGl1bVVybCA9IHRoaXMub3B0aW9ucy5hcHBpdW1VcmwgfHwgREVGQVVMVF9BUFBJVU1fVVJMO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWVyZ2UgY2FwYWJpbGl0aWVzIGZyb20gY29udGV4dCBhbmQgZnJvbSBpbml0IGZ1bmN0aW9uIGFyZ3VtZW50LCBnaXZlIHByZWZlcmVuY2UgdG8gY29udGV4dC1wYXNzZWQgY2FwYWJpbGl0aWVzXHJcbiAgICAgICAgdGhpcy5jYXBzID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuY3R4LmNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmN0eC5jYXBzIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jYXBzLCAuLi5jYXBzIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xlYXIgdGhlIGV4aXN0aW5nIGRldmljZSBsb2dzLCBpZiBjb2xsZWN0RGV2aWNlTG9ncyBvcHRpb24gaXMgdHJ1ZSAod2Ugd2FudCB0byBpbmNsdWRlIGxvZ3Mgb25seSByZWxldmFudCBmb3IgdGhpcyBzZXNzaW9uKVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdERldmljZUxvZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzWydjbGVhckRldmljZUxvZ3NPblN0YXJ0J10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgYm90aCBicm93c2VyTmFtZSBhbmQgYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgd2VyZSBzcGVjaWZpZWQgLSBhc3N1bWUgd2Ugd2FudCB0byBydW4gdGhlIGFwcGxpY2F0aW9uIGFuZCByZW1vdmUgYnJvd3Nlck5hbWVcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmICh0aGlzLmNhcHMuYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwIHx8IHRoaXMuY2Fwcy5idW5kbGVJZCkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgbm8gYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgY2FwYWJpbGl0eSBub3IgYnJvd3Nlck5hbWUgYXJlIGRlZmluZWQsIGFzc3VtZSB3ZSB3YW50IHRvIHJ1biB0aGUgdGVzdCBhZ2FpbnN0IGRlZmF1bHQgYnJvd3NlclxyXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUgJiYgIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmICF0aGlzLmNhcHMuYXBwICYmICF0aGlzLmNhcHMuYnVuZGxlSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdlYmRyaXZlciBleHBlY3RzIGxvd2VyIGNhc2UgbmFtZXNcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmIHR5cGVvZiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBXRElPIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwucGFyc2UoYXBwaXVtVXJsKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcbiAgICAgICAgbGV0IG5hbWUgPSAnbmFtZSc7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1heEluc3RhbmNlcyA9IDE7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBhdGggPSAnL25leHBlcmllbmNlL3BlcmZlY3RvbW9iaWxlL3dkL2h1Yic7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBvcnQgPSA4MDtcclxuICAgICAgICAgICAgd2Rpb09wdHMucHJvdG9jb2wgPSAnaHR0cCc7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLm9wZW5EZXZpY2VUaW1lb3V0ID0gMTU7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1hbnVmYWN0dXJlcjtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5tb2RlbDtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5ob3N0O1xyXG5cclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgY29uc3QgYnNPcHRpb25zID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgICAgICBpZiAoYnNPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VOYW1lID0gYnNPcHRpb25zLmRldmljZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvc05hbWUgPSBic09wdGlvbnMub3M7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRldmljZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMucmVhbE1vYmlsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06ZGV2aWNlTmFtZSddID0gZGV2aWNlTmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgYXV0b21hdGlvbk5hbWUgQXBwaXVtIGNhcGFiaWxpdHlcclxuICAgICAgICAgICAgICAgIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdhbmRyb2lkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWUgPSAnQW5kcm9pZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06YXV0b21hdGlvbk5hbWUnXSA9ICdVSUF1dG9tYXRvcjInO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpb3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZSA9ICdpT1MnO1xyXG4gICAgICAgICAgICAgICAgICAgIHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmF1dG9tYXRpb25OYW1lJ10gPSAnWENVSVRlc3QnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG1lcmdlIHVzZXItcHJvdmlkZWQgQlMgb3B0aW9ucyBpbnRvIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXBOYW1lIGluIHdkaW9PcHRzLmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXBOYW1lLnN0YXJ0c1dpdGgoJ2JzdGFjazonKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBic0NhcE5hbWUgPSBjYXBOYW1lLnN1YnN0cmluZygnYnN0YWNrOicubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChic0NhcE5hbWUgPT09ICdvcHRpb25zJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uIG5lZWRzIHRvIGJlIHJlbW92ZWQgZXZlbnR1YWxseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnNDYXBOYW1lID09PSAncmVjb3JkVmlkZW8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBic09wdGlvbnMudmlkZW8gPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbY2FwTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJzT3B0aW9uc1tic0NhcE5hbWVdID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzW2NhcE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ11bJ25hbWUnXSkge1xyXG4gICAgICAgICAgICBuYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndkaW9PcHRzID0gd2Rpb09wdHM7XHJcblxyXG4gICAgICAgIC8vIGluaXQgd2ViZHJpdmVyXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBhd2FpdCB3ZGlvLnJlbW90ZSh3ZGlvT3B0cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5wcm92aWRlciA9IHByb3ZpZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQgPSBhd2FpdCBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICB3ZWJkcml2ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVNjcmlwdDogYXN5bmMgKGNvbW1hbmQsIHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoY29tbWFuZCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRpbmdDbGllbnQgPSBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQocGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdGFydChuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldEFwcGl1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldENvbnRleHQoKTtcclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcgb24gQW5kcm9pZCA3KyBlbXVsYXRvciwgYW5kIHRodXMvb3IgdXNpbmcgYSBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyIC1cclxuICAgICAgICAvLyBwZXJmb3JtIGFuIGFjdHVhbCBhcHBDb250ZXh0IHN3aXRjaCB0byBXRUJcclxuICAgICAgICAvLyBzbyBBcHBpdW0gd2lsbCBkZWxlZ2F0ZSBjb21tYW5kcyB0byBDaHJvbWUgRHJpdmVyIGluc3RlYWQgb2YgQXBwaXVtIERyaXZlclxyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICAnY2hyb21pdW0td2VidmlldycpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIC8vIGZhaWxzIG9uIGJyb3dzZXJzdGFja1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLndhaXRGb3JUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgbW9kVXRpbHMub3ZlcndyaXRlV2Rpb0NvbW1hbmRzKHRoaXMuZHJpdmVyKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCh0aGlzLmRyaXZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzdGF0dXMgLSBUZXN0IHN0YXR1cywgZWl0aGVyIGBwYXNzZWRgIG9yIGBmYWlsZWRgLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cykge1xyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9ICdwYXNzZWQnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucnMuc3RlcHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnJzLnN0ZXBzKSAmJiB0aGlzLnJzLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEZpbmRlZCA9IHRoaXMucnMuc3RlcHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdG9wKHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZlY3RvUmVwb3J0aW5nLkNvbnN0YW50cy5yZXN1bHRzLnBhc3NlZCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMuZmFpbGVkXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRCcm93c2VyU3RhY2tSZXN1bHRTdGF0dXMoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFbJ0NBTkNFTEVEJywgJ0ZBSUxFRCddLmluY2x1ZGVzKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVTZXNzaW9uIHdpbGwgdGFrZSA1IG1pbiB0byBjYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRXJyb3IgZGlzcG9zaW5nIGRyaXZlcjogJyArIGUpOyAgICAvLyBpZ25vcmUgYW55IGVycm9ycyBhdCBkaXNwb3NhbCBzdGFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqIEBmb3IgYW5kcm9pZCwgaW9zLCBoeWJyaWQsIHdlYlxyXG4gICAgICovXHJcbiAgICB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8ganVzdCBpbiBjYXNlIHVzZXIgcGFzc2VkIGEgY29tcGxleCBvYmplY3QgYnkgbWlzdGFrZVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIC8vIGxpbWl0IHRoZSBuYW1lIGxlbmd0aCAoc2luY2Ugd2UgY2FuJ3Qgc3RvcmUgdmFsdWVzIGxhcmdlciB0aGFuIDUxMkIgaW4gdGhlIGRhdGFiYXNlKVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIDUxMik7XHJcblxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGVcclxuICAgICAqL1xyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXI/LnRha2VTY3JlZW5zaG90KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXNoSW1hZ2VUb0ltYWdlcyA9IGFzeW5jKGZldGNoVGl0bGUgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hUaXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCcuLi9saWIvdGV4dC10by1pbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGVJbWFnZSA9IGF3YWl0IHRleHRUb0ltYWdlLmdlbmVyYXRlKHRpdGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlSW1hZ2UgJiYgdHlwZW9mIHRpdGxlSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUltYWdlID0gdGl0bGVJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2godGl0bGVJbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNXZWJWaWV3Q29udGV4dCA9IGF3YWl0IHRoaXMuaXNXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXZWJWaWV3Q29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgKHNjcmVlbnNob3QgYW5kIHRpdGxlKSBpbWFnZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRXaW5kb3dIYW5kbGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaGFuZGxlcykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlIG9mIGhhbmRsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVzaEltYWdlVG9JbWFnZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwdXNoSW1hZ2VUb0ltYWdlcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFsbCBpbWFnZXMgaW50byBvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkSW1hZ2UgPSBhd2FpdCBtZXJnZUltYWdlcyhpbWFnZXMsIHsgZGlyZWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkSW1hZ2UgJiYgdHlwZW9mIG1lcmdlZEltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gbWVyZ2VkSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGltZW91dDogMzAqMTAwMCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90IGlubmVyIGVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gX2dldExvZ3MobmFtZSkge1xyXG4gICAgLy8gICAgIGlmICghTk9fTE9HU19DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2dzKCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIF9hZGp1c3RBcHBpdW1Mb2cobG9nLCBzcmMpIHtcclxuICAgICAgICBpZiAoIWxvZyB8fCB0eXBlb2YgbG9nICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogY29udmVydCBsb2cudGltZXN0YW1wIGZyb20gdGhlIGRldmljZSB0aW1lIHpvbmUgdG8gdGhlIGxvY2FsIG9uZSAoc28gd2UgY2FuIGxhdGVyIGNvcnJlbGF0ZSBiZXR3ZWVuIHN0ZXBzIGFuZCBsb2dzKSAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGltZTogbG9nLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgbXNnOiBsb2cubWVzc2FnZSxcclxuICAgICAgICAgICAgbGV2ZWw6IGxvZy5sZXZlbCxcclxuICAgICAgICAgICAgc3JjOiBzcmNcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIF9pdGVyYXRpb25TdGFydCgpIHtcclxuICAgICAgICAvLyBjbGVhciB0cmFuc2FjdGlvbiBuYW1lIHNhdmVkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiBhbnlcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pdGVyYXRpb25FbmQoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFQUElVTV9TRVNTSU9OX1RJTUVPVVQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZ25vcmUgdGhlIHJlc3QgaWYgbW9iIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWRcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBkZXZpY2UgbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0RGV2aWNlTG9ncykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEFwcGl1bUxvZyhsb2csICdkZXZpY2UnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGRldmljZSBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb2xsZWN0IGFsbCB0aGUgYnJvd3NlciBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dzICYmIEFycmF5LmlzQXJyYXkobG9ncykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsb2cgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzLmxvZ3MucHVzaCh0aGlzLl9hZGp1c3RBcHBpdW1Mb2cobG9nLCAnYnJvd3NlcicpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgYnJvd3NlciBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjb2xsZWN0IGFsbCBBcHBpdW0gbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QXBwaXVtTG9ncykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IHRoaXMuZ2V0QXBwaXVtTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZ0VudHJ5IG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QXBwaXVtTG9nKGxvZ0VudHJ5LCAnYXBwaXVtJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBBcHBpdW0gbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdFVybCA9IGF3YWl0IHRoaXMuX2dldEJyb3dzZXJTdGFja1Jlc3VsdFVybCgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0VXJsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgd3JpdHRlbiB0byBjb250ZXh0LnJlc3VsdERhdGEgaW5zdGVhZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ycy5hdHRyaWJ1dGVzWydCcm93c2VyU3RhY2tVcmwnXSA9IHJlc3VsdFVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZ2V0V2Rpb0xvY2F0b3IobG9jYXRvcikge1xyXG4gICAgICAgIGlmICghbG9jYXRvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ0ludmFsaWQgYXJndW1lbnQgLSBsb2NhdG9yIG5vdCBzcGVjaWZpZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhdG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignLycpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yOyAvLyBsZWF2ZSB4cGF0aCBsb2NhdG9yIGFzIGlzXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5jYXBzICYmIHRoaXMuY2Fwcy5wbGF0Zm9ybU5hbWUgPyB0aGlzLmNhcHMucGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hcHBDb250ZXh0ID09PSAnTkFUSVZFX0FQUCcgJiYgcGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCdpZD0nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gcHJlcGVuZCBwYWNrYWdlIG5hbWUgaWYgaXQncyBub3Qgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBnZXRDdXJyZW50UGFja2FnZSgpIHNlZW1zIHRvIGNyYXNoIHBvc3NpYmx5IGR1ZSB0byBhIHdkaW8gYnVnLiBcclxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIHdlIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBjYXBzIGluc3RlYWQuXHJcbiAgICAgICAgICAgICAgICBsb2NhdG9yID0gbG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJzppZC8nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhdG9yID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgKyAnOmlkLycgKyBsb2NhdG9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZChcIicgKyBsb2NhdG9yICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdjbGFzcz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLmNsYXNzTmFtZShcIicgKyBsb2NhdG9yLnN1YnN0cignY2xhc3M9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZigndGV4dD0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnRleHQoXCInICsgbG9jYXRvci5zdWJzdHIoJ3RleHQ9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZigndGV4dC1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIicgKyBsb2NhdG9yLnN1YnN0cigndGV4dC1jb250YWlucz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdkZXNjPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb24oXCInICsgbG9jYXRvci5zdWJzdHIoJ2Rlc2M9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignZGVzYy1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uQ29udGFpbnMoXCInICsgbG9jYXRvci5zdWJzdHIoJ2Rlc2MtY29udGFpbnM9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignc2Nyb2xsYWJsZScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuc2Nyb2xsYWJsZSh0cnVlKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignficpID09PSAwKSAgICAvLyBhY2Nlc3NpYmlsaXR5IGlkXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwQ29udGV4dCA9PT0gJ05BVElWRV9BUFAnICYmIHBsYXRmb3JtID09PSAnaW9zJykge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCd+JykgPT09IDApIC8vIGFjY2Vzc2liaWxpdHkgaWRcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBDb250ZXh0ICE9PSAnTkFUSVZFX0FQUCcpIHsgICAgICAgICAgICAvLyBIeWJyaWQgb3IgV2ViIGFwcGxpY2F0aW9uXHJcbiAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJ2lkPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcjJyArIGxvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCk7ICAgICAgLy8gY29udmVydCAnaWQ9JyB0byAnIydcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCduYW1lPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbmFtZT0nICsgbG9jYXRvci5zdWJzdHIoJ25hbWU9Jy5sZW5ndGgpICsgJ10nO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbms9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJz0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2xpbmstY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyo9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdjc3M9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvci5zdWJzdHIoJ2Nzcz0nLmxlbmd0aCk7ICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGNzcywganVzdCByZW1vdmUgY3NzPSBwcmVmaXhcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSGVscGVyRnVuY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRXZGlvTG9jYXRvciA9IHRoaXMuX2dldFdkaW9Mb2NhdG9yO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5tYXRjaFBhdHRlcm4gPSBtb2RVdGlscy5tYXRjaFBhdHRlcm47XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnQgPSBtb2RVdGlscy5nZXRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50cyA9IG1vZFV0aWxzLmdldEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnQgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudHMgPSBtb2RVdGlscy5nZXRDaGlsZEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5zZXRUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5zZXRUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQgPSBtb2RVdGlscy5yZXN0b3JlVGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXIgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmU7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRDb250ZXh0ID0gbW9kVXRpbHMuYXNzZXJ0Q29udGV4dDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuY29udGV4dExpc3QgPSBtb2RVdGlscy5jb250ZXh0TGlzdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0TG9nVHlwZXMgPSBtb2RVdGlscy5nZXRMb2dUeXBlcztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGVTZXNzaW9uKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdkZWxldGVTZXNzaW9uIGVycm9yJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zZXRCcm93c2VyU3RhY2tSZXN1bHRTdGF0dXMoc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgLy8gZGlmZmVyZW50IEFQSXMgYXJlIHVzZWQgZGVwZW5kaW5nIG9uIHRlc3QgdHlwZS5cclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2F1dG9tYXRlL2FwaS1yZWZlcmVuY2Uvc2VsZW5pdW0vc2Vzc2lvbiNzZXQtdGVzdC1zdGF0dXNcclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2FwcC1hdXRvbWF0ZS9hcGktcmVmZXJlbmNlL2FwcGl1bS9zZXNzaW9ucyN1cGRhdGUtc2Vzc2lvbi1zdGF0dXNcclxuICAgICAgICAgICAgY29uc3QgYnNBcGlVcmwgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmFwcCddID9cclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGktY2xvdWQuYnJvd3NlcnN0YWNrLmNvbS9hcHAtYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gIDpcclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmA7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRlc3Qgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJzQXBpVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGgnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJzogdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10udXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzJzogdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10uYWNjZXNzS2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2VuZEltbWVkaWF0ZWx5JzogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCAoZXJyLCByZXMsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBzZXR0aW5nIEJyb3dzZXJTdGFjayB0ZXN0IHJlc3VsdCBzdGF0dXM6ICcgKyBlcnIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3Igc2V0dGluZyBCcm93c2VyU3RhY2sgdGVzdCByZXN1bHQgc3RhdHVzOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRCcm93c2VyU3RhY2tSZXN1bHRVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgLy8gZGlmZmVyZW50IEFQSXMgYXJlIHVzZWQgZGVwZW5kaW5nIG9uIHRlc3QgdHlwZS5cclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2F1dG9tYXRlL2FwaS1yZWZlcmVuY2Uvc2VsZW5pdW0vc2Vzc2lvbiNzZXQtdGVzdC1zdGF0dXNcclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYnJvd3NlcnN0YWNrLmNvbS9kb2NzL2FwcC1hdXRvbWF0ZS9hcGktcmVmZXJlbmNlL2FwcGl1bS9zZXNzaW9ucyN1cGRhdGUtc2Vzc2lvbi1zdGF0dXNcclxuICAgICAgICAgICAgY29uc3QgYnNBcGlVcmwgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYXBwaXVtOmFwcCddID9cclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGktY2xvdWQuYnJvd3NlcnN0YWNrLmNvbS9hcHAtYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gIDpcclxuICAgICAgICAgICAgICBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmA7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gcmV0cmVpdmUgQlMgdGVzdCByZXN1bHQgdXJsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJzQXBpVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICdhdXRoJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddLnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddLmFjY2Vzc0tleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbmRJbW1lZGlhdGVseSc6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgZ2V0dGluZyBCcm93c2VyU3RhY2sgdGVzdCByZXN1bHQgdXJsOiAnICsgZXJyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShib2R5Py5hdXRvbWF0aW9uX3Nlc3Npb24/LmJyb3dzZXJfdXJsKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGdldHRpbmcgQnJvd3NlclN0YWNrIHRlc3QgcmVzdWx0IHVybDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=
675
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJyZXF1aXJlIiwiX3VybCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJ3ZGlvIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfV2ViRHJpdmVyTW9kdWxlIiwiX3V0aWxzIiwiX2hlbHBlciIsIl9PeHlnZW5FcnJvciIsIl9wZXJmZWN0b1JlcG9ydGluZyIsIl9yZXF1ZXN0IiwiX2ltZ01lcmdlIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiTU9EVUxFX05BTUUiLCJERUZBVUxUX0FQUElVTV9VUkwiLCJERUZBVUxUX0JST1dTRVJfTkFNRSIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJOT19TTkFQU0hPVF9DT01NQU5EUyIsIkFDVElPTl9DT01NQU5EUyIsIkRFRkFVTFRfV0FJVF9USU1FT1VUIiwiTW9iaWxlTW9kdWxlIiwiV2ViRHJpdmVyTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwidHJhbnNhY3Rpb25zIiwibGFzdE5hdmlnYXRpb25TdGFydFRpbWUiLCJuZXR3b3JrUmVxdWVzdHMiLCJoZWxwZXJzIiwiYXBwQ29udGV4dCIsIl9sb2FkSGVscGVyRnVuY3Rpb25zIiwiT3hFcnJvciIsImVyckhlbHBlciIsIndhaXRGb3JUaW1lb3V0IiwibmFtZSIsImdldERyaXZlciIsImdldENhcGFiaWxpdGllcyIsImNhcHMiLCJpbml0IiwiYXBwaXVtVXJsIiwiaXNJbml0aWFsaXplZCIsInJlb3BlblNlc3Npb24iLCJkZWJ1ZyIsImRyaXZlciIsInJlbG9hZFNlc3Npb24iLCJfaXNJbml0aWFsaXplZCIsImN0eCIsInBsYXRmb3JtTmFtZSIsInBsYXRmb3JtVmVyc2lvbiIsImRldmljZU5hbWUiLCJicm93c2VyTmFtZSIsImF1dG9tYXRpb25OYW1lIiwidWRpZCIsImFwcCIsImVuYWJsZUFwcGl1bUJlaGF2aW9yIiwidXNlQXBwaXVtRm9yV2ViIiwiY29sbGVjdERldmljZUxvZ3MiLCJhcHBQYWNrYWdlIiwiYnVuZGxlSWQiLCJ0b0xvd2VyQ2FzZSIsInJlY29yZEhBUiIsImJyb3dzZXIiLCJwZXJmb3JtYW5jZSIsInVybCIsIlVSTCIsInBhcnNlIiwicHJvdG9jb2wiLCJyZXBsYWNlIiwiaG9zdCIsImhvc3RuYW1lIiwicG9ydCIsInBhcnNlSW50IiwicGF0aCIsInBhdGhuYW1lIiwiYXV0aCIsInNwbGl0Iiwid2Rpb09wdHMiLCJ1c2VyIiwia2V5IiwiY2FwYWJpbGl0aWVzIiwibG9nTGV2ZWwiLCJydW5uZXIiLCJ3YWl0Zm9yVGltZW91dCIsImNvbm5lY3Rpb25SZXRyeVRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlDb3VudCIsInByb3ZpZGVyIiwibW9kVXRpbHMiLCJkZXRlcm1pbmVQcm92aWRlciIsImVucmljaFByb3ZpZGVyV2Rpb09wdGlvbnMiLCJyZW1vdGUiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0Iiwic2VsZW5pdW1UaW1lb3V0IiwiUEVSRkVDVE8iLCJwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJwZXJmZWN0b1JlcG9ydGluZyIsIlBlcmZlY3RvIiwiUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0Iiwid2ViZHJpdmVyIiwiZXhlY3V0ZVNjcmlwdCIsImNvbW1hbmQiLCJwYXJhbXMiLCJleGVjdXRlIiwicmVwb3J0aW5nQ2xpZW50IiwiUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQiLCJ0ZXN0U3RhcnQiLCJnZXRBcHBpdW1Jbml0RXJyb3IiLCJnZXRDb250ZXh0Iiwic2V0V2ViVmlld0NvbnRleHQiLCJCUk9XU0VSU1RBQ0siLCJzZXRUaW1lb3V0Iiwib3ZlcndyaXRlV2Rpb0NvbW1hbmRzIiwiZGlzcG9zZSIsInN0YXR1cyIsInN0ZXBzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZmFpbGVkRmluZGVkIiwiZmluZCIsIml0ZW0iLCJ0b1VwcGVyQ2FzZSIsInRlc3RTdG9wIiwiQ29uc3RhbnRzIiwicmVzdWx0cyIsInBhc3NlZCIsImZhaWxlZCIsIl9zZXRCcm93c2VyU3RhY2tSZXN1bHRTdGF0dXMiLCJkZWxldGVTZXNzaW9uIiwiaW5jbHVkZXMiLCJzZWxlbml1bVNlc3Npb25UaW1lb3V0Iiwid2FybiIsInRyYW5zYWN0aW9uIiwidG9TdHJpbmciLCJzbGljZSIsImdsb2JhbCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiX2lzQWN0aW9uIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwiZXJyb3IiLCJfdGhpcyRkcml2ZXIiLCJ0YWtlU2NyZWVuc2hvdCIsInJldHZhbCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwid2FpdFVudGlsUmV0VmFsIiwid2FpdFVudGlsIiwiaW1hZ2VzIiwicHVzaEltYWdlVG9JbWFnZXMiLCJmZXRjaFRpdGxlIiwiaW1hZ2UiLCJ0aXRsZSIsImdldFRpdGxlIiwidGV4dFRvSW1hZ2UiLCJ0aXRsZUltYWdlIiwiZ2VuZXJhdGUiLCJwdXNoIiwiaXNXZWJWaWV3Q29udGV4dCIsImhhbmRsZXMiLCJnZXRXaW5kb3dIYW5kbGVzIiwiaGFuZGxlIiwic3dpdGNoVG9XaW5kb3ciLCJtZXJnZWRJbWFnZSIsIm1lcmdlSW1hZ2VzIiwiZGlyZWN0aW9uIiwidGltZW91dCIsInRoZW4iLCJjYXRjaCIsImVyciIsIl90YWtlU25hcHNob3RTaWxlbnQiLCJnZXRQYWdlU291cmNlIiwicmVzdWx0IiwiX2FkanVzdEFwcGl1bUxvZyIsImxvZyIsInNyYyIsInRpbWUiLCJ0aW1lc3RhbXAiLCJtc2ciLCJtZXNzYWdlIiwibGV2ZWwiLCJfaXRlcmF0aW9uU3RhcnQiLCJfaXRlcmF0aW9uRW5kIiwidHlwZSIsImVycm9ySGVscGVyIiwiZXJyb3JDb2RlIiwiQVBQSVVNX1NFU1NJT05fVElNRU9VVCIsImxvZ3MiLCJnZXREZXZpY2VMb2dzIiwiY29sbGVjdEJyb3dzZXJMb2dzIiwiZ2V0QnJvd3NlckxvZ3MiLCJjb2xsZWN0QXBwaXVtTG9ncyIsImdldEFwcGl1bUxvZ3MiLCJsb2dFbnRyeSIsInJlc3VsdFVybCIsIl9nZXRCcm93c2VyU3RhY2tSZXN1bHRVcmwiLCJhdHRyaWJ1dGVzIiwiX2dldFdkaW9Mb2NhdG9yIiwibG9jYXRvciIsIlNDUklQVF9FUlJPUiIsImluZGV4T2YiLCJwbGF0Zm9ybSIsInN1YnN0ciIsImdldFdkaW9Mb2NhdG9yIiwibWF0Y2hQYXR0ZXJuIiwiZ2V0RWxlbWVudCIsImdldEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50IiwiZ2V0Q2hpbGRFbGVtZW50cyIsInNldFRpbWVvdXRJbXBsaWNpdCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJhc3NlcnRBcmd1bWVudCIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydENvbnRleHQiLCJjb250ZXh0TGlzdCIsImdldExvZ1R5cGVzIiwiYnNBcGlVcmwiLCJzZXNzaW9uSWQiLCJyZXF1ZXN0IiwibWV0aG9kIiwianNvbiIsInJlamVjdFVuYXV0aG9yaXplZCIsImJvZHkiLCJ1c2VyTmFtZSIsImFjY2Vzc0tleSIsInJlcyIsIl9ib2R5JGF1dG9tYXRpb25fc2VzcyIsImF1dG9tYXRpb25fc2Vzc2lvbiIsImJyb3dzZXJfdXJsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL294X21vZHVsZXMvbW9kdWxlLW1vYi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIEBuYW1lIG1vYlxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9iaWxlIGF1dG9tYXRpb24uXHJcbiAqIEBzYW1wbGUgKipMb2NhdG9yczoqKiAgXHJcbiAqIFxyXG4gKiBOYXRpdmUgYXBwbGljYXRpb24gbG9jYXRvcnMgZm9yIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hbmRyb2lkLnBuZykgIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGB+QUNDRVNTSUJJTElUWV9JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIEFjY2Vzc2liaWxpdHkgSWQuXHJcbiAqICogYGlkPUlEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgaWQuXHJcbiAqICogYGNsYXNzPUNMQVNTYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgY2xhc3MuXHJcbiAqICogYHRleHQ9VEVYVGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIHZpc2libGUgdGV4dC5cclxuICogKiBgdGV4dC1jb250YWlucz1URVhUYCAtIExvY2F0ZXMgZWxlbWVudCB3aG9zZSB2aXNpYmxlIHRleHQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBzdHJpbmcuXHJcbiAqICogYGRlc2M9REVTQ1JJUFRJT05gIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBkZXNjcmlwdGlvbi5cclxuICogKiBgZGVzYy1jb250YWlucz1ERVNDUklQVElPTmAgLSBMb2NhdGVzIGVsZW1lbnQgd2hvc2UgZGVzY3JpcHRpb24gY29udGFpbnMgdGhlIHNwZWNpZmllZCBzdHJpbmcuXHJcbiAqICogYHNjcm9sbGFibGVgIC0gTG9jYXRlcyBlbGVtZW50cyB0aGF0IGFyZSBzY3JvbGxhYmxlLiAgXHJcbiAqICBcclxuICogTmF0aXZlIGFwcGxpY2F0aW9uIGxvY2F0b3JzIGZvciFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvYXBwbGUucG5nKSAgXHJcbiAqICBcclxuICogKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBJRC5cclxuICogKiBgfkFDQ0VTU0lCSUxJVFlfSURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBBY2Nlc3NpYmlsaXR5IElkLiAgXHJcbiAqICogYC1pb3MgcHJlZGljYXRlIHN0cmluZzpQUkVESUNBVEVfU1RSSU5HYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhIFtwcmVkaWNhdGUgcXVlcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2FyY2hpdmUvV2ViRHJpdmVyQWdlbnQvd2lraS9QcmVkaWNhdGUtUXVlcmllcy1Db25zdHJ1Y3Rpb24tUnVsZXMpLiAgXHJcbiAqICogYC1pb3MgY2xhc3MgY2hhaW46Q0xBU1NfQ0hBSU5gIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgW2NsYXNzIGNoYWluIGV4cHJlc3Npb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2FyY2hpdmUvV2ViRHJpdmVyQWdlbnQvd2lraS9DbGFzcy1DaGFpbi1RdWVyaWVzLUNvbnN0cnVjdGlvbi1SdWxlcykuICBcclxuICogIFxyXG4gKiBIeWJyaWQhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2h5YnJpZC5wbmcpICBhbmQgV2ViIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy93ZWIucG5nKSAgYXBwbGljYXRpb24gbG9jYXRvcnMgZm9yIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hbmRyb2lkLnBuZykgICFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvYXBwbGUucG5nKSAgXHJcbiAqICBcclxuICogKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBpZC5cclxuICogKiBgbmFtZT1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgbmFtZSBhdHRyaWJ1dGUuXHJcbiAqICogYHRhZz1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdGFnIG5hbWUuXHJcbiAqICogYGxpbms9VEVYVGAgLSBMb2NhdGVzIGFuY2hvciBlbGVtZW50IHdob3NlIHRleHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAqIGBsaW5rLWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBhbmNob3IgZWxlbWVudCB3aG9zZSB0ZXh0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICogYGNzcz1DU1NfU0VMRUNUT1JgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgQ1NTIHNlbGVjdG9yLlxyXG4gKiBcclxuICogKipQYXR0ZXJuIGFyZ3VtZW50czoqKlxyXG4gKiBcclxuICogQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGEgc3RyaW5nIG1hdGNoaW5nIHBhdHRlcm4gaW4gdGhlaXIgYXJndW1lbnRzLCBzdXBwb3J0IGZvbGxvd2luZyBwYXR0ZXJucyB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZTpcclxuICogXHJcbiAqICogYHJlZ2V4OlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgcmVndWxhciBleHByZXNzaW9uLlxyXG4gKiAqIGBQQVRURVJOYCAtIFZlcmJhdGltIG1hdGNoaW5nLlxyXG4gKiBcclxuICovXHJcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcclxuaW1wb3J0ICogYXMgd2RpbyBmcm9tICd3ZWJkcml2ZXJpbyc7XHJcbmltcG9ydCBXZWJEcml2ZXJNb2R1bGUgZnJvbSAnLi4vY29yZS9XZWJEcml2ZXJNb2R1bGUnO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBwZXJmZWN0b1JlcG9ydGluZyBmcm9tICdwZXJmZWN0by1yZXBvcnRpbmcnO1xyXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdyZXF1ZXN0JztcclxuaW1wb3J0IG1lcmdlSW1hZ2VzIGZyb20gJy4uL2xpYi9pbWctbWVyZ2UnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdtb2InO1xyXG5jb25zdCBERUZBVUxUX0FQUElVTV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1Yic7XHJcbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9OQU1FID0gJ2RlZmF1bHQnO1xyXG5jb25zdCBOT19TQ1JFRU5TSE9UX0NPTU1BTkRTID0gWydpbml0JywgJ2Fzc2VydEFsZXJ0JywgJ2Rpc3Bvc2UnXTtcclxuY29uc3QgTk9fU05BUFNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnLCAnZGlzcG9zZSddO1xyXG5jb25zdCBBQ1RJT05fQ09NTUFORFMgPSBbJ29wZW4nLCd0YXAnLCdjbGljaycsJ3N3aXBlJywnc3VibWl0Jywnc2V0VmFsdWUnXTtcclxuY29uc3QgREVGQVVMVF9XQUlUX1RJTUVPVVQgPSA2MCAqIDEwMDA7ICAgICAgICAgICAgLy8gZGVmYXVsdCA2MHMgd2FpdCB0aW1lb3V0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2JpbGVNb2R1bGUgZXh0ZW5kcyBXZWJEcml2ZXJNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5ldHdvcmtSZXF1ZXN0cyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5hcHBDb250ZXh0ID0gJ05BVElWRV9BUFAnO1xyXG4gICAgICAgIHRoaXMuX2xvYWRIZWxwZXJGdW5jdGlvbnMoKTtcclxuICAgICAgICAvLyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKHNvbWUgbW9kdWxlIGNvbW1hbmRzIG1pZ2h0IHJlZmVyIHRvIHRoaXMuT3hFcnJvciBhbmQgdGhpcy5lcnJIZWxwZXIpXHJcbiAgICAgICAgdGhpcy5PeEVycm9yID0gT3hFcnJvcjtcclxuICAgICAgICB0aGlzLmVyckhlbHBlciA9IGVyckhlbHBlcjtcclxuICAgICAgICAvLyBob2xkcyBlbGVtZW50IG9wZXJhdGlvbiB0aW1lb3V0IHZhbHVlXHJcbiAgICAgICAgdGhpcy53YWl0Rm9yVGltZW91dCA9IERFRkFVTFRfV0FJVF9USU1FT1VUO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXREcml2ZXJcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHVuZGVybHlpbmcgV0RJTyBkcml2ZXIuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFdESU8gZHJpdmVyLlxyXG4gICAgICovXHJcbiAgICBnZXREcml2ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldERyaXZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldENhcGFiaWxpdGllc1xyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBjdXJyZW50bHkgZGVmaW5lZCBjYXBhYmlsaXRpZXMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgY2FwYWJpbGl0aWVzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcHMgfHwgc3VwZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gaW5pdFxyXG4gICAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgQXBwaXVtIHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNhcHMgLSBEZXNpcmVkIGNhcGFiaWxpdGllcy4gSWYgbm90IHNwZWNpZmllZCBjYXBhYmlsaXRpZXMgd2lsbCBiZSB0YWtlbiBmcm9tIHN1aXRlIGRlZmluaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGFwcGl1bVVybCAtIFJlbW90ZSBBcHBpdW0gc2VydmVyIFVSTCAoZGVmYXVsdDogaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YikuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQoY2FwcywgYXBwaXVtVXJsKSB7XHJcbiAgICAgICAgLy8gaWYgcmVvcGVuU2Vzc2lvbiBpcyB0cnVlIC0gcmVpbml0aWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW9wZW5TZXNzaW9uICE9PSBmYWxzZSkgeyAvLyB0cnVlIG9yIGZhbHNlIGlmIGV4cGxpc2l0bHkgc2V0LiB0cnVlIG9uIG51bGwgb3IgdW5kZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3Jlb3BlblNlc3Npb24gaXMgdHJ1ZSAtIHJlbG9hZGluZyB0aGUgc2Vzc2lvbi4uLicpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIucmVsb2FkU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnbW9iLmluaXQgd2FzIGNhbGxlZCBmb3IgYWxyZWFkeSBpbml0aWFsaXplZCBtb2R1bGUuIHJlb3BlblNlc3Npb24gaXMgZmFsc2Ugc28gdGhlIGNhbGwgaXMgaWdub3JlZC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgcmVmYWN0b3JlZFxyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzICYmIHRoaXMuY3R4LmNhcHNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMucGxhdGZvcm1OYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMucGxhdGZvcm1WZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMuZGV2aWNlTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmJyb3dzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMuYXV0b21hdGlvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy51ZGlkO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjYXBzLmFwcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcHMuZW5hYmxlQXBwaXVtQmVoYXZpb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXBzLnVzZUFwcGl1bUZvcldlYiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Fwcy5lbmFibGVBcHBpdW1CZWhhdmlvciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5jYXBzLnVzZUFwcGl1bUZvcldlYiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5jYXBzLmVuYWJsZUFwcGl1bUJlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFhcHBpdW1VcmwpIHtcclxuICAgICAgICAgICAgYXBwaXVtVXJsID0gdGhpcy5vcHRpb25zLmFwcGl1bVVybCB8fCBERUZBVUxUX0FQUElVTV9VUkw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtZXJnZSBjYXBhYmlsaXRpZXMgZnJvbSBjb250ZXh0IGFuZCBmcm9tIGluaXQgZnVuY3Rpb24gYXJndW1lbnQsIGdpdmUgcHJlZmVyZW5jZSB0byBjb250ZXh0LXBhc3NlZCBjYXBhYmlsaXRpZXNcclxuICAgICAgICB0aGlzLmNhcHMgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5jdHguY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY3R4LmNhcHMgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmNhcHMsIC4uLmNhcHMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBjbGVhciB0aGUgZXhpc3RpbmcgZGV2aWNlIGxvZ3MsIGlmIGNvbGxlY3REZXZpY2VMb2dzIG9wdGlvbiBpcyB0cnVlICh3ZSB3YW50IHRvIGluY2x1ZGUgbG9ncyBvbmx5IHJlbGV2YW50IGZvciB0aGlzIHNlc3Npb24pXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0RGV2aWNlTG9ncykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHNbJ2NsZWFyRGV2aWNlTG9nc09uU3RhcnQnXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiBib3RoIGJyb3dzZXJOYW1lIGFuZCBhcHBQYWNrYWdlL2FwcC9idW5kbGVJZCB3ZXJlIHNwZWNpZmllZCAtIGFzc3VtZSB3ZSB3YW50IHRvIHJ1biB0aGUgYXBwbGljYXRpb24gYW5kIHJlbW92ZSBicm93c2VyTmFtZVxyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgJiYgKHRoaXMuY2Fwcy5hcHBQYWNrYWdlIHx8IHRoaXMuY2Fwcy5hcHAgfHwgdGhpcy5jYXBzLmJ1bmRsZUlkKSkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYXBzLmJyb3dzZXJOYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiBubyBhcHBQYWNrYWdlL2FwcC9idW5kbGVJZCBjYXBhYmlsaXR5IG5vciBicm93c2VyTmFtZSBhcmUgZGVmaW5lZCwgYXNzdW1lIHdlIHdhbnQgdG8gcnVuIHRoZSB0ZXN0IGFnYWluc3QgZGVmYXVsdCBicm93c2VyXHJcbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSAmJiAhdGhpcy5jYXBzLmFwcFBhY2thZ2UgJiYgIXRoaXMuY2Fwcy5hcHAgJiYgIXRoaXMuY2Fwcy5idW5kbGVJZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSBERUZBVUxUX0JST1dTRVJfTkFNRTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gd2ViZHJpdmVyIGV4cGVjdHMgbG93ZXIgY2FzZSBuYW1lc1xyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgJiYgdHlwZW9mIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gdGhpcy5jYXBzLmJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFkanVzdCBjYXBhYmlsaXRpZXMgdG8gZW5hYmxlIGNvbGxlY3RpbmcgYnJvd3NlciBhbmQgcGVyZm9ybWFuY2Ugc3RhdHMgaW4gQ2hyb21lIFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzWydnb29nOmxvZ2dpbmdQcmVmcyddID0geyAgICAgLy8gZm9yIENocm9tZURyaXZlciA+PSA3NVxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogJ0FMTCcsXHJcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogJ0FMTCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBvcHVsYXRlIFdESU8gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5wYXJzZShhcHBpdW1VcmwpO1xyXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpO1xyXG4gICAgICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWU7XHJcbiAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0IHx8IChwcm90b2NvbCA9PT0gJ2h0dHBzJyA/IDQ0MyA6IDgwKSk7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZTtcclxuXHJcbiAgICAgICAgLy8gYXV0aCBpcyBuZWVkZWQgbW9zdGx5IGZvciBjbG91ZCBwcm92aWRlcnMgc3VjaCBhcyBMYW1iZGFUZXN0XHJcbiAgICAgICAgaWYgKHVybC5hdXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSB1cmwuYXV0aC5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMud2Rpb09wdHMgPSB7XHJcbiAgICAgICAgICAgICAgICB1c2VyOiBhdXRoWzBdLFxyXG4gICAgICAgICAgICAgICAga2V5OiBhdXRoWzFdXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgd2Rpb09wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucy53ZGlvT3B0cyB8fCB7fSxcclxuICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sLFxyXG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdCxcclxuICAgICAgICAgICAgcG9ydDogcG9ydCxcclxuICAgICAgICAgICAgcGF0aDogcGF0aCxcclxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB0aGlzLmNhcHMsXHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcclxuICAgICAgICAgICAgcnVubmVyOiAncmVwbCcsXHJcbiAgICAgICAgICAgIHdhaXRmb3JUaW1lb3V0OiA1MDAwLCAvLyBpbmNyZWFzZSB0aGUgZGVmYXVsdCAzMDAwXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IDMxMCoxMDAwLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogMVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBwcm92aWRlciA9IG1vZFV0aWxzLmRldGVybWluZVByb3ZpZGVyKHdkaW9PcHRzKTtcclxuICAgICAgICBjb25zdCBuYW1lID0gbW9kVXRpbHMuZW5yaWNoUHJvdmlkZXJXZGlvT3B0aW9ucyhwcm92aWRlciwgd2Rpb09wdHMpO1xyXG5cclxuICAgICAgICB0aGlzLndkaW9PcHRzID0gd2Rpb09wdHM7XHJcblxyXG4gICAgICAgIC8vIGluaXQgd2ViZHJpdmVyXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBhd2FpdCB3ZGlvLnJlbW90ZSh3ZGlvT3B0cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5wcm92aWRlciA9IHByb3ZpZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQgPSBhd2FpdCBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICB3ZWJkcml2ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVNjcmlwdDogYXN5bmMgKGNvbW1hbmQsIHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoY29tbWFuZCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRpbmdDbGllbnQgPSBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQocGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdGFydChuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldEFwcGl1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldENvbnRleHQoKTtcclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcgb24gQW5kcm9pZCA3KyBlbXVsYXRvciwgYW5kIHRodXMvb3IgdXNpbmcgYSBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyIC1cclxuICAgICAgICAvLyBwZXJmb3JtIGFuIGFjdHVhbCBhcHBDb250ZXh0IHN3aXRjaCB0byBXRUJcclxuICAgICAgICAvLyBzbyBBcHBpdW0gd2lsbCBkZWxlZ2F0ZSBjb21tYW5kcyB0byBDaHJvbWUgRHJpdmVyIGluc3RlYWQgb2YgQXBwaXVtIERyaXZlclxyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICAnY2hyb21pdW0td2VidmlldycpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIC8vIGZhaWxzIG9uIGJyb3dzZXJzdGFja1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLndhaXRGb3JUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgbW9kVXRpbHMub3ZlcndyaXRlV2Rpb0NvbW1hbmRzKHRoaXMuZHJpdmVyKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCh0aGlzLmRyaXZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzdGF0dXMgLSBUZXN0IHN0YXR1cywgZWl0aGVyIGBwYXNzZWRgIG9yIGBmYWlsZWRgLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cykge1xyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9ICdwYXNzZWQnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucnMuc3RlcHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnJzLnN0ZXBzKSAmJiB0aGlzLnJzLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEZpbmRlZCA9IHRoaXMucnMuc3RlcHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdG9wKHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZlY3RvUmVwb3J0aW5nLkNvbnN0YW50cy5yZXN1bHRzLnBhc3NlZCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMuZmFpbGVkXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuQlJPV1NFUlNUQUNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRCcm93c2VyU3RhY2tSZXN1bHRTdGF0dXMoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFbJ0NBTkNFTEVEJywgJ0ZBSUxFRCddLmluY2x1ZGVzKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVTZXNzaW9uIHdpbGwgdGFrZSA1IG1pbiB0byBjYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRXJyb3IgZGlzcG9zaW5nIGRyaXZlcjogJyArIGUpOyAgICAvLyBpZ25vcmUgYW55IGVycm9ycyBhdCBkaXNwb3NhbCBzdGFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqIEBmb3IgYW5kcm9pZCwgaW9zLCBoeWJyaWQsIHdlYlxyXG4gICAgICovXHJcbiAgICB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8ganVzdCBpbiBjYXNlIHVzZXIgcGFzc2VkIGEgY29tcGxleCBvYmplY3QgYnkgbWlzdGFrZVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIC8vIGxpbWl0IHRoZSBuYW1lIGxlbmd0aCAoc2luY2Ugd2UgY2FuJ3Qgc3RvcmUgdmFsdWVzIGxhcmdlciB0aGFuIDUxMkIgaW4gdGhlIGRhdGFiYXNlKVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIDUxMik7XHJcblxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGVcclxuICAgICAqL1xyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXI/LnRha2VTY3JlZW5zaG90KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXNoSW1hZ2VUb0ltYWdlcyA9IGFzeW5jKGZldGNoVGl0bGUgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hUaXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCcuLi9saWIvdGV4dC10by1pbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGVJbWFnZSA9IGF3YWl0IHRleHRUb0ltYWdlLmdlbmVyYXRlKHRpdGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlSW1hZ2UgJiYgdHlwZW9mIHRpdGxlSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUltYWdlID0gdGl0bGVJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2godGl0bGVJbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNXZWJWaWV3Q29udGV4dCA9IGF3YWl0IHRoaXMuaXNXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXZWJWaWV3Q29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgKHNjcmVlbnNob3QgYW5kIHRpdGxlKSBpbWFnZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRXaW5kb3dIYW5kbGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaGFuZGxlcykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlIG9mIGhhbmRsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVzaEltYWdlVG9JbWFnZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwdXNoSW1hZ2VUb0ltYWdlcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFsbCBpbWFnZXMgaW50byBvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkSW1hZ2UgPSBhd2FpdCBtZXJnZUltYWdlcyhpbWFnZXMsIHsgZGlyZWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkSW1hZ2UgJiYgdHlwZW9mIG1lcmdlZEltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gbWVyZ2VkSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGltZW91dDogMzAqMTAwMCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90JywgZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90IGlubmVyIGVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3Rha2VTbmFwc2hvdFNpbGVudChuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFOT19TTkFQU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5nZXRQYWdlU291cmNlXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhbGwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuZ2V0UGFnZVNvdXJjZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcmVzdWx0OyByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzbmFwc2hvdCAoMSknLCBlcnJvcik7IHJlamVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNuYXBzaG90ICgyKScsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNuYXBzaG90ICgzKScsIGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc25hcHNob3QgaW5uZXIgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBfZ2V0TG9ncyhuYW1lKSB7XHJcbiAgICAvLyAgICAgaWYgKCFOT19MT0dTX0NPTU1BTkRTLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmdldExvZ3MoKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgX2FkanVzdEFwcGl1bUxvZyhsb2csIHNyYykge1xyXG4gICAgICAgIGlmICghbG9nIHx8IHR5cGVvZiBsb2cgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGxvZy50aW1lc3RhbXAgZnJvbSB0aGUgZGV2aWNlIHRpbWUgem9uZSB0byB0aGUgbG9jYWwgb25lIChzbyB3ZSBjYW4gbGF0ZXIgY29ycmVsYXRlIGJldHdlZW4gc3RlcHMgYW5kIGxvZ3MpICAgICAgICBcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lOiBsb2cudGltZXN0YW1wLFxyXG4gICAgICAgICAgICBtc2c6IGxvZy5tZXNzYWdlLFxyXG4gICAgICAgICAgICBsZXZlbDogbG9nLmxldmVsLFxyXG4gICAgICAgICAgICBzcmM6IHNyY1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgX2l0ZXJhdGlvblN0YXJ0KCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHRyYW5zYWN0aW9uIG5hbWUgc2F2ZWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIGFueVxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2l0ZXJhdGlvbkVuZChlcnJvcikge1xyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVBQSVVNX1NFU1NJT05fVElNRU9VVCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlnbm9yZSB0aGUgcmVzdCBpZiBtb2IgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZFxyXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29sbGVjdCBhbGwgdGhlIGRldmljZSBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3REZXZpY2VMb2dzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXREZXZpY2VMb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QXBwaXVtTG9nKGxvZywgJ2RldmljZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgZGV2aWNlIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBicm93c2VyIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEFwcGl1bUxvZyhsb2csICdicm93c2VyJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBicm93c2VyIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNvbGxlY3QgYWxsIEFwcGl1bSBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RBcHBpdW1Mb2dzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gdGhpcy5nZXRBcHBpdW1Mb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbG9nRW50cnkgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzLmxvZ3MucHVzaCh0aGlzLl9hZGp1c3RBcHBpdW1Mb2cobG9nRW50cnksICdhcHBpdW0nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIEFwcGl1bSBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0VXJsID0gYXdhaXQgdGhpcy5fZ2V0QnJvd3NlclN0YWNrUmVzdWx0VXJsKCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRVcmwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSB3cml0dGVuIHRvIGNvbnRleHQucmVzdWx0RGF0YSBpbnN0ZWFkXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJzLmF0dHJpYnV0ZXNbJ0Jyb3dzZXJTdGFja1VybCddID0gcmVzdWx0VXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9nZXRXZGlvTG9jYXRvcihsb2NhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFsb2NhdG9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBhcmd1bWVudCAtIGxvY2F0b3Igbm90IHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGxvY2F0b3IgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCcvJykgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7IC8vIGxlYXZlIHhwYXRoIGxvY2F0b3IgYXMgaXNcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLmNhcHMgJiYgdGhpcy5jYXBzLnBsYXRmb3JtTmFtZSA/IHRoaXMuY2Fwcy5wbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFwcENvbnRleHQgPT09ICdOQVRJVkVfQVBQJyAmJiBwbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJ2lkPScpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmVwZW5kIHBhY2thZ2UgbmFtZSBpZiBpdCdzIG5vdCBzcGVjaWZpZWRcclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IGdldEN1cnJlbnRQYWNrYWdlKCkgc2VlbXMgdG8gY3Jhc2ggcG9zc2libHkgZHVlIHRvIGEgd2RpbyBidWcuIFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgc28gd2UgZ2V0IHBhY2thZ2UgbmFtZSBmcm9tIGNhcHMgaW5zdGVhZC5cclxuICAgICAgICAgICAgICAgIGxvY2F0b3IgPSBsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignOmlkLycpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0b3IgPSB0aGlzLmNhcHMuYXBwUGFja2FnZSArICc6aWQvJyArIGxvY2F0b3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKFwiJyArIGxvY2F0b3IgKyAnXCIpJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2NsYXNzPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuY2xhc3NOYW1lKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCdjbGFzcz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCd0ZXh0PScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkudGV4dChcIicgKyBsb2NhdG9yLnN1YnN0cigndGV4dD0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCd0ZXh0LWNvbnRhaW5zPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkudGV4dENvbnRhaW5zKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCd0ZXh0LWNvbnRhaW5zPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2Rlc2M9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbihcIicgKyBsb2NhdG9yLnN1YnN0cignZGVzYz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdkZXNjLWNvbnRhaW5zPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIicgKyBsb2NhdG9yLnN1YnN0cignZGVzYy1jb250YWlucz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdzY3JvbGxhYmxlJykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCd+JykgPT09IDApICAgIC8vIGFjY2Vzc2liaWxpdHkgaWRcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBDb250ZXh0ID09PSAnTkFUSVZFX0FQUCcgJiYgcGxhdGZvcm0gPT09ICdpb3MnKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJ34nKSA9PT0gMCkgLy8gYWNjZXNzaWJpbGl0eSBpZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcENvbnRleHQgIT09ICdOQVRJVkVfQVBQJykgeyAgICAgICAgICAgIC8vIEh5YnJpZCBvciBXZWIgYXBwbGljYXRpb25cclxuICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignaWQ9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyMnICsgbG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKTsgICAgICAvLyBjb252ZXJ0ICdpZD0nIHRvICcjJ1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ25hbWU9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tuYW1lPScgKyBsb2NhdG9yLnN1YnN0cignbmFtZT0nLmxlbmd0aCkgKyAnXSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluaz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnPScgKyBsb2NhdG9yLnN1YnN0cignbGluaz0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluay1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnKj0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2Nzcz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdG9yLnN1YnN0cignY3NzPScubGVuZ3RoKTsgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgY3NzLCBqdXN0IHJlbW92ZSBjc3M9IHByZWZpeFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRIZWxwZXJGdW5jdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yID0gdGhpcy5fZ2V0V2Rpb0xvY2F0b3I7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLm1hdGNoUGF0dGVybiA9IG1vZFV0aWxzLm1hdGNoUGF0dGVybjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudCA9IG1vZFV0aWxzLmdldEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0RWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudCA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50cyA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnNldFRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnNldFRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydENvbnRleHQgPSBtb2RVdGlscy5hc3NlcnRDb250ZXh0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5jb250ZXh0TGlzdCA9IG1vZFV0aWxzLmNvbnRleHRMaXN0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRMb2dUeXBlcyA9IG1vZFV0aWxzLmdldExvZ1R5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZVNlc3Npb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlbGV0ZVNlc3Npb24gZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NldEJyb3dzZXJTdGFja1Jlc3VsdFN0YXR1cyhzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBkaWZmZXJlbnQgQVBJcyBhcmUgdXNlZCBkZXBlbmRpbmcgb24gdGVzdCB0eXBlLlxyXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5icm93c2Vyc3RhY2suY29tL2RvY3MvYXV0b21hdGUvYXBpLXJlZmVyZW5jZS9zZWxlbml1bS9zZXNzaW9uI3NldC10ZXN0LXN0YXR1c1xyXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5icm93c2Vyc3RhY2suY29tL2RvY3MvYXBwLWF1dG9tYXRlL2FwaS1yZWZlcmVuY2UvYXBwaXVtL3Nlc3Npb25zI3VwZGF0ZS1zZXNzaW9uLXN0YXR1c1xyXG4gICAgICAgICAgICBjb25zdCBic0FwaVVybCA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06YXBwJ10gP1xyXG4gICAgICAgICAgICAgIGBodHRwczovL2FwaS1jbG91ZC5icm93c2Vyc3RhY2suY29tL2FwcC1hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmAgOlxyXG4gICAgICAgICAgICAgIGBodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlL3Nlc3Npb25zLyR7dGhpcy5kcml2ZXIuc2Vzc2lvbklkfS5qc29uYDtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgdGVzdCBzdGF0dXNcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogYnNBcGlVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyAncGFzc2VkJyA6ICdmYWlsZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAnYXV0aCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInOiB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnOiB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXS5hY2Nlc3NLZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZW5kSW1tZWRpYXRlbHknOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHNldHRpbmcgQnJvd3NlclN0YWNrIHRlc3QgcmVzdWx0IHN0YXR1czogJyArIGVyci50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBzZXR0aW5nIEJyb3dzZXJTdGFjayB0ZXN0IHJlc3VsdCBzdGF0dXM6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEJyb3dzZXJTdGFja1Jlc3VsdFVybCgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBkaWZmZXJlbnQgQVBJcyBhcmUgdXNlZCBkZXBlbmRpbmcgb24gdGVzdCB0eXBlLlxyXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5icm93c2Vyc3RhY2suY29tL2RvY3MvYXV0b21hdGUvYXBpLXJlZmVyZW5jZS9zZWxlbml1bS9zZXNzaW9uI3NldC10ZXN0LXN0YXR1c1xyXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5icm93c2Vyc3RhY2suY29tL2RvY3MvYXBwLWF1dG9tYXRlL2FwaS1yZWZlcmVuY2UvYXBwaXVtL3Nlc3Npb25zI3VwZGF0ZS1zZXNzaW9uLXN0YXR1c1xyXG4gICAgICAgICAgICBjb25zdCBic0FwaVVybCA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydhcHBpdW06YXBwJ10gP1xyXG4gICAgICAgICAgICAgIGBodHRwczovL2FwaS1jbG91ZC5icm93c2Vyc3RhY2suY29tL2FwcC1hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmAgOlxyXG4gICAgICAgICAgICAgIGBodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlL3Nlc3Npb25zLyR7dGhpcy5kcml2ZXIuc2Vzc2lvbklkfS5qc29uYDtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZXRyZWl2ZSBCUyB0ZXN0IHJlc3VsdCB1cmxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogYnNBcGlVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgICAgICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGgnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJzogdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10udXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzJzogdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10uYWNjZXNzS2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2VuZEltbWVkaWF0ZWx5JzogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCAoZXJyLCByZXMsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBnZXR0aW5nIEJyb3dzZXJTdGFjayB0ZXN0IHJlc3VsdCB1cmw6ICcgKyBlcnIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGJvZHk/LmF1dG9tYXRpb25fc2Vzc2lvbj8uYnJvd3Nlcl91cmwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgZ2V0dGluZyBCcm93c2VyU3RhY2sgdGVzdCByZXN1bHQgdXJsOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZOztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpDQUEsTUFBQSxDQUFBQyxjQUFBLENBQUFDLE9BQUE7RUFBQUMsS0FBQTtBQUFBO0FBQUFELE9BQUEsQ0FBQUUsT0FBQTtBQUFBQyxPQUFBO0FBMENBLElBQUFDLElBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLElBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLGdCQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxNQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxPQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxZQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxrQkFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsUUFBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVcsU0FBQSxHQUFBVCxzQkFBQSxDQUFBRixPQUFBO0FBQTJDLFNBQUFJLHdCQUFBUSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBVix1QkFBQSxZQUFBQSxDQUFBUSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQXRCLE9BQUEsRUFBQWEsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFWLENBQUEsVUFBQU0sQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsR0FBQU0sQ0FBQSxDQUFBTSxHQUFBLENBQUFaLENBQUEsRUFBQVEsQ0FBQSxnQkFBQVAsQ0FBQSxJQUFBRCxDQUFBLGdCQUFBQyxDQUFBLE9BQUFZLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZCxDQUFBLEVBQUFDLENBQUEsT0FBQU0sQ0FBQSxJQUFBRCxDQUFBLEdBQUF2QixNQUFBLENBQUFDLGNBQUEsS0FBQUQsTUFBQSxDQUFBZ0Msd0JBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsQ0FBQUksR0FBQSxJQUFBSixDQUFBLENBQUFLLEdBQUEsSUFBQU4sQ0FBQSxDQUFBRSxDQUFBLEVBQUFQLENBQUEsRUFBQU0sQ0FBQSxJQUFBQyxDQUFBLENBQUFQLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFdBQUFPLENBQUEsS0FBQVIsQ0FBQSxFQUFBQyxDQUFBO0FBQUEsU0FBQVgsdUJBQUFVLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsR0FBQUwsQ0FBQSxLQUFBYixPQUFBLEVBQUFhLENBQUE7QUFHM0MsTUFBTWdCLFdBQVcsR0FBRyxLQUFLO0FBQ3pCLE1BQU1DLGtCQUFrQixHQUFHLDhCQUE4QjtBQUN6RCxNQUFNQyxvQkFBb0IsR0FBRyxTQUFTO0FBQ3RDLE1BQU1DLHNCQUFzQixHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUM7QUFDakUsTUFBTUMsb0JBQW9CLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQztBQUMvRCxNQUFNQyxlQUFlLEdBQUcsQ0FBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsUUFBUSxFQUFDLFVBQVUsQ0FBQztBQUMxRSxNQUFNQyxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQVk7O0FBRXBDLE1BQU1DLFlBQVksU0FBU0Msd0JBQWUsQ0FBQztFQUN0REMsV0FBV0EsQ0FBQ0MsT0FBTyxFQUFFQyxPQUFPLEVBQUVDLEVBQUUsRUFBRUMsTUFBTSxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsRUFBRTtJQUN6RCxLQUFLLENBQUNMLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxFQUFFLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxFQUFFQyxRQUFRLENBQUM7SUFDdEQsSUFBSSxDQUFDQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLElBQUksQ0FBQ0MsdUJBQXVCLEdBQUcsSUFBSTtJQUNuQyxJQUFJLENBQUNDLGVBQWUsR0FBRyxJQUFJO0lBQzNCLElBQUksQ0FBQ0MsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUNDLFVBQVUsR0FBRyxZQUFZO0lBQzlCLElBQUksQ0FBQ0Msb0JBQW9CLENBQUMsQ0FBQztJQUMzQjtJQUNBLElBQUksQ0FBQ0MsT0FBTyxHQUFHQSxvQkFBTztJQUN0QixJQUFJLENBQUNDLFNBQVMsR0FBR0EsZUFBUztJQUMxQjtJQUNBLElBQUksQ0FBQ0MsY0FBYyxHQUFHbEIsb0JBQW9CO0VBQzlDO0VBRUEsSUFBSW1CLElBQUlBLENBQUEsRUFBRztJQUNQLE9BQU96QixXQUFXO0VBQ3RCOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSTBCLFNBQVNBLENBQUEsRUFBRztJQUNSLE9BQU8sS0FBSyxDQUFDQSxTQUFTLENBQUMsQ0FBQztFQUM1Qjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0lDLGVBQWVBLENBQUEsRUFBRztJQUNkLE9BQU8sSUFBSSxDQUFDQyxJQUFJLElBQUksS0FBSyxDQUFDRCxlQUFlLENBQUMsQ0FBQztFQUMvQzs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSSxNQUFNRSxJQUFJQSxDQUFDRCxJQUFJLEVBQUVFLFNBQVMsRUFBRTtJQUN4QjtJQUNBLElBQUksSUFBSSxDQUFDQyxhQUFhLEVBQUU7TUFDcEIsSUFBSSxJQUFJLENBQUNyQixPQUFPLENBQUNzQixhQUFhLEtBQUssS0FBSyxFQUFFO1FBQUU7UUFDeEMsSUFBSSxDQUFDbkIsTUFBTSxDQUFDb0IsS0FBSyxDQUFDLGtEQUFrRCxDQUFDO1FBQ3JFLElBQUksQ0FBQ0MsTUFBTSxDQUFDQyxhQUFhLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUNDLGNBQWMsR0FBRyxJQUFJO01BQzlCLENBQUMsTUFBTTtRQUNILElBQUksQ0FBQ3ZCLE1BQU0sQ0FBQ29CLEtBQUssQ0FBQyxvR0FBb0csQ0FBQztNQUMzSDtNQUNBO0lBQ0o7O0lBRUE7SUFDQSxJQUFJLElBQUksQ0FBQ0ksR0FBRyxDQUFDVCxJQUFJLElBQUksSUFBSSxDQUFDUyxHQUFHLENBQUNULElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO01BQzFELElBQUlBLElBQUksRUFBRTtRQUNOLE9BQU9BLElBQUksQ0FBQ1UsWUFBWTtRQUN4QixPQUFPVixJQUFJLENBQUNXLGVBQWU7UUFDM0IsT0FBT1gsSUFBSSxDQUFDWSxVQUFVO1FBQ3RCLE9BQU9aLElBQUksQ0FBQ2EsV0FBVztRQUN2QixPQUFPYixJQUFJLENBQUNjLGNBQWM7UUFDMUIsT0FBT2QsSUFBSSxDQUFDZSxJQUFJO1FBRWhCLElBQUlmLElBQUksQ0FBQ2dCLEdBQUcsRUFBRTtVQUNWaEIsSUFBSSxDQUFDaUIsb0JBQW9CLEdBQUcsSUFBSTtRQUNwQyxDQUFDLE1BQU07VUFDSGpCLElBQUksQ0FBQ2tCLGVBQWUsR0FBRyxJQUFJO1VBQzNCbEIsSUFBSSxDQUFDaUIsb0JBQW9CLEdBQUcsSUFBSTtRQUNwQztNQUNKLENBQUMsTUFBTTtRQUNILElBQUksQ0FBQ1IsR0FBRyxDQUFDVCxJQUFJLENBQUNrQixlQUFlLEdBQUcsSUFBSTtRQUNwQyxJQUFJLENBQUNULEdBQUcsQ0FBQ1QsSUFBSSxDQUFDaUIsb0JBQW9CLEdBQUcsSUFBSTtNQUM3QztJQUNKO0lBRUEsSUFBSSxDQUFDZixTQUFTLEVBQUU7TUFDWkEsU0FBUyxHQUFHLElBQUksQ0FBQ3BCLE9BQU8sQ0FBQ29CLFNBQVMsSUFBSTdCLGtCQUFrQjtJQUM1RDs7SUFFQTtJQUNBLElBQUksQ0FBQzJCLElBQUksR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLElBQUksQ0FBQ1MsR0FBRyxDQUFDVCxJQUFJLEVBQUU7TUFDZixJQUFJLENBQUNBLElBQUksR0FBRztRQUFFLEdBQUcsSUFBSSxDQUFDUyxHQUFHLENBQUNUO01BQUssQ0FBQztJQUNwQztJQUNBLElBQUlBLElBQUksRUFBRTtNQUNOLElBQUksQ0FBQ0EsSUFBSSxHQUFHO1FBQUUsR0FBRyxJQUFJLENBQUNBLElBQUk7UUFBRSxHQUFHQTtNQUFLLENBQUM7SUFDekM7O0lBRUE7SUFDQSxJQUFJLElBQUksQ0FBQ2xCLE9BQU8sQ0FBQ3FDLGlCQUFpQixFQUFFO01BQ2hDLElBQUksQ0FBQ25CLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLElBQUk7SUFDOUM7O0lBRUE7SUFDQSxJQUFJLElBQUksQ0FBQ0EsSUFBSSxDQUFDYSxXQUFXLEtBQUssSUFBSSxDQUFDYixJQUFJLENBQUNvQixVQUFVLElBQUksSUFBSSxDQUFDcEIsSUFBSSxDQUFDZ0IsR0FBRyxJQUFJLElBQUksQ0FBQ2hCLElBQUksQ0FBQ3FCLFFBQVEsQ0FBQyxFQUFFO01BQ3hGLE9BQU8sSUFBSSxDQUFDckIsSUFBSSxDQUFDYSxXQUFXO0lBQ2hDO0lBQ0E7SUFBQSxLQUNLLElBQUksQ0FBQyxJQUFJLENBQUNiLElBQUksQ0FBQ2EsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDYixJQUFJLENBQUNvQixVQUFVLElBQUksQ0FBQyxJQUFJLENBQUNwQixJQUFJLENBQUNnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUNoQixJQUFJLENBQUNxQixRQUFRLEVBQUU7TUFDL0YsSUFBSSxDQUFDckIsSUFBSSxDQUFDYSxXQUFXLEdBQUd2QyxvQkFBb0I7SUFDaEQ7SUFDQTtJQUNBLElBQUksSUFBSSxDQUFDMEIsSUFBSSxDQUFDYSxXQUFXLElBQUksT0FBTyxJQUFJLENBQUNiLElBQUksQ0FBQ2EsV0FBVyxLQUFLLFFBQVEsRUFBRTtNQUNwRSxJQUFJLENBQUNiLElBQUksQ0FBQ2EsV0FBVyxHQUFHLElBQUksQ0FBQ2IsSUFBSSxDQUFDYSxXQUFXLENBQUNTLFdBQVcsQ0FBQyxDQUFDO0lBQy9EO0lBQ0E7SUFDQSxJQUFJLElBQUksQ0FBQ3hDLE9BQU8sQ0FBQ3lDLFNBQVMsSUFBSSxJQUFJLENBQUN2QixJQUFJLENBQUNhLFdBQVcsS0FBSyxRQUFRLEVBQUU7TUFDOUQsSUFBSSxDQUFDYixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRztRQUFNO1FBQ25Dd0IsT0FBTyxFQUFFLEtBQUs7UUFDZEMsV0FBVyxFQUFFO01BQ2pCLENBQUM7SUFDTDs7SUFFQTtJQUNBLE1BQU1DLEdBQUcsR0FBR0MsWUFBRyxDQUFDQyxLQUFLLENBQUMxQixTQUFTLENBQUM7SUFDaEMsTUFBTTJCLFFBQVEsR0FBR0gsR0FBRyxDQUFDRyxRQUFRLENBQUNDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQy9DLE1BQU1DLElBQUksR0FBR0wsR0FBRyxDQUFDTSxRQUFRO0lBQ3pCLE1BQU1DLElBQUksR0FBR0MsUUFBUSxDQUFDUixHQUFHLENBQUNPLElBQUksS0FBS0osUUFBUSxLQUFLLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDcEUsTUFBTU0sSUFBSSxHQUFHVCxHQUFHLENBQUNVLFFBQVE7O0lBRXpCO0lBQ0EsSUFBSVYsR0FBRyxDQUFDVyxJQUFJLEVBQUU7TUFDVixNQUFNQSxJQUFJLEdBQUdYLEdBQUcsQ0FBQ1csSUFBSSxDQUFDQyxLQUFLLENBQUMsR0FBRyxDQUFDO01BQ2hDLElBQUksQ0FBQ3hELE9BQU8sQ0FBQ3lELFFBQVEsR0FBRztRQUNwQkMsSUFBSSxFQUFFSCxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2JJLEdBQUcsRUFBRUosSUFBSSxDQUFDLENBQUM7TUFDZixDQUFDO0lBQ0w7SUFFQSxJQUFJRSxRQUFRLEdBQUc7TUFDWCxJQUFHLElBQUksQ0FBQ3pELE9BQU8sQ0FBQ3lELFFBQVEsSUFBSSxDQUFDLENBQUM7TUFDOUJWLFFBQVEsRUFBRUEsUUFBUTtNQUNsQkcsUUFBUSxFQUFFRCxJQUFJO01BQ2RFLElBQUksRUFBRUEsSUFBSTtNQUNWRSxJQUFJLEVBQUVBLElBQUk7TUFDVk8sWUFBWSxFQUFFLElBQUksQ0FBQzFDLElBQUk7TUFDdkIyQyxRQUFRLEVBQUUsUUFBUTtNQUNsQkMsTUFBTSxFQUFFLE1BQU07TUFDZEMsY0FBYyxFQUFFLElBQUk7TUFBRTtNQUN0QkMsc0JBQXNCLEVBQUUsR0FBRyxHQUFDLElBQUk7TUFDaENDLG9CQUFvQixFQUFFO0lBQzFCLENBQUM7SUFFRCxJQUFJQyxRQUFRLEdBQUdDLGNBQVEsQ0FBQ0MsaUJBQWlCLENBQUNYLFFBQVEsQ0FBQztJQUNuRCxNQUFNMUMsSUFBSSxHQUFHb0QsY0FBUSxDQUFDRSx5QkFBeUIsQ0FBQ0gsUUFBUSxFQUFFVCxRQUFRLENBQUM7SUFFbkUsSUFBSSxDQUFDQSxRQUFRLEdBQUdBLFFBQVE7O0lBRXhCO0lBQ0EsSUFBSTtNQUNBLElBQUksQ0FBQ2pDLE1BQU0sR0FBRyxNQUFNM0QsSUFBSSxDQUFDeUcsTUFBTSxDQUFDYixRQUFRLENBQUM7TUFFekMsSUFBSSxDQUFDakMsTUFBTSxDQUFDMEMsUUFBUSxHQUFHQSxRQUFRO01BRS9CLElBQUksSUFBSSxDQUFDbEUsT0FBTyxDQUFDdUUsc0JBQXNCLEVBQUU7UUFDckMsSUFBSSxDQUFDL0MsTUFBTSxDQUFDK0Msc0JBQXNCLEdBQUcsSUFBSSxDQUFDdkUsT0FBTyxDQUFDdUUsc0JBQXNCO01BQzVFO01BRUEsSUFBSSxJQUFJLENBQUN2RSxPQUFPLENBQUN3RSxlQUFlLEVBQUU7UUFDOUIsSUFBSSxDQUFDaEQsTUFBTSxDQUFDZ0QsZUFBZSxHQUFHLElBQUksQ0FBQ3hFLE9BQU8sQ0FBQ3dFLGVBQWU7TUFDOUQ7TUFFQSxJQUFJTixRQUFRLEtBQUtDLGNBQVEsQ0FBQ0QsUUFBUSxDQUFDTyxRQUFRLEVBQUU7UUFDekMsTUFBTUMsd0JBQXdCLEdBQUcsTUFBTSxJQUFJQywwQkFBaUIsQ0FBQ0MsUUFBUSxDQUFDQyx3QkFBd0IsQ0FBQztVQUMzRkMsU0FBUyxFQUFFO1lBQ1BDLGFBQWEsRUFBRSxNQUFBQSxDQUFPQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztjQUN0QyxPQUFPLE1BQU0sSUFBSSxDQUFDekQsTUFBTSxDQUFDMEQsT0FBTyxDQUFDRixPQUFPLEVBQUVDLE1BQU0sQ0FBQztZQUNyRDtVQUNKO1FBQ0osQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDRSxlQUFlLEdBQUcsSUFBSVIsMEJBQWlCLENBQUNDLFFBQVEsQ0FBQ1EsdUJBQXVCLENBQUNWLHdCQUF3QixDQUFDO1FBQ3ZHLE1BQU0sSUFBSSxDQUFDUyxlQUFlLENBQUNFLFNBQVMsQ0FBQ3RFLElBQUksQ0FBQztNQUM5QztJQUNKLENBQUMsQ0FBQyxPQUFPekMsQ0FBQyxFQUFFO01BQ1IsTUFBTXVDLGVBQVMsQ0FBQ3lFLGtCQUFrQixDQUFDaEgsQ0FBQyxDQUFDO0lBQ3pDO0lBRUEsSUFBSSxDQUFDb0MsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDYyxNQUFNLENBQUMrRCxVQUFVLENBQUMsQ0FBQzs7SUFFaEQ7SUFDQTtJQUNBO0lBQ0EsSUFBSSxJQUFJLENBQUNyRSxJQUFJLENBQUNhLFdBQVcsS0FBTSxrQkFBa0IsRUFBRTtNQUMvQyxNQUFNLElBQUksQ0FBQ3lELGlCQUFpQixDQUFDLENBQUM7SUFDbEM7SUFFQSxJQUFJdEIsUUFBUSxLQUFLQyxjQUFRLENBQUNELFFBQVEsQ0FBQ3VCLFlBQVksRUFBRTtNQUM3QztNQUNBO0lBQUEsQ0FDSCxNQUFNO01BQ0gsTUFBTSxJQUFJLENBQUNqRSxNQUFNLENBQUNrRSxVQUFVLENBQUM7UUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDNUU7TUFBZSxDQUFDLENBQUM7SUFDckU7SUFFQSxNQUFNcUQsY0FBUSxDQUFDd0IscUJBQXFCLENBQUMsSUFBSSxDQUFDbkUsTUFBTSxDQUFDO0lBRWpELEtBQUssQ0FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQ0ssTUFBTSxDQUFDO0VBQzNCOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxNQUFNb0UsT0FBT0EsQ0FBQ0MsTUFBTSxFQUFFO0lBQ2xCLElBQUksQ0FBQ0EsTUFBTSxFQUFFO01BQ1RBLE1BQU0sR0FBRyxRQUFRO01BRWpCLElBQUksSUFBSSxDQUFDM0YsRUFBRSxDQUFDNEYsS0FBSyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQyxJQUFJLENBQUM5RixFQUFFLENBQUM0RixLQUFLLENBQUMsSUFBSSxJQUFJLENBQUM1RixFQUFFLENBQUM0RixLQUFLLENBQUNHLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDM0UsTUFBTUMsWUFBWSxHQUFHLElBQUksQ0FBQ2hHLEVBQUUsQ0FBQzRGLEtBQUssQ0FBQ0ssSUFBSSxDQUFFQyxJQUFJLElBQUtBLElBQUksQ0FBQ1AsTUFBTSxLQUFLLFFBQVEsQ0FBQztRQUMzRSxJQUFJSyxZQUFZLEVBQUU7VUFDZEwsTUFBTSxHQUFHLFFBQVE7UUFDckI7TUFDSjtJQUNKO0lBRUEsSUFBSSxJQUFJLENBQUNyRSxNQUFNLElBQUksSUFBSSxDQUFDSCxhQUFhLEVBQUU7TUFDbkN3RSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ1EsV0FBVyxDQUFDLENBQUM7TUFFN0IsSUFBSSxJQUFJLENBQUM3RSxNQUFNLENBQUMwQyxRQUFRLEtBQUtDLGNBQVEsQ0FBQ0QsUUFBUSxDQUFDTyxRQUFRLEVBQUU7UUFDckQsTUFBTSxJQUFJLENBQUNVLGVBQWUsQ0FBQ21CLFFBQVEsQ0FBQztVQUNoQ1QsTUFBTSxFQUFFQSxNQUFNLEtBQUssUUFBUSxHQUNmbEIsMEJBQWlCLENBQUM0QixTQUFTLENBQUNDLE9BQU8sQ0FBQ0MsTUFBTSxHQUMxQzlCLDBCQUFpQixDQUFDNEIsU0FBUyxDQUFDQyxPQUFPLENBQUNFO1FBQ3BELENBQUMsQ0FBQztNQUNOLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQ2xGLE1BQU0sQ0FBQzBDLFFBQVEsS0FBS0MsY0FBUSxDQUFDRCxRQUFRLENBQUN1QixZQUFZLEVBQUU7UUFDaEUsTUFBTSxJQUFJLENBQUNrQiw0QkFBNEIsQ0FBQ2QsTUFBTSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxDQUFDZSxhQUFhLENBQUMsQ0FBQztNQUM5QjtNQUVBLElBQUk7UUFDQSxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUNDLFFBQVEsQ0FBQ2hCLE1BQU0sQ0FBQyxFQUFFO1VBQzFDLElBQUksSUFBSSxDQUFDaUIsc0JBQXNCLEVBQUU7WUFDN0I7WUFDQTtVQUFBLENBQ0gsTUFBTTtZQUNILE1BQU0sSUFBSSxDQUFDdEYsTUFBTSxDQUFDb0YsYUFBYSxDQUFDLENBQUM7VUFDckM7UUFDSjtNQUNKLENBQUMsQ0FBQyxPQUFPdEksQ0FBQyxFQUFFO1FBQ1IsSUFBSSxDQUFDNkIsTUFBTSxDQUFDNEcsSUFBSSxDQUFDLDBCQUEwQixHQUFHekksQ0FBQyxDQUFDLENBQUMsQ0FBSTtNQUN6RDtNQUNBLElBQUksQ0FBQ2tELE1BQU0sR0FBRyxJQUFJO01BQ2xCLElBQUksQ0FBQ2pCLHVCQUF1QixHQUFHLElBQUk7TUFDbkMsS0FBSyxDQUFDcUYsT0FBTyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxNQUFNO01BQ0g7SUFDSjtFQUNKOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0lvQixXQUFXQSxDQUFDakcsSUFBSSxFQUFFO0lBQ2QsSUFBSSxDQUFDQSxJQUFJLEVBQUU7TUFDUDtJQUNKO0lBQ0E7SUFDQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNrRyxRQUFRLENBQUMsQ0FBQzs7SUFFdEI7SUFDQWxHLElBQUksR0FBR0EsSUFBSSxDQUFDbUcsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7SUFFekJDLE1BQU0sQ0FBQ0Msb0JBQW9CLEdBQUdyRyxJQUFJO0VBQ3RDOztFQUVBO0FBQ0o7QUFDQTs7RUFFSXNHLFNBQVNBLENBQUN0RyxJQUFJLEVBQUU7SUFDWixPQUFPcEIsZUFBZSxDQUFDa0gsUUFBUSxDQUFDOUYsSUFBSSxDQUFDO0VBQ3pDO0VBRUF1RyxxQkFBcUJBLENBQUN2RyxJQUFJLEVBQUU7SUFDeEIsSUFBSSxDQUFDdEIsc0JBQXNCLENBQUNvSCxRQUFRLENBQUM5RixJQUFJLENBQUMsRUFBRTtNQUN4QyxJQUFJd0csS0FBSztNQUNULElBQUk7UUFBQSxJQUFBQyxZQUFBO1FBQ0EsS0FBQUEsWUFBQSxHQUFJLElBQUksQ0FBQ2hHLE1BQU0sY0FBQWdHLFlBQUEsZUFBWEEsWUFBQSxDQUFhQyxjQUFjLEVBQUU7VUFDN0IsSUFBSUMsTUFBTTtVQUNWLElBQUksQ0FBQ2xHLE1BQU0sQ0FBQ3BDLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sSUFBSXVJLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztjQUNwQyxNQUFNQyxlQUFlLEdBQUcsSUFBSSxDQUFDdEcsTUFBTSxDQUFDdUcsU0FBUyxDQUFDLFlBQVc7Z0JBQ3JELElBQUk7a0JBQ0EsSUFBSUMsTUFBTSxHQUFHLEVBQUU7a0JBRWYsTUFBTUMsaUJBQWlCLEdBQUcsTUFBQUEsQ0FBTUMsVUFBVSxHQUFHLElBQUksS0FBSztvQkFDbEQsTUFBTUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDM0csTUFBTSxDQUFDaUcsY0FBYyxDQUFDLENBQUM7b0JBQ2hELElBQUlTLFVBQVUsRUFBRTtzQkFDWixNQUFNRSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUM1RyxNQUFNLENBQUM2RyxRQUFRLENBQUMsQ0FBQztzQkFDMUMsSUFBSUQsS0FBSyxFQUFFO3dCQUNQLE1BQU1FLFdBQVcsR0FBRzVLLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDbkQsSUFBSTZLLFVBQVUsR0FBRyxNQUFNRCxXQUFXLENBQUNFLFFBQVEsQ0FBQ0osS0FBSyxDQUFDO3dCQUNsRCxJQUFJRyxVQUFVLElBQUksT0FBT0EsVUFBVSxLQUFLLFFBQVEsRUFBRTswQkFDOUNBLFVBQVUsR0FBR0EsVUFBVSxDQUFDdkYsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQzswQkFDN0RnRixNQUFNLENBQUNTLElBQUksQ0FBQ0YsVUFBVSxDQUFDO3dCQUMzQjtzQkFDSjtvQkFDSjtvQkFFQVAsTUFBTSxDQUFDUyxJQUFJLENBQUNOLEtBQUssQ0FBQztrQkFDdEIsQ0FBQztrQkFFRCxNQUFNTyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQ0EsZ0JBQWdCLENBQUMsQ0FBQztrQkFDdEQsSUFBSUEsZ0JBQWdCLEVBQUU7b0JBQ2xCO29CQUNBLE1BQU1DLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ25ILE1BQU0sQ0FBQ29ILGdCQUFnQixDQUFDLENBQUM7b0JBQ3BELElBQ0lELE9BQU8sSUFDUDVDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDMkMsT0FBTyxDQUFDLElBQ3RCQSxPQUFPLENBQUMxQyxNQUFNLEdBQUcsQ0FBQyxFQUNwQjtzQkFDRSxLQUFLLE1BQU00QyxNQUFNLElBQUlGLE9BQU8sRUFBRTt3QkFDMUIsTUFBTSxJQUFJLENBQUNuSCxNQUFNLENBQUNzSCxjQUFjLENBQUNELE1BQU0sQ0FBQzt3QkFDeEMsTUFBTVosaUJBQWlCLENBQUMsQ0FBQztzQkFDN0I7b0JBQ0o7a0JBQ0osQ0FBQyxNQUFNO29CQUNILE1BQU1BLGlCQUFpQixDQUFDLEtBQUssQ0FBQztrQkFDbEM7O2tCQUVBO2tCQUNBLE1BQU1jLFdBQVcsR0FBRyxNQUFNLElBQUFDLGlCQUFXLEVBQUNoQixNQUFNLEVBQUU7b0JBQUVpQixTQUFTLEVBQUU7a0JBQUssQ0FBQyxDQUFDO2tCQUNsRSxJQUFJRixXQUFXLElBQUksT0FBT0EsV0FBVyxLQUFLLFFBQVEsRUFBRTtvQkFDaERyQixNQUFNLEdBQUdxQixXQUFXLENBQUMvRixPQUFPLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO2tCQUMvRDtrQkFFQSxPQUFPLElBQUk7Z0JBQ2YsQ0FBQyxDQUFDLE9BQU8xRSxDQUFDLEVBQUU7a0JBQ1JpSixLQUFLLEdBQUdqSixDQUFDO2tCQUNULE9BQU8sS0FBSztnQkFDaEI7Y0FDSixDQUFDLEVBQ0Q7Z0JBQUU0SyxPQUFPLEVBQUUsRUFBRSxHQUFDO2NBQUssQ0FBQyxDQUFDO2NBRXJCLElBQUlwQixlQUFlLElBQUlBLGVBQWUsQ0FBQ3FCLElBQUksRUFBRTtnQkFDekNyQixlQUFlLENBQUNxQixJQUFJLENBQUMsTUFBTTtrQkFDdkJ2QixPQUFPLENBQUMsQ0FBQztnQkFDYixDQUFDLENBQUMsQ0FBQ3dCLEtBQUssQ0FBRUMsR0FBRyxJQUFLO2tCQUNkeEIsTUFBTSxDQUFDd0IsR0FBRyxDQUFDO2dCQUNmLENBQUMsQ0FBQztjQUNOLENBQUMsTUFBTTtnQkFDSHpCLE9BQU8sQ0FBQyxDQUFDO2NBQ2I7WUFDSixDQUFDLENBQUM7VUFDTixDQUFDLENBQUM7VUFFRixJQUFJTCxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUNwSCxNQUFNLENBQUNvSCxLQUFLLENBQUMsdUJBQXVCLEVBQUVBLEtBQUssQ0FBQztVQUNyRDtVQUVBLE9BQU9HLE1BQU07UUFDakI7TUFDSixDQUFDLENBQUMsT0FBT3BKLENBQUMsRUFBRTtRQUNSLElBQUksQ0FBQzZCLE1BQU0sQ0FBQ29ILEtBQUssQ0FBQyx1QkFBdUIsRUFBRWpKLENBQUMsQ0FBQztRQUM3QyxJQUFJaUosS0FBSyxFQUFFO1VBQ1AsSUFBSSxDQUFDcEgsTUFBTSxDQUFDb0gsS0FBSyxDQUFDLG1DQUFtQyxFQUFFQSxLQUFLLENBQUM7UUFDakU7UUFDQTtNQUNKO0lBQ0o7RUFDSjtFQUVBK0IsbUJBQW1CQSxDQUFDdkksSUFBSSxFQUFFO0lBQ3RCLElBQUksQ0FBQ3JCLG9CQUFvQixDQUFDbUgsUUFBUSxDQUFDOUYsSUFBSSxDQUFDLEVBQUU7TUFDdEMsSUFBSXdHLEtBQUs7TUFDVCxJQUFJO1FBQ0EsSUFDSSxJQUFJLENBQUMvRixNQUFNLElBQ1gsSUFBSSxDQUFDQSxNQUFNLENBQUMrSCxhQUFhLEVBQzNCO1VBQ0UsSUFBSTdCLE1BQU07VUFDVixJQUFJLENBQUNsRyxNQUFNLENBQUNwQyxJQUFJLENBQUMsTUFBTTtZQUNuQixPQUFPLElBQUl1SSxPQUFPLENBQUMsQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEtBQUs7Y0FDcEMsSUFBSSxDQUFDckcsTUFBTSxDQUFDK0gsYUFBYSxDQUFDLENBQUMsQ0FDdEJKLElBQUksQ0FBQ0ssTUFBTSxJQUFJO2dCQUNaOUIsTUFBTSxHQUFHOEIsTUFBTTtnQkFBRTVCLE9BQU8sQ0FBQyxDQUFDO2NBQzlCLENBQUMsQ0FBQyxDQUNEd0IsS0FBSyxDQUFDN0IsS0FBSyxJQUFJO2dCQUNaLElBQUksQ0FBQ3BILE1BQU0sQ0FBQ29ILEtBQUssQ0FBQyx5QkFBeUIsRUFBRUEsS0FBSyxDQUFDO2dCQUFFTSxNQUFNLENBQUMsQ0FBQztjQUNqRSxDQUFDLENBQUM7WUFDVixDQUFDLENBQUM7VUFDTixDQUFDLENBQUM7VUFFRixJQUFJTixLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUNwSCxNQUFNLENBQUNvSCxLQUFLLENBQUMseUJBQXlCLEVBQUVBLEtBQUssQ0FBQztVQUN2RDtVQUVBLE9BQU9HLE1BQU07UUFDakI7TUFDSixDQUFDLENBQUMsT0FBT3BKLENBQUMsRUFBRTtRQUNSLElBQUksQ0FBQzZCLE1BQU0sQ0FBQ29ILEtBQUssQ0FBQyx5QkFBeUIsRUFBRWpKLENBQUMsQ0FBQztRQUMvQyxJQUFJaUosS0FBSyxFQUFFO1VBQ1AsSUFBSSxDQUFDcEgsTUFBTSxDQUFDb0gsS0FBSyxDQUFDLGlDQUFpQyxFQUFFQSxLQUFLLENBQUM7UUFDL0Q7UUFDQTtNQUNKO0lBQ0o7RUFDSjs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBa0MsZ0JBQWdCQSxDQUFDQyxHQUFHLEVBQUVDLEdBQUcsRUFBRTtJQUN2QixJQUFJLENBQUNELEdBQUcsSUFBSSxPQUFPQSxHQUFHLEtBQUssUUFBUSxFQUFFO01BQ2pDLE9BQU8sSUFBSTtJQUNmO0lBQ0E7SUFDQSxPQUFPO01BQ0hFLElBQUksRUFBRUYsR0FBRyxDQUFDRyxTQUFTO01BQ25CQyxHQUFHLEVBQUVKLEdBQUcsQ0FBQ0ssT0FBTztNQUNoQkMsS0FBSyxFQUFFTixHQUFHLENBQUNNLEtBQUs7TUFDaEJMLEdBQUcsRUFBRUE7SUFDVCxDQUFDO0VBQ0w7RUFFQU0sZUFBZUEsQ0FBQSxFQUFHO0lBQ2Q7SUFDQTlDLE1BQU0sQ0FBQ0Msb0JBQW9CLEdBQUcsSUFBSTtFQUN0QztFQUVBLE1BQU04QyxhQUFhQSxDQUFDM0MsS0FBSyxFQUFFO0lBQ3ZCLElBQUlBLEtBQUssSUFBSUEsS0FBSyxDQUFDNEMsSUFBSSxLQUFLQyxlQUFXLENBQUNDLFNBQVMsQ0FBQ0Msc0JBQXNCLEVBQUU7TUFDdEUsSUFBSSxDQUFDeEQsc0JBQXNCLEdBQUcsSUFBSTtNQUNsQztJQUNKLENBQUMsTUFBTTtNQUNILElBQUksQ0FBQ0Esc0JBQXNCLEdBQUcsS0FBSztJQUN2QztJQUNBO0lBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ3pGLGFBQWEsRUFBRTtNQUNyQjtJQUNKO0lBQ0E7SUFDQSxJQUFJLElBQUksQ0FBQ3JCLE9BQU8sQ0FBQ3FDLGlCQUFpQixFQUFFO01BQ2hDLElBQUk7UUFDQSxNQUFNa0ksSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxhQUFhLENBQUMsQ0FBQztRQUN2QyxJQUFJRCxJQUFJLElBQUl4RSxLQUFLLENBQUNDLE9BQU8sQ0FBQ3VFLElBQUksQ0FBQyxFQUFFO1VBQzdCLEtBQUssSUFBSWIsR0FBRyxJQUFJYSxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDckssRUFBRSxDQUFDcUssSUFBSSxDQUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQ2dCLGdCQUFnQixDQUFDQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7VUFDM0Q7UUFDSjtNQUNKLENBQUMsQ0FDRCxPQUFPcEwsQ0FBQyxFQUFFO1FBQ047UUFDQSxJQUFJLENBQUM2QixNQUFNLENBQUNvSCxLQUFLLENBQUMsOEJBQThCLEVBQUVqSixDQUFDLENBQUM7TUFDeEQ7SUFDSjs7SUFFQTtJQUNBLElBQUksSUFBSSxDQUFDMEIsT0FBTyxDQUFDeUssa0JBQWtCLEVBQUU7TUFDakMsSUFBSTtRQUNBLE1BQU1GLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQ0csY0FBYyxDQUFDLENBQUM7UUFDeEMsSUFBSUgsSUFBSSxJQUFJeEUsS0FBSyxDQUFDQyxPQUFPLENBQUN1RSxJQUFJLENBQUMsRUFBRTtVQUM3QixLQUFLLElBQUliLEdBQUcsSUFBSWEsSUFBSSxFQUFFO1lBQ2xCLElBQUksQ0FBQ3JLLEVBQUUsQ0FBQ3FLLElBQUksQ0FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUNnQixnQkFBZ0IsQ0FBQ0MsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1VBQzVEO1FBQ0o7TUFDSixDQUFDLENBQ0QsT0FBT3BMLENBQUMsRUFBRTtRQUNOO1FBQ0EsSUFBSSxDQUFDNkIsTUFBTSxDQUFDb0gsS0FBSyxDQUFDLCtCQUErQixFQUFFakosQ0FBQyxDQUFDO01BQ3pEO0lBQ0o7O0lBRUE7SUFDQSxJQUFJLElBQUksQ0FBQzBCLE9BQU8sQ0FBQzJLLGlCQUFpQixFQUFFO01BQ2hDLElBQUk7UUFDQSxNQUFNSixJQUFJLEdBQUcsSUFBSSxDQUFDSyxhQUFhLENBQUMsQ0FBQztRQUNqQyxJQUFJTCxJQUFJLElBQUl4RSxLQUFLLENBQUNDLE9BQU8sQ0FBQ3VFLElBQUksQ0FBQyxFQUFFO1VBQzdCLEtBQUssSUFBSU0sUUFBUSxJQUFJTixJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDckssRUFBRSxDQUFDcUssSUFBSSxDQUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQ2dCLGdCQUFnQixDQUFDb0IsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1VBQ2hFO1FBQ0o7TUFDSixDQUFDLENBQ0QsT0FBT3ZNLENBQUMsRUFBRTtRQUNOO1FBQ0EsSUFBSSxDQUFDNkIsTUFBTSxDQUFDb0gsS0FBSyxDQUFDLDhCQUE4QixFQUFFakosQ0FBQyxDQUFDO01BQ3hEO0lBQ0o7SUFFQSxJQUFJLElBQUksQ0FBQ2tELE1BQU0sQ0FBQzBDLFFBQVEsS0FBS0MsY0FBUSxDQUFDRCxRQUFRLENBQUN1QixZQUFZLEVBQUU7TUFDekQsSUFBSXFGLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQ0MseUJBQXlCLENBQUMsQ0FBQztNQUN0RCxJQUFJRCxTQUFTLEVBQUU7UUFDWDtRQUNBLElBQUksQ0FBQzVLLEVBQUUsQ0FBQzhLLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHRixTQUFTO01BQ3JEO0lBQ0o7RUFDSjtFQUVBRyxlQUFlQSxDQUFDQyxPQUFPLEVBQUU7SUFDckIsSUFBSSxDQUFDQSxPQUFPLEVBQUU7TUFDVixNQUFNLElBQUl0SyxvQkFBTyxDQUFDQyxlQUFTLENBQUN3SixTQUFTLENBQUNjLFlBQVksRUFBRSwwQ0FBMEMsQ0FBQztJQUNuRztJQUNBLElBQUksT0FBT0QsT0FBTyxLQUFLLFFBQVEsRUFBRTtNQUM3QixPQUFPQSxPQUFPO0lBQ2xCO0lBQ0EsSUFBSUEsT0FBTyxDQUFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO01BQzVCLE9BQU9GLE9BQU8sQ0FBQyxDQUFDO0lBQ3BCO0lBQ0EsTUFBTUcsUUFBUSxHQUFHLElBQUksQ0FBQ25LLElBQUksSUFBSSxJQUFJLENBQUNBLElBQUksQ0FBQ1UsWUFBWSxHQUFHLElBQUksQ0FBQ1YsSUFBSSxDQUFDVSxZQUFZLENBQUNZLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSTtJQUVsRyxJQUFJLElBQUksQ0FBQzlCLFVBQVUsS0FBSyxZQUFZLElBQUkySyxRQUFRLEtBQUssU0FBUyxFQUFFO01BQzVELElBQUlILE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM5QjtRQUNBO1FBQ0E7UUFDQUYsT0FBTyxHQUFHQSxPQUFPLENBQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUNyRixNQUFNLENBQUM7UUFDdEMsSUFBSWlGLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQ2hDRixPQUFPLEdBQUcsSUFBSSxDQUFDaEssSUFBSSxDQUFDb0IsVUFBVSxHQUFHLE1BQU0sR0FBRzRJLE9BQU87UUFDckQ7UUFDQSxPQUFPLHVDQUF1QyxHQUFHQSxPQUFPLEdBQUcsSUFBSTtNQUNuRSxDQUFDLE1BQU0sSUFBSUEsT0FBTyxDQUFDRSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUN0QyxPQUFPLHNDQUFzQyxHQUFHRixPQUFPLENBQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUNyRixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FDdEYsSUFBSWlGLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFDbkMsT0FBTyxpQ0FBaUMsR0FBR0YsT0FBTyxDQUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDckYsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQ2hGLElBQUlpRixPQUFPLENBQUNFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFDNUMsT0FBTyx5Q0FBeUMsR0FBR0YsT0FBTyxDQUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQUNyRixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FDakcsSUFBSWlGLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFDbkMsT0FBTyx3Q0FBd0MsR0FBR0YsT0FBTyxDQUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDckYsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQ3ZGLElBQUlpRixPQUFPLENBQUNFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFDNUMsT0FBTyxnREFBZ0QsR0FBR0YsT0FBTyxDQUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQUNyRixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FDeEcsSUFBSWlGLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFDeEMsT0FBTywyQ0FBMkMsQ0FBQyxLQUNsRCxJQUFJRixPQUFPLENBQUNFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQUs7UUFDcEMsT0FBT0YsT0FBTztJQUN0QixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN4SyxVQUFVLEtBQUssWUFBWSxJQUFJMkssUUFBUSxLQUFLLEtBQUssRUFBRTtNQUMvRCxJQUFJSCxPQUFPLENBQUNFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQUU7UUFDNUIsT0FBT0YsT0FBTztJQUN0QixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN4SyxVQUFVLEtBQUssWUFBWSxFQUFFO01BQWE7TUFDdEQsSUFBSXdLLE9BQU8sQ0FBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDNUIsT0FBTyxHQUFHLEdBQUdGLE9BQU8sQ0FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQ3JGLE1BQU0sQ0FBQyxDQUFDLENBQU07TUFBQSxLQUMvQyxJQUFJaUYsT0FBTyxDQUFDRSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUNuQyxPQUFPLFFBQVEsR0FBR0YsT0FBTyxDQUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDckYsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQ3RELElBQUlpRixPQUFPLENBQUNFLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ25DLE9BQU8sR0FBRyxHQUFHRixPQUFPLENBQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUNyRixNQUFNLENBQUMsQ0FBQyxLQUMzQyxJQUFJaUYsT0FBTyxDQUFDRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQzVDLE9BQU8sSUFBSSxHQUFHRixPQUFPLENBQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUNyRixNQUFNLENBQUMsQ0FBQyxLQUM1QyxJQUFJaUYsT0FBTyxDQUFDRSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNsQyxPQUFPRixPQUFPLENBQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUNyRixNQUFNLENBQUMsQ0FBQyxDQUFXO0lBQ3hEO0lBRUEsT0FBT2lGLE9BQU87RUFDbEI7RUFFQXZLLG9CQUFvQkEsQ0FBQSxFQUFHO0lBQ25CLElBQUksQ0FBQ0YsT0FBTyxDQUFDOEssY0FBYyxHQUFHLElBQUksQ0FBQ04sZUFBZTtJQUNsRCxJQUFJLENBQUN4SyxPQUFPLENBQUMrSyxZQUFZLEdBQUdySCxjQUFRLENBQUNxSCxZQUFZO0lBQ2pELElBQUksQ0FBQy9LLE9BQU8sQ0FBQ2dMLFVBQVUsR0FBR3RILGNBQVEsQ0FBQ3NILFVBQVU7SUFDN0MsSUFBSSxDQUFDaEwsT0FBTyxDQUFDaUwsV0FBVyxHQUFHdkgsY0FBUSxDQUFDdUgsV0FBVztJQUMvQyxJQUFJLENBQUNqTCxPQUFPLENBQUNrTCxlQUFlLEdBQUd4SCxjQUFRLENBQUN3SCxlQUFlO0lBQ3ZELElBQUksQ0FBQ2xMLE9BQU8sQ0FBQ21MLGdCQUFnQixHQUFHekgsY0FBUSxDQUFDeUgsZ0JBQWdCO0lBQ3pELElBQUksQ0FBQ25MLE9BQU8sQ0FBQ29MLGtCQUFrQixHQUFHMUgsY0FBUSxDQUFDMEgsa0JBQWtCO0lBQzdELElBQUksQ0FBQ3BMLE9BQU8sQ0FBQ3FMLHNCQUFzQixHQUFHM0gsY0FBUSxDQUFDMkgsc0JBQXNCO0lBQ3JFLElBQUksQ0FBQ3JMLE9BQU8sQ0FBQ3NMLGNBQWMsR0FBRzVILGNBQVEsQ0FBQzRILGNBQWM7SUFDckQsSUFBSSxDQUFDdEwsT0FBTyxDQUFDdUwsNEJBQTRCLEdBQUc3SCxjQUFRLENBQUM2SCw0QkFBNEI7SUFDakYsSUFBSSxDQUFDdkwsT0FBTyxDQUFDd0wsb0JBQW9CLEdBQUc5SCxjQUFRLENBQUM4SCxvQkFBb0I7SUFDakUsSUFBSSxDQUFDeEwsT0FBTyxDQUFDeUwsK0JBQStCLEdBQUcvSCxjQUFRLENBQUMrSCwrQkFBK0I7SUFDdkYsSUFBSSxDQUFDekwsT0FBTyxDQUFDMEwsa0JBQWtCLEdBQUdoSSxjQUFRLENBQUNnSSxrQkFBa0I7SUFDN0QsSUFBSSxDQUFDMUwsT0FBTyxDQUFDMkwsMEJBQTBCLEdBQUdqSSxjQUFRLENBQUNpSSwwQkFBMEI7SUFDN0UsSUFBSSxDQUFDM0wsT0FBTyxDQUFDNEwscUJBQXFCLEdBQUdsSSxjQUFRLENBQUNrSSxxQkFBcUI7SUFDbkUsSUFBSSxDQUFDNUwsT0FBTyxDQUFDNkwsYUFBYSxHQUFHbkksY0FBUSxDQUFDbUksYUFBYTtJQUNuRCxJQUFJLENBQUM3TCxPQUFPLENBQUM4TCxXQUFXLEdBQUdwSSxjQUFRLENBQUNvSSxXQUFXO0lBQy9DLElBQUksQ0FBQzlMLE9BQU8sQ0FBQytMLFdBQVcsR0FBR3JJLGNBQVEsQ0FBQ3FJLFdBQVc7RUFDbkQ7RUFFQSxNQUFNNUYsYUFBYUEsQ0FBQSxFQUFHO0lBQ2xCLElBQUk7TUFDQSxJQUFJLElBQUksQ0FBQ3BGLE1BQU0sSUFBSSxJQUFJLENBQUNBLE1BQU0sQ0FBQ29GLGFBQWEsRUFBRTtRQUMxQyxNQUFNLElBQUksQ0FBQ3BGLE1BQU0sQ0FBQ29GLGFBQWEsQ0FBQyxDQUFDO01BQ3JDO0lBQ0osQ0FBQyxDQUFDLE9BQU90SSxDQUFDLEVBQUU7TUFDUixJQUFJLENBQUM2QixNQUFNLENBQUNvSCxLQUFLLENBQUMscUJBQXFCLEVBQUVqSixDQUFDLENBQUM7SUFDL0M7RUFDSjtFQUVBLE1BQU1xSSw0QkFBNEJBLENBQUNkLE1BQU0sRUFBRTtJQUN2QyxPQUFPLElBQUk4QixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEtBQUs7TUFDcEM7TUFDQTtNQUNBO01BQ0EsTUFBTTRFLFFBQVEsR0FBRyxJQUFJLENBQUNoSixRQUFRLENBQUNHLFlBQVksQ0FBQyxZQUFZLENBQUMsR0FDdkQsNERBQTRELElBQUksQ0FBQ3BDLE1BQU0sQ0FBQ2tMLFNBQVMsT0FBTyxHQUN4RixrREFBa0QsSUFBSSxDQUFDbEwsTUFBTSxDQUFDa0wsU0FBUyxPQUFPO01BRWhGLElBQUk7UUFDQTtRQUNBLElBQUFDLGdCQUFPLEVBQUM7VUFDSi9KLEdBQUcsRUFBRTZKLFFBQVE7VUFDYkcsTUFBTSxFQUFFLEtBQUs7VUFDYkMsSUFBSSxFQUFFLElBQUk7VUFDVkMsa0JBQWtCLEVBQUUsS0FBSztVQUN6QkMsSUFBSSxFQUFFO1lBQ0ZsSCxNQUFNLEVBQUVBLE1BQU0sS0FBSyxRQUFRLEdBQUcsUUFBUSxHQUFHO1VBQzdDLENBQUM7VUFDRCxNQUFNLEVBQUU7WUFDSixNQUFNLEVBQUUsSUFBSSxDQUFDcEMsUUFBUSxDQUFDRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQ29KLFFBQVE7WUFDN0QsTUFBTSxFQUFFLElBQUksQ0FBQ3ZKLFFBQVEsQ0FBQ0csWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUNxSixTQUFTO1lBQzlELGlCQUFpQixFQUFFO1VBQ3ZCO1FBQ0osQ0FBQyxFQUFFLENBQUM1RCxHQUFHLEVBQUU2RCxHQUFHLEVBQUVILElBQUksS0FBSztVQUNuQixJQUFJMUQsR0FBRyxFQUFFO1lBQ0wsSUFBSSxDQUFDbEosTUFBTSxDQUFDb0gsS0FBSyxDQUFDLGlEQUFpRCxHQUFHOEIsR0FBRyxDQUFDcEMsUUFBUSxDQUFDLENBQUMsQ0FBQztVQUN6RjtVQUNBVyxPQUFPLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQztNQUNOLENBQUMsQ0FBQyxPQUFPdEosQ0FBQyxFQUFFO1FBQ1IsSUFBSSxDQUFDNkIsTUFBTSxDQUFDb0gsS0FBSyxDQUFDLGlEQUFpRCxHQUFHakosQ0FBQyxDQUFDMkksUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuRlcsT0FBTyxDQUFDLENBQUM7TUFDYjtJQUNKLENBQUMsQ0FBQztFQUNOO0VBRUEsTUFBTW1ELHlCQUF5QkEsQ0FBQSxFQUFHO0lBQzlCLE9BQU8sSUFBSXBELE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztNQUNwQztNQUNBO01BQ0E7TUFDQSxNQUFNNEUsUUFBUSxHQUFHLElBQUksQ0FBQ2hKLFFBQVEsQ0FBQ0csWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUN2RCw0REFBNEQsSUFBSSxDQUFDcEMsTUFBTSxDQUFDa0wsU0FBUyxPQUFPLEdBQ3hGLGtEQUFrRCxJQUFJLENBQUNsTCxNQUFNLENBQUNrTCxTQUFTLE9BQU87TUFFaEYsSUFBSTtRQUNBO1FBQ0EsSUFBQUMsZ0JBQU8sRUFBQztVQUNKL0osR0FBRyxFQUFFNkosUUFBUTtVQUNiRyxNQUFNLEVBQUUsS0FBSztVQUNiQyxJQUFJLEVBQUUsSUFBSTtVQUNWQyxrQkFBa0IsRUFBRSxLQUFLO1VBQ3pCLE1BQU0sRUFBRTtZQUNKLE1BQU0sRUFBRSxJQUFJLENBQUNySixRQUFRLENBQUNHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDb0osUUFBUTtZQUM3RCxNQUFNLEVBQUUsSUFBSSxDQUFDdkosUUFBUSxDQUFDRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQ3FKLFNBQVM7WUFDOUQsaUJBQWlCLEVBQUU7VUFDdkI7UUFDSixDQUFDLEVBQUUsQ0FBQzVELEdBQUcsRUFBRTZELEdBQUcsRUFBRUgsSUFBSSxLQUFLO1VBQUEsSUFBQUkscUJBQUE7VUFDbkIsSUFBSTlELEdBQUcsRUFBRTtZQUNMLElBQUksQ0FBQ2xKLE1BQU0sQ0FBQ29ILEtBQUssQ0FBQyw4Q0FBOEMsR0FBRzhCLEdBQUcsQ0FBQ3BDLFFBQVEsQ0FBQyxDQUFDLENBQUM7VUFDdEY7VUFFQVcsT0FBTyxDQUFDbUYsSUFBSSxhQUFKQSxJQUFJLHdCQUFBSSxxQkFBQSxHQUFKSixJQUFJLENBQUVLLGtCQUFrQixjQUFBRCxxQkFBQSx1QkFBeEJBLHFCQUFBLENBQTBCRSxXQUFXLENBQUM7UUFDbEQsQ0FBQyxDQUFDO01BRU4sQ0FBQyxDQUFDLE9BQU8vTyxDQUFDLEVBQUU7UUFDUixJQUFJLENBQUM2QixNQUFNLENBQUNvSCxLQUFLLENBQUMsOENBQThDLEdBQUdqSixDQUFDLENBQUMySSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2hGVyxPQUFPLENBQUMsQ0FBQztNQUNiO0lBQ0osQ0FBQyxDQUFDO0VBQ047QUFDSjtBQUFDckssT0FBQSxDQUFBRSxPQUFBLEdBQUFvQyxZQUFBIiwiaWdub3JlTGlzdCI6W119