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
@@ -4,29 +4,19 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _path = _interopRequireDefault(require("path"));
11
-
12
9
  var _fs = _interopRequireDefault(require("fs"));
13
-
14
10
  var _FileReporterBase = _interopRequireDefault(require("../reporter/FileReporterBase"));
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
12
  var EasyXml = require('easyxml');
19
-
20
13
  class XmlReporter extends _FileReporterBase.default {
21
14
  constructor(options) {
22
15
  super(options);
23
16
  }
24
-
25
17
  generate(results) {
26
18
  var resultFilePath = this.createFolderStructureAndFilePath('.xml');
27
-
28
19
  var resultFolderPath = _path.default.dirname(resultFilePath);
29
-
30
20
  var serializer = new EasyXml({
31
21
  singularize: true,
32
22
  rootElement: 'test-results',
@@ -38,7 +28,6 @@ class XmlReporter extends _FileReporterBase.default {
38
28
  });
39
29
  this.replaceScreenshotsWithFiles(results, resultFolderPath);
40
30
  const forXmlRender = [];
41
-
42
31
  if (results && Array.isArray(results) && results.length > 0) {
43
32
  results.map(result => {
44
33
  forXmlRender.push({
@@ -82,15 +71,10 @@ class XmlReporter extends _FileReporterBase.default {
82
71
  });
83
72
  });
84
73
  }
85
-
86
74
  var xml = serializer.render(forXmlRender);
87
-
88
75
  _fs.default.writeFileSync(resultFilePath, xml);
89
-
90
76
  return resultFilePath;
91
77
  }
92
-
93
78
  }
94
-
95
79
  exports.default = XmlReporter;
96
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sLmpzIl0sIm5hbWVzIjpbIkVhc3lYbWwiLCJyZXF1aXJlIiwiWG1sUmVwb3J0ZXIiLCJGaWxlUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwicmVzdWx0RmlsZVBhdGgiLCJjcmVhdGVGb2xkZXJTdHJ1Y3R1cmVBbmRGaWxlUGF0aCIsInJlc3VsdEZvbGRlclBhdGgiLCJwYXRoIiwiZGlybmFtZSIsInNlcmlhbGl6ZXIiLCJzaW5ndWxhcml6ZSIsInJvb3RFbGVtZW50Iiwicm9vdEFycmF5IiwiZGF0ZUZvcm1hdCIsIm1hbmlmZXN0IiwidW53cmFwQXJyYXlzIiwiZmlsdGVyTnVsbHMiLCJyZXBsYWNlU2NyZWVuc2hvdHNXaXRoRmlsZXMiLCJmb3JYbWxSZW5kZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJyZXN1bHQiLCJwdXNoIiwibmFtZSIsInN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsImZhaWx1cmUiLCJlbnZpcm9ubWVudCIsImNhcGFiaWxpdGllcyIsImN3ZCIsInRhcmdldCIsImJyb3dzZXJOYW1lIiwic2VsZW5pdW1VcmwiLCJhcHBpdW1VcmwiLCJyZW9wZW5TZXNzaW9uIiwicmVSdW5PbkZhaWxlZCIsIml0ZXJhdGlvbnMiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJwYXJhbWV0ZXJzIiwicGFyYWxsZWwiLCJzZXJ2aWNlcyIsIm1vZHVsZXMiLCJmcmFtZXdvcmsiLCJhcHBsaXRvb2xzT3B0cyIsImVudnMiLCJlbnYiLCJwbyIsInNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0Iiwic3VpdGVzIiwieG1sIiwicmVuZGVyIiwiZnMiLCJ3cml0ZUZpbGVT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a0J6QyxZQUFsQixDQUFWOztBQUNBMEMsZ0JBQUdDLGFBQUgsQ0FBaUJ6RCxjQUFqQixFQUFpQ3NELEdBQWpDOztBQUVBLFdBQU90RCxjQUFQO0FBQ0g7O0FBekVxRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogT3h5Z2VuIFhNTCBSZXBvcnRlclxyXG4gKi9cclxuXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgRmlsZVJlcG9ydGVyQmFzZSBmcm9tICcuLi9yZXBvcnRlci9GaWxlUmVwb3J0ZXJCYXNlJztcclxudmFyIEVhc3lYbWwgPSByZXF1aXJlKCdlYXN5eG1sJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBYbWxSZXBvcnRlciBleHRlbmRzIEZpbGVSZXBvcnRlckJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgICAgICB2YXIgcmVzdWx0RmlsZVBhdGggPSB0aGlzLmNyZWF0ZUZvbGRlclN0cnVjdHVyZUFuZEZpbGVQYXRoKCcueG1sJyk7XHJcbiAgICAgICAgdmFyIHJlc3VsdEZvbGRlclBhdGggPSBwYXRoLmRpcm5hbWUocmVzdWx0RmlsZVBhdGgpO1xyXG5cclxuICAgICAgICB2YXIgc2VyaWFsaXplciA9IG5ldyBFYXN5WG1sKHtcclxuICAgICAgICAgICAgc2luZ3VsYXJpemU6IHRydWUsXHJcbiAgICAgICAgICAgIHJvb3RFbGVtZW50OiAndGVzdC1yZXN1bHRzJyxcclxuICAgICAgICAgICAgcm9vdEFycmF5OiAndGVzdC1yZXN1bHRzJyxcclxuICAgICAgICAgICAgZGF0ZUZvcm1hdDogJ0lTTycsXHJcbiAgICAgICAgICAgIG1hbmlmZXN0OiB0cnVlLFxyXG4gICAgICAgICAgICB1bndyYXBBcnJheXM6IGZhbHNlLFxyXG4gICAgICAgICAgICBmaWx0ZXJOdWxsczogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlcGxhY2VTY3JlZW5zaG90c1dpdGhGaWxlcyhyZXN1bHRzLCByZXN1bHRGb2xkZXJQYXRoKTtcclxuICAgICAgICBjb25zdCBmb3JYbWxSZW5kZXIgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdHMgJiYgQXJyYXkuaXNBcnJheShyZXN1bHRzKSAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yWG1sUmVuZGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHJlc3VsdC5zdGFydFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogcmVzdWx0LmVuZFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHJlc3VsdC5kdXJhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiByZXN1bHQuZmFpbHVyZSxcclxuICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogcmVzdWx0LmVudmlyb25tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllczogcmVzdWx0LmNhcGFiaWxpdGllcyxcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogcmVzdWx0Lm9wdGlvbnMuY3dkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICByZXN1bHQub3B0aW9ucy50YXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJOYW1lOiByZXN1bHQub3B0aW9ucy5icm93c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZW5pdW1Vcmw6IHJlc3VsdC5vcHRpb25zLnNlbGVuaXVtVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBpdW1Vcmw6IHJlc3VsdC5vcHRpb25zLmFwcGl1bVVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVvcGVuU2Vzc2lvbjogcmVzdWx0Lm9wdGlvbnMucmVvcGVuU2Vzc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVSdW5PbkZhaWxlZDogcmVzdWx0Lm9wdGlvbnMucmVSdW5PbkZhaWxlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uczogcmVzdWx0Lm9wdGlvbnMuaXRlcmF0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdQb3J0OiByZXN1bHQub3B0aW9ucy5kZWJ1Z1BvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiByZXN1bHQub3B0aW9ucy5kZWxheSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdERldmljZUxvZ3M6IHJlc3VsdC5vcHRpb25zLmNvbGxlY3REZXZpY2VMb2dzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdEFwcGl1bUxvZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RCcm93c2VyTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRpbmc6IHJlc3VsdC5vcHRpb25zLnJlcG9ydGluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogcmVzdWx0Lm9wdGlvbnMucGFyYW1ldGVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VpdGVzOiByZXN1bHQub3B0aW9ucy5zdWl0ZXMsIC8vIGlnbm9yZSwgZnVuY3Rpb24gaW5zaWRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsOiByZXN1bHQub3B0aW9ucy5wYXJhbGxlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiByZXN1bHQub3B0aW9ucy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzOiByZXN1bHQub3B0aW9ucy5zZXJ2aWNlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlczogcmVzdWx0Lm9wdGlvbnMubW9kdWxlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrOiByZXN1bHQub3B0aW9ucy5mcmFtZXdvcmssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpdG9vbHNPcHRzOiByZXN1bHQub3B0aW9ucy5hcHBsaXRvb2xzT3B0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va3M6IHJlc3VsdC5vcHRpb25zLmhvb2tzLCAvLyBpZ25vcmUsIGZ1bmN0aW9uIGluc2lkZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZzOiByZXN1bHQub3B0aW9ucy5lbnZzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXN1bHQub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnY6IHJlc3VsdC5vcHRpb25zLmVudixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG86IHJlc3VsdC5vcHRpb25zLnBvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRDb250ZW50TGluZU9mZnNldDogcmVzdWx0Lm9wdGlvbnMuc2NyaXB0Q29udGVudExpbmVPZmZzZXRcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogcmVzdWx0LnN1aXRlc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2VyaWFsaXplIHRlc3QgcmVzdWx0cyB0byBYTUwgYW5kIHNhdmUgdG8gZmlsZVxyXG4gICAgICAgIHZhciB4bWwgPSBzZXJpYWxpemVyLnJlbmRlcihmb3JYbWxSZW5kZXIpO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocmVzdWx0RmlsZVBhdGgsIHhtbCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHRGaWxlUGF0aDtcclxuICAgIH1cclxufSJdfQ==
80
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX0ZpbGVSZXBvcnRlckJhc2UiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJFYXN5WG1sIiwiWG1sUmVwb3J0ZXIiLCJGaWxlUmVwb3J0ZXJCYXNlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiZ2VuZXJhdGUiLCJyZXN1bHRzIiwicmVzdWx0RmlsZVBhdGgiLCJjcmVhdGVGb2xkZXJTdHJ1Y3R1cmVBbmRGaWxlUGF0aCIsInJlc3VsdEZvbGRlclBhdGgiLCJwYXRoIiwiZGlybmFtZSIsInNlcmlhbGl6ZXIiLCJzaW5ndWxhcml6ZSIsInJvb3RFbGVtZW50Iiwicm9vdEFycmF5IiwiZGF0ZUZvcm1hdCIsIm1hbmlmZXN0IiwidW53cmFwQXJyYXlzIiwiZmlsdGVyTnVsbHMiLCJyZXBsYWNlU2NyZWVuc2hvdHNXaXRoRmlsZXMiLCJmb3JYbWxSZW5kZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJyZXN1bHQiLCJwdXNoIiwibmFtZSIsInN0YXR1cyIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsImZhaWx1cmUiLCJlbnZpcm9ubWVudCIsImNhcGFiaWxpdGllcyIsImN3ZCIsInRhcmdldCIsImJyb3dzZXJOYW1lIiwic2VsZW5pdW1VcmwiLCJhcHBpdW1VcmwiLCJyZW9wZW5TZXNzaW9uIiwicmVSdW5PbkZhaWxlZCIsIml0ZXJhdGlvbnMiLCJkZWJ1Z1BvcnQiLCJkZWxheSIsImNvbGxlY3REZXZpY2VMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJyZXBvcnRpbmciLCJwYXJhbWV0ZXJzIiwicGFyYWxsZWwiLCJzZXJ2aWNlcyIsIm1vZHVsZXMiLCJmcmFtZXdvcmsiLCJhcHBsaXRvb2xzT3B0cyIsImVudnMiLCJlbnYiLCJwbyIsInNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0Iiwic3VpdGVzIiwieG1sIiwicmVuZGVyIiwiZnMiLCJ3cml0ZUZpbGVTeW5jIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogT3h5Z2VuIFhNTCBSZXBvcnRlclxyXG4gKi9cclxuXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgRmlsZVJlcG9ydGVyQmFzZSBmcm9tICcuLi9yZXBvcnRlci9GaWxlUmVwb3J0ZXJCYXNlJztcclxudmFyIEVhc3lYbWwgPSByZXF1aXJlKCdlYXN5eG1sJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBYbWxSZXBvcnRlciBleHRlbmRzIEZpbGVSZXBvcnRlckJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgICAgICB2YXIgcmVzdWx0RmlsZVBhdGggPSB0aGlzLmNyZWF0ZUZvbGRlclN0cnVjdHVyZUFuZEZpbGVQYXRoKCcueG1sJyk7XHJcbiAgICAgICAgdmFyIHJlc3VsdEZvbGRlclBhdGggPSBwYXRoLmRpcm5hbWUocmVzdWx0RmlsZVBhdGgpO1xyXG5cclxuICAgICAgICB2YXIgc2VyaWFsaXplciA9IG5ldyBFYXN5WG1sKHtcclxuICAgICAgICAgICAgc2luZ3VsYXJpemU6IHRydWUsXHJcbiAgICAgICAgICAgIHJvb3RFbGVtZW50OiAndGVzdC1yZXN1bHRzJyxcclxuICAgICAgICAgICAgcm9vdEFycmF5OiAndGVzdC1yZXN1bHRzJyxcclxuICAgICAgICAgICAgZGF0ZUZvcm1hdDogJ0lTTycsXHJcbiAgICAgICAgICAgIG1hbmlmZXN0OiB0cnVlLFxyXG4gICAgICAgICAgICB1bndyYXBBcnJheXM6IGZhbHNlLFxyXG4gICAgICAgICAgICBmaWx0ZXJOdWxsczogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlcGxhY2VTY3JlZW5zaG90c1dpdGhGaWxlcyhyZXN1bHRzLCByZXN1bHRGb2xkZXJQYXRoKTtcclxuICAgICAgICBjb25zdCBmb3JYbWxSZW5kZXIgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdHMgJiYgQXJyYXkuaXNBcnJheShyZXN1bHRzKSAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yWG1sUmVuZGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHJlc3VsdC5zdGFydFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogcmVzdWx0LmVuZFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHJlc3VsdC5kdXJhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiByZXN1bHQuZmFpbHVyZSxcclxuICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogcmVzdWx0LmVudmlyb25tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllczogcmVzdWx0LmNhcGFiaWxpdGllcyxcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogcmVzdWx0Lm9wdGlvbnMuY3dkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICByZXN1bHQub3B0aW9ucy50YXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJOYW1lOiByZXN1bHQub3B0aW9ucy5icm93c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZW5pdW1Vcmw6IHJlc3VsdC5vcHRpb25zLnNlbGVuaXVtVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBpdW1Vcmw6IHJlc3VsdC5vcHRpb25zLmFwcGl1bVVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVvcGVuU2Vzc2lvbjogcmVzdWx0Lm9wdGlvbnMucmVvcGVuU2Vzc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVSdW5PbkZhaWxlZDogcmVzdWx0Lm9wdGlvbnMucmVSdW5PbkZhaWxlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uczogcmVzdWx0Lm9wdGlvbnMuaXRlcmF0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdQb3J0OiByZXN1bHQub3B0aW9ucy5kZWJ1Z1BvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiByZXN1bHQub3B0aW9ucy5kZWxheSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdERldmljZUxvZ3M6IHJlc3VsdC5vcHRpb25zLmNvbGxlY3REZXZpY2VMb2dzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0QXBwaXVtTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdEFwcGl1bUxvZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RCcm93c2VyTG9nczogcmVzdWx0Lm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRpbmc6IHJlc3VsdC5vcHRpb25zLnJlcG9ydGluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogcmVzdWx0Lm9wdGlvbnMucGFyYW1ldGVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VpdGVzOiByZXN1bHQub3B0aW9ucy5zdWl0ZXMsIC8vIGlnbm9yZSwgZnVuY3Rpb24gaW5zaWRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsOiByZXN1bHQub3B0aW9ucy5wYXJhbGxlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiByZXN1bHQub3B0aW9ucy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzOiByZXN1bHQub3B0aW9ucy5zZXJ2aWNlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlczogcmVzdWx0Lm9wdGlvbnMubW9kdWxlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrOiByZXN1bHQub3B0aW9ucy5mcmFtZXdvcmssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpdG9vbHNPcHRzOiByZXN1bHQub3B0aW9ucy5hcHBsaXRvb2xzT3B0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va3M6IHJlc3VsdC5vcHRpb25zLmhvb2tzLCAvLyBpZ25vcmUsIGZ1bmN0aW9uIGluc2lkZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZzOiByZXN1bHQub3B0aW9ucy5lbnZzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXN1bHQub3B0aW9ucy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnY6IHJlc3VsdC5vcHRpb25zLmVudixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG86IHJlc3VsdC5vcHRpb25zLnBvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRDb250ZW50TGluZU9mZnNldDogcmVzdWx0Lm9wdGlvbnMuc2NyaXB0Q29udGVudExpbmVPZmZzZXRcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogcmVzdWx0LnN1aXRlc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2VyaWFsaXplIHRlc3QgcmVzdWx0cyB0byBYTUwgYW5kIHNhdmUgdG8gZmlsZVxyXG4gICAgICAgIHZhciB4bWwgPSBzZXJpYWxpemVyLnJlbmRlcihmb3JYbWxSZW5kZXIpO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocmVzdWx0RmlsZVBhdGgsIHhtbCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHRGaWxlUGF0aDtcclxuICAgIH1cclxufSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQWFBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLGlCQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFBNEQsU0FBQUQsdUJBQUFJLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFDNUQsSUFBSUcsT0FBTyxHQUFHTixPQUFPLENBQUMsU0FBUyxDQUFDO0FBRWpCLE1BQU1PLFdBQVcsU0FBU0Ms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
@@ -4,21 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _OxygenSubModule = require("../../core/OxygenSubModule");
11
-
12
9
  var _chromeHar = require("chrome-har");
13
-
14
10
  var _helper = _interopRequireDefault(require("../../errors/helper"));
15
-
16
11
  var _OxygenError = _interopRequireDefault(require("../../errors/OxygenError"));
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
13
  const observe = ['Page.domContentEventFired', 'Page.frameAttached', 'Page.loadEventFired', 'Page.frameRequestedNavigation', 'Page.frameStartedLoading', 'Page.navigatedWithinDocument', 'Network.dataReceived', 'Network.loadingFailed', 'Network.loadingFinished', 'Network.requestServedFromCache', 'Network.requestWillBeSent', 'Network.responseReceived', 'Network.requestWillBeSentExtraInfo', 'Network.resourceChangedPriority', 'Network.responseReceivedExtraInfo'];
21
-
22
14
  class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
23
15
  constructor(name, parent) {
24
16
  super(name, parent);
@@ -26,13 +18,11 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
26
18
  this._collectData = false;
27
19
  this._events = [];
28
20
  }
29
-
30
21
  init(devTools) {
31
22
  if (!devTools || !this._parent || !this._parent.getDriver || typeof this._parent.getDriver !== 'function' || !this._parent.getDriver()) {
32
23
  super.init();
33
24
  return false;
34
25
  }
35
-
36
26
  this._devTools = devTools;
37
27
  this._driver = this._parent.getDriver();
38
28
  observe.forEach(method => {
@@ -48,7 +38,6 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
48
38
  super.init();
49
39
  return true;
50
40
  }
51
-
52
41
  async dispose() {
53
42
  try {
54
43
  if (this._driver) {
@@ -59,56 +48,46 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
59
48
  await this._driver.emit('Network.close');
60
49
  }
61
50
  } catch (e) {}
62
-
63
51
  this._devTools = null;
64
52
  this._driver = null;
65
53
  this._events = [];
66
54
  super.dispose();
67
55
  }
68
-
69
56
  start() {
70
57
  this._collectData = true;
71
58
  this._events = [];
72
59
  }
73
-
74
60
  stop() {
75
61
  this._collectData = false;
76
62
  }
77
-
78
63
  async getRequests() {
79
64
  return await this._getEntries();
80
65
  }
81
-
82
66
  async _getEntries() {
83
67
  try {
84
68
  const har = (0, _chromeHar.harFromMessages)(this._events);
85
-
86
69
  if (har && har.log && har.log.entries && har.log.entries.map) {
87
70
  har.log.entries.reverse();
88
71
  return await Promise.all(har.log.entries.map(async item => {
89
72
  let responseBody = {};
90
-
91
73
  try {
92
74
  responseBody = await this._driver.cdp('Network', 'getResponseBody', {
93
75
  requestId: item._requestId
94
76
  });
95
77
  } catch (e) {}
96
-
97
78
  if (responseBody && responseBody.body) {
98
79
  try {
99
80
  responseBody.body = JSON.parse(responseBody.body);
100
81
  } catch (e) {}
101
82
  }
102
-
103
83
  let requestPostData = {};
104
-
105
84
  try {
106
85
  requestPostData = await this._driver.cdp('Network', 'getRequestPostData', {
107
86
  requestId: item._requestId
108
87
  });
109
88
  } catch (e) {}
110
-
111
- return { ...item,
89
+ return {
90
+ ...item,
112
91
  url: item.request.url,
113
92
  requestId: item._requestId,
114
93
  ...item.response,
@@ -123,205 +102,147 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
123
102
  return [];
124
103
  }
125
104
  }
126
-
127
105
  async waitForUrl(pattern, timeout = 60 * 1000) {
128
106
  if (!this._driver || !this._isInitialized || !this._parent) {
129
107
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
130
108
  }
131
-
132
109
  if (!this._collectData) {
133
110
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
134
111
  }
135
-
136
112
  this._parent.helpers.assertArgument(pattern, 'pattern');
137
-
138
113
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
139
-
140
114
  const start = Date.now();
141
-
142
115
  while (Date.now() - start < timeout) {
143
116
  const networkRequests = await this._getEntries();
144
-
145
117
  for (let req of networkRequests) {
146
118
  if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
147
119
  return req;
148
120
  }
149
121
  }
150
-
151
122
  await this._driver.pause(500);
152
123
  }
153
-
154
124
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
155
125
  }
156
-
157
126
  async waitForNotUrl(pattern, timeout = 60 * 1000) {
158
127
  if (!this._driver || !this._isInitialized || !this._parent) {
159
128
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
160
129
  }
161
-
162
130
  if (!this._collectData) {
163
131
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
164
132
  }
165
-
166
133
  this._parent.helpers.assertArgument(pattern, 'pattern');
167
-
168
134
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
169
-
170
135
  const start = Date.now();
171
-
172
136
  while (Date.now() - start < timeout) {
173
137
  const networkRequests = await this._getEntries();
174
-
175
138
  for (let req of networkRequests) {
176
139
  if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
177
140
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `A request matching the URL "${pattern}" was found.`);
178
141
  }
179
142
  }
180
-
181
143
  await this._driver.pause(500);
182
144
  }
183
145
  }
184
-
185
146
  async waitFor(matcher, timeout = 60 * 1000) {
186
147
  if (!this._driver || !this._isInitialized || !this._parent) {
187
148
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` module is not initialized.');
188
149
  }
189
-
190
150
  if (!this._collectData) {
191
151
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
192
152
  }
193
-
194
153
  this._parent.helpers.assertArgument(matcher, 'matcher');
195
-
196
154
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
197
-
198
155
  const start = Date.now();
199
-
200
156
  while (Date.now() - start < timeout) {
201
157
  const networkRequests = await this._getEntries();
202
-
203
158
  for (var req of networkRequests) {
204
159
  if (matcher(req)) {
205
160
  return req;
206
161
  }
207
162
  }
208
-
209
163
  await this._driver.pause(500);
210
164
  }
211
-
212
165
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
213
166
  }
214
-
215
167
  async assertUrl(url, timeout = 60 * 1000) {
216
168
  if (!this._driver || !this._isInitialized || !this._parent) {
217
169
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
218
170
  }
219
-
220
171
  if (!this._collectData) {
221
172
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
222
173
  }
223
-
224
174
  this._parent.helpers.assertArgument(url, 'url');
225
-
226
175
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
227
-
228
176
  const start = Date.now();
229
-
230
177
  while (Date.now() - start < timeout) {
231
178
  const networkRequests = await this._getEntries();
232
-
233
179
  for (let req of networkRequests) {
234
180
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
235
181
  return req;
236
182
  }
237
183
  }
238
-
239
184
  await this._driver.pause(500);
240
185
  }
241
-
242
186
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
243
187
  }
244
-
245
188
  async assertStatusCode(url, statusCode, failureMessage = null, timeout = 60 * 1000) {
246
189
  if (!this._driver || !this._isInitialized || !this._parent) {
247
190
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
248
191
  }
249
-
250
192
  if (!this._collectData) {
251
193
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
252
194
  }
253
-
254
195
  this._parent.helpers.assertArgument(url, 'url');
255
-
256
196
  this._parent.helpers.assertArgument(statusCode, 'statusCode');
257
-
258
197
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
259
-
260
198
  const start = Date.now();
261
199
  let matchedReq = null;
262
-
263
200
  while (Date.now() - start < timeout && !matchedReq) {
264
201
  const networkRequests = await this._getEntries();
265
-
266
202
  for (let req of networkRequests) {
267
203
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
268
204
  matchedReq = req;
269
205
  break;
270
206
  }
271
207
  }
272
-
273
208
  !matchedReq && (await this._driver.pause(500));
274
209
  }
275
-
276
210
  if (!matchedReq) {
277
211
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
278
212
  }
279
-
280
213
  if (statusCode !== matchedReq.status) {
281
214
  const message = failureMessage || `The expected status code "${statusCode}" does not match "${matchedReq.status}".`;
282
215
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
283
216
  }
284
217
  }
285
-
286
218
  async assertResponseContent(url, content, failureMessage = null, timeout = 60 * 1000) {
287
219
  if (!this._driver || !this._isInitialized || !this._parent) {
288
220
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
289
221
  }
290
-
291
222
  if (!this._collectData) {
292
223
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
293
224
  }
294
-
295
225
  this._parent.helpers.assertArgument(url, 'url');
296
-
297
226
  this._parent.helpers.assertArgument(content, 'content');
298
-
299
227
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
300
-
301
228
  const start = Date.now();
302
229
  let matchedReq = null;
303
-
304
230
  while (Date.now() - start < timeout && !matchedReq) {
305
231
  const networkRequests = await this._getEntries();
306
-
307
232
  for (let req of networkRequests) {
308
233
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
309
234
  matchedReq = req;
310
235
  break;
311
236
  }
312
237
  }
313
-
314
238
  !matchedReq && (await this._driver.pause(500));
315
239
  }
316
-
317
240
  if (!matchedReq) {
318
241
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
319
242
  }
320
-
321
243
  const resp = await this._driver.cdp('Network', 'getResponseBody', {
322
244
  requestId: matchedReq.requestId
323
245
  });
324
-
325
246
  if (resp && resp.body && !resp.base64Encoded) {
326
247
  if (content.constructor.name === 'RegExp' && (content.test(resp.body) || resp.body.indexOf(content) > -1)) {
327
248
  return true;
@@ -331,14 +252,11 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
331
252
  }
332
253
  }
333
254
  }
334
-
335
255
  async blockUrls(urls) {
336
256
  await this._driver.cdp('Network', 'setBlockedURLs', {
337
257
  urls
338
258
  });
339
259
  }
340
-
341
260
  }
342
-
343
261
  exports.default = NetworkSubModule;
344
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrLmpzIl0sIm5hbWVzIjpbIm9ic2VydmUiLCJOZXR3b3JrU3ViTW9kdWxlIiwiT3h5Z2VuU3ViTW9kdWxlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicGFyZW50IiwiX2RldlRvb2xzIiwiX2NvbGxlY3REYXRhIiwiX2V2ZW50cyIsImluaXQiLCJkZXZUb29scyIsIl9wYXJlbnQiLCJnZXREcml2ZXIiLCJfZHJpdmVyIiwiZm9yRWFjaCIsIm1ldGhvZCIsIm9uIiwicGFyYW1zIiwicHVzaCIsImRpc3Bvc2UiLCJyZW1vdmVMaXN0ZW5lciIsImVtaXQiLCJlIiwic3RhcnQiLCJzdG9wIiwiZ2V0UmVxdWVzdHMiLCJfZ2V0RW50cmllcyIsImhhciIsImxvZyIsImVudHJpZXMiLCJtYXAiLCJyZXZlcnNlIiwiUHJvbWlzZSIsImFsbCIsIml0ZW0iLCJyZXNwb25zZUJvZHkiLCJjZHAiLCJyZXF1ZXN0SWQiLCJfcmVxdWVzdElkIiwiYm9keSIsIkpTT04iLCJwYXJzZSIsInJlcXVlc3RQb3N0RGF0YSIsInVybCIsInJlcXVlc3QiLCJyZXNwb25zZSIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIl9pc0luaXRpYWxpemVkIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IiLCJoZWxwZXJzIiwiYXNzZXJ0QXJndW1lbnQiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJEYXRlIiwibm93IiwibmV0d29ya1JlcXVlc3RzIiwicmVxIiwidGVzdCIsInBhdXNlIiwiVElNRU9VVCIsIndhaXRGb3JOb3RVcmwiLCJ3YWl0Rm9yIiwibWF0Y2hlciIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwic3RhdHVzIiwibWVzc2FnZSIsImFzc2VydFJlc3BvbnNlQ29udGVudCIsImNvbnRlbnQiLCJyZXNwIiwiYmFzZTY0RW5jb2RlZCIsImluZGV4T2YiLCJibG9ja1VybHMiLCJ1cmxzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUdBLE1BQU1BLE9BQU8sR0FBRyxDQUNaLDJCQURZLEVBR1osb0JBSFksRUFXWixxQkFYWSxFQWtCWiwrQkFsQlksRUFvQlosMEJBcEJZLEVBc0JaLDhCQXRCWSxFQXlCWixzQkF6QlksRUEyQlosdUJBM0JZLEVBNEJaLHlCQTVCWSxFQTZCWixnQ0E3QlksRUE4QlosMkJBOUJZLEVBK0JaLDBCQS9CWSxFQXVDWixvQ0F2Q1ksRUF3Q1osaUNBeENZLEVBeUNaLG1DQXpDWSxDQUFoQjs7QUE2Q2UsTUFBTUMsZ0JBQU4sU0FBK0JDLGdDQUEvQixDQUErQztBQUMxREMsRUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBZTtBQUN0QixVQUFNRCxJQUFOLEVBQVlDLE1BQVo7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7O0FBRURDLEVBQUFBLElBQUksQ0FBQ0MsUUFBRCxFQUFXO0FBQ1gsUUFBSSxDQUFDQSxRQUFELElBQWEsQ0FBQyxLQUFLQyxPQUFuQixJQUE4QixDQUFDLEtBQUtBLE9BQUwsQ0FBYUMsU0FBNUMsSUFBeUQsT0FBTyxLQUFLRCxPQUFMLENBQWFDLFNBQXBCLEtBQWtDLFVBQTNGLElBQXlHLENBQUMsS0FBS0QsT0FBTCxDQUFhQyxTQUFiLEVBQTlHLEVBQXdJO0FBQ3BJLFlBQU1ILElBQU47QUFDQSxhQUFPLEtBQVA7QUFDSDs7QUFDRCxTQUFLSCxTQUFMLEdBQWlCSSxRQUFqQjtBQUNBLFNBQUtHLE9BQUwsR0FBZSxLQUFLRixPQUFMLENBQWFDLFNBQWIsRUFBZjtBQUVBWixJQUFBQSxPQUFPLENBQUNjLE9BQVIsQ0FBZ0JDLE1BQU0sSUFBSTtBQUN0QixXQUFLRixPQUFMLENBQWFHLEVBQWIsQ0FBZ0JELE1BQWhCLEVBQXdCRSxNQUFNLElBQUk7QUFDOUIsWUFBSSxLQUFLVixZQUFULEVBQXVCO0FBQ25CLGVBQUtDLE9BQUwsQ0FBYVUsSUFBYixDQUFrQjtBQUFFSCxZQUFBQSxNQUFGO0FBQVVFLFlBQUFBO0FBQVYsV0FBbEI7QUFDSDtBQUNKLE9BSkQ7QUFLSCxLQU5EO0FBUUEsVUFBTVIsSUFBTjtBQUNBLFdBQU8sSUFBUDtBQUNIOztBQUVZLFFBQVBVLE9BQU8sR0FBRztBQUVaLFFBQUk7QUFDQSxVQUFJLEtBQUtOLE9BQVQsRUFBa0I7QUFFZGIsUUFBQUEsT0FBTyxDQUFDYyxPQUFSLENBQWdCLE1BQU1DLE1BQU4sSUFBZ0I7QUFDNUIsZ0JBQU0sS0FBS0YsT0FBTCxDQUFhTyxjQUFiLENBQTRCTCxNQUE1QixFQUFvQyxNQUFNLENBQUUsQ0FBNUMsQ0FBTjtBQUNILFNBRkQ7QUFJQSxjQUFNLEtBQUtGLE9BQUwsQ0FBYVEsSUFBYixDQUFrQixpQkFBbEIsQ0FBTjtBQUNBLGNBQU0sS0FBS1IsT0FBTCxDQUFhUSxJQUFiLENBQWtCLGVBQWxCLENBQU47QUFDSDtBQUNKLEtBVkQsQ0FVRSxPQUFPQyxDQUFQLEVBQVUsQ0FFWDs7QUFFRCxTQUFLaEIsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFNBQUtPLE9BQUwsR0FBZSxJQUFmO0FBQ0EsU0FBS0wsT0FBTCxHQUFlLEVBQWY7QUFDQSxVQUFNVyxPQUFOO0FBQ0g7O0FBd0JESSxFQUFBQSxLQUFLLEdBQUc7QUFDSixTQUFLaEIsWUFBTCxHQUFvQixJQUFwQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7O0FBTURnQixFQUFBQSxJQUFJLEdBQUc7QUFDSCxTQUFLakIsWUFBTCxHQUFvQixLQUFwQjtBQUNIOztBQU9nQixRQUFYa0IsV0FBVyxHQUFHO0FBQ2hCLFdBQU8sTUFBTSxLQUFLQyxXQUFMLEVBQWI7QUFDSDs7QUFFZ0IsUUFBWEEsV0FBVyxHQUFHO0FBQ2hCLFFBQUk7QUFDQSxZQUFNQyxHQUFHLEdBQUcsZ0NBQWdCLEtBQUtuQixPQUFyQixDQUFaOztBQUVBLFVBQUltQixHQUFHLElBQUlBLEdBQUcsQ0FBQ0MsR0FBWCxJQUFrQkQsR0FBRyxDQUFDQyxHQUFKLENBQVFDLE9BQTFCLElBQXFDRixHQUFHLENBQUNDLEdBQUosQ0FBUUMsT0FBUixDQUFnQkMsR0FBekQsRUFBOEQ7QUFDMURILFFBQUFBLEdBQUcsQ0FBQ0MsR0FBSixDQUFRQyxPQUFSLENBQWdCRSxPQUFoQjtBQUNBLGVBQU8sTUFBTUMsT0FBTyxDQUFDQyxHQUFSLENBQVlOLEdBQUcsQ0FBQ0MsR0FBSixDQUFRQyxPQUFSLENBQWdCQyxHQUFoQixDQUFvQixNQUFPSSxJQUFQLElBQWdCO0FBR3pELGNBQUlDLFlBQVksR0FBRyxFQUFuQjs7QUFDQSxjQUFJO0FBQ0FBLFlBQUFBLFlBQVksR0FBRyxNQUFNLEtBQUt0QixPQUFMLENBQWF1QixHQUFiLENBQWlCLFNBQWpCLEVBQTJCLGlCQUEzQixFQUE4QztBQUMvREMsY0FBQUEsU0FBUyxFQUFFSCxJQUFJLENBQUNJO0FBRCtDLGFBQTlDLENBQXJCO0FBR0gsV0FKRCxDQUlFLE9BQU9oQixDQUFQLEVBQVUsQ0FFWDs7QUFFRCxjQUFJYSxZQUFZLElBQUlBLFlBQVksQ0FBQ0ksSUFBakMsRUFBdUM7QUFDbkMsZ0JBQUk7QUFDQUosY0FBQUEsWUFBWSxDQUFDSSxJQUFiLEdBQW9CQyxJQUFJLENBQUNDLEtBQUwsQ0FBV04sWUFBWSxDQUFDSSxJQUF4QixDQUFwQjtBQUNILGFBRkQsQ0FFRSxPQUFPakIsQ0FBUCxFQUFVLENBRVg7QUFDSjs7QUFFRCxjQUFJb0IsZUFBZSxHQUFHLEVBQXRCOztBQUNBLGNBQUk7QUFDQUEsWUFBQUEsZUFBZSxHQUFHLE1BQU0sS0FBSzdCLE9BQUwsQ0FBYXVCLEdBQWIsQ0FBaUIsU0FBakIsRUFBMkIsb0JBQTNCLEVBQWlEO0FBQ3JFQyxjQUFBQSxTQUFTLEVBQUVILElBQUksQ0FBQ0k7QUFEcUQsYUFBakQsQ0FBeEI7QUFHSCxXQUpELENBSUUsT0FBT2hCLENBQVAsRUFBVSxDQUVYOztBQUVELGlCQUFPLEVBQ0gsR0FBR1ksSUFEQTtBQUVIUyxZQUFBQSxHQUFHLEVBQUVULElBQUksQ0FBQ1UsT0FBTCxDQUFhRCxHQUZmO0FBR0hOLFlBQUFBLFNBQVMsRUFBRUgsSUFBSSxDQUFDSSxVQUhiO0FBSUgsZUFBR0osSUFBSSxDQUFDVyxRQUpMO0FBS0hWLFlBQUFBLFlBTEc7QUFNSE8sWUFBQUE7QUFORyxXQUFQO0FBUUgsU0FyQ3dCLENBQVosQ0FBYjtBQXNDSCxPQXhDRCxNQXdDTztBQUNILGVBQU8sRUFBUDtBQUNIO0FBQ0osS0E5Q0QsQ0E4Q0UsT0FBT3BCLENBQVAsRUFBVTtBQUNSLGFBQU8sRUFBUDtBQUNIO0FBQ0o7O0FBU2UsUUFBVndCLFVBQVUsQ0FBQ0MsT0FBRCxFQUFVQyxPQUFPLEdBQUcsS0FBRyxJQUF2QixFQUE2QjtBQUN6QyxRQUFJLENBQUMsS0FBS25DLE9BQU4sSUFBaUIsQ0FBQyxLQUFLb0MsY0FBdkIsSUFBeUMsQ0FBQyxLQUFLdEMsT0FBbkQsRUFBNEQ7QUFDeEQsWUFBTSxJQUFJdUMsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JDLDRCQUFoQyxFQUE4RCwrQ0FBOUQsQ0FBTjtBQUNIOztBQUVELFFBQUksQ0FBQyxLQUFLOUMsWUFBVixFQUF3QjtBQUNwQixZQUFNLElBQUkyQyxvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQkMsNEJBQWhDLEVBQThELHVFQUE5RCxDQUFOO0FBQ0g7O0FBRUQsU0FBSzFDLE9BQUwsQ0FBYTJDLE9BQWIsQ0FBcUJDLGNBQXJCLENBQW9DUixPQUFwQyxFQUE2QyxTQUE3Qzs7QUFDQSxTQUFLcEMsT0FBTCxDQUFhMkMsT0FBYixDQUFxQkUscUJBQXJCLENBQTJDUixPQUEzQyxFQUFvRCxTQUFwRDs7QUFDQSxVQUFNekIsS0FBSyxHQUFHa0MsSUFBSSxDQUFDQyxHQUFMLEVBQWQ7O0FBQ0EsV0FBT0QsSUFBSSxDQUFDQyxHQUFMLEtBQWFuQyxLQUFiLEdBQXFCeUIsT0FBNUIsRUFBcUM7QUFDakMsWUFBTVcsZUFBZSxHQUFHLE1BQU0sS0FBS2pDLFdBQUwsRUFBOUI7O0FBQ0EsV0FBSyxJQUFJa0MsR0FBVCxJQUFnQkQsZUFBaEIsRUFBaUM7QUFDN0IsWUFBSVosT0FBTyxDQUFDNUMsV0FBUixDQUFvQkMsSUFBcEIsS0FBNkIsUUFBN0IsSUFBeUMyQyxPQUFPLENBQUNjLElBQVIsQ0FBYUQsR0FBRyxDQUFDakIsR0FBakIsQ0FBekMsSUFBa0VJLE9BQU8sS0FBS2EsR0FBRyxDQUFDakIsR0FBdEYsRUFBMkY7QUFDdkYsaUJBQU9pQixHQUFQO0FBQ0g7QUFDSjs7QUFDRCxZQUFNLEtBQUsvQyxPQUFMLENBQWFpRCxLQUFiLENBQW1CLEdBQW5CLENBQU47QUFDSDs7QUFDRCxVQUFNLElBQUlaLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CVyxPQUFoQyxFQUEwQyxnQ0FBK0JoQixPQUFRLGNBQWpGLENBQU47QUFDSDs7QUFRa0IsUUFBYmlCLGFBQWEsQ0FBQ2pCLE9BQUQsRUFBVUMsT0FBTyxHQUFHLEtBQUcsSUFBdkIsRUFBNkI7QUFDNUMsUUFBSSxDQUFDLEtBQUtuQyxPQUFOLElBQWlCLENBQUMsS0FBS29DLGNBQXZCLElBQXlDLENBQUMsS0FBS3RDLE9BQW5ELEVBQTREO0FBQ3hELFlBQU0sSUFBSXVDLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CQyw0QkFBaEMsRUFBOEQsK0NBQTlELENBQU47QUFDSDs7QUFFRCxRQUFJLENBQUMsS0FBSzlDLFlBQVYsRUFBd0I7QUFDcEIsWUFBTSxJQUFJMkMsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JDLDRCQUFoQyxFQUE4RCx1RUFBOUQsQ0FBTjtBQUNIOztBQUVELFNBQUsxQyxPQUFMLENBQWEyQyxPQUFiLENBQXFCQyxjQUFyQixDQUFvQ1IsT0FBcEMsRUFBNkMsU0FBN0M7O0FBQ0EsU0FBS3BDLE9BQUwsQ0FBYTJDLE9BQWIsQ0FBcUJFLHFCQUFyQixDQUEyQ1IsT0FBM0MsRUFBb0QsU0FBcEQ7O0FBQ0EsVUFBTXpCLEtBQUssR0FBR2tDLElBQUksQ0FBQ0MsR0FBTCxFQUFkOztBQUNBLFdBQU9ELElBQUksQ0FBQ0MsR0FBTCxLQUFhbkMsS0FBYixHQUFxQnlCLE9BQTVCLEVBQXFDO0FBQ2pDLFlBQU1XLGVBQWUsR0FBRyxNQUFNLEtBQUtqQyxXQUFMLEVBQTlCOztBQUNBLFdBQUssSUFBSWtDLEdBQVQsSUFBZ0JELGVBQWhCLEVBQWlDO0FBQzdCLFlBQUlaLE9BQU8sQ0FBQzVDLFdBQVIsQ0FBb0JDLElBQXBCLEtBQTZCLFFBQTdCLElBQXlDMkMsT0FBTyxDQUFDYyxJQUFSLENBQWFELEdBQUcsQ0FBQ2pCLEdBQWpCLENBQXpDLElBQWtFSSxPQUFPLEtBQUthLEdBQUcsQ0FBQ2pCLEdBQXRGLEVBQTJGO0FBQ3ZGLGdCQUFNLElBQUlPLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CVyxPQUFoQyxFQUEwQywrQkFBOEJoQixPQUFRLGNBQWhGLENBQU47QUFDSDtBQUNKOztBQUNELFlBQU0sS0FBS2xDLE9BQUwsQ0FBYWlELEtBQWIsQ0FBbUIsR0FBbkIsQ0FBTjtBQUNIO0FBQ0o7O0FBU1ksUUFBUEcsT0FBTyxDQUFDQyxPQUFELEVBQVVsQixPQUFPLEdBQUcsS0FBRyxJQUF2QixFQUE2QjtBQUN0QyxRQUFJLENBQUMsS0FBS25DLE9BQU4sSUFBaUIsQ0FBQyxLQUFLb0MsY0FBdkIsSUFBeUMsQ0FBQyxLQUFLdEMsT0FBbkQsRUFBNEQ7QUFDeEQsWUFBTSxJQUFJdUMsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JDLDRCQUFoQyxFQUE4RCxzQ0FBOUQsQ0FBTjtBQUNIOztBQUVELFFBQUksQ0FBQyxLQUFLOUMsWUFBVixFQUF3QjtBQUNwQixZQUFNLElBQUkyQyxvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQkMsNEJBQWhDLEVBQThELDJFQUE5RCxDQUFOO0FBQ0g7O0FBRUQsU0FBSzFDLE9BQUwsQ0FBYTJDLE9BQWIsQ0FBcUJDLGNBQXJCLENBQW9DVyxPQUFwQyxFQUE2QyxTQUE3Qzs7QUFDQSxTQUFLdkQsT0FBTCxDQUFhMkMsT0FBYixDQUFxQkUscUJBQXJCLENBQTJDUixPQUEzQyxFQUFvRCxTQUFwRDs7QUFDQSxVQUFNekIsS0FBSyxHQUFHa0MsSUFBSSxDQUFDQyxHQUFMLEVBQWQ7O0FBQ0EsV0FBT0QsSUFBSSxDQUFDQyxHQUFMLEtBQWFuQyxLQUFiLEdBQXFCeUIsT0FBNUIsRUFBcUM7QUFDakMsWUFBTVcsZUFBZSxHQUFHLE1BQU0sS0FBS2pDLFdBQUwsRUFBOUI7O0FBQ0EsV0FBSyxJQUFJa0MsR0FBVCxJQUFnQkQsZUFBaEIsRUFBaUM7QUFDN0IsWUFBSU8sT0FBTyxDQUFDTixHQUFELENBQVgsRUFBa0I7QUFDZCxpQkFBT0EsR0FBUDtBQUNIO0FBQ0o7O0FBQ0QsWUFBTSxLQUFLL0MsT0FBTCxDQUFhaUQsS0FBYixDQUFtQixHQUFuQixDQUFOO0FBQ0g7O0FBQ0QsVUFBTSxJQUFJWixvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQlcsT0FBaEMsRUFBeUMsOENBQXpDLENBQU47QUFDSDs7QUFTYyxRQUFUSSxTQUFTLENBQUN4QixHQUFELEVBQU1LLE9BQU8sR0FBRyxLQUFHLElBQW5CLEVBQXlCO0FBQ3BDLFFBQUksQ0FBQyxLQUFLbkMsT0FBTixJQUFpQixDQUFDLEtBQUtvQyxjQUF2QixJQUF5QyxDQUFDLEtBQUt0QyxPQUFuRCxFQUE0RDtBQUN4RCxZQUFNLElBQUl1QyxvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQkMsNEJBQWhDLEVBQThELCtDQUE5RCxDQUFOO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLEtBQUs5QyxZQUFWLEVBQXdCO0FBQ3BCLFlBQU0sSUFBSTJDLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CQyw0QkFBaEMsRUFBOEQsMkVBQTlELENBQU47QUFDSDs7QUFFRCxTQUFLMUMsT0FBTCxDQUFhMkMsT0FBYixDQUFxQkMsY0FBckIsQ0FBb0NaLEdBQXBDLEVBQXlDLEtBQXpDOztBQUNBLFNBQUtoQyxPQUFMLENBQWEyQyxPQUFiLENBQXFCRSxxQkFBckIsQ0FBMkNSLE9BQTNDLEVBQW9ELFNBQXBEOztBQUNBLFVBQU16QixLQUFLLEdBQUdrQyxJQUFJLENBQUNDLEdBQUwsRUFBZDs7QUFDQSxXQUFPRCxJQUFJLENBQUNDLEdBQUwsS0FBYW5DLEtBQWIsR0FBcUJ5QixPQUE1QixFQUFxQztBQUNqQyxZQUFNVyxlQUFlLEdBQUcsTUFBTSxLQUFLakMsV0FBTCxFQUE5Qjs7QUFDQSxXQUFLLElBQUlrQyxHQUFULElBQWdCRCxlQUFoQixFQUFpQztBQUM3QixZQUFJaEIsR0FBRyxDQUFDeEMsV0FBSixDQUFnQkMsSUFBaEIsS0FBeUIsUUFBekIsSUFBcUN1QyxHQUFHLENBQUNrQixJQUFKLENBQVNELEdBQUcsQ0FBQ2pCLEdBQWIsQ0FBckMsSUFBMERBLEdBQUcsS0FBS2lCLEdBQUcsQ0FBQ2pCLEdBQTFFLEVBQStFO0FBQzNFLGlCQUFPaUIsR0FBUDtBQUNIO0FBQ0o7O0FBQ0QsWUFBTSxLQUFLL0MsT0FBTCxDQUFhaUQsS0FBYixDQUFtQixHQUFuQixDQUFOO0FBQ0g7O0FBQ0QsVUFBTSxJQUFJWixvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQmdCLFlBQWhDLEVBQStDLGdDQUErQnpCLEdBQUksY0FBbEYsQ0FBTjtBQUNIOztBQVdxQixRQUFoQjBCLGdCQUFnQixDQUFDMUIsR0FBRCxFQUFNMkIsVUFBTixFQUFrQkMsY0FBYyxHQUFHLElBQW5DLEVBQXlDdkIsT0FBTyxHQUFHLEtBQUcsSUFBdEQsRUFBNEQ7QUFDOUUsUUFBSSxDQUFDLEtBQUtuQyxPQUFOLElBQWlCLENBQUMsS0FBS29DLGNBQXZCLElBQXlDLENBQUMsS0FBS3RDLE9BQW5ELEVBQTREO0FBQ3hELFlBQU0sSUFBSXVDLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CQyw0QkFBaEMsRUFBOEQsK0NBQTlELENBQU47QUFDSDs7QUFFRCxRQUFJLENBQUMsS0FBSzlDLFlBQVYsRUFBd0I7QUFDcEIsWUFBTSxJQUFJMkMsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JDLDRCQUFoQyxFQUE4RCwyRUFBOUQsQ0FBTjtBQUNIOztBQUVELFNBQUsxQyxPQUFMLENBQWEyQyxPQUFiLENBQXFCQyxjQUFyQixDQUFvQ1osR0FBcEMsRUFBeUMsS0FBekM7O0FBQ0EsU0FBS2hDLE9BQUwsQ0FBYTJDLE9BQWIsQ0FBcUJDLGNBQXJCLENBQW9DZSxVQUFwQyxFQUFnRCxZQUFoRDs7QUFDQSxTQUFLM0QsT0FBTCxDQUFhMkMsT0FBYixDQUFxQkUscUJBQXJCLENBQTJDUixPQUEzQyxFQUFvRCxTQUFwRDs7QUFDQSxVQUFNekIsS0FBSyxHQUFHa0MsSUFBSSxDQUFDQyxHQUFMLEVBQWQ7QUFDQSxRQUFJYyxVQUFVLEdBQUcsSUFBakI7O0FBQ0EsV0FBT2YsSUFBSSxDQUFDQyxHQUFMLEtBQWFuQyxLQUFiLEdBQXFCeUIsT0FBckIsSUFBZ0MsQ0FBQ3dCLFVBQXhDLEVBQW9EO0FBQ2hELFlBQU1iLGVBQWUsR0FBRyxNQUFNLEtBQUtqQyxXQUFMLEVBQTlCOztBQUNBLFdBQUssSUFBSWtDLEdBQVQsSUFBZ0JELGVBQWhCLEVBQWlDO0FBQzdCLFlBQUloQixHQUFHLENBQUN4QyxXQUFKLENBQWdCQyxJQUFoQixLQUF5QixRQUF6QixJQUFxQ3VDLEdBQUcsQ0FBQ2tCLElBQUosQ0FBU0QsR0FBRyxDQUFDakIsR0FBYixDQUFyQyxJQUEwREEsR0FBRyxLQUFLaUIsR0FBRyxDQUFDakIsR0FBMUUsRUFBK0U7QUFDM0U2QixVQUFBQSxVQUFVLEdBQUdaLEdBQWI7QUFDQTtBQUNIO0FBQ0o7O0FBQ0QsT0FBQ1ksVUFBRCxLQUFlLE1BQU0sS0FBSzNELE9BQUwsQ0FBYWlELEtBQWIsQ0FBbUIsR0FBbkIsQ0FBckI7QUFDSDs7QUFDRCxRQUFJLENBQUNVLFVBQUwsRUFBaUI7QUFDYixZQUFNLElBQUl0QixvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQmdCLFlBQWhDLEVBQStDLGdDQUErQnpCLEdBQUksY0FBbEYsQ0FBTjtBQUNIOztBQUNELFFBQUkyQixVQUFVLEtBQUtFLFVBQVUsQ0FBQ0MsTUFBOUIsRUFBc0M7QUFDbEMsWUFBTUMsT0FBTyxHQUFHSCxjQUFjLElBQUssNkJBQTRCRCxVQUFXLHFCQUFvQkUsVUFBVSxDQUFDQyxNQUFPLElBQWhIO0FBQ0EsWUFBTSxJQUFJdkIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JnQixZQUFoQyxFQUE4Q00sT0FBOUMsQ0FBTjtBQUNIO0FBQ0o7O0FBVzBCLFFBQXJCQyxxQkFBcUIsQ0FBQ2hDLEdBQUQsRUFBTWlDLE9BQU4sRUFBZUwsY0FBYyxHQUFHLElBQWhDLEVBQXNDdkIsT0FBTyxHQUFHLEtBQUcsSUFBbkQsRUFBeUQ7QUFDaEYsUUFBSSxDQUFDLEtBQUtuQyxPQUFOLElBQWlCLENBQUMsS0FBS29DLGNBQXZCLElBQXlDLENBQUMsS0FBS3RDLE9BQW5ELEVBQTREO0FBQ3hELFlBQU0sSUFBSXVDLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CQyw0QkFBaEMsRUFBOEQsK0NBQTlELENBQU47QUFDSDs7QUFFRCxRQUFJLENBQUMsS0FBSzlDLFlBQVYsRUFBd0I7QUFDcEIsWUFBTSxJQUFJMkMsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JDLDRCQUFoQyxFQUE4RCwyRUFBOUQsQ0FBTjtBQUNIOztBQUVELFNBQUsxQyxPQUFMLENBQWEyQyxPQUFiLENBQXFCQyxjQUFyQixDQUFvQ1osR0FBcEMsRUFBeUMsS0FBekM7O0FBQ0EsU0FBS2hDLE9BQUwsQ0FBYTJDLE9BQWIsQ0FBcUJDLGNBQXJCLENBQW9DcUIsT0FBcEMsRUFBNkMsU0FBN0M7O0FBQ0EsU0FBS2pFLE9BQUwsQ0FBYTJDLE9BQWIsQ0FBcUJFLHFCQUFyQixDQUEyQ1IsT0FBM0MsRUFBb0QsU0FBcEQ7O0FBQ0EsVUFBTXpCLEtBQUssR0FBR2tDLElBQUksQ0FBQ0MsR0FBTCxFQUFkO0FBQ0EsUUFBSWMsVUFBVSxHQUFHLElBQWpCOztBQUNBLFdBQU9mLElBQUksQ0FBQ0MsR0FBTCxLQUFhbkMsS0FBYixHQUFxQnlCLE9BQXJCLElBQWdDLENBQUN3QixVQUF4QyxFQUFvRDtBQUNoRCxZQUFNYixlQUFlLEdBQUcsTUFBTSxLQUFLakMsV0FBTCxFQUE5Qjs7QUFDQSxXQUFLLElBQUlrQyxHQUFULElBQWdCRCxlQUFoQixFQUFpQztBQUM3QixZQUFJaEIsR0FBRyxDQUFDeEMsV0FBSixDQUFnQkMsSUFBaEIsS0FBeUIsUUFBekIsSUFBcUN1QyxHQUFHLENBQUNrQixJQUFKLENBQVNELEdBQUcsQ0FBQ2pCLEdBQWIsQ0FBckMsSUFBMERBLEdBQUcsS0FBS2lCLEdBQUcsQ0FBQ2pCLEdBQTFFLEVBQStFO0FBQzNFNkIsVUFBQUEsVUFBVSxHQUFHWixHQUFiO0FBQ0E7QUFDSDtBQUNKOztBQUNELE9BQUNZLFVBQUQsS0FBZSxNQUFNLEtBQUszRCxPQUFMLENBQWFpRCxLQUFiLENBQW1CLEdBQW5CLENBQXJCO0FBQ0g7O0FBQ0QsUUFBSSxDQUFDVSxVQUFMLEVBQWlCO0FBQ2IsWUFBTSxJQUFJdEIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JnQixZQUFoQyxFQUErQyxnQ0FBK0J6QixHQUFJLGNBQWxGLENBQU47QUFDSDs7QUFDRCxVQUFNa0MsSUFBSSxHQUFHLE1BQU0sS0FBS2hFLE9BQUwsQ0FBYXVCLEdBQWIsQ0FBaUIsU0FBakIsRUFBMkIsaUJBQTNCLEVBQThDO0FBQzdEQyxNQUFBQSxTQUFTLEVBQUVtQyxVQUFVLENBQUNuQztBQUR1QyxLQUE5QyxDQUFuQjs7QUFHQSxRQUFJd0MsSUFBSSxJQUFJQSxJQUFJLENBQUN0QyxJQUFiLElBQXFCLENBQUNzQyxJQUFJLENBQUNDLGFBQS9CLEVBQThDO0FBQzFDLFVBQUlGLE9BQU8sQ0FBQ3pFLFdBQVIsQ0FBb0JDLElBQXBCLEtBQTZCLFFBQTdCLEtBQTBDd0UsT0FBTyxDQUFDZixJQUFSLENBQWFnQixJQUFJLENBQUN0QyxJQUFsQixLQUEyQnNDLElBQUksQ0FBQ3RDLElBQUwsQ0FBVXdDLE9BQVYsQ0FBa0JILE9BQWxCLElBQTZCLENBQUMsQ0FBbkcsQ0FBSixFQUEyRztBQUN2RyxlQUFPLElBQVA7QUFDSCxPQUZELE1BR0s7QUFDRCxjQUFNRixPQUFPLEdBQUdILGNBQWMsSUFBSyxhQUFZNUIsR0FBSSxrQ0FBaUNpQyxPQUFRLEdBQTVGO0FBQ0EsY0FBTSxJQUFJMUIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JnQixZQUFoQyxFQUE4Q00sT0FBOUMsQ0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUFPYyxRQUFUTSxTQUFTLENBQUNDLElBQUQsRUFBTztBQUNsQixVQUFNLEtBQUtwRSxPQUFMLENBQWF1QixHQUFiLENBQWlCLFNBQWpCLEVBQTJCLGdCQUEzQixFQUE2QztBQUMvQzZDLE1BQUFBO0FBRCtDLEtBQTdDLENBQU47QUFHSDs7QUFqWHlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbi8vIGJlbG93IGFyZSB0aGUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBvYnNlcnZlZCBmb3IgXCJjaHJvbWUtaGFyXCIgbW9kdWxlIHRvIGdlbmVyYXRlIGEgcHJvcGVyIEhBUiBmaWxlXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAvLydQYWdlLmZpbGVDaG9vc2VyT3BlbmVkJyxcclxuICAgICdQYWdlLmZyYW1lQXR0YWNoZWQnLFxyXG4gICAgLy8nUGFnZS5mcmFtZURldGFjaGVkJyxcclxuICAgIC8vJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgLy8nUGFnZS5pbnRlcnN0aXRpYWxIaWRkZW4nLFxyXG4gICAgLy8nUGFnZS5pbnRlcnN0aXRpYWxTaG93bicsXHJcbiAgICAvLydQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgLy8nUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsXHJcbiAgICAvLydQYWdlLmxpZmVjeWNsZUV2ZW50JyxcclxuICAgICdQYWdlLmxvYWRFdmVudEZpcmVkJyxcclxuICAgIC8vJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAvLydQYWdlLmZyYW1lQ2xlYXJlZFNjaGVkdWxlZE5hdmlnYXRpb24nLFxyXG4gICAgLy8nUGFnZS5mcmFtZVNjaGVkdWxlZE5hdmlnYXRpb24nLFxyXG4gICAgLy8nUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgLy8nUGFnZS5kb3dubG9hZFByb2dyZXNzJyxcclxuICAgIC8vJ1BhZ2UuZG93bmxvYWRXaWxsQmVnaW4nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXF1ZXN0ZWROYXZpZ2F0aW9uJyxcclxuICAgIC8vJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgLy8nUGFnZS5mcmFtZVN0b3BwZWRMb2FkaW5nJyxcclxuICAgICdQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50JyxcclxuICAgIC8vJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lJyxcclxuICAgIC8vJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLmV2ZW50U291cmNlTWVzc2FnZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGYWlsZWQnLFxyXG4gICAgJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQnLFxyXG4gICAgJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldENsb3NlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgLy8nTmV0d29yay53ZWJTb2NrZXRGcmFtZUVycm9yJyxcclxuICAgIC8vJ05ldHdvcmsud2ViU29ja2V0RnJhbWVSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldEhhbmRzaGFrZVJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgLy8nTmV0d29yay53ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3QnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnRFeHRyYUluZm8nLFxyXG4gICAgJ05ldHdvcmsucmVzb3VyY2VDaGFuZ2VkUHJpb3JpdHknLFxyXG4gICAgJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mbycsXHJcbiAgICAvLydOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgLy8nTmV0d29yay5yZXF1ZXN0SW50ZXJjZXB0ZWQnXHJcbl07XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5ldHdvcmtTdWJNb2R1bGUgZXh0ZW5kcyBPeHlnZW5TdWJNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IobmFtZSwgcGFyZW50KSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgcGFyZW50KTtcclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KGRldlRvb2xzKSB7XHJcbiAgICAgICAgaWYgKCFkZXZUb29scyB8fCAhdGhpcy5fcGFyZW50IHx8ICF0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyIHx8IHR5cGVvZiB0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyKCkpIHtcclxuICAgICAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RldlRvb2xzID0gZGV2VG9vbHM7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gdGhpcy5fcGFyZW50LmdldERyaXZlcigpO1xyXG5cclxuICAgICAgICBvYnNlcnZlLmZvckVhY2gobWV0aG9kID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLm9uKG1ldGhvZCwgcGFyYW1zID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5wdXNoKHsgbWV0aG9kLCBwYXJhbXMgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZSgpIHtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyaXZlcikge1xyXG5cclxuICAgICAgICAgICAgICAgIG9ic2VydmUuZm9yRWFjaChhc3luYyBtZXRob2QgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5yZW1vdmVMaXN0ZW5lcihtZXRob2QsICgpID0+IHt9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5lbWl0KCdOZXR3b3JrLmRpc2FibGUnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5lbWl0KCdOZXR3b3JrLmNsb3NlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBCZWdpbiBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQW55IHByZXZpb3VzbHkgY29sbGVjdGVkIHJlcXVlc3RzIHdpbGwgYmUgZGlzY2FyZGVkLiBOZXR3b3JrIHJlcXVlc3QgY29sbGVjdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBvbiBDaHJvbWUgNjMgYW5kIGxhdGVyLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0YXJ0XHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIHdlYi5pbml0KCk7XHJcbiAgICAgKiB3ZWIubmV0d29yay5zdGFydCgpO1xyXG4gICAgICogd2ViLm9wZW4oXCJodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb21cIik7XHJcbiAgICAgKiAvLyBwcmludCB0aGUgY29sbGVjdGVkIHJlcXVlc3Qgc28gZmFyOlxyXG4gICAgICogbGV0IHJlcXVlc3RzID0gd2ViLm5ldHdvcmsuZ2V0UmVxdWVzdHMoKTtcclxuICAgICAqIGZvciAobGV0IHJlcSBvZiByZXF1ZXN0cykge1xyXG4gICAgICogICBsb2cuaW5mbyhyZXEpO1xyXG4gICAgICogfVxyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgdmVyYmF0aW0gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkwgbWF0Y2g6XHJcbiAgICAgKiB3ZWIubmV0d29yay53YWl0Rm9yVXJsKC9odHRwczpcXC9cXC8uKlxcL2Zvb1xcL2Jhci8pO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgY3VzdG9tIG1hdGNoZXI6XHJcbiAgICAgKiB3ZWIubmV0d29yay53YWl0Rm9yKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgKiAgIHJldHVybiByZXF1ZXN0LnN0YXR1c1RleHQgPT09ICdPSycgJiYgcmVxdWVzdC51cmwgPT09ICdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2Jhcic7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU3RvcCBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RvcFxyXG4gICAgICovXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYWxsIHRoZSBjb2xsZWN0ZWQgbmV0d29yayByZXF1ZXN0cyBzbyBmYXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVxdWVzdHNcclxuICAgICAqIEByZXR1cm4ge09iamVjdFtdfSBBcnJheSBjb250YWluaW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFJlcXVlc3RzKCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEVudHJpZXMoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaGFyID0gaGFyRnJvbU1lc3NhZ2VzKHRoaXMuX2V2ZW50cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFyICYmIGhhci5sb2cgJiYgaGFyLmxvZy5lbnRyaWVzICYmIGhhci5sb2cuZW50cmllcy5tYXApIHtcclxuICAgICAgICAgICAgICAgIGhhci5sb2cuZW50cmllcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoaGFyLmxvZy5lbnRyaWVzLm1hcChhc3luYyAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlQm9keSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGl0ZW0uX3JlcXVlc3RJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBnZXRSZXNwb25zZUJvZHkgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VCb2R5ICYmIHJlc3BvbnNlQm9keS5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkuYm9keSA9IEpTT04ucGFyc2UocmVzcG9uc2VCb2R5LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgcGFyc2UgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0UG9zdERhdGEgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9zdERhdGEgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVxdWVzdFBvc3REYXRhJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVxdWVzdFBvc3REYXRhIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpdGVtLnJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGl0ZW0uX3JlcXVlc3RJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbS5yZXNwb25zZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9zdERhdGFcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvclVybChwYXR0ZXJuLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQocGF0dGVybiwgJ3BhdHRlcm4nKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiBwYXR0ZXJuLnRlc3QocmVxLnVybCkgfHwgcGF0dGVybiA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7cGF0dGVybn1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBGYWlsIHRoZSB0ZXN0IGlmIHJlcXVlc3Qgd2l0aCBhIG1hdGNoaW5nIFVSTCB3YXMgcmVjZWl2ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSBmcmFtZS5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yTm90VXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gLSBBbiBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JOb3RVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBBIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7cGF0dGVybn1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QuXHJcbiAgICAgKiBAZnVuY3Rpb24gbmV0d29ya1dhaXRGb3JcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1hdGNoZXIgLSBNYXRjaGluZyBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiB0cnVlIG9uIG1hdGNoLCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yKG1hdGNoZXIsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2AgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQobWF0Y2hlciwgJ21hdGNoZXInKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcihyZXEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCAnTm8gcmVxdWVzdCBmb3VuZCB1c2luZyB0aGUgcHJvdmlkZWQgbWF0Y2hlci4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBhc3NlcnRVcmwodXJsLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHVybCwgJ3VybCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1cmwuY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgdXJsLnRlc3QocmVxLnVybCkgfHwgdXJsID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNDb2RlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzQ29kZSAtIEEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0U3RhdHVzQ29kZSh1cmwsIHN0YXR1c0NvZGUsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChzdGF0dXNDb2RlLCAnc3RhdHVzQ29kZScpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IG1hdGNoZWRSZXEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmYWlsdXJlTWVzc2FnZSB8fCBgVGhlIGV4cGVjdGVkIHN0YXR1cyBjb2RlIFwiJHtzdGF0dXNDb2RlfVwiIGRvZXMgbm90IG1hdGNoIFwiJHttYXRjaGVkUmVxLnN0YXR1c31cIi5gO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBjb250ZW50IG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBvciBwYXR0ZXJuLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlQ29udGVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBjb250ZW50IC0gQSByZXNwb25zZSBib2R5IGNvbnRlbnQgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0UmVzcG9uc2VDb250ZW50KHVybCwgY29udGVudCwgZmFpbHVyZU1lc3NhZ2UgPSBudWxsLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHVybCwgJ3VybCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KGNvbnRlbnQsICdjb250ZW50Jyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGxldCBtYXRjaGVkUmVxID0gbnVsbDtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCAmJiAhbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1cmwuY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgdXJsLnRlc3QocmVxLnVybCkgfHwgdXJsID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlcSA9IHJlcTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAhbWF0Y2hlZFJlcSAmJiBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlc3BvbnNlQm9keScsIHtcclxuICAgICAgICAgICAgcmVxdWVzdElkOiBtYXRjaGVkUmVxLnJlcXVlc3RJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChyZXNwICYmIHJlc3AuYm9keSAmJiAhcmVzcC5iYXNlNjRFbmNvZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIChjb250ZW50LnRlc3QocmVzcC5ib2R5KSB8fCByZXNwLmJvZHkuaW5kZXhPZihjb250ZW50KSA+IC0xKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFJlc3BvbnNlIFwiJHt1cmx9XCIgYm9keSBjb250ZW50IGRvZXMgbm90IG1hdGNoIFwiJHtjb250ZW50fS5gO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBhIGxpc3Qgb2YgcmVxdWVzdCBVUkxzIHRvIGJlIGJsb2NrZWQgZnJvbSBsb2FkaW5nLlxyXG4gICAgICogQGZ1bmN0aW9uIGJsb2NrVXJsc1xyXG4gICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSB1cmxzIC0gQSBsaXN0IG9mIFVSTHMgdGhhdCBtYXRjaCB0aGUgcmVxdWVzdHMgdG8gYmUgYmxvY2tlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYmxvY2tVcmxzKHVybHMpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnc2V0QmxvY2tlZFVSTHMnLCB7XHJcbiAgICAgICAgICAgIHVybHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSJdfQ==
262
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfT3h5Z2VuU3ViTW9kdWxlIiwicmVxdWlyZSIsIl9jaHJvbWVIYXIiLCJfaGVscGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9PeHlnZW5FcnJvciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIm9ic2VydmUiLCJOZXR3b3JrU3ViTW9kdWxlIiwiT3h5Z2VuU3ViTW9kdWxlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicGFyZW50IiwiX2RldlRvb2xzIiwiX2NvbGxlY3REYXRhIiwiX2V2ZW50cyIsImluaXQiLCJkZXZUb29scyIsIl9wYXJlbnQiLCJnZXREcml2ZXIiLCJfZHJpdmVyIiwiZm9yRWFjaCIsIm1ldGhvZCIsIm9uIiwicGFyYW1zIiwicHVzaCIsImRpc3Bvc2UiLCJyZW1vdmVMaXN0ZW5lciIsImVtaXQiLCJzdGFydCIsInN0b3AiLCJnZXRSZXF1ZXN0cyIsIl9nZXRFbnRyaWVzIiwiaGFyIiwiaGFyRnJvbU1lc3NhZ2VzIiwibG9nIiwiZW50cmllcyIsIm1hcCIsInJldmVyc2UiLCJQcm9taXNlIiwiYWxsIiwiaXRlbSIsInJlc3BvbnNlQm9keSIsImNkcCIsInJlcXVlc3RJZCIsIl9yZXF1ZXN0SWQiLCJib2R5IiwiSlNPTiIsInBhcnNlIiwicmVxdWVzdFBvc3REYXRhIiwidXJsIiwicmVxdWVzdCIsInJlc3BvbnNlIiwid2FpdEZvclVybCIsInBhdHRlcm4iLCJ0aW1lb3V0IiwiX2lzSW5pdGlhbGl6ZWQiLCJPeEVycm9yIiwiZXJySGVscGVyIiwiZXJyb3JDb2RlIiwiTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiIsImhlbHBlcnMiLCJhc3NlcnRBcmd1bWVudCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsIkRhdGUiLCJub3ciLCJuZXR3b3JrUmVxdWVzdHMiLCJyZXEiLCJ0ZXN0IiwicGF1c2UiLCJUSU1FT1VUIiwid2FpdEZvck5vdFVybCIsIndhaXRGb3IiLCJtYXRjaGVyIiwiYXNzZXJ0VXJsIiwiQVNTRVJUX0VSUk9SIiwiYXNzZXJ0U3RhdHVzQ29kZSIsInN0YXR1c0NvZGUiLCJmYWlsdXJlTWVzc2FnZSIsIm1hdGNoZWRSZXEiLCJzdGF0dXMiLCJtZXNzYWdlIiwiYXNzZXJ0UmVzcG9uc2VDb250ZW50IiwiY29udGVudCIsInJlc3AiLCJiYXNlNjRFbmNvZGVkIiwiaW5kZXhPZiIsImJsb2NrVXJscyIsInVybHMiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL294X3NlcnZpY2VzL3NlcnZpY2UtZGV2dG9vbHMvc3VibW9kdWxlLW5ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbi8vIGJlbG93IGFyZSB0aGUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBvYnNlcnZlZCBmb3IgXCJjaHJvbWUtaGFyXCIgbW9kdWxlIHRvIGdlbmVyYXRlIGEgcHJvcGVyIEhBUiBmaWxlXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAvLydQYWdlLmZpbGVDaG9vc2VyT3BlbmVkJyxcclxuICAgICdQYWdlLmZyYW1lQXR0YWNoZWQnLFxyXG4gICAgLy8nUGFnZS5mcmFtZURldGFjaGVkJyxcclxuICAgIC8vJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgLy8nUGFnZS5pbnRlcnN0aXRpYWxIaWRkZW4nLFxyXG4gICAgLy8nUGFnZS5pbnRlcnN0aXRpYWxTaG93bicsXHJcbiAgICAvLydQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgLy8nUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsXHJcbiAgICAvLydQYWdlLmxpZmVjeWNsZUV2ZW50JyxcclxuICAgICdQYWdlLmxvYWRFdmVudEZpcmVkJyxcclxuICAgIC8vJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAvLydQYWdlLmZyYW1lQ2xlYXJlZFNjaGVkdWxlZE5hdmlnYXRpb24nLFxyXG4gICAgLy8nUGFnZS5mcmFtZVNjaGVkdWxlZE5hdmlnYXRpb24nLFxyXG4gICAgLy8nUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgLy8nUGFnZS5kb3dubG9hZFByb2dyZXNzJyxcclxuICAgIC8vJ1BhZ2UuZG93bmxvYWRXaWxsQmVnaW4nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXF1ZXN0ZWROYXZpZ2F0aW9uJyxcclxuICAgIC8vJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgLy8nUGFnZS5mcmFtZVN0b3BwZWRMb2FkaW5nJyxcclxuICAgICdQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50JyxcclxuICAgIC8vJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lJyxcclxuICAgIC8vJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLmV2ZW50U291cmNlTWVzc2FnZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGYWlsZWQnLFxyXG4gICAgJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQnLFxyXG4gICAgJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldENsb3NlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgLy8nTmV0d29yay53ZWJTb2NrZXRGcmFtZUVycm9yJyxcclxuICAgIC8vJ05ldHdvcmsud2ViU29ja2V0RnJhbWVSZWNlaXZlZCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAvLydOZXR3b3JrLndlYlNvY2tldEhhbmRzaGFrZVJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgLy8nTmV0d29yay53ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3QnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnRFeHRyYUluZm8nLFxyXG4gICAgJ05ldHdvcmsucmVzb3VyY2VDaGFuZ2VkUHJpb3JpdHknLFxyXG4gICAgJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mbycsXHJcbiAgICAvLydOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgLy8nTmV0d29yay5yZXF1ZXN0SW50ZXJjZXB0ZWQnXHJcbl07XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5ldHdvcmtTdWJNb2R1bGUgZXh0ZW5kcyBPeHlnZW5TdWJNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IobmFtZSwgcGFyZW50KSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgcGFyZW50KTtcclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KGRldlRvb2xzKSB7XHJcbiAgICAgICAgaWYgKCFkZXZUb29scyB8fCAhdGhpcy5fcGFyZW50IHx8ICF0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyIHx8IHR5cGVvZiB0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLl9wYXJlbnQuZ2V0RHJpdmVyKCkpIHtcclxuICAgICAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RldlRvb2xzID0gZGV2VG9vbHM7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gdGhpcy5fcGFyZW50LmdldERyaXZlcigpO1xyXG5cclxuICAgICAgICBvYnNlcnZlLmZvckVhY2gobWV0aG9kID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLm9uKG1ldGhvZCwgcGFyYW1zID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5wdXNoKHsgbWV0aG9kLCBwYXJhbXMgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZSgpIHtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyaXZlcikge1xyXG5cclxuICAgICAgICAgICAgICAgIG9ic2VydmUuZm9yRWFjaChhc3luYyBtZXRob2QgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5yZW1vdmVMaXN0ZW5lcihtZXRob2QsICgpID0+IHt9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5lbWl0KCdOZXR3b3JrLmRpc2FibGUnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5lbWl0KCdOZXR3b3JrLmNsb3NlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZHJpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBCZWdpbiBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQW55IHByZXZpb3VzbHkgY29sbGVjdGVkIHJlcXVlc3RzIHdpbGwgYmUgZGlzY2FyZGVkLiBOZXR3b3JrIHJlcXVlc3QgY29sbGVjdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBvbiBDaHJvbWUgNjMgYW5kIGxhdGVyLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0YXJ0XHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIHdlYi5pbml0KCk7XHJcbiAgICAgKiB3ZWIubmV0d29yay5zdGFydCgpO1xyXG4gICAgICogd2ViLm9wZW4oXCJodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb21cIik7XHJcbiAgICAgKiAvLyBwcmludCB0aGUgY29sbGVjdGVkIHJlcXVlc3Qgc28gZmFyOlxyXG4gICAgICogbGV0IHJlcXVlc3RzID0gd2ViLm5ldHdvcmsuZ2V0UmVxdWVzdHMoKTtcclxuICAgICAqIGZvciAobGV0IHJlcSBvZiByZXF1ZXN0cykge1xyXG4gICAgICogICBsb2cuaW5mbyhyZXEpO1xyXG4gICAgICogfVxyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgdmVyYmF0aW0gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkwgbWF0Y2g6XHJcbiAgICAgKiB3ZWIubmV0d29yay53YWl0Rm9yVXJsKC9odHRwczpcXC9cXC8uKlxcL2Zvb1xcL2Jhci8pO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgY3VzdG9tIG1hdGNoZXI6XHJcbiAgICAgKiB3ZWIubmV0d29yay53YWl0Rm9yKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgKiAgIHJldHVybiByZXF1ZXN0LnN0YXR1c1RleHQgPT09ICdPSycgJiYgcmVxdWVzdC51cmwgPT09ICdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2Jhcic7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU3RvcCBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RvcFxyXG4gICAgICovXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYWxsIHRoZSBjb2xsZWN0ZWQgbmV0d29yayByZXF1ZXN0cyBzbyBmYXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVxdWVzdHNcclxuICAgICAqIEByZXR1cm4ge09iamVjdFtdfSBBcnJheSBjb250YWluaW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFJlcXVlc3RzKCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEVudHJpZXMoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaGFyID0gaGFyRnJvbU1lc3NhZ2VzKHRoaXMuX2V2ZW50cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFyICYmIGhhci5sb2cgJiYgaGFyLmxvZy5lbnRyaWVzICYmIGhhci5sb2cuZW50cmllcy5tYXApIHtcclxuICAgICAgICAgICAgICAgIGhhci5sb2cuZW50cmllcy5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoaGFyLmxvZy5lbnRyaWVzLm1hcChhc3luYyAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlQm9keSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGl0ZW0uX3JlcXVlc3RJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBnZXRSZXNwb25zZUJvZHkgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VCb2R5ICYmIHJlc3BvbnNlQm9keS5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkuYm9keSA9IEpTT04ucGFyc2UocmVzcG9uc2VCb2R5LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgcGFyc2UgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0UG9zdERhdGEgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9zdERhdGEgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVxdWVzdFBvc3REYXRhJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVxdWVzdFBvc3REYXRhIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpdGVtLnJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGl0ZW0uX3JlcXVlc3RJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbS5yZXNwb25zZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9zdERhdGFcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvclVybChwYXR0ZXJuLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQocGF0dGVybiwgJ3BhdHRlcm4nKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiBwYXR0ZXJuLnRlc3QocmVxLnVybCkgfHwgcGF0dGVybiA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7cGF0dGVybn1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBGYWlsIHRoZSB0ZXN0IGlmIHJlcXVlc3Qgd2l0aCBhIG1hdGNoaW5nIFVSTCB3YXMgcmVjZWl2ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSBmcmFtZS5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yTm90VXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gLSBBbiBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JOb3RVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBBIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7cGF0dGVybn1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QuXHJcbiAgICAgKiBAZnVuY3Rpb24gbmV0d29ya1dhaXRGb3JcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1hdGNoZXIgLSBNYXRjaGluZyBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiB0cnVlIG9uIG1hdGNoLCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yKG1hdGNoZXIsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2AgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQobWF0Y2hlciwgJ21hdGNoZXInKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcihyZXEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCAnTm8gcmVxdWVzdCBmb3VuZCB1c2luZyB0aGUgcHJvdmlkZWQgbWF0Y2hlci4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBhc3NlcnRVcmwodXJsLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHVybCwgJ3VybCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1cmwuY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgdXJsLnRlc3QocmVxLnVybCkgfHwgdXJsID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNDb2RlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzQ29kZSAtIEEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0U3RhdHVzQ29kZSh1cmwsIHN0YXR1c0NvZGUsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChzdGF0dXNDb2RlLCAnc3RhdHVzQ29kZScpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IG1hdGNoZWRSZXEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmYWlsdXJlTWVzc2FnZSB8fCBgVGhlIGV4cGVjdGVkIHN0YXR1cyBjb2RlIFwiJHtzdGF0dXNDb2RlfVwiIGRvZXMgbm90IG1hdGNoIFwiJHttYXRjaGVkUmVxLnN0YXR1c31cIi5gO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBjb250ZW50IG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBvciBwYXR0ZXJuLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlQ29udGVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBjb250ZW50IC0gQSByZXNwb25zZSBib2R5IGNvbnRlbnQgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0UmVzcG9uc2VDb250ZW50KHVybCwgY29udGVudCwgZmFpbHVyZU1lc3NhZ2UgPSBudWxsLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG9yIGB3ZWJgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHVybCwgJ3VybCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KGNvbnRlbnQsICdjb250ZW50Jyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGxldCBtYXRjaGVkUmVxID0gbnVsbDtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCAmJiAhbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh1cmwuY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgdXJsLnRlc3QocmVxLnVybCkgfHwgdXJsID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlcSA9IHJlcTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAhbWF0Y2hlZFJlcSAmJiBhd2FpdCB0aGlzLl9kcml2ZXIucGF1c2UoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlc3BvbnNlQm9keScsIHtcclxuICAgICAgICAgICAgcmVxdWVzdElkOiBtYXRjaGVkUmVxLnJlcXVlc3RJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChyZXNwICYmIHJlc3AuYm9keSAmJiAhcmVzcC5iYXNlNjRFbmNvZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIChjb250ZW50LnRlc3QocmVzcC5ib2R5KSB8fCByZXNwLmJvZHkuaW5kZXhPZihjb250ZW50KSA+IC0xKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFJlc3BvbnNlIFwiJHt1cmx9XCIgYm9keSBjb250ZW50IGRvZXMgbm90IG1hdGNoIFwiJHtjb250ZW50fS5gO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBhIGxpc3Qgb2YgcmVxdWVzdCBVUkxzIHRvIGJlIGJsb2NrZWQgZnJvbSBsb2FkaW5nLlxyXG4gICAgICogQGZ1bmN0aW9uIGJsb2NrVXJsc1xyXG4gICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSB1cmxzIC0gQSBsaXN0IG9mIFVSTHMgdGhhdCBtYXRjaCB0aGUgcmVxdWVzdHMgdG8gYmUgYmxvY2tlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYmxvY2tVcmxzKHVybHMpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnc2V0QmxvY2tlZFVSTHMnLCB7XHJcbiAgICAgICAgICAgIHVybHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVlBLElBQUFBLGdCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFBK0MsU0FBQUcsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFHL0MsTUFBTUcsT0FBTyxHQUFHLENBQ1osMkJBQTJCLEVBRTNCLG9CQUFvQixFQVFwQixxQkFBcUIsRUFPckIsK0JBQStCLEVBRS9CLDBCQUEwQixFQUUxQiw4QkFBOEIsRUFHOUIsc0JBQXNCLEVBRXRCLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIsZ0NBQWdDLEVBQ2hDLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFRMUIsb0NBQW9DLEVBQ3BDLGlDQUFpQyxFQUNqQyxtQ0FBbUMsQ0FHdEM7QUFDYyxNQUFNQyxnQkFBZ0IsU0FBU0MsZ0NBQWUsQ0FBQztFQUMxREMsV0FBV0EsQ0FBQ0MsSUFBSSxFQUFFQyxNQUFNLEVBQUU7SUFDdEIsS0FBSyxDQUFDRCxJQUFJLEVBQUVDLE1BQU0sQ0FBQztJQUNuQixJQUFJLENBQUNDLFNBQVMsR0FBRyxJQUFJ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LElBQUksS0FBSyxRQUFRLElBQUl1QyxHQUFHLENBQUNrQixJQUFJLENBQUNELEdBQUcsQ0FBQ2pCLEdBQUcsQ0FBQyxJQUFJQSxHQUFHLEtBQUtpQixHQUFHLENBQUNqQixHQUFHLEVBQUU7VUFDM0U2QixVQUFVLEdBQUdaLEdBQUc7VUFDaEI7UUFDSjtNQUNKO01BQ0EsQ0FBQ1ksVUFBVSxLQUFJLE1BQU0sSUFBSSxDQUFDM0QsT0FBTyxDQUFDaUQsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUNoRDtJQUNBLElBQUksQ0FBQ1UsVUFBVSxFQUFFO01BQ2IsTUFBTSxJQUFJdEIsb0JBQU8sQ0FBQ0MsZUFBUyxDQUFDQyxTQUFTLENBQUNnQixZQUFZLEVBQUUsZ0NBQWdDekIsR0FBRyxjQUFjLENBQUM7SUFDMUc7SUFDQSxNQUFNa0MsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDaEUsT0FBTyxDQUFDdUIsR0FBRyxDQUFDLFNBQVMsRUFBQyxpQkFBaUIsRUFBRTtNQUM3REMsU0FBUyxFQUFFbUMsVUFBVSxDQUFDbkM7SUFDMUIsQ0FBQyxDQUFDO0lBQ0YsSUFBSXdDLElBQUksSUFBSUEsSUFBSSxDQUFDdEMsSUFBSSxJQUFJLENBQUNzQyxJQUFJLENBQUNDLGFBQWEsRUFBRTtNQUMxQyxJQUFJRixPQUFPLENBQUN6RSxXQUFXLENBQUNDLElBQUksS0FBSyxRQUFRLEtBQUt3RSxPQUFPLENBQUNmLElBQUksQ0FBQ2dCLElBQUksQ0FBQ3RDLElBQUksQ0FBQyxJQUFJc0MsSUFBSSxDQUFDdEMsSUFBSSxDQUFDd0MsT0FBTyxDQUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3ZHLE9BQU8sSUFBSTtNQUNmLENBQUMsTUFDSTtRQUNELE1BQU1GLE9BQU8sR0FBR0gsY0FBYyxJQUFJLGFBQWE1QixHQUFHLGtDQUFrQ2lDLE9BQU8sR0FBRztRQUM5RixNQUFNLElBQUkxQixvQkFBTyxDQUFDQyxlQUFTLENBQUNDLFNBQVMsQ0FBQ2dCLFlBQVksRUFBRU0sT0FBTyxDQUFDO01BQ2hFO0lBQ0o7RUFDSjtFQU9BLE1BQU1NLFNBQVNBLENBQUNDLElBQUksRUFBRTtJQUNsQixNQUFNLElBQUksQ0FBQ3BFLE9BQU8sQ0FBQ3VCLEdBQUcsQ0FBQyxTQUFTLEVBQUMsZ0JBQWdCLEVBQUU7TUFDL0M2QztJQUNKLENBQUMsQ0FBQztFQUNOO0FBQ0o7QUFBQ0MsT0FBQSxDQUFBbkYsT0FBQSxHQUFBRSxnQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==