testcafe 1.20.2-alpha.1 → 2.0.0-rc.3

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 (231) hide show
  1. package/lib/api/request-hooks/assert-type.js +2 -2
  2. package/lib/api/request-hooks/hook.js +2 -2
  3. package/lib/api/request-hooks/request-logger.js +2 -2
  4. package/lib/api/skip-js-errors/index.js +62 -0
  5. package/lib/api/structure/base-unit.js +2 -2
  6. package/lib/api/structure/fixture.js +13 -13
  7. package/lib/api/structure/test.js +18 -17
  8. package/lib/api/structure/testing-unit.js +26 -16
  9. package/lib/api/test-controller/assertion.js +5 -5
  10. package/lib/api/test-controller/execution-context.js +2 -2
  11. package/lib/api/test-controller/index.js +33 -30
  12. package/lib/api/test-controller/proxy.js +2 -2
  13. package/lib/api/test-page-url.js +4 -4
  14. package/lib/api/test-run-tracker.js +2 -2
  15. package/lib/api/wrap-test-function.js +3 -3
  16. package/lib/assertions/executor.js +4 -4
  17. package/lib/assertions/get-fn.js +3 -3
  18. package/lib/browser/connection/gateway.js +18 -18
  19. package/lib/browser/connection/get-hints.js +8 -8
  20. package/lib/browser/connection/index.js +11 -11
  21. package/lib/browser/connection/remotes-queue.js +4 -4
  22. package/lib/browser/provider/built-in/dedicated/base.js +6 -6
  23. package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +10 -10
  24. package/lib/browser/provider/built-in/dedicated/chrome/config.js +17 -17
  25. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +4 -4
  26. package/lib/browser/provider/built-in/dedicated/chrome/index.js +6 -6
  27. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +6 -6
  28. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +4 -4
  29. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +2 -2
  30. package/lib/browser/provider/built-in/dedicated/firefox/config.js +8 -8
  31. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +3 -3
  32. package/lib/browser/provider/built-in/dedicated/firefox/index.js +5 -5
  33. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +2 -2
  34. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +7 -7
  35. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +3 -3
  36. package/lib/browser/provider/built-in/path.js +2 -2
  37. package/lib/browser/provider/built-in/remote.js +3 -3
  38. package/lib/browser/provider/index.js +5 -5
  39. package/lib/browser/provider/plugin-host.js +5 -6
  40. package/lib/browser/provider/pool.js +4 -4
  41. package/lib/browser/provider/utils/argument-parsing.js +3 -3
  42. package/lib/browser/provider/utils/browser-starter.js +2 -2
  43. package/lib/cli/argument-parser/index.js +52 -41
  44. package/lib/cli/argument-parser/parse-utils.js +2 -2
  45. package/lib/cli/authentication-helper.js +3 -3
  46. package/lib/cli/cli.js +8 -8
  47. package/lib/cli/correct-browsers-and-sources.js +2 -2
  48. package/lib/cli/index.js +2 -2
  49. package/lib/cli/log.js +3 -3
  50. package/lib/cli/remotes-wizard.js +3 -3
  51. package/lib/client/automation/index.js +120 -34
  52. package/lib/client/automation/index.min.js +1 -1
  53. package/lib/client/browser/idle-page/index.js +321 -317
  54. package/lib/client/browser/service-worker.js +244 -290
  55. package/lib/client/core/deps/hammerhead.js +12 -4
  56. package/lib/client/core/index.js +145 -55
  57. package/lib/client/core/index.min.js +1 -1
  58. package/lib/client/core/utils/dom.js +33 -28
  59. package/lib/client/core/utils/position.js +18 -14
  60. package/lib/client/core/utils/style.js +8 -4
  61. package/lib/client/driver/command-executors/client-functions/selector-executor/filter.js +5 -5
  62. package/lib/client/driver/command-executors/client-functions/selector-executor/utils.js +3 -3
  63. package/lib/client/driver/deps/hammerhead.js +12 -4
  64. package/lib/client/driver/deps/testcafe-core.js +12 -4
  65. package/lib/client/driver/deps/testcafe-ui.js +12 -4
  66. package/lib/client/driver/index.js +654 -630
  67. package/lib/client/driver/index.min.js +1 -1
  68. package/lib/client/driver/status.js +2 -2
  69. package/lib/client/ui/index.js +10 -8
  70. package/lib/client/ui/index.min.js +1 -1
  71. package/lib/client-functions/builder-symbol.js +1 -2
  72. package/lib/client-functions/client-function-builder.js +12 -12
  73. package/lib/client-functions/replicator.js +2 -2
  74. package/lib/client-functions/selector-api-execution-mode.js +2 -2
  75. package/lib/client-functions/selectors/add-api.js +48 -48
  76. package/lib/client-functions/selectors/selector-builder.js +17 -17
  77. package/lib/compiler/compile-client-function.js +6 -6
  78. package/lib/compiler/index.js +9 -9
  79. package/lib/compiler/test-file/api-based.js +8 -8
  80. package/lib/compiler/test-file/base.js +6 -6
  81. package/lib/compiler/test-file/exportble-lib-path.js +2 -2
  82. package/lib/compiler/test-file/formats/coffeescript/compiler.js +2 -2
  83. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +2 -2
  84. package/lib/compiler/test-file/formats/es-next/compiler.js +4 -4
  85. package/lib/compiler/test-file/formats/es-next/get-test-list.js +4 -4
  86. package/lib/compiler/test-file/formats/raw.js +2 -2
  87. package/lib/compiler/test-file/formats/typescript/compiler.js +11 -11
  88. package/lib/compiler/test-file/formats/typescript/get-test-list.js +3 -3
  89. package/lib/compiler/test-file/test-file-parser-base.js +3 -3
  90. package/lib/configuration/configuration-base.js +15 -15
  91. package/lib/configuration/interfaces.js +1 -1
  92. package/lib/configuration/skip-js-errors-option-names.js +11 -0
  93. package/lib/configuration/testcafe-configuration.js +21 -16
  94. package/lib/configuration/types.js +1 -1
  95. package/lib/configuration/typescript-configuration.js +4 -4
  96. package/lib/custom-client-scripts/assert-type.js +2 -2
  97. package/lib/custom-client-scripts/client-script.js +6 -6
  98. package/lib/custom-client-scripts/get-code.js +2 -2
  99. package/lib/custom-client-scripts/routing.js +3 -3
  100. package/lib/custom-client-scripts/utils.js +3 -3
  101. package/lib/dashboard/connector.js +4 -4
  102. package/lib/dashboard/get-default-project-link.js +2 -2
  103. package/lib/dashboard/index.js +26 -26
  104. package/lib/errors/create-stack-filter.js +2 -2
  105. package/lib/errors/error-list.js +2 -2
  106. package/lib/errors/get-callsite.js +2 -2
  107. package/lib/errors/is-internal-stack-frame.js +5 -5
  108. package/lib/errors/process-test-fn-error.js +2 -2
  109. package/lib/errors/runtime/index.js +10 -10
  110. package/lib/errors/runtime/templates.js +5 -2
  111. package/lib/errors/runtime/type-assertions.js +6 -6
  112. package/lib/errors/stack-cleaning-hook.js +2 -2
  113. package/lib/errors/test-run/formattable-adapter.js +7 -7
  114. package/lib/errors/test-run/index.js +25 -5
  115. package/lib/errors/test-run/render-error-template/index.js +6 -6
  116. package/lib/errors/test-run/render-error-template/utils.js +2 -2
  117. package/lib/errors/test-run/templates.js +40 -31
  118. package/lib/errors/test-run/utils.js +7 -7
  119. package/lib/errors/types.js +5 -1
  120. package/lib/index.js +1 -1
  121. package/lib/live/file-watcher/index.js +2 -2
  122. package/lib/live/keyboard-observer.js +3 -3
  123. package/lib/live/test-run-controller.js +3 -3
  124. package/lib/live/test-run.js +3 -2
  125. package/lib/live/test-runner.js +2 -2
  126. package/lib/load-assets.js +2 -2
  127. package/lib/notifications/add-rendered-warning.js +4 -4
  128. package/lib/notifications/debug-logger.js +6 -6
  129. package/lib/notifications/deprecated.js +2 -2
  130. package/lib/notifications/information-message.js +4 -3
  131. package/lib/proxyless/resource-injector.js +4 -4
  132. package/lib/reporter/command/command-formatter.js +4 -4
  133. package/lib/reporter/index.js +10 -10
  134. package/lib/reporter/plugin-host.js +7 -7
  135. package/lib/role/index.js +8 -8
  136. package/lib/role/role.js +2 -2
  137. package/lib/runner/bootstrapper.js +20 -20
  138. package/lib/runner/browser-job.js +3 -3
  139. package/lib/runner/browser-set.js +12 -12
  140. package/lib/runner/fixture-hook-controller.js +5 -5
  141. package/lib/runner/index.js +43 -33
  142. package/lib/runner/task/index.js +10 -6
  143. package/lib/runner/test-run-hook-controller.js +5 -5
  144. package/lib/runner/tested-app.js +7 -7
  145. package/lib/screenshots/capturer.js +17 -17
  146. package/lib/screenshots/crop.js +8 -8
  147. package/lib/screenshots/index.js +6 -10
  148. package/lib/screenshots/utils.js +4 -4
  149. package/lib/services/compiler/host.js +8 -8
  150. package/lib/services/compiler/service.js +13 -13
  151. package/lib/services/compiler/test-run-proxy.js +8 -8
  152. package/lib/services/serialization/replicator/transforms/callsite-record-transform.js +2 -2
  153. package/lib/services/serialization/replicator/transforms/command-base-trasform/command-constructors.js +2 -1
  154. package/lib/services/serialization/replicator/transforms/command-base-trasform/index.js +3 -3
  155. package/lib/services/serialization/replicator/transforms/raw-command-callsite-record-transform.js +2 -2
  156. package/lib/services/serialization/test-structure.js +4 -4
  157. package/lib/services/utils/ipc/interfaces.js +1 -3
  158. package/lib/services/utils/ipc/io.js +3 -3
  159. package/lib/services/utils/ipc/message.js +2 -2
  160. package/lib/services/utils/ipc/proxy.js +4 -4
  161. package/lib/services/utils/ipc/transport.js +2 -2
  162. package/lib/shared/errors/index.js +9 -2
  163. package/lib/shared/errors/selector-error-ctor-callback.js +7 -3
  164. package/lib/test-run/bookmark.js +1 -1
  165. package/lib/test-run/browser-manipulation-queue.js +3 -3
  166. package/lib/test-run/commands/actions.js +66 -46
  167. package/lib/test-run/commands/assertion.js +3 -3
  168. package/lib/test-run/commands/base.js +2 -2
  169. package/lib/test-run/commands/browser-manipulation.js +8 -8
  170. package/lib/test-run/commands/observation.js +4 -4
  171. package/lib/test-run/commands/options.js +27 -12
  172. package/lib/test-run/commands/type.js +2 -1
  173. package/lib/test-run/commands/utils.js +3 -2
  174. package/lib/test-run/commands/validations/argument.js +19 -10
  175. package/lib/test-run/commands/validations/factories.js +10 -2
  176. package/lib/test-run/commands/validations/initializers.js +4 -4
  177. package/lib/test-run/debug-log.js +4 -4
  178. package/lib/test-run/execute-js-expression/index.js +4 -4
  179. package/lib/test-run/index.js +48 -41
  180. package/lib/test-run/request/create-request-options.js +9 -9
  181. package/lib/test-run/request/process-response-data.js +2 -2
  182. package/lib/test-run/request/send.js +5 -5
  183. package/lib/testcafe.js +8 -4
  184. package/lib/utils/check-file-path.js +2 -2
  185. package/lib/utils/check-url.js +2 -2
  186. package/lib/utils/correct-file-path.js +4 -4
  187. package/lib/utils/delegated-api.js +1 -1
  188. package/lib/utils/detect-ffmpeg.js +3 -3
  189. package/lib/utils/diff/colors.js +2 -2
  190. package/lib/utils/diff/index.js +11 -7
  191. package/lib/utils/diff/util.js +5 -5
  192. package/lib/utils/diff.js +4 -4
  193. package/lib/utils/escape-user-agent.js +2 -2
  194. package/lib/utils/execute-fn-with-timeout.js +2 -2
  195. package/lib/utils/get-browser.js +2 -2
  196. package/lib/utils/get-filter-fn.js +4 -4
  197. package/lib/utils/get-options/base.js +2 -2
  198. package/lib/utils/get-options/compiler.js +2 -2
  199. package/lib/utils/get-options/dashboard.js +2 -2
  200. package/lib/utils/get-options/get-assertion-timeout.js +1 -1
  201. package/lib/utils/get-options/index.js +4 -2
  202. package/lib/utils/get-options/meta.js +2 -2
  203. package/lib/utils/get-options/quarantine.js +8 -6
  204. package/lib/utils/get-options/screenshot.js +2 -2
  205. package/lib/utils/get-options/skip-js-errors.js +35 -0
  206. package/lib/utils/get-options/ssl.js +6 -6
  207. package/lib/utils/get-options/video.js +2 -2
  208. package/lib/utils/is-password-input.js +1 -1
  209. package/lib/utils/log-entry.js +2 -2
  210. package/lib/utils/make-reg-exp.js +19 -6
  211. package/lib/utils/moment-loader.js +2 -2
  212. package/lib/utils/parse-file-list.js +7 -7
  213. package/lib/utils/path-pattern.js +4 -4
  214. package/lib/utils/prepare-reporters.js +2 -2
  215. package/lib/utils/prerender-callsite.js +6 -6
  216. package/lib/utils/process.js +7 -7
  217. package/lib/utils/promisified-functions.js +14 -14
  218. package/lib/utils/raw-command-callsite-record.js +2 -2
  219. package/lib/utils/resolve-path-relatively-cwd.js +2 -2
  220. package/lib/utils/string.js +3 -3
  221. package/lib/utils/temp-directory/cleanup-process/index.js +6 -6
  222. package/lib/utils/temp-directory/cleanup-process/worker.js +4 -4
  223. package/lib/utils/temp-directory/index.js +6 -6
  224. package/lib/utils/temp-directory/lockfile.js +2 -2
  225. package/lib/video-recorder/process.js +6 -6
  226. package/lib/video-recorder/recorder.js +9 -9
  227. package/lib/video-recorder/test-run-video-recorder.js +2 -2
  228. package/package.json +8 -7
  229. package/ts-defs/index.d.ts +46 -7
  230. package/ts-defs/selectors.d.ts +39 -0
  231. package/ts-defs/testcafe-scripts.d.ts +39 -0
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -14,7 +18,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
14
18
  var __importStar = (this && this.__importStar) || function (mod) {
15
19
  if (mod && mod.__esModule) return mod;
16
20
  var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
22
  __setModuleDefault(result, mod);
19
23
  return result;
20
24
  };
@@ -39,8 +43,9 @@ const node_arguments_filter_1 = require("../node-arguments-filter");
39
43
  const get_testcafe_version_1 = __importDefault(require("../../utils/get-testcafe-version"));
40
44
  const parse_utils_1 = require("./parse-utils");
41
45
  const command_names_1 = __importDefault(require("./command-names"));
46
+ const skip_js_errors_option_names_1 = __importDefault(require("../../configuration/skip-js-errors-option-names"));
42
47
  const REMOTE_ALIAS_RE = /^remote(?::(\d*))?$/;
43
- const DESCRIPTION = dedent_1.default(`
48
+ const DESCRIPTION = (0, dedent_1.default)(`
44
49
  In the browser list, you can use browser names (e.g. "ie", "chrome", etc.) as well as paths to executables.
45
50
 
46
51
  To run tests against all installed browsers, use the "all" alias.
@@ -82,13 +87,13 @@ class CLIArgumentParser {
82
87
  }
83
88
  static _getDescription() {
84
89
  // NOTE: add empty line to workaround commander-forced indentation on the first line.
85
- return '\n' + string_1.wordWrap(DESCRIPTION, 2, get_viewport_width_1.default(process.stdout));
90
+ return '\n' + (0, string_1.wordWrap)(DESCRIPTION, 2, (0, get_viewport_width_1.default)(process.stdout));
86
91
  }
87
92
  _addTestCafeCommand() {
88
93
  CLIArgumentParser._removeCommandIfExists(command_names_1.default.TestCafe);
89
94
  return commander_1.default
90
95
  .command(command_names_1.default.TestCafe, { isDefault: true })
91
- .version(get_testcafe_version_1.default(), '-v, --version')
96
+ .version((0, get_testcafe_version_1.default)(), '-v, --version')
92
97
  .usage('[options] <comma-separated-browser-list> <file-or-glob ...>')
93
98
  .description(CLIArgumentParser._getDescription())
94
99
  .allowUnknownOption()
@@ -99,7 +104,7 @@ class CLIArgumentParser {
99
104
  .option('-p, --screenshot-path-pattern <pattern>', 'use patterns to compose screenshot file names and paths: ${BROWSER}, ${BROWSER_VERSION}, ${OS}, etc.')
100
105
  .option('-q, --quarantine-mode [option=value,...]', 'enable quarantine mode and (optionally) modify quarantine mode settings')
101
106
  .option('-d, --debug-mode', 'execute test steps one by one pausing the test after each step')
102
- .option('-e, --skip-js-errors', 'make tests not fail when a JS error happens on a page')
107
+ .option('-e, --skip-js-errors [option=value,...]', 'ignore JavaScript errors that match the specified criteria')
103
108
  .option('-u, --skip-uncaught-errors', 'ignore uncaught errors and unhandled promise rejections, which occur during test execution')
104
109
  .option('-t, --test <name>', 'run only tests with the specified name')
105
110
  .option('-T, --test-grep <pattern>', 'run only tests matching the specified pattern')
@@ -175,66 +180,66 @@ class CLIArgumentParser {
175
180
  }
176
181
  async _parseFilteringOptions() {
177
182
  if (this.opts.testGrep)
178
- this.opts.testGrep = get_options_1.getGrepOptions('--test-grep', this.opts.testGrep);
183
+ this.opts.testGrep = (0, get_options_1.getGrepOptions)('--test-grep', this.opts.testGrep);
179
184
  if (this.opts.fixtureGrep)
180
- this.opts.fixtureGrep = get_options_1.getGrepOptions('--fixture-grep', this.opts.fixtureGrep);
185
+ this.opts.fixtureGrep = (0, get_options_1.getGrepOptions)('--fixture-grep', this.opts.fixtureGrep);
181
186
  if (this.opts.testMeta)
182
- this.opts.testMeta = await get_options_1.getMetaOptions('--test-meta', this.opts.testMeta);
187
+ this.opts.testMeta = await (0, get_options_1.getMetaOptions)('--test-meta', this.opts.testMeta);
183
188
  if (this.opts.fixtureMeta)
184
- this.opts.fixtureMeta = await get_options_1.getMetaOptions('--fixture-meta', this.opts.fixtureMeta);
185
- this.opts.filter = get_filter_fn_1.default(this.opts);
189
+ this.opts.fixtureMeta = await (0, get_options_1.getMetaOptions)('--fixture-meta', this.opts.fixtureMeta);
190
+ this.opts.filter = (0, get_filter_fn_1.default)(this.opts);
186
191
  }
187
192
  _parseAppInitDelay() {
188
193
  if (this.opts.appInitDelay) {
189
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The tested app initialization delay', this.opts.appInitDelay);
194
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The tested app initialization delay', this.opts.appInitDelay);
190
195
  this.opts.appInitDelay = parseInt(this.opts.appInitDelay, 10);
191
196
  }
192
197
  }
193
198
  _parseSelectorTimeout() {
194
199
  if (this.opts.selectorTimeout) {
195
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The Selector timeout', this.opts.selectorTimeout);
200
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The Selector timeout', this.opts.selectorTimeout);
196
201
  this.opts.selectorTimeout = parseInt(this.opts.selectorTimeout, 10);
197
202
  }
198
203
  }
199
204
  _parseAssertionTimeout() {
200
205
  if (this.opts.assertionTimeout) {
201
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The assertion timeout', this.opts.assertionTimeout);
206
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The assertion timeout', this.opts.assertionTimeout);
202
207
  this.opts.assertionTimeout = parseInt(this.opts.assertionTimeout, 10);
203
208
  }
204
209
  }
205
210
  _parsePageLoadTimeout() {
206
211
  if (this.opts.pageLoadTimeout) {
207
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The page load timeout', this.opts.pageLoadTimeout);
212
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The page load timeout', this.opts.pageLoadTimeout);
208
213
  this.opts.pageLoadTimeout = parseInt(this.opts.pageLoadTimeout, 10);
209
214
  }
210
215
  }
211
216
  _parsePageRequestTimeout() {
212
217
  if (!this.opts.pageRequestTimeout)
213
218
  return;
214
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The page request timeout', this.opts.pageRequestTimeout);
219
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The page request timeout', this.opts.pageRequestTimeout);
215
220
  this.opts.pageRequestTimeout = parseInt(this.opts.pageRequestTimeout, 10);
216
221
  }
217
222
  _parseAjaxRequestTimeout() {
218
223
  if (!this.opts.ajaxRequestTimeout)
219
224
  return;
220
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The AJAX request timeout', this.opts.ajaxRequestTimeout);
225
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The AJAX request timeout', this.opts.ajaxRequestTimeout);
221
226
  this.opts.ajaxRequestTimeout = parseInt(this.opts.ajaxRequestTimeout, 10);
222
227
  }
223
228
  _parseBrowserInitTimeout() {
224
229
  if (!this.opts.browserInitTimeout)
225
230
  return;
226
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The browser initialization timeout', this.opts.browserInitTimeout);
231
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The browser initialization timeout', this.opts.browserInitTimeout);
227
232
  this.opts.browserInitTimeout = parseInt(this.opts.browserInitTimeout, 10);
228
233
  }
229
234
  _parseTestExecutionTimeout() {
230
235
  if (this.opts.testExecutionTimeout) {
231
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The test execution timeout', this.opts.testExecutionTimeout);
236
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The test execution timeout', this.opts.testExecutionTimeout);
232
237
  this.opts.testExecutionTimeout = parseInt(this.opts.testExecutionTimeout, 10);
233
238
  }
234
239
  }
235
240
  _parseRunExecutionTimeout() {
236
241
  if (this.opts.runExecutionTimeout) {
237
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The run execution timeout', this.opts.runExecutionTimeout);
242
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The run execution timeout', this.opts.runExecutionTimeout);
238
243
  this.opts.runExecutionTimeout = parseInt(this.opts.runExecutionTimeout, 10);
239
244
  }
240
245
  }
@@ -248,7 +253,11 @@ class CLIArgumentParser {
248
253
  }
249
254
  async _parseQuarantineOptions() {
250
255
  if (this.opts.quarantineMode)
251
- this.opts.quarantineMode = await get_options_1.getQuarantineOptions('--quarantine-mode', this.opts.quarantineMode);
256
+ this.opts.quarantineMode = await (0, get_options_1.getQuarantineOptions)('--quarantine-mode', this.opts.quarantineMode);
257
+ }
258
+ async _parseSkipJsErrorsOptions() {
259
+ if (this.opts.skipJsErrors)
260
+ this.opts.skipJsErrors = await (0, get_options_1.getSkipJsErrorsOptions)('--skip-js-errors', this.opts.skipJsErrors);
252
261
  }
253
262
  _parsePorts() {
254
263
  if (this.opts.ports) {
@@ -262,12 +271,12 @@ class CLIArgumentParser {
262
271
  }
263
272
  _parseBrowsersFromArgs() {
264
273
  const browsersArg = this.testCafeCommand.args[0] || '';
265
- this.opts.browsers = string_1.splitQuotedText(browsersArg, ',')
274
+ this.opts.browsers = (0, string_1.splitQuotedText)(browsersArg, ',')
266
275
  .filter(browser => browser && this._checkAndCountRemotes(browser));
267
276
  }
268
277
  async _parseSslOptions() {
269
278
  if (this.opts.ssl)
270
- this.opts.ssl = await get_options_1.getSSLOptions(this.opts.ssl);
279
+ this.opts.ssl = await (0, get_options_1.getSSLOptions)(this.opts.ssl);
271
280
  }
272
281
  async _parseReporters() {
273
282
  const reporters = this.opts.reporter ? this.opts.reporter.split(',') : []; /* eslint-disable-line no-extra-parens*/
@@ -285,32 +294,32 @@ class CLIArgumentParser {
285
294
  }
286
295
  async _parseScreenshotOptions() {
287
296
  if (this.opts.screenshots)
288
- this.opts.screenshots = await get_options_1.getScreenshotOptions(this.opts.screenshots);
297
+ this.opts.screenshots = await (0, get_options_1.getScreenshotOptions)(this.opts.screenshots);
289
298
  else
290
299
  this.opts.screenshots = {};
291
- if (!lodash_1.has(this.opts.screenshots, screenshot_option_names_1.default.pathPattern) && this.opts.screenshotPathPattern)
300
+ if (!(0, lodash_1.has)(this.opts.screenshots, screenshot_option_names_1.default.pathPattern) && this.opts.screenshotPathPattern)
292
301
  this.opts.screenshots[screenshot_option_names_1.default.pathPattern] = this.opts.screenshotPathPattern;
293
- if (!lodash_1.has(this.opts.screenshots, screenshot_option_names_1.default.takeOnFails) && this.opts.screenshotsOnFails)
302
+ if (!(0, lodash_1.has)(this.opts.screenshots, screenshot_option_names_1.default.takeOnFails) && this.opts.screenshotsOnFails)
294
303
  this.opts.screenshots[screenshot_option_names_1.default.takeOnFails] = this.opts.screenshotsOnFails;
295
304
  }
296
305
  async _parseVideoOptions() {
297
306
  if (this.opts.videoOptions)
298
- this.opts.videoOptions = await get_options_1.getVideoOptions(this.opts.videoOptions);
307
+ this.opts.videoOptions = await (0, get_options_1.getVideoOptions)(this.opts.videoOptions);
299
308
  if (this.opts.videoEncodingOptions)
300
- this.opts.videoEncodingOptions = await get_options_1.getVideoOptions(this.opts.videoEncodingOptions);
309
+ this.opts.videoEncodingOptions = await (0, get_options_1.getVideoOptions)(this.opts.videoEncodingOptions);
301
310
  }
302
311
  async _parseCompilerOptions() {
303
312
  if (!this.opts.compilerOptions)
304
313
  return;
305
- const parsedCompilerOptions = await get_options_1.getCompilerOptions(this.opts.compilerOptions);
314
+ const parsedCompilerOptions = await (0, get_options_1.getCompilerOptions)(this.opts.compilerOptions);
306
315
  const resultCompilerOptions = Object.create(null);
307
316
  for (const [key, value] of Object.entries(parsedCompilerOptions))
308
- lodash_1.set(resultCompilerOptions, key, value);
317
+ (0, lodash_1.set)(resultCompilerOptions, key, value);
309
318
  this.opts.compilerOptions = resultCompilerOptions;
310
319
  }
311
320
  async _parseDashboardOptions() {
312
321
  if (this.opts.dashboardOptions)
313
- this.opts.dashboardOptions = await get_options_1.getDashboardOptions(this.opts.dashboardOptions);
322
+ this.opts.dashboardOptions = await (0, get_options_1.getDashboardOptions)(this.opts.dashboardOptions);
314
323
  }
315
324
  _parseListBrowsers() {
316
325
  const listBrowserOption = this.opts.listBrowsers;
@@ -319,20 +328,21 @@ class CLIArgumentParser {
319
328
  return;
320
329
  this.opts.providerName = typeof listBrowserOption === 'string' ? listBrowserOption : 'locally-installed';
321
330
  }
322
- static _prepareQuarantineOptions(argv) {
323
- // NOTE: move the quarantine mode options to the end of the array to avoid the wrong quarantine mode CLI options parsing (GH-6231)
324
- const quarantineOptionIndex = argv.findIndex(el => ['-q', '--quarantine-mode'].some(opt => el.startsWith(opt)));
325
- if (quarantineOptionIndex > -1) {
326
- const isNotLastOption = quarantineOptionIndex < argv.length - 1;
331
+ static _prepareBooleanOrObjectOption(argv, optionNames, subOptionsNames) {
332
+ // NOTE: move options to the end of the array to correctly parse both Boolean and Object type arguments (GH-6231)
333
+ const optionIndex = argv.findIndex(el => optionNames.some(opt => el.startsWith(opt)));
334
+ if (optionIndex > -1) {
335
+ const isNotLastOption = optionIndex < argv.length - 1;
327
336
  const shouldMoveOptionToEnd = isNotLastOption &&
328
- ![quarantine_option_names_1.default.attemptLimit, quarantine_option_names_1.default.successThreshold].some(opt => argv[quarantineOptionIndex + 1].startsWith(opt));
337
+ !subOptionsNames.some(opt => argv[optionIndex + 1].startsWith(opt));
329
338
  if (shouldMoveOptionToEnd)
330
- argv.push(argv.splice(quarantineOptionIndex, 1)[0]);
339
+ argv.push(argv.splice(optionIndex, 1)[0]);
331
340
  }
332
341
  }
333
342
  async parse(argv) {
334
- CLIArgumentParser._prepareQuarantineOptions(argv);
335
- const { args, v8Flags } = node_arguments_filter_1.extractNodeProcessArguments(argv);
343
+ CLIArgumentParser._prepareBooleanOrObjectOption(argv, ['-q', '--quarantine-mode'], Object.values(quarantine_option_names_1.default));
344
+ CLIArgumentParser._prepareBooleanOrObjectOption(argv, ['-e', '--skip-js-errors'], Object.values(skip_js_errors_option_names_1.default));
345
+ const { args, v8Flags } = (0, node_arguments_filter_1.extractNodeProcessArguments)(argv);
336
346
  commander_1.default.parse(args);
337
347
  this.args = commander_1.default.args;
338
348
  this.opts = Object.assign(this.opts, { v8Flags });
@@ -357,6 +367,7 @@ class CLIArgumentParser {
357
367
  this._parseFileList();
358
368
  await this._parseFilteringOptions();
359
369
  await this._parseQuarantineOptions();
370
+ await this._parseSkipJsErrorsOptions();
360
371
  await this._parseScreenshotOptions();
361
372
  await this._parseVideoOptions();
362
373
  await this._parseCompilerOptions();
@@ -376,4 +387,4 @@ class CLIArgumentParser {
376
387
  }
377
388
  exports.default = CLIArgumentParser;
378
389
  module.exports = exports.default;
379
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBa0M7QUFFbEMsdURBR21CO0FBRW5CLG9EQUE0QjtBQUM1QixrREFBb0Q7QUFDcEQsOENBQW9EO0FBQ3BELDBFQUFzRTtBQUN0RSx3RkFBOEQ7QUFDOUQsK0NBQStEO0FBQy9ELHlEQVNpQztBQUVqQyw4RUFBb0Q7QUFDcEQsMEdBQWtGO0FBQ2xGLDRGQUFvRTtBQU1wRSwwR0FBa0Y7QUFDbEYsb0VBQXVFO0FBQ3ZFLDRGQUFrRTtBQUNsRSwrQ0FBMkQ7QUFDM0Qsb0VBQTRDO0FBRzVDLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sV0FBVyxHQUFHLGdCQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Q0FhMUIsQ0FBQyxDQUFDO0FBd0NILE1BQXFCLGlCQUFpQjtJQVNsQyxZQUFvQixHQUFZO1FBQzVCLElBQUksQ0FBQyxHQUFHLEdBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFXLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFXLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1QyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTyxNQUFNLENBQUMsaUJBQWlCO1FBQzVCLHdFQUF3RTtRQUN4RSxn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dCI6WyJpbXBvcnQgeyBoYXMsIHNldCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCBwcm9ncmFtLCB7XG4gICAgQ29tbWFuZCxcbiAgICBPcHRpb24sXG59IGZyb20gJ2NvbW1hbmRlcic7XG5cbmltcG9ydCBkZWRlbnQgZnJvbSAnZGVkZW50JztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCB7IGFzc2VydFR5cGUsIGlzIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUvdHlwZS1hc3NlcnRpb25zJztcbmltcG9ydCBnZXRWaWV3UG9ydFdpZHRoIGZyb20gJy4uLy4uL3V0aWxzL2dldC12aWV3cG9ydC13aWR0aCc7XG5pbXBvcnQgeyB3b3JkV3JhcCwgc3BsaXRRdW90ZWRUZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCB7XG4gICAgZ2V0U1NMT3B0aW9ucyxcbiAgICBnZXRRdWFyYW50aW5lT3B0aW9ucyxcbiAgICBnZXRTY3JlZW5zaG90T3B0aW9ucyxcbiAgICBnZXRWaWRlb09wdGlvbnMsXG4gICAgZ2V0TWV0YU9wdGlvbnMsXG4gICAgZ2V0R3JlcE9wdGlvbnMsXG4gICAgZ2V0Q29tcGlsZXJPcHRpb25zLFxuICAgIGdldERhc2hib2FyZE9wdGlvbnMsXG59IGZyb20gJy4uLy4uL3V0aWxzL2dldC1vcHRpb25zJztcblxuaW1wb3J0IGdldEZpbHRlckZuIGZyb20gJy4uLy4uL3V0aWxzL2dldC1maWx0ZXItZm4nO1xuaW1wb3J0IFNDUkVFTlNIT1RfT1BUSU9OX05BTUVTIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vc2NyZWVuc2hvdC1vcHRpb24tbmFtZXMnO1xuaW1wb3J0IFJVTl9PUFRJT05fTkFNRVMgZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9ydW4tb3B0aW9uLW5hbWVzJztcbmltcG9ydCB7XG4gICAgRGljdGlvbmFyeSxcbiAgICBSZXBvcnRlck9wdGlvbixcbiAgICBSdW5uZXJSdW5PcHRpb25zLFxufSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL2ludGVyZmFjZXMnO1xuaW1wb3J0IFFVQVJBTlRJTkVfT1BUSU9OX05BTUVTIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vcXVhcmFudGluZS1vcHRpb24tbmFtZXMnO1xuaW1wb3J0IHsgZXh0cmFjdE5vZGVQcm9jZXNzQXJndW1lbnRzIH0gZnJvbSAnLi4vbm9kZS1hcmd1bWVudHMtZmlsdGVyJztcbmltcG9ydCBnZXRUZXN0Y2FmZVZlcnNpb24gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LXRlc3RjYWZlLXZlcnNpb24nO1xuaW1wb3J0IHsgcGFyc2VQb3J0TnVtYmVyLCBwYXJzZUxpc3QgfSBmcm9tICcuL3BhcnNlLXV0aWxzJztcbmltcG9ydCBDT01NQU5EX05BTUVTIGZyb20gJy4vY29tbWFuZC1uYW1lcyc7XG5pbXBvcnQgeyBTZW5kUmVwb3J0U3RhdGUgfSBmcm9tICcuLi8uLi9kYXNoYm9hcmQvaW50ZXJmYWNlcyc7XG5cbmNvbnN0IFJFTU9URV9BTElBU19SRSA9IC9ecmVtb3RlKD86OihcXGQqKSk/JC87XG5cbmNvbnN0IERFU0NSSVBUSU9OID0gZGVkZW50KGBcbiAgICBJbiB0aGUgYnJvd3NlciBsaXN0LCB5b3UgY2FuIHVzZSBicm93c2VyIG5hbWVzIChlLmcuIFwiaWVcIiwgXCJjaHJvbWVcIiwgZXRjLikgYXMgd2VsbCBhcyBwYXRocyB0byBleGVjdXRhYmxlcy5cblxuICAgIFRvIHJ1biB0ZXN0cyBhZ2FpbnN0IGFsbCBpbnN0YWxsZWQgYnJvd3NlcnMsIHVzZSB0aGUgXCJhbGxcIiBhbGlhcy5cblxuICAgIFRvIHVzZSBhIHJlbW90ZSBicm93c2VyIGNvbm5lY3Rpb24gKGUuZy4sIHRvIGNvbm5lY3QgYSBtb2JpbGUgZGV2aWNlKSwgc3BlY2lmeSBcInJlbW90ZVwiIGFzIHRoZSBicm93c2VyIGFsaWFzLlxuICAgIElmIHlvdSBuZWVkIHRvIGNvbm5lY3QgbXVsdGlwbGUgZGV2aWNlcywgYWRkIGEgY29sb24gYW5kIHRoZSBudW1iZXIgb2YgYnJvd3NlcnMgeW91IHdhbnQgdG8gY29ubmVjdCAoZS5nLiwgXCJyZW1vdGU6M1wiKS5cblxuICAgIFRvIHJ1biB0ZXN0cyBpbiBhIGJyb3dzZXIgYWNjZXNzZWQgdGhyb3VnaCBhIGJyb3dzZXIgcHJvdmlkZXIgcGx1Z2luLCBzcGVjaWZ5IGEgYnJvd3NlciBhbGlhcyB0aGF0IGNvbnNpc3RzIG9mIHR3byBwYXJ0cyAtIHRoZSBicm93c2VyIHByb3ZpZGVyIG5hbWUgcHJlZml4IGFuZCB0aGUgbmFtZSBvZiB0aGUgYnJvd3NlciBpdHNlbGY7IGZvciBleGFtcGxlLCBcInNhdWNlbGFiczpjaHJvbWVANTFcIi5cblxuICAgIFlvdSBjYW4gdXNlIG9uZSBvciBtb3JlIGZpbGUgcGF0aHMgb3IgZ2xvYiBwYXR0ZXJucyB0byBzcGVjaWZ5IHdoaWNoIHRlc3RzIHRvIHJ1bi5cblxuICAgIE1vcmUgaW5mbzogaHR0cHM6Ly9kZXZleHByZXNzLmdpdGh1Yi5pby90ZXN0Y2FmZS9kb2N1bWVudGF0aW9uXG5gKTtcblxuaW50ZXJmYWNlIENvbW1hbmRMaW5lT3B0aW9ucyB7XG4gICAgdGVzdEdyZXA/OiBzdHJpbmcgfCBSZWdFeHA7XG4gICAgZml4dHVyZUdyZXA/OiBzdHJpbmcgfCBSZWdFeHA7XG4gICAgc3JjPzogc3RyaW5nW107XG4gICAgYnJvd3NlcnM/OiBzdHJpbmdbXTtcbiAgICBsaXN0QnJvd3NlcnM/OiBib29sZWFuIHwgc3RyaW5nO1xuICAgIHRlc3RNZXRhPzogc3RyaW5nIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICBmaXh0dXJlTWV0YT86IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gICAgZmlsdGVyPzogRnVuY3Rpb247XG4gICAgYXBwSW5pdERlbGF5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGFzc2VydGlvblRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc2VsZWN0b3JUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHNwZWVkPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHBhZ2VMb2FkVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBwYWdlUmVxdWVzdFRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgYWpheFJlcXVlc3RUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGJyb3dzZXJJbml0VGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICB0ZXN0RXhlY3V0aW9uVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBydW5FeGVjdXRpb25UaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGNvbmN1cnJlbmN5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHF1YXJhbnRpbmVNb2RlPzogYm9vbGVhbiB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICBwb3J0cz86IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3ZpZGVyTmFtZT86IHN0cmluZztcbiAgICBzc2w/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gPjtcbiAgICByZXBvcnRlcj86IHN0cmluZyB8IFJlcG9ydGVyT3B0aW9uW107XG4gICAgc2NyZWVuc2hvdHM/OiBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHwgc3RyaW5nO1xuICAgIHNjcmVlbnNob3RQYXRoUGF0dGVybj86IHN0cmluZztcbiAgICBzY3JlZW5zaG90c09uRmFpbHM/OiBib29sZWFuO1xuICAgIHZpZGVvT3B0aW9ucz86IHN0cmluZyB8IERpY3Rpb25hcnk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbj47XG4gICAgdmlkZW9FbmNvZGluZ09wdGlvbnM/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4+O1xuICAgIGNvbXBpbGVyT3B0aW9ucz86IHN0cmluZyB8IERpY3Rpb25hcnk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbj47XG4gICAgY29uZmlnRmlsZT86IHN0cmluZztcbiAgICBwcm94eWxlc3M/OiBib29sZWFuO1xuICAgIHY4RmxhZ3M/OiBzdHJpbmdbXTtcbiAgICBkYXNoYm9hcmRPcHRpb25zPyA6IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj47XG4gICAgYmFzZVVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0xJQXJndW1lbnRQYXJzZXIge1xuICAgIHByaXZhdGUgY3dkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZW1vdGVDb3VudDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc0Rhc2hib2FyZENvbW1hbmQ6IGJvb2xlYW47XG4gICAgcHVibGljIHNlbmRSZXBvcnRTdGF0ZTogU2VuZFJlcG9ydFN0YXRlO1xuICAgIHB1YmxpYyBvcHRzOiBDb21tYW5kTGluZU9wdGlvbnM7XG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdENhZmVDb21tYW5kOiBDb21tYW5kO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChjd2Q/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jd2QgICAgICAgICAgPSBjd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy5yZW1vdGVDb3VudCAgPSAwO1xuICAgICAgICB0aGlzLm9wdHMgICAgICAgICA9IHt9O1xuICAgICAgICB0aGlzLmFyZ3MgICAgICAgICA9IFtdO1xuXG4gICAgICAgIHRoaXMuaXNEYXNoYm9hcmRDb21tYW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGVzdENhZmVDb21tYW5kICAgID0gdGhpcy5fYWRkVGVzdENhZmVDb21tYW5kKCk7XG5cbiAgICAgICAgdGhpcy5fcGF0Y2hIZWxwT3V0cHV0KHRoaXMudGVzdENhZmVDb21tYW5kKTtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3NldHVwUm9vdENvbW1hbmQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfc2V0dXBSb290Q29tbWFuZCAoKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFyZSBmb3JjZWQgdG8gc2V0IHRoZSBuYW1lIG9mIHRoZSByb290IGNvbW1hbmQgdG8gJ3Rlc3RjYWZlJ1xuICAgICAgICAvLyB0byBhdm9pZCB0aGUgYXV0b21hdGljIGNvbW1hbmQgbmFtZSBjYWxjdWxhdGlvbiB1c2luZyB0aGUgZXhlY3V0ZWQgZmlsZSBwYXRoLlxuICAgICAgICAvLyBJdCdzIG5lY2Vzc2FyeSB0byBjb3JyZWN0IGNvbW1hbmQgZGVzY3JpcHRpb24gZm9yIG5lc3RlZCBjb21tYW5kcy5cbiAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5uYW1lKENPTU1BTkRfTkFNRVMuVGVzdENhZmUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9yZW1vdmVDb21tYW5kSWZFeGlzdHMgKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBCdWcgaW4gdGhlICdjb21tYW5kZXInIG1vZHVsZS5cbiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0byBhZGQgYSBmZXcgY29tbWFuZHMgd2l0aCB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAvLyBBbHNvLCByZW1vdmluZyBpcyBhIGJldHRlciB0aGFuIGNvbmRpdGlvbmFsbHkgYWRkaW5nXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgYWxsb3dzIGF2b2lkaW5nIHRoZSBwYXJzZWQgb3B0aW9uIGR1cGxpY2F0ZXMuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5jb21tYW5kcy5maW5kSW5kZXgoY21kID0+IGNtZC5uYW1lKCkgPT09IG5hbWUpO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5jb21tYW5kcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9nZXREZXNjcmlwdGlvbiAoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gTk9URTogYWRkIGVtcHR5IGxpbmUgdG8gd29ya2Fyb3VuZCBjb21tYW5kZXItZm9yY2VkIGluZGVudGF0aW9uIG9uIHRoZSBmaXJzdCBsaW5lLlxuICAgICAgICByZXR1cm4gJ1xcbicgKyB3b3JkV3JhcChERVNDUklQVElPTiwgMiwgZ2V0Vmlld1BvcnRXaWR0aChwcm9jZXNzLnN0ZG91dCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZFRlc3RDYWZlQ29tbWFuZCAoKTogQ29tbWFuZCB7XG4gICAgICAgIENMSUFyZ3VtZW50UGFyc2VyLl9yZW1vdmVDb21tYW5kSWZFeGlzdHMoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSk7XG5cbiAgICAgICAgcmV0dXJuIChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZClcbiAgICAgICAgICAgIC5jb21tYW5kKENPTU1BTkRfTkFNRVMuVGVzdENhZmUsIHsgaXNEZWZhdWx0OiB0cnVlIH0pXG4gICAgICAgICAgICAudmVyc2lvbihnZXRUZXN0Y2FmZVZlcnNpb24oKSwgJy12LCAtLXZlcnNpb24nKVxuICAgICAgICAgICAgLnVzYWdlKCdbb3B0aW9uc10gPGNvbW1hLXNlcGFyYXRlZC1icm93c2VyLWxpc3Q+IDxmaWxlLW9yLWdsb2IgLi4uPicpXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oQ0xJQXJndW1lbnRQYXJzZXIuX2dldERlc2NyaXB0aW9uKCkpXG5cbiAgICAgICAgICAgIC5hbGxvd1Vua25vd25PcHRpb24oKVxuICAgICAgICAgICAgLm9wdGlvbignLWIsIC0tbGlzdC1icm93c2VycyBbcHJvdmlkZXJdJywgJ291dHB1dCB0aGUgYWxpYXNlcyBmb3IgbG9jYWwgYnJvd3NlcnMgb3IgYnJvd3NlcnMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHNwZWNpZmllZCBicm93c2VyIHByb3ZpZGVyJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1yLCAtLXJlcG9ydGVyIDxuYW1lWzpvdXRwdXRGaWxlXVssLi4uXT4nLCAnc3BlY2lmeSB0aGUgcmVwb3J0ZXJzIGFuZCBvcHRpb25hbGx5IGZpbGVzIHdoZXJlIHJlcG9ydHMgYXJlIHNhdmVkJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1zLCAtLXNjcmVlbnNob3RzIDxvcHRpb249dmFsdWVbLC4uLl0+JywgJ3NwZWNpZnkgc2NyZWVuc2hvdCBvcHRpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1TLCAtLXNjcmVlbnNob3RzLW9uLWZhaWxzJywgJ3Rha2UgYSBzY3JlZW5zaG90IHdoZW5ldmVyIGEgdGVzdCBmYWlscycpXG4gICAgICAgICAgICAub3B0aW9uKCctcCwgLS1zY3JlZW5zaG90LXBhdGgtcGF0dGVybiA8cGF0dGVybj4nLCAndXNlIHBhdHRlcm5zIHRvIGNvbXBvc2Ugc2NyZWVuc2hvdCBmaWxlIG5hbWVzIGFuZCBwYXRoczogJHtCUk9XU0VSfSwgJHtCUk9XU0VSX1ZFUlNJT059LCAke09TfSwgZXRjLicpXG4gICAgICAgICAgICAub3B0aW9uKCctcSwgLS1xdWFyYW50aW5lLW1vZGUgW29wdGlvbj12YWx1ZSwuLi5dJywgJ2VuYWJsZSBxdWFyYW50aW5lIG1vZGUgYW5kIChvcHRpb25hbGx5KSBtb2RpZnkgcXVhcmFudGluZSBtb2RlIHNldHRpbmdzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1kLCAtLWRlYnVnLW1vZGUnLCAnZXhlY3V0ZSB0ZXN0IHN0ZXBzIG9uZSBieSBvbmUgcGF1c2luZyB0aGUgdGVzdCBhZnRlciBlYWNoIHN0ZXAnKVxuICAgICAgICAgICAgLm9wdGlvbignLWUsIC0tc2tpcC1qcy1lcnJvcnMnLCAnbWFrZSB0ZXN0cyBub3QgZmFpbCB3aGVuIGEgSlMgZXJyb3IgaGFwcGVucyBvbiBhIHBhZ2UnKVxuICAgICAgICAgICAgLm9wdGlvbignLXUsIC0tc2tpcC11bmNhdWdodC1lcnJvcnMnLCAnaWdub3JlIHVuY2F1Z2h0IGVycm9ycyBhbmQgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9ucywgd2hpY2ggb2NjdXIgZHVyaW5nIHRlc3QgZXhlY3V0aW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy10LCAtLXRlc3QgPG5hbWU+JywgJ3J1biBvbmx5IHRlc3RzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1ULCAtLXRlc3QtZ3JlcCA8cGF0dGVybj4nLCAncnVuIG9ubHkgdGVzdHMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXR0ZXJuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1mLCAtLWZpeHR1cmUgPG5hbWU+JywgJ3J1biBvbmx5IGZpeHR1cmVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1GLCAtLWZpeHR1cmUtZ3JlcCA8cGF0dGVybj4nLCAncnVuIG9ubHkgZml4dHVyZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXR0ZXJuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1hLCAtLWFwcCA8Y29tbWFuZD4nLCAnbGF1bmNoIHRoZSB0ZXN0ZWQgYXBwIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBiZWZvcmUgcnVubmluZyB0ZXN0cycpXG4gICAgICAgICAgICAub3B0aW9uKCctYywgLS1jb25jdXJyZW5jeSA8bnVtYmVyPicsICdydW4gdGVzdHMgY29uY3VycmVudGx5JylcbiAgICAgICAgICAgIC5vcHRpb24oJy1MLCAtLWxpdmUnLCAnZW5hYmxlIGxpdmUgbW9kZS4gSW4gdGhpcyBtb2RlLCBUZXN0Q2FmZSB3YXRjaGVzIGZvciBjaGFuZ2VzIHlvdSBtYWtlIGluIHRoZSB0ZXN0IGZpbGVzLiBUaGVzZSBjaGFuZ2VzIGltbWVkaWF0ZWx5IHJlc3RhcnQgdGhlIHRlc3RzIHNvIHRoYXQgeW91IGNhbiBzZWUgdGhlIGVmZmVjdC4nKVxuICAgICAgICAgICAgLm9wdGlvbignLS10ZXN0LW1ldGEgPGtleT12YWx1ZVssa2V5Mj12YWx1ZTIsLi4uXT4nLCAncnVuIG9ubHkgdGVzdHMgd2l0aCBtYXRjaGluZyBtZXRhZGF0YScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWZpeHR1cmUtbWV0YSA8a2V5PXZhbHVlWyxrZXkyPXZhbHVlMiwuLi5dPicsICdydW4gb25seSBmaXh0dXJlcyB3aXRoIG1hdGNoaW5nIG1ldGFkYXRhJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGVidWctb24tZmFpbCcsICdwYXVzZSB0aGUgdGVzdCBpZiBpdCBmYWlscycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFwcC1pbml0LWRlbGF5IDxtcz4nLCAnc3BlY2lmeSBob3cgbXVjaCB0aW1lIGl0IHRha2VzIGZvciB0aGUgdGVzdGVkIGFwcCB0byBpbml0aWFsaXplJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc2VsZWN0b3ItdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIHRpbWUgd2l0aGluIHdoaWNoIHNlbGVjdG9ycyBtYWtlIGF0dGVtcHRzIHRvIG9idGFpbiBhIG5vZGUgdG8gYmUgcmV0dXJuZWQnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1hc3NlcnRpb24tdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIHRpbWUgd2l0aGluIHdoaWNoIGFzc2VydGlvbiBzaG91bGQgcGFzcycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXBhZ2UtbG9hZC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgdGltZSB3aXRoaW4gd2hpY2ggVGVzdENhZmUgd2FpdHMgZm9yIHRoZSBgd2luZG93LmxvYWRgIGV2ZW50IHRvIGZpcmUgb24gcGFnZSBsb2FkIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHRoZSBuZXh0IHRlc3QgYWN0aW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcGFnZS1yZXF1ZXN0LXRpbWVvdXQgPG1zPicsIFwic3BlY2lmaWVzIHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCBmb3IgdGhlIHBhZ2UncyBIVE1MXCIpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFqYXgtcmVxdWVzdC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmaWVzIHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBjb21wbGV0ZSB0aGUgQUpBWCByZXF1ZXN0cyAoWEhSIG9yIGZldGNoKScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWJyb3dzZXItaW5pdC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBUZXN0Q2FmZSB3YWl0cyBmb3IgdGhlIGJyb3dzZXIgdG8gc3RhcnQnKVxuICAgICAgICAgICAgLm9wdGlvbignLS10ZXN0LWV4ZWN1dGlvbi10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBUZXN0Q2FmZSB3YWl0cyBmb3IgdGhlIHRlc3QgZXhlY3V0ZWQnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1ydW4tZXhlY3V0aW9uLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIFRlc3RDYWZlIHdhaXRzIGZvciB0aGUgYWxsIHRlc3QgZXhlY3V0ZWQnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zcGVlZCA8ZmFjdG9yPicsICdzZXQgdGhlIHNwZWVkIG9mIHRlc3QgZXhlY3V0aW9uICgwLjAxIC4uLiAxKScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXBvcnRzIDxwb3J0MSxwb3J0Mj4nLCAnc3BlY2lmeSBjdXN0b20gcG9ydCBudW1iZXJzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0taG9zdG5hbWUgPG5hbWU+JywgJ3NwZWNpZnkgdGhlIGhvc3RuYW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcHJveHkgPGhvc3Q+JywgJ3NwZWNpZnkgdGhlIGhvc3Qgb2YgdGhlIHByb3h5IHNlcnZlcicpXG4gICAgICAgICAgICAub3B0aW9uKCctLXByb3h5LWJ5cGFzcyA8cnVsZXM+JywgJ3NwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBydWxlcyB0aGF0IGRlZmluZSBVUkxzIGFjY2Vzc2VkIGJ5cGFzc2luZyB0aGUgcHJveHkgc2VydmVyJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc3NsIDxvcHRpb25zPicsICdzcGVjaWZ5IFNTTCBvcHRpb25zIHRvIHJ1biBUZXN0Q2FmZSBwcm94eSBzZXJ2ZXIgb3ZlciB0aGUgSFRUUFMgcHJvdG9jb2wnKVxuICAgICAgICAgICAgLm9wdGlvbignLS12aWRlbyA8cGF0aD4nLCAncmVjb3JkIHZpZGVvcyBvZiB0ZXN0IHJ1bnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS12aWRlby1vcHRpb25zIDxvcHRpb249dmFsdWVbLC4uLl0+JywgJ3NwZWNpZnkgdmlkZW8gcmVjb3JkaW5nIG9wdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS12aWRlby1lbmNvZGluZy1vcHRpb25zIDxvcHRpb249dmFsdWVbLC4uLl0+JywgJ3NwZWNpZnkgZW5jb2Rpbmcgb3B0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRldicsICdlbmFibGVzIG1lY2hhbmlzbXMgdG8gbG9nIGFuZCBkaWFnbm9zZSBlcnJvcnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1xci1jb2RlJywgJ291dHB1dHMgUVItY29kZSB0aGF0IHJlcGVhdHMgVVJMcyB1c2VkIHRvIGNvbm5lY3QgdGhlIHJlbW90ZSBicm93c2VycycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNmLCAtLXN0b3Atb24tZmlyc3QtZmFpbCcsICdzdG9wIGFuIGVudGlyZSB0ZXN0IHJ1biBpZiBhbnkgdGVzdCBmYWlscycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNvbmZpZy1maWxlIDxwYXRoPicsICdzcGVjaWZ5IGEgY3VzdG9tIHBhdGggdG8gdGhlIHRlc3RjYWZlIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRzLWNvbmZpZy1wYXRoIDxwYXRoPicsICd1c2UgYSBjdXN0b20gVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHNwZWNpZnkgaXRzIGxvY2F0aW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3MsIC0tY2xpZW50LXNjcmlwdHMgPHBhdGhzPicsICdpbmplY3Qgc2NyaXB0cyBpbnRvIHRlc3RlZCBwYWdlcycsIHBhcnNlTGlzdCwgW10pXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtcGFnZS1jYWNoaW5nJywgJ2Rpc2FibGUgcGFnZSBjYWNoaW5nIGR1cmluZyB0ZXN0IGV4ZWN1dGlvbicpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtcGFnZS1yZWxvYWRzJywgJ2Rpc2FibGUgcGFnZSByZWxvYWRzIGJldHdlZW4gdGVzdHMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1yZXRyeS10ZXN0LXBhZ2VzJywgJ3JldHJ5IG5ldHdvcmsgcmVxdWVzdHMgdG8gdGVzdCBwYWdlcyBkdXJpbmcgdGVzdCBleGVjdXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLXNjcmVlbnNob3RzJywgJ2Rpc2FibGUgc2NyZWVuc2hvdHMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zY3JlZW5zaG90cy1mdWxsLXBhZ2UnLCAnZW5hYmxlIGZ1bGwtcGFnZSBzY3JlZW5zaG90cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNvbXBpbGVyLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSB0ZXN0IGZpbGUgY29tcGlsZXIgb3B0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtbXVsdGlwbGUtd2luZG93cycsICdkaXNhYmxlIG11bHRpcGxlIHdpbmRvd3MgbW9kZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtaHR0cDInLCAnZGlzYWJsZSB0aGUgSFRUUC8yIHByb3h5IGJhY2tlbmQgYW5kIGZvcmNlIHRoZSBwcm94eSB0byB1c2Ugb25seSBIVFRQLzEuMSByZXF1ZXN0cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNhY2hlJywgJ2NhY2hlIHdlYiBhc3NldHMgYmV0d2VlbiB0ZXN0IHJ1bnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1iYXNlLXVybCA8dXJsPicsICdzZXQgdGhlIGJhc2UgdXJsIGZvciBhbGwgdGVzdHMnKVxuXG4gICAgICAgICAgICAvLyBOT1RFOiB0aGVzZSBvcHRpb25zIHdpbGwgYmUgaGFuZGxlZCBieSBjaGFsayBpbnRlcm5hbGx5XG4gICAgICAgICAgICAub3B0aW9uKCctLWNvbG9yJywgJ2ZvcmNlIGNvbG9ycyBpbiBjb21tYW5kIGxpbmUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1uby1jb2xvcicsICdkaXNhYmxlIGNvbG9ycyBpbiBjb21tYW5kIGxpbmUnKVxuXG4gICAgICAgICAgICAvLyBOT1RFOiB0ZW1wb3JhcnkgaGlkZSBleHBlcmltZW50YWwgb3B0aW9ucyBmcm9tIC0taGVscCBjb21tYW5kXG4gICAgICAgICAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tcHJveHlsZXNzJywgJ2V4cGVyaW1lbnRhbCcpLmhpZGVIZWxwKCkpXG4gICAgICAgICAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZXhwZXJpbWVudGFsLWRlYnVnJywgJ2VuYWJsZSBleHBlcmltZW50YWwgZGVidWcgbW9kZScpLmhpZGVIZWxwKCkpXG4gICAgICAgICAgICAuYWN0aW9uKChvcHRzOiBDb21tYW5kTGluZU9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGF0Y2hIZWxwT3V0cHV0IChkZWZhdWx0U3ViQ29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBJbiB0aGUgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSAnY29tbWFuZGVyJyBtb2R1bGVcbiAgICAgICAgLy8gbmVlZCB0byBpbnZlc3RpZ2F0ZSBob3cgdG8gcmVtb3ZlIHRoaXMgaGFjay5cbiAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5vdXRwdXRIZWxwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkUGFyZW50ID0gZGVmYXVsdFN1YkNvbW1hbmQucGFyZW50O1xuXG4gICAgICAgICAgICBkZWZhdWx0U3ViQ29tbWFuZC5wYXJlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICBkZWZhdWx0U3ViQ29tbWFuZC5vdXRwdXRIZWxwKCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRTdWJDb21tYW5kLnBhcmVudCA9IHN0b3JlZFBhcmVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja0FuZENvdW50UmVtb3RlcyAoYnJvd3Nlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZU1hdGNoID0gYnJvd3Nlci5tYXRjaChSRU1PVEVfQUxJQVNfUkUpO1xuXG4gICAgICAgIGlmIChyZW1vdGVNYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVDb3VudCArPSBwYXJzZUludChyZW1vdGVNYXRjaFsxXSwgMTApIHx8IDE7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfcGFyc2VGaWx0ZXJpbmdPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy50ZXN0R3JlcClcbiAgICAgICAgICAgIHRoaXMub3B0cy50ZXN0R3JlcCA9IGdldEdyZXBPcHRpb25zKCctLXRlc3QtZ3JlcCcsIHRoaXMub3B0cy50ZXN0R3JlcCBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMuZml4dHVyZUdyZXApXG4gICAgICAgICAgICB0aGlzLm9wdHMuZml4dHVyZUdyZXAgPSBnZXRHcmVwT3B0aW9ucygnLS1maXh0dXJlLWdyZXAnLCB0aGlzLm9wdHMuZml4dHVyZUdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLnRlc3RNZXRhKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnRlc3RNZXRhID0gYXdhaXQgZ2V0TWV0YU9wdGlvbnMoJy0tdGVzdC1tZXRhJywgdGhpcy5vcHRzLnRlc3RNZXRhIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5maXh0dXJlTWV0YSlcbiAgICAgICAgICAgIHRoaXMub3B0cy5maXh0dXJlTWV0YSA9IGF3YWl0IGdldE1ldGFPcHRpb25zKCctLWZpeHR1cmUtbWV0YScsIHRoaXMub3B0cy5maXh0dXJlTWV0YSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIHRoaXMub3B0cy5maWx0ZXIgPSBnZXRGaWx0ZXJGbih0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQXBwSW5pdERlbGF5ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hcHBJbml0RGVsYXkpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgdGVzdGVkIGFwcCBpbml0aWFsaXphdGlvbiBkZWxheScsIHRoaXMub3B0cy5hcHBJbml0RGVsYXkpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuYXBwSW5pdERlbGF5ID0gcGFyc2VJbnQodGhpcy5vcHRzLmFwcEluaXREZWxheSBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlU2VsZWN0b3JUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgU2VsZWN0b3IgdGltZW91dCcsIHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQXNzZXJ0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBhc3NlcnRpb24gdGltZW91dCcsIHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLmFzc2VydGlvblRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUGFnZUxvYWRUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgcGFnZSBsb2FkIHRpbWVvdXQnLCB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVBhZ2VSZXF1ZXN0VGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHBhZ2UgcmVxdWVzdCB0aW1lb3V0JywgdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VBamF4UmVxdWVzdFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBBSkFYIHJlcXVlc3QgdGltZW91dCcsIHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuYWpheFJlcXVlc3RUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQnJvd3NlckluaXRUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgYnJvd3NlciBpbml0aWFsaXphdGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5icm93c2VySW5pdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VUZXN0RXhlY3V0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgdGVzdCBleGVjdXRpb24gdGltZW91dCcsIHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUnVuRXhlY3V0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBydW4gZXhlY3V0aW9uIHRpbWVvdXQnLCB0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVNwZWVkICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zcGVlZClcbiAgICAgICAgICAgIHRoaXMub3B0cy5zcGVlZCA9IHBhcnNlRmxvYXQodGhpcy5vcHRzLnNwZWVkIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDb25jdXJyZW5jeSAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuY29uY3VycmVuY3kpXG4gICAgICAgICAgICB0aGlzLm9wdHMuY29uY3VycmVuY3kgPSBwYXJzZUludCh0aGlzLm9wdHMuY29uY3VycmVuY3kgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VRdWFyYW50aW5lT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucXVhcmFudGluZU1vZGUpXG4gICAgICAgICAgICB0aGlzLm9wdHMucXVhcmFudGluZU1vZGUgPSBhd2FpdCBnZXRRdWFyYW50aW5lT3B0aW9ucygnLS1xdWFyYW50aW5lLW1vZGUnLCB0aGlzLm9wdHMucXVhcmFudGluZU1vZGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUG9ydHMgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBvcnRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRQb3J0cyA9ICh0aGlzLm9wdHMucG9ydHMgYXMgc3RyaW5nKSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV4dHJhLXBhcmVucyAqL1xuICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgLm1hcChwYXJzZVBvcnROdW1iZXIpO1xuXG4gICAgICAgICAgICBpZiAocGFyc2VkUG9ydHMubGVuZ3RoIDwgMilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLnBvcnRzT3B0aW9uUmVxdWlyZXNUd29OdW1iZXJzKTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnBvcnRzID0gcGFyc2VkUG9ydHMgYXMgbnVtYmVyW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUJyb3dzZXJzRnJvbUFyZ3MgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBicm93c2Vyc0FyZyA9IHRoaXMudGVzdENhZmVDb21tYW5kLmFyZ3NbMF0gfHwgJyc7XG5cbiAgICAgICAgdGhpcy5vcHRzLmJyb3dzZXJzID0gc3BsaXRRdW90ZWRUZXh0KGJyb3dzZXJzQXJnLCAnLCcpXG4gICAgICAgICAgICAuZmlsdGVyKGJyb3dzZXIgPT4gYnJvd3NlciAmJiB0aGlzLl9jaGVja0FuZENvdW50UmVtb3Rlcyhicm93c2VyKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9wYXJzZVNzbE9wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNzbClcbiAgICAgICAgICAgIHRoaXMub3B0cy5zc2wgPSBhd2FpdCBnZXRTU0xPcHRpb25zKHRoaXMub3B0cy5zc2wgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVJlcG9ydGVycyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcG9ydGVycyA9IHRoaXMub3B0cy5yZXBvcnRlciA/ICh0aGlzLm9wdHMucmVwb3J0ZXIgYXMgc3RyaW5nKS5zcGxpdCgnLCcpIDogW107IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXh0cmEtcGFyZW5zKi9cblxuICAgICAgICB0aGlzLm9wdHMucmVwb3J0ZXIgPSByZXBvcnRlcnMubWFwKChyZXBvcnRlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHJlcG9ydGVyLmluZGV4T2YoJzonKTtcblxuICAgICAgICAgICAgaWYgKHNlcGFyYXRvckluZGV4IDwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiByZXBvcnRlciB9O1xuXG4gICAgICAgICAgICBjb25zdCBuYW1lICAgPSByZXBvcnRlci5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gcmVwb3J0ZXIuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IG5hbWUsIG91dHB1dCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUZpbGVMaXN0ICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcHRzLnNyYyA9IHRoaXMudGVzdENhZmVDb21tYW5kLmFyZ3Muc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VTY3JlZW5zaG90T3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc2NyZWVuc2hvdHMpXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHMgPSBhd2FpdCBnZXRTY3JlZW5zaG90T3B0aW9ucyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHMgPSB7fTtcblxuICAgICAgICBpZiAoIWhhcyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMsIFNDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnBhdGhQYXR0ZXJuKSAmJiB0aGlzLm9wdHMuc2NyZWVuc2hvdFBhdGhQYXR0ZXJuKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNjcmVlbnNob3RzW1NDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnBhdGhQYXR0ZXJuXSA9IHRoaXMub3B0cy5zY3JlZW5zaG90UGF0aFBhdHRlcm47XG5cbiAgICAgICAgaWYgKCFoYXModGhpcy5vcHRzLnNjcmVlbnNob3RzLCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy50YWtlT25GYWlscykgJiYgdGhpcy5vcHRzLnNjcmVlbnNob3RzT25GYWlscylcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90c1tTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy50YWtlT25GYWlsc10gPSB0aGlzLm9wdHMuc2NyZWVuc2hvdHNPbkZhaWxzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlVmlkZW9PcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy52aWRlb09wdGlvbnMpXG4gICAgICAgICAgICB0aGlzLm9wdHMudmlkZW9PcHRpb25zID0gYXdhaXQgZ2V0VmlkZW9PcHRpb25zKHRoaXMub3B0cy52aWRlb09wdGlvbnMgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zID0gYXdhaXQgZ2V0VmlkZW9PcHRpb25zKHRoaXMub3B0cy52aWRlb0VuY29kaW5nT3B0aW9ucyBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlQ29tcGlsZXJPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuY29tcGlsZXJPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZENvbXBpbGVyT3B0aW9ucyA9IGF3YWl0IGdldENvbXBpbGVyT3B0aW9ucyh0aGlzLm9wdHMuY29tcGlsZXJPcHRpb25zIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdENvbXBpbGVyT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29tcGlsZXJPcHRpb25zKSlcbiAgICAgICAgICAgIHNldChyZXN1bHRDb21waWxlck9wdGlvbnMsIGtleSwgdmFsdWUpO1xuXG4gICAgICAgIHRoaXMub3B0cy5jb21waWxlck9wdGlvbnMgPSByZXN1bHRDb21waWxlck9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VEYXNoYm9hcmRPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5kYXNoYm9hcmRPcHRpb25zKVxuICAgICAgICAgICAgdGhpcy5vcHRzLmRhc2hib2FyZE9wdGlvbnMgPSBhd2FpdCBnZXREYXNoYm9hcmRPcHRpb25zKHRoaXMub3B0cy5kYXNoYm9hcmRPcHRpb25zIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VMaXN0QnJvd3NlcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0QnJvd3Nlck9wdGlvbiA9IHRoaXMub3B0cy5saXN0QnJvd3NlcnM7XG5cbiAgICAgICAgdGhpcy5vcHRzLmxpc3RCcm93c2VycyA9ICEhdGhpcy5vcHRzLmxpc3RCcm93c2VycztcblxuICAgICAgICBpZiAoIXRoaXMub3B0cy5saXN0QnJvd3NlcnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5vcHRzLnByb3ZpZGVyTmFtZSA9IHR5cGVvZiBsaXN0QnJvd3Nlck9wdGlvbiA9PT0gJ3N0cmluZycgPyBsaXN0QnJvd3Nlck9wdGlvbiA6ICdsb2NhbGx5LWluc3RhbGxlZCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3ByZXBhcmVRdWFyYW50aW5lT3B0aW9ucyAoYXJndjogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogbW92ZSB0aGUgcXVhcmFudGluZSBtb2RlIG9wdGlvbnMgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgdG8gYXZvaWQgdGhlIHdyb25nIHF1YXJhbnRpbmUgbW9kZSBDTEkgb3B0aW9ucyBwYXJzaW5nIChHSC02MjMxKVxuICAgICAgICBjb25zdCBxdWFyYW50aW5lT3B0aW9uSW5kZXggPSBhcmd2LmZpbmRJbmRleChcbiAgICAgICAgICAgIGVsID0+IFsnLXEnLCAnLS1xdWFyYW50aW5lLW1vZGUnXS5zb21lKG9wdCA9PiBlbC5zdGFydHNXaXRoKG9wdCkpKTtcblxuICAgICAgICBpZiAocXVhcmFudGluZU9wdGlvbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTm90TGFzdE9wdGlvbiAgICAgICA9IHF1YXJhbnRpbmVPcHRpb25JbmRleCA8IGFyZ3YubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZE1vdmVPcHRpb25Ub0VuZCA9IGlzTm90TGFzdE9wdGlvbiAmJlxuICAgICAgICAgICAgICAgICFbUVVBUkFOVElORV9PUFRJT05fTkFNRVMuYXR0ZW1wdExpbWl0LCBRVUFSQU5USU5FX09QVElPTl9OQU1FUy5zdWNjZXNzVGhyZXNob2xkXS5zb21lKG9wdCA9PiBhcmd2W3F1YXJhbnRpbmVPcHRpb25JbmRleCArIDFdLnN0YXJ0c1dpdGgob3B0KSk7XG5cbiAgICAgICAgICAgIGlmIChzaG91bGRNb3ZlT3B0aW9uVG9FbmQpXG4gICAgICAgICAgICAgICAgYXJndi5wdXNoKGFyZ3Yuc3BsaWNlKHF1YXJhbnRpbmVPcHRpb25JbmRleCwgMSlbMF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBhcnNlIChhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fcHJlcGFyZVF1YXJhbnRpbmVPcHRpb25zKGFyZ3YpO1xuXG4gICAgICAgIGNvbnN0IHsgYXJncywgdjhGbGFncyB9ID0gZXh0cmFjdE5vZGVQcm9jZXNzQXJndW1lbnRzKGFyZ3YpO1xuXG4gICAgICAgIChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkucGFyc2UoYXJncyk7XG5cbiAgICAgICAgdGhpcy5hcmdzID0gKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5hcmdzO1xuICAgICAgICB0aGlzLm9wdHMgPSBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgeyB2OEZsYWdzIH0pO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlTGlzdEJyb3dzZXJzKCk7XG5cbiAgICAgICAgLy8gTk9URTogdGhlICctLWxpc3QtYnJvd3NlcnMnIG9wdGlvbiBvbmx5IGxpc3RzIGJyb3dzZXJzIGFuZCBpbW1lZGlhdGVseSBleGl0cyB0aGUgYXBwLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VzcyBvdGhlciBhcmd1bWVudHMuXG4gICAgICAgIGlmICh0aGlzLm9wdHMubGlzdEJyb3dzZXJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlU2VsZWN0b3JUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQXNzZXJ0aW9uVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVBhZ2VMb2FkVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVBhZ2VSZXF1ZXN0VGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUFqYXhSZXF1ZXN0VGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUJyb3dzZXJJbml0VGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVRlc3RFeGVjdXRpb25UaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUnVuRXhlY3V0aW9uVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUFwcEluaXREZWxheSgpO1xuICAgICAgICB0aGlzLl9wYXJzZVNwZWVkKCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUG9ydHMoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VCcm93c2Vyc0Zyb21BcmdzKCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQ29uY3VycmVuY3koKTtcbiAgICAgICAgdGhpcy5fcGFyc2VGaWxlTGlzdCgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlRmlsdGVyaW5nT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVF1YXJhbnRpbmVPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlU2NyZWVuc2hvdE9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VWaWRlb09wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VDb21waWxlck9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VTc2xPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlUmVwb3J0ZXJzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlRGFzaGJvYXJkT3B0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSdW5PcHRpb25zICgpOiBSdW5uZXJSdW5PcHRpb25zIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBSVU5fT1BUSU9OX05BTUVTLmZvckVhY2gob3B0aW9uTmFtZSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uTmFtZSBpbiB0aGlzLm9wdHMpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBhIGhhY2sgdG8gYWRkIGFuIGluZGV4IHNpZ25hdHVyZSB0byBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICByZXN1bHRbb3B0aW9uTmFtZV0gPSB0aGlzLm9wdHNbb3B0aW9uTmFtZV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgUnVubmVyUnVuT3B0aW9ucztcbiAgICB9XG59XG4iXX0=
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHVEQUdtQjtBQUVuQixvREFBNEI7QUFDNUIsa0RBQW9EO0FBQ3BELDhDQUFvRDtBQUNwRCwwRUFBc0U7QUFDdEUsd0ZBQThEO0FBQzlELCtDQUErRDtBQUMvRCx5REFVaUM7QUFFakMsOEVBQW9EO0FBQ3BELDBHQUFrRjtBQUNsRiw0RkFBb0U7QUFNcEUsMEdBQWtGO0FBQ2xGLG9FQUF1RTtBQUN2RSw0RkFBa0U7QUFDbEUsK0NBQTJEO0FBQzNELG9FQUE0QztBQUU1QyxrSEFBMEY7QUFFMUYsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFFOUMsTUFBTSxXQUFXLEdBQUcsSUFBQSxnQkFBTSxFQUFDOzs7Ozs7Ozs7Ozs7O0NBYTFCLENBQUMsQ0FBQztBQXlDSCxNQUFxQixpQkFBaUI7SUFTbEMsWUFBb0IsR0FBWTtRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBVSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksR0FBVSxFQUFFLENBQUM7UUFFdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRXJELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFp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LE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVNLGFBQWE7UUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuQywwQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEMsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLElBQUk7Z0JBQ3ZCLDJEQUEyRDtnQkFDM0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQTBCLENBQUM7SUFDdEMsQ0FBQztDQUNKO0FBdmFELG9DQXVhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhhcywgc2V0IH0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHByb2dyYW0sIHtcbiAgICBDb21tYW5kLFxuICAgIE9wdGlvbixcbn0gZnJvbSAnY29tbWFuZGVyJztcblxuaW1wb3J0IGRlZGVudCBmcm9tICdkZWRlbnQnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi8uLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgYXNzZXJ0VHlwZSwgaXMgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZS90eXBlLWFzc2VydGlvbnMnO1xuaW1wb3J0IGdldFZpZXdQb3J0V2lkdGggZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LXZpZXdwb3J0LXdpZHRoJztcbmltcG9ydCB7IHdvcmRXcmFwLCBzcGxpdFF1b3RlZFRleHQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgICBnZXRTU0xPcHRpb25zLFxuICAgIGdldFF1YXJhbnRpbmVPcHRpb25zLFxuICAgIGdldFNjcmVlbnNob3RPcHRpb25zLFxuICAgIGdldFNraXBKc0Vycm9yc09wdGlvbnMsXG4gICAgZ2V0VmlkZW9PcHRpb25zLFxuICAgIGdldE1ldGFPcHRpb25zLFxuICAgIGdldEdyZXBPcHRpb25zLFxuICAgIGdldENvbXBpbGVyT3B0aW9ucyxcbiAgICBnZXREYXNoYm9hcmRPcHRpb25zLFxufSBmcm9tICcuLi8uLi91dGlscy9nZXQtb3B0aW9ucyc7XG5cbmltcG9ydCBnZXRGaWx0ZXJGbiBmcm9tICcuLi8uLi91dGlscy9nZXQtZmlsdGVyLWZuJztcbmltcG9ydCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3NjcmVlbnNob3Qtb3B0aW9uLW5hbWVzJztcbmltcG9ydCBSVU5fT1BUSU9OX05BTUVTIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vcnVuLW9wdGlvbi1uYW1lcyc7XG5pbXBvcnQge1xuICAgIERpY3Rpb25hcnksXG4gICAgUmVwb3J0ZXJPcHRpb24sXG4gICAgUnVubmVyUnVuT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBRVUFSQU5USU5FX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3F1YXJhbnRpbmUtb3B0aW9uLW5hbWVzJztcbmltcG9ydCB7IGV4dHJhY3ROb2RlUHJvY2Vzc0FyZ3VtZW50cyB9IGZyb20gJy4uL25vZGUtYXJndW1lbnRzLWZpbHRlcic7XG5pbXBvcnQgZ2V0VGVzdGNhZmVWZXJzaW9uIGZyb20gJy4uLy4uL3V0aWxzL2dldC10ZXN0Y2FmZS12ZXJzaW9uJztcbmltcG9ydCB7IHBhcnNlUG9ydE51bWJlciwgcGFyc2VMaXN0IH0gZnJvbSAnLi9wYXJzZS11dGlscyc7XG5pbXBvcnQgQ09NTUFORF9OQU1FUyBmcm9tICcuL2NvbW1hbmQtbmFtZXMnO1xuaW1wb3J0IHsgU2VuZFJlcG9ydFN0YXRlIH0gZnJvbSAnLi4vLi4vZGFzaGJvYXJkL2ludGVyZmFjZXMnO1xuaW1wb3J0IFNLSVBfSlNfRVJST1JTX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3NraXAtanMtZXJyb3JzLW9wdGlvbi1uYW1lcyc7XG5cbmNvbnN0IFJFTU9URV9BTElBU19SRSA9IC9ecmVtb3RlKD86OihcXGQqKSk/JC87XG5cbmNvbnN0IERFU0NSSVBUSU9OID0gZGVkZW50KGBcbiAgICBJbiB0aGUgYnJvd3NlciBsaXN0LCB5b3UgY2FuIHVzZSBicm93c2VyIG5hbWVzIChlLmcuIFwiaWVcIiwgXCJjaHJvbWVcIiwgZXRjLikgYXMgd2VsbCBhcyBwYXRocyB0byBleGVjdXRhYmxlcy5cblxuICAgIFRvIHJ1biB0ZXN0cyBhZ2FpbnN0IGFsbCBpbnN0YWxsZWQgYnJvd3NlcnMsIHVzZSB0aGUgXCJhbGxcIiBhbGlhcy5cblxuICAgIFRvIHVzZSBhIHJlbW90ZSBicm93c2VyIGNvbm5lY3Rpb24gKGUuZy4sIHRvIGNvbm5lY3QgYSBtb2JpbGUgZGV2aWNlKSwgc3BlY2lmeSBcInJlbW90ZVwiIGFzIHRoZSBicm93c2VyIGFsaWFzLlxuICAgIElmIHlvdSBuZWVkIHRvIGNvbm5lY3QgbXVsdGlwbGUgZGV2aWNlcywgYWRkIGEgY29sb24gYW5kIHRoZSBudW1iZXIgb2YgYnJvd3NlcnMgeW91IHdhbnQgdG8gY29ubmVjdCAoZS5nLiwgXCJyZW1vdGU6M1wiKS5cblxuICAgIFRvIHJ1biB0ZXN0cyBpbiBhIGJyb3dzZXIgYWNjZXNzZWQgdGhyb3VnaCBhIGJyb3dzZXIgcHJvdmlkZXIgcGx1Z2luLCBzcGVjaWZ5IGEgYnJvd3NlciBhbGlhcyB0aGF0IGNvbnNpc3RzIG9mIHR3byBwYXJ0cyAtIHRoZSBicm93c2VyIHByb3ZpZGVyIG5hbWUgcHJlZml4IGFuZCB0aGUgbmFtZSBvZiB0aGUgYnJvd3NlciBpdHNlbGY7IGZvciBleGFtcGxlLCBcInNhdWNlbGFiczpjaHJvbWVANTFcIi5cblxuICAgIFlvdSBjYW4gdXNlIG9uZSBvciBtb3JlIGZpbGUgcGF0aHMgb3IgZ2xvYiBwYXR0ZXJucyB0byBzcGVjaWZ5IHdoaWNoIHRlc3RzIHRvIHJ1bi5cblxuICAgIE1vcmUgaW5mbzogaHR0cHM6Ly9kZXZleHByZXNzLmdpdGh1Yi5pby90ZXN0Y2FmZS9kb2N1bWVudGF0aW9uXG5gKTtcblxuaW50ZXJmYWNlIENvbW1hbmRMaW5lT3B0aW9ucyB7XG4gICAgdGVzdEdyZXA/OiBzdHJpbmcgfCBSZWdFeHA7XG4gICAgZml4dHVyZUdyZXA/OiBzdHJpbmcgfCBSZWdFeHA7XG4gICAgc3JjPzogc3RyaW5nW107XG4gICAgYnJvd3NlcnM/OiBzdHJpbmdbXTtcbiAgICBsaXN0QnJvd3NlcnM/OiBib29sZWFuIHwgc3RyaW5nO1xuICAgIHRlc3RNZXRhPzogc3RyaW5nIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICBmaXh0dXJlTWV0YT86IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gICAgZmlsdGVyPzogRnVuY3Rpb247XG4gICAgYXBwSW5pdERlbGF5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGFzc2VydGlvblRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc2VsZWN0b3JUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHNwZWVkPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHBhZ2VMb2FkVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBwYWdlUmVxdWVzdFRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgYWpheFJlcXVlc3RUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGJyb3dzZXJJbml0VGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICB0ZXN0RXhlY3V0aW9uVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBydW5FeGVjdXRpb25UaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGNvbmN1cnJlbmN5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHF1YXJhbnRpbmVNb2RlPzogYm9vbGVhbiB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICBwb3J0cz86IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3ZpZGVyTmFtZT86IHN0cmluZztcbiAgICBzc2w/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIHJlcG9ydGVyPzogc3RyaW5nIHwgUmVwb3J0ZXJPcHRpb25bXTtcbiAgICBzY3JlZW5zaG90cz86IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfCBzdHJpbmc7XG4gICAgc2NyZWVuc2hvdFBhdGhQYXR0ZXJuPzogc3RyaW5nO1xuICAgIHNjcmVlbnNob3RzT25GYWlscz86IGJvb2xlYW47XG4gICAgdmlkZW9PcHRpb25zPzogc3RyaW5nIHwgRGljdGlvbmFyeTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICB2aWRlb0VuY29kaW5nT3B0aW9ucz86IHN0cmluZyB8IERpY3Rpb25hcnk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbj47XG4gICAgY29tcGlsZXJPcHRpb25zPzogc3RyaW5nIHwgRGljdGlvbmFyeTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICBjb25maWdGaWxlPzogc3RyaW5nO1xuICAgIHByb3h5bGVzcz86IGJvb2xlYW47XG4gICAgdjhGbGFncz86IHN0cmluZ1tdO1xuICAgIGRhc2hib2FyZE9wdGlvbnM/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+O1xuICAgIGJhc2VVcmw/OiBzdHJpbmc7XG4gICAgc2tpcEpzRXJyb3JzPzogYm9vbGVhbiB8IERpY3Rpb25hcnk8UmVnRXhwIHwgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0xJQXJndW1lbnRQYXJzZXIge1xuICAgIHByaXZhdGUgY3dkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZW1vdGVDb3VudDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc0Rhc2hib2FyZENvbW1hbmQ6IGJvb2xlYW47XG4gICAgcHVibGljIHNlbmRSZXBvcnRTdGF0ZTogU2VuZFJlcG9ydFN0YXRlO1xuICAgIHB1YmxpYyBvcHRzOiBDb21tYW5kTGluZU9wdGlvbnM7XG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdENhZmVDb21tYW5kOiBDb21tYW5kO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChjd2Q/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jd2QgICAgICAgICA9IGN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICB0aGlzLnJlbW90ZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5vcHRzICAgICAgICA9IHt9O1xuICAgICAgICB0aGlzLmFyZ3MgICAgICAgID0gW107XG5cbiAgICAgICAgdGhpcy5pc0Rhc2hib2FyZENvbW1hbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50ZXN0Q2FmZUNvbW1hbmQgICAgPSB0aGlzLl9hZGRUZXN0Q2FmZUNvbW1hbmQoKTtcblxuICAgICAgICB0aGlzLl9wYXRjaEhlbHBPdXRwdXQodGhpcy50ZXN0Q2FmZUNvbW1hbmQpO1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fc2V0dXBSb290Q29tbWFuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9zZXR1cFJvb3RDb21tYW5kICgpOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGZvcmNlZCB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIHJvb3QgY29tbWFuZCB0byAndGVzdGNhZmUnXG4gICAgICAgIC8vIHRvIGF2b2lkIHRoZSBhdXRvbWF0aWMgY29tbWFuZCBuYW1lIGNhbGN1bGF0aW9uIHVzaW5nIHRoZSBleGVjdXRlZCBmaWxlIHBhdGguXG4gICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIGNvcnJlY3QgY29tbWFuZCBkZXNjcmlwdGlvbiBmb3IgbmVzdGVkIGNvbW1hbmRzLlxuICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLm5hbWUoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3JlbW92ZUNvbW1hbmRJZkV4aXN0cyAobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IEJ1ZyBpbiB0aGUgJ2NvbW1hbmRlcicgbW9kdWxlLlxuICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGFkZCBhIGZldyBjb21tYW5kcyB3aXRoIHRoZSBzYW1lIG5hbWUuXG4gICAgICAgIC8vIEFsc28sIHJlbW92aW5nIGlzIGEgYmV0dGVyIHRoYW4gY29uZGl0aW9uYWxseSBhZGRpbmdcbiAgICAgICAgLy8gYmVjYXVzZSBpdCBhbGxvd3MgYXZvaWRpbmcgdGhlIHBhcnNlZCBvcHRpb24gZHVwbGljYXRlcy5cbiAgICAgICAgY29uc3QgaW5kZXggPSAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmNvbW1hbmRzLmZpbmRJbmRleChjbWQgPT4gY21kLm5hbWUoKSA9PT0gbmFtZSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmNvbW1hbmRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2dldERlc2NyaXB0aW9uICgpOiBzdHJpbmcge1xuICAgICAgICAvLyBOT1RFOiBhZGQgZW1wdHkgbGluZSB0byB3b3JrYXJvdW5kIGNvbW1hbmRlci1mb3JjZWQgaW5kZW50YXRpb24gb24gdGhlIGZpcnN0IGxpbmUuXG4gICAgICAgIHJldHVybiAnXFxuJyArIHdvcmRXcmFwKERFU0NSSVBUSU9OLCAyLCBnZXRWaWV3UG9ydFdpZHRoKHByb2Nlc3Muc3Rkb3V0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkVGVzdENhZmVDb21tYW5kICgpOiBDb21tYW5kIHtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3JlbW92ZUNvbW1hbmRJZkV4aXN0cyhDT01NQU5EX05BTUVTLlRlc3RDYWZlKTtcblxuICAgICAgICByZXR1cm4gKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKVxuICAgICAgICAgICAgLmNvbW1hbmQoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSwgeyBpc0RlZmF1bHQ6IHRydWUgfSlcbiAgICAgICAgICAgIC52ZXJzaW9uKGdldFRlc3RjYWZlVmVyc2lvbigpLCAnLXYsIC0tdmVyc2lvbicpXG4gICAgICAgICAgICAudXNhZ2UoJ1tvcHRpb25zXSA8Y29tbWEtc2VwYXJhdGVkLWJyb3dzZXItbGlzdD4gPGZpbGUtb3ItZ2xvYiAuLi4+JylcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbihDTElBcmd1bWVudFBhcnNlci5fZ2V0RGVzY3JpcHRpb24oKSlcblxuICAgICAgICAgICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgICAgICAgICAub3B0aW9uKCctYiwgLS1saXN0LWJyb3dzZXJzIFtwcm92aWRlcl0nLCAnb3V0cHV0IHRoZSBhbGlhc2VzIGZvciBsb2NhbCBicm93c2VycyBvciBicm93c2VycyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGJyb3dzZXIgcHJvdmlkZXInKVxuICAgICAgICAgICAgLm9wdGlvbignLXIsIC0tcmVwb3J0ZXIgPG5hbWVbOm91dHB1dEZpbGVdWywuLi5dPicsICdzcGVjaWZ5IHRoZSByZXBvcnRlcnMgYW5kIG9wdGlvbmFsbHkgZmlsZXMgd2hlcmUgcmVwb3J0cyBhcmUgc2F2ZWQnKVxuICAgICAgICAgICAgLm9wdGlvbignLXMsIC0tc2NyZWVuc2hvdHMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSBzY3JlZW5zaG90IG9wdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLVMsIC0tc2NyZWVuc2hvdHMtb24tZmFpbHMnLCAndGFrZSBhIHNjcmVlbnNob3Qgd2hlbmV2ZXIgYSB0ZXN0IGZhaWxzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1wLCAtLXNjcmVlbnNob3QtcGF0aC1wYXR0ZXJuIDxwYXR0ZXJuPicsICd1c2UgcGF0dGVybnMgdG8gY29tcG9zZSBzY3JlZW5zaG90IGZpbGUgbmFtZXMgYW5kIHBhdGhzOiAke0JST1dTRVJ9LCAke0JST1dTRVJfVkVSU0lPTn0sICR7T1N9LCBldGMuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1xLCAtLXF1YXJhbnRpbmUtbW9kZSBbb3B0aW9uPXZhbHVlLC4uLl0nLCAnZW5hYmxlIHF1YXJhbnRpbmUgbW9kZSBhbmQgKG9wdGlvbmFsbHkpIG1vZGlmeSBxdWFyYW50aW5lIG1vZGUgc2V0dGluZ3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLWQsIC0tZGVidWctbW9kZScsICdleGVjdXRlIHRlc3Qgc3RlcHMgb25lIGJ5IG9uZSBwYXVzaW5nIHRoZSB0ZXN0IGFmdGVyIGVhY2ggc3RlcCcpXG4gICAgICAgICAgICAub3B0aW9uKCctZSwgLS1za2lwLWpzLWVycm9ycyBbb3B0aW9uPXZhbHVlLC4uLl0nLCAnaWdub3JlIEphdmFTY3JpcHQgZXJyb3JzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBjcml0ZXJpYScpXG4gICAgICAgICAgICAub3B0aW9uKCctdSwgLS1za2lwLXVuY2F1Z2h0LWVycm9ycycsICdpZ25vcmUgdW5jYXVnaHQgZXJyb3JzIGFuZCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zLCB3aGljaCBvY2N1ciBkdXJpbmcgdGVzdCBleGVjdXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLXQsIC0tdGVzdCA8bmFtZT4nLCAncnVuIG9ubHkgdGVzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLVQsIC0tdGVzdC1ncmVwIDxwYXR0ZXJuPicsICdydW4gb25seSB0ZXN0cyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHBhdHRlcm4nKVxuICAgICAgICAgICAgLm9wdGlvbignLWYsIC0tZml4dHVyZSA8bmFtZT4nLCAncnVuIG9ubHkgZml4dHVyZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLUYsIC0tZml4dHVyZS1ncmVwIDxwYXR0ZXJuPicsICdydW4gb25seSBmaXh0dXJlcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHBhdHRlcm4nKVxuICAgICAgICAgICAgLm9wdGlvbignLWEsIC0tYXBwIDxjb21tYW5kPicsICdsYXVuY2ggdGhlIHRlc3RlZCBhcHAgdXNpbmcgdGhlIHNwZWNpZmllZCBjb21tYW5kIGJlZm9yZSBydW5uaW5nIHRlc3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1jLCAtLWNvbmN1cnJlbmN5IDxudW1iZXI+JywgJ3J1biB0ZXN0cyBjb25jdXJyZW50bHknKVxuICAgICAgICAgICAgLm9wdGlvbignLUwsIC0tbGl2ZScsICdlbmFibGUgbGl2ZSBtb2RlLiBJbiB0aGlzIG1vZGUsIFRlc3RDYWZlIHdhdGNoZXMgZm9yIGNoYW5nZXMgeW91IG1ha2UgaW4gdGhlIHRlc3QgZmlsZXMuIFRoZXNlIGNoYW5nZXMgaW1tZWRpYXRlbHkgcmVzdGFydCB0aGUgdGVzdHMgc28gdGhhdCB5b3UgY2FuIHNlZSB0aGUgZWZmZWN0LicpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRlc3QtbWV0YSA8a2V5PXZhbHVlWyxrZXkyPXZhbHVlMiwuLi5dPicsICdydW4gb25seSB0ZXN0cyB3aXRoIG1hdGNoaW5nIG1ldGFkYXRhJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZml4dHVyZS1tZXRhIDxrZXk9dmFsdWVbLGtleTI9dmFsdWUyLC4uLl0+JywgJ3J1biBvbmx5IGZpeHR1cmVzIHdpdGggbWF0Y2hpbmcgbWV0YWRhdGEnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kZWJ1Zy1vbi1mYWlsJywgJ3BhdXNlIHRoZSB0ZXN0IGlmIGl0IGZhaWxzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYXBwLWluaXQtZGVsYXkgPG1zPicsICdzcGVjaWZ5IGhvdyBtdWNoIHRpbWUgaXQgdGFrZXMgZm9yIHRoZSB0ZXN0ZWQgYXBwIHRvIGluaXRpYWxpemUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zZWxlY3Rvci10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgdGltZSB3aXRoaW4gd2hpY2ggc2VsZWN0b3JzIG1ha2UgYXR0ZW1wdHMgdG8gb2J0YWluIGEgbm9kZSB0byBiZSByZXR1cm5lZCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFzc2VydGlvbi10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgdGltZSB3aXRoaW4gd2hpY2ggYXNzZXJ0aW9uIHNob3VsZCBwYXNzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcGFnZS1sb2FkLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSB0aW1lIHdpdGhpbiB3aGljaCBUZXN0Q2FmZSB3YWl0cyBmb3IgdGhlIGB3aW5kb3cubG9hZGAgZXZlbnQgdG8gZmlyZSBvbiBwYWdlIGxvYWQgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlIG5leHQgdGVzdCBhY3Rpb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wYWdlLXJlcXVlc3QtdGltZW91dCA8bXM+JywgXCJzcGVjaWZpZXMgdGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0IGZvciB0aGUgcGFnZSdzIEhUTUxcIilcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYWpheC1yZXF1ZXN0LXRpbWVvdXQgPG1zPicsICdzcGVjaWZpZXMgdGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGNvbXBsZXRlIHRoZSBBSkFYIHJlcXVlc3RzIChYSFIgb3IgZmV0Y2gpJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYnJvd3Nlci1pbml0LXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIFRlc3RDYWZlIHdhaXRzIGZvciB0aGUgYnJvd3NlciB0byBzdGFydCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRlc3QtZXhlY3V0aW9uLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIFRlc3RDYWZlIHdhaXRzIGZvciB0aGUgdGVzdCBleGVjdXRlZCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLXJ1bi1leGVjdXRpb24tdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgVGVzdENhZmUgd2FpdHMgZm9yIHRoZSBhbGwgdGVzdCBleGVjdXRlZCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNwZWVkIDxmYWN0b3I+JywgJ3NldCB0aGUgc3BlZWQgb2YgdGVzdCBleGVjdXRpb24gKDAuMDEgLi4uIDEpJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcG9ydHMgPHBvcnQxLHBvcnQyPicsICdzcGVjaWZ5IGN1c3RvbSBwb3J0IG51bWJlcnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1ob3N0bmFtZSA8bmFtZT4nLCAnc3BlY2lmeSB0aGUgaG9zdG5hbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wcm94eSA8aG9zdD4nLCAnc3BlY2lmeSB0aGUgaG9zdCBvZiB0aGUgcHJveHkgc2VydmVyJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcHJveHktYnlwYXNzIDxydWxlcz4nLCAnc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJ1bGVzIHRoYXQgZGVmaW5lIFVSTHMgYWNjZXNzZWQgYnlwYXNzaW5nIHRoZSBwcm94eSBzZXJ2ZXInKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zc2wgPG9wdGlvbnM+JywgJ3NwZWNpZnkgU1NMIG9wdGlvbnMgdG8gcnVuIFRlc3RDYWZlIHByb3h5IHNlcnZlciBvdmVyIHRoZSBIVFRQUyBwcm90b2NvbCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvIDxwYXRoPicsICdyZWNvcmQgdmlkZW9zIG9mIHRlc3QgcnVucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSB2aWRlbyByZWNvcmRpbmcgb3B0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvLWVuY29kaW5nLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSBlbmNvZGluZyBvcHRpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGV2JywgJ2VuYWJsZXMgbWVjaGFuaXNtcyB0byBsb2cgYW5kIGRpYWdub3NlIGVycm9ycycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXFyLWNvZGUnLCAnb3V0cHV0cyBRUi1jb2RlIHRoYXQgcmVwZWF0cyBVUkxzIHVzZWQgdG8gY29ubmVjdCB0aGUgcmVtb3RlIGJyb3dzZXJzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tc2YsIC0tc3RvcC1vbi1maXJzdC1mYWlsJywgJ3N0b3AgYW4gZW50aXJlIHRlc3QgcnVuIGlmIGFueSB0ZXN0IGZhaWxzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29uZmlnLWZpbGUgPHBhdGg+JywgJ3NwZWNpZnkgYSBjdXN0b20gcGF0aCB0byB0aGUgdGVzdGNhZmUgY29uZmlndXJhdGlvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdHMtY29uZmlnLXBhdGggPHBhdGg+JywgJ3VzZSBhIGN1c3RvbSBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgc3BlY2lmeSBpdHMgbG9jYXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jcywgLS1jbGllbnQtc2NyaXB0cyA8cGF0aHM+JywgJ2luamVjdCBzY3JpcHRzIGludG8gdGVzdGVkIHBhZ2VzJywgcGFyc2VMaXN0LCBbXSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1wYWdlLWNhY2hpbmcnLCAnZGlzYWJsZSBwYWdlIGNhY2hpbmcgZHVyaW5nIHRlc3QgZXhlY3V0aW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1wYWdlLXJlbG9hZHMnLCAnZGlzYWJsZSBwYWdlIHJlbG9hZHMgYmV0d2VlbiB0ZXN0cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXJldHJ5LXRlc3QtcGFnZXMnLCAncmV0cnkgbmV0d29yayByZXF1ZXN0cyB0byB0ZXN0IHBhZ2VzIGR1cmluZyB0ZXN0IGV4ZWN1dGlvbicpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtc2NyZWVuc2hvdHMnLCAnZGlzYWJsZSBzY3JlZW5zaG90cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNjcmVlbnNob3RzLWZ1bGwtcGFnZScsICdlbmFibGUgZnVsbC1wYWdlIHNjcmVlbnNob3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29tcGlsZXItb3B0aW9ucyA8b3B0aW9uPXZhbHVlWywuLi5dPicsICdzcGVjaWZ5IHRlc3QgZmlsZSBjb21waWxlciBvcHRpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1tdWx0aXBsZS13aW5kb3dzJywgJ2Rpc2FibGUgbXVsdGlwbGUgd2luZG93cyBtb2RlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1odHRwMicsICdkaXNhYmxlIHRoZSBIVFRQLzIgcHJveHkgYmFja2VuZCBhbmQgZm9yY2UgdGhlIHByb3h5IHRvIHVzZSBvbmx5IEhUVFAvMS4xIHJlcXVlc3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY2FjaGUnLCAnY2FjaGUgd2ViIGFzc2V0cyBiZXR3ZWVuIHRlc3QgcnVucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWJhc2UtdXJsIDx1cmw+JywgJ3NldCB0aGUgYmFzZSB1cmwgZm9yIGFsbCB0ZXN0cycpXG5cbiAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIG9wdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IGNoYWxrIGludGVybmFsbHlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29sb3InLCAnZm9yY2UgY29sb3JzIGluIGNvbW1hbmQgbGluZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLW5vLWNvbG9yJywgJ2Rpc2FibGUgY29sb3JzIGluIGNvbW1hbmQgbGluZScpXG5cbiAgICAgICAgICAgIC8vIE5PVEU6IHRlbXBvcmFyeSBoaWRlIGV4cGVyaW1lbnRhbCBvcHRpb25zIGZyb20gLS1oZWxwIGNvbW1hbmRcbiAgICAgICAgICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1wcm94eWxlc3MnLCAnZXhwZXJpbWVudGFsJykuaGlkZUhlbHAoKSlcbiAgICAgICAgICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1leHBlcmltZW50YWwtZGVidWcnLCAnZW5hYmxlIGV4cGVyaW1lbnRhbCBkZWJ1ZyBtb2RlJykuaGlkZUhlbHAoKSlcbiAgICAgICAgICAgIC5hY3Rpb24oKG9wdHM6IENvbW1hbmRMaW5lT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXRjaEhlbHBPdXRwdXQgKGRlZmF1bHRTdWJDb21tYW5kOiBDb21tYW5kKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IEluIHRoZSBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlICdjb21tYW5kZXInIG1vZHVsZVxuICAgICAgICAvLyBuZWVkIHRvIGludmVzdGlnYXRlIGhvdyB0byByZW1vdmUgdGhpcyBoYWNrLlxuICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLm91dHB1dEhlbHAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZWRQYXJlbnQgPSBkZWZhdWx0U3ViQ29tbWFuZC5wYXJlbnQ7XG5cbiAgICAgICAgICAgIGRlZmF1bHRTdWJDb21tYW5kLnBhcmVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIGRlZmF1bHRTdWJDb21tYW5kLm91dHB1dEhlbHAoKTtcblxuICAgICAgICAgICAgZGVmYXVsdFN1YkNvbW1hbmQucGFyZW50ID0gc3RvcmVkUGFyZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrQW5kQ291bnRSZW1vdGVzIChicm93c2VyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcmVtb3RlTWF0Y2ggPSBicm93c2VyLm1hdGNoKFJFTU9URV9BTElBU19SRSk7XG5cbiAgICAgICAgaWYgKHJlbW90ZU1hdGNoKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZUNvdW50ICs9IHBhcnNlSW50KHJlbW90ZU1hdGNoWzFdLCAxMCkgfHwgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9wYXJzZUZpbHRlcmluZ09wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRlc3RHcmVwKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnRlc3RHcmVwID0gZ2V0R3JlcE9wdGlvbnMoJy0tdGVzdC1ncmVwJywgdGhpcy5vcHRzLnRlc3RHcmVwIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5maXh0dXJlR3JlcClcbiAgICAgICAgICAgIHRoaXMub3B0cy5maXh0dXJlR3JlcCA9IGdldEdyZXBPcHRpb25zKCctLWZpeHR1cmUtZ3JlcCcsIHRoaXMub3B0cy5maXh0dXJlR3JlcCBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMudGVzdE1ldGEpXG4gICAgICAgICAgICB0aGlzLm9wdHMudGVzdE1ldGEgPSBhd2FpdCBnZXRNZXRhT3B0aW9ucygnLS10ZXN0LW1ldGEnLCB0aGlzLm9wdHMudGVzdE1ldGEgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLmZpeHR1cmVNZXRhKVxuICAgICAgICAgICAgdGhpcy5vcHRzLmZpeHR1cmVNZXRhID0gYXdhaXQgZ2V0TWV0YU9wdGlvbnMoJy0tZml4dHVyZS1tZXRhJywgdGhpcy5vcHRzLmZpeHR1cmVNZXRhIGFzIHN0cmluZyk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmZpbHRlciA9IGdldEZpbHRlckZuKHRoaXMub3B0cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VBcHBJbml0RGVsYXkgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmFwcEluaXREZWxheSkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSB0ZXN0ZWQgYXBwIGluaXRpYWxpemF0aW9uIGRlbGF5JywgdGhpcy5vcHRzLmFwcEluaXREZWxheSk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5hcHBJbml0RGVsYXkgPSBwYXJzZUludCh0aGlzLm9wdHMuYXBwSW5pdERlbGF5IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VTZWxlY3RvclRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBTZWxlY3RvciB0aW1lb3V0JywgdGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VBc3NlcnRpb25UaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIGFzc2VydGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLmFzc2VydGlvblRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VQYWdlTG9hZFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBwYWdlIGxvYWQgdGltZW91dCcsIHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUGFnZVJlcXVlc3RUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMucGFnZVJlcXVlc3RUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgcGFnZSByZXF1ZXN0IHRpbWVvdXQnLCB0aGlzLm9wdHMucGFnZVJlcXVlc3RUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLm9wdHMucGFnZVJlcXVlc3RUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUFqYXhSZXF1ZXN0VGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLmFqYXhSZXF1ZXN0VGltZW91dClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIEFKQVggcmVxdWVzdCB0aW1lb3V0JywgdGhpcy5vcHRzLmFqYXhSZXF1ZXN0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmFqYXhSZXF1ZXN0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VCcm93c2VySW5pdFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5icm93c2VySW5pdFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBicm93c2VyIGluaXRpYWxpemF0aW9uIHRpbWVvdXQnLCB0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVRlc3RFeGVjdXRpb25UaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSB0ZXN0IGV4ZWN1dGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLnRlc3RFeGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnRlc3RFeGVjdXRpb25UaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnRlc3RFeGVjdXRpb25UaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VSdW5FeGVjdXRpb25UaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHJ1biBleGVjdXRpb24gdGltZW91dCcsIHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlU3BlZWQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNwZWVkKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNwZWVkID0gcGFyc2VGbG9hdCh0aGlzLm9wdHMuc3BlZWQgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUNvbmN1cnJlbmN5ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5jb25jdXJyZW5jeSlcbiAgICAgICAgICAgIHRoaXMub3B0cy5jb25jdXJyZW5jeSA9IHBhcnNlSW50KHRoaXMub3B0cy5jb25jdXJyZW5jeSBhcyBzdHJpbmcsIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVF1YXJhbnRpbmVPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSlcbiAgICAgICAgICAgIHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSA9IGF3YWl0IGdldFF1YXJhbnRpbmVPcHRpb25zKCctLXF1YXJhbnRpbmUtbW9kZScsIHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VTa2lwSnNFcnJvcnNPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5za2lwSnNFcnJvcnMpXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2tpcEpzRXJyb3JzID0gYXdhaXQgZ2V0U2tpcEpzRXJyb3JzT3B0aW9ucygnLS1za2lwLWpzLWVycm9ycycsIHRoaXMub3B0cy5za2lwSnNFcnJvcnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUG9ydHMgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBvcnRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRQb3J0cyA9ICh0aGlzLm9wdHMucG9ydHMgYXMgc3RyaW5nKSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV4dHJhLXBhcmVucyAqL1xuICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgLm1hcChwYXJzZVBvcnROdW1iZXIpO1xuXG4gICAgICAgICAgICBpZiAocGFyc2VkUG9ydHMubGVuZ3RoIDwgMilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLnBvcnRzT3B0aW9uUmVxdWlyZXNUd29OdW1iZXJzKTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnBvcnRzID0gcGFyc2VkUG9ydHMgYXMgbnVtYmVyW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUJyb3dzZXJzRnJvbUFyZ3MgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBicm93c2Vyc0FyZyA9IHRoaXMudGVzdENhZmVDb21tYW5kLmFyZ3NbMF0gfHwgJyc7XG5cbiAgICAgICAgdGhpcy5vcHRzLmJyb3dzZXJzID0gc3BsaXRRdW90ZWRUZXh0KGJyb3dzZXJzQXJnLCAnLCcpXG4gICAgICAgICAgICAuZmlsdGVyKGJyb3dzZXIgPT4gYnJvd3NlciAmJiB0aGlzLl9jaGVja0FuZENvdW50UmVtb3Rlcyhicm93c2VyKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9wYXJzZVNzbE9wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNzbClcbiAgICAgICAgICAgIHRoaXMub3B0cy5zc2wgPSBhd2FpdCBnZXRTU0xPcHRpb25zKHRoaXMub3B0cy5zc2wgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVJlcG9ydGVycyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcG9ydGVycyA9IHRoaXMub3B0cy5yZXBvcnRlciA/ICh0aGlzLm9wdHMucmVwb3J0ZXIgYXMgc3RyaW5nKS5zcGxpdCgnLCcpIDogW107IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXh0cmEtcGFyZW5zKi9cblxuICAgICAgICB0aGlzLm9wdHMucmVwb3J0ZXIgPSByZXBvcnRlcnMubWFwKChyZXBvcnRlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHJlcG9ydGVyLmluZGV4T2YoJzonKTtcblxuICAgICAgICAgICAgaWYgKHNlcGFyYXRvckluZGV4IDwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiByZXBvcnRlciB9O1xuXG4gICAgICAgICAgICBjb25zdCBuYW1lICAgPSByZXBvcnRlci5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gcmVwb3J0ZXIuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IG5hbWUsIG91dHB1dCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUZpbGVMaXN0ICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcHRzLnNyYyA9IHRoaXMudGVzdENhZmVDb21tYW5kLmFyZ3Muc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VTY3JlZW5zaG90T3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc2NyZWVuc2hvdHMpXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHMgPSBhd2FpdCBnZXRTY3JlZW5zaG90T3B0aW9ucyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHMgPSB7fTtcblxuICAgICAgICBpZiAoIWhhcyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMsIFNDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnBhdGhQYXR0ZXJuKSAmJiB0aGlzLm9wdHMuc2NyZWVuc2hvdFBhdGhQYXR0ZXJuKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNjcmVlbnNob3RzW1NDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnBhdGhQYXR0ZXJuXSA9IHRoaXMub3B0cy5zY3JlZW5zaG90UGF0aFBhdHRlcm47XG5cbiAgICAgICAgaWYgKCFoYXModGhpcy5vcHRzLnNjcmVlbnNob3RzLCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy50YWtlT25GYWlscykgJiYgdGhpcy5vcHRzLnNjcmVlbnNob3RzT25GYWlscylcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90c1tTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy50YWtlT25GYWlsc10gPSB0aGlzLm9wdHMuc2NyZWVuc2hvdHNPbkZhaWxzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlVmlkZW9PcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy52aWRlb09wdGlvbnMpXG4gICAgICAgICAgICB0aGlzLm9wdHMudmlkZW9PcHRpb25zID0gYXdhaXQgZ2V0VmlkZW9PcHRpb25zKHRoaXMub3B0cy52aWRlb09wdGlvbnMgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zID0gYXdhaXQgZ2V0VmlkZW9PcHRpb25zKHRoaXMub3B0cy52aWRlb0VuY29kaW5nT3B0aW9ucyBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlQ29tcGlsZXJPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuY29tcGlsZXJPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZENvbXBpbGVyT3B0aW9ucyA9IGF3YWl0IGdldENvbXBpbGVyT3B0aW9ucyh0aGlzLm9wdHMuY29tcGlsZXJPcHRpb25zIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdENvbXBpbGVyT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29tcGlsZXJPcHRpb25zKSlcbiAgICAgICAgICAgIHNldChyZXN1bHRDb21waWxlck9wdGlvbnMsIGtleSwgdmFsdWUpO1xuXG4gICAgICAgIHRoaXMub3B0cy5jb21waWxlck9wdGlvbnMgPSByZXN1bHRDb21waWxlck9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VEYXNoYm9hcmRPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5kYXNoYm9hcmRPcHRpb25zKVxuICAgICAgICAgICAgdGhpcy5vcHRzLmRhc2hib2FyZE9wdGlvbnMgPSBhd2FpdCBnZXREYXNoYm9hcmRPcHRpb25zKHRoaXMub3B0cy5kYXNoYm9hcmRPcHRpb25zIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VMaXN0QnJvd3NlcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0QnJvd3Nlck9wdGlvbiA9IHRoaXMub3B0cy5saXN0QnJvd3NlcnM7XG5cbiAgICAgICAgdGhpcy5vcHRzLmxpc3RCcm93c2VycyA9ICEhdGhpcy5vcHRzLmxpc3RCcm93c2VycztcblxuICAgICAgICBpZiAoIXRoaXMub3B0cy5saXN0QnJvd3NlcnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5vcHRzLnByb3ZpZGVyTmFtZSA9IHR5cGVvZiBsaXN0QnJvd3Nlck9wdGlvbiA9PT0gJ3N0cmluZycgPyBsaXN0QnJvd3Nlck9wdGlvbiA6ICdsb2NhbGx5LWluc3RhbGxlZCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3ByZXBhcmVCb29sZWFuT3JPYmplY3RPcHRpb24gKGFyZ3Y6IHN0cmluZ1tdLCBvcHRpb25OYW1lczogc3RyaW5nW10sIHN1Yk9wdGlvbnNOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogbW92ZSBvcHRpb25zIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IHRvIGNvcnJlY3RseSBwYXJzZSBib3RoIEJvb2xlYW4gYW5kIE9iamVjdCB0eXBlIGFyZ3VtZW50cyAoR0gtNjIzMSlcbiAgICAgICAgY29uc3Qgb3B0aW9uSW5kZXggPSBhcmd2LmZpbmRJbmRleChcbiAgICAgICAgICAgIGVsID0+IG9wdGlvbk5hbWVzLnNvbWUob3B0ID0+IGVsLnN0YXJ0c1dpdGgob3B0KSkpO1xuXG4gICAgICAgIGlmIChvcHRpb25JbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBpc05vdExhc3RPcHRpb24gICAgICAgPSBvcHRpb25JbmRleCA8IGFyZ3YubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZE1vdmVPcHRpb25Ub0VuZCA9IGlzTm90TGFzdE9wdGlvbiAmJlxuICAgICAgICAgICAgICAgICFzdWJPcHRpb25zTmFtZXMuc29tZShvcHQgPT4gYXJndltvcHRpb25JbmRleCArIDFdLnN0YXJ0c1dpdGgob3B0KSk7XG5cbiAgICAgICAgICAgIGlmIChzaG91bGRNb3ZlT3B0aW9uVG9FbmQpXG4gICAgICAgICAgICAgICAgYXJndi5wdXNoKGFyZ3Yuc3BsaWNlKG9wdGlvbkluZGV4LCAxKVswXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcGFyc2UgKGFyZ3Y6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIENMSUFyZ3VtZW50UGFyc2VyLl9wcmVwYXJlQm9vbGVhbk9yT2JqZWN0T3B0aW9uKGFyZ3YsIFsnLXEnLCAnLS1xdWFyYW50aW5lLW1vZGUnXSwgT2JqZWN0LnZhbHVlcyhRVUFSQU5USU5FX09QVElPTl9OQU1FUykpO1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fcHJlcGFyZUJvb2xlYW5Pck9iamVjdE9wdGlvbihhcmd2LCBbJy1lJywgJy0tc2tpcC1qcy1lcnJvcnMnXSwgT2JqZWN0LnZhbHVlcyhTS0lQX0pTX0VSUk9SU19PUFRJT05fTkFNRVMpKTtcblxuICAgICAgICBjb25zdCB7IGFyZ3MsIHY4RmxhZ3MgfSA9IGV4dHJhY3ROb2RlUHJvY2Vzc0FyZ3VtZW50cyhhcmd2KTtcblxuICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLnBhcnNlKGFyZ3MpO1xuXG4gICAgICAgIHRoaXMuYXJncyA9IChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkuYXJncztcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIHsgdjhGbGFncyB9KTtcblxuICAgICAgICB0aGlzLl9wYXJzZUxpc3RCcm93c2VycygpO1xuXG4gICAgICAgIC8vIE5PVEU6IHRoZSAnLS1saXN0LWJyb3dzZXJzJyBvcHRpb24gb25seSBsaXN0cyBicm93c2VycyBhbmQgaW1tZWRpYXRlbHkgZXhpdHMgdGhlIGFwcC5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIHByb2Nlc3Mgb3RoZXIgYXJndW1lbnRzLlxuICAgICAgICBpZiAodGhpcy5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLl9wYXJzZVNlbGVjdG9yVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUFzc2VydGlvblRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VQYWdlTG9hZFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VQYWdlUmVxdWVzdFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VBamF4UmVxdWVzdFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VCcm93c2VySW5pdFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VUZXN0RXhlY3V0aW9uVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVJ1bkV4ZWN1dGlvblRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VBcHBJbml0RGVsYXkoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VTcGVlZCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVBvcnRzKCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQnJvd3NlcnNGcm9tQXJncygpO1xuICAgICAgICB0aGlzLl9wYXJzZUNvbmN1cnJlbmN5KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlRmlsZUxpc3QoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZUZpbHRlcmluZ09wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VRdWFyYW50aW5lT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVNraXBKc0Vycm9yc09wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VTY3JlZW5zaG90T3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVZpZGVvT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZUNvbXBpbGVyT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVNzbE9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VSZXBvcnRlcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VEYXNoYm9hcmRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJ1bk9wdGlvbnMgKCk6IFJ1bm5lclJ1bk9wdGlvbnMge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIFJVTl9PUFRJT05fTkFNRVMuZm9yRWFjaChvcHRpb25OYW1lID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25OYW1lIGluIHRoaXMub3B0cylcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGEgaGFjayB0byBhZGQgYW4gaW5kZXggc2lnbmF0dXJlIHRvIGludGVyZmFjZVxuICAgICAgICAgICAgICAgIHJlc3VsdFtvcHRpb25OYW1lXSA9IHRoaXMub3B0c1tvcHRpb25OYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBSdW5uZXJSdW5PcHRpb25zO1xuICAgIH1cbn1cbiJdfQ==
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseList = exports.parsePortNumber = void 0;
4
4
  const type_assertions_1 = require("../../errors/runtime/type-assertions");
5
5
  function parsePortNumber(value) {
6
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumberString, null, 'The port number', value);
6
+ (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumberString, null, 'The port number', value);
7
7
  return parseInt(value, 10);
8
8
  }
9
9
  exports.parsePortNumber = parsePortNumber;
@@ -11,4 +11,4 @@ function parseList(val) {
11
11
  return val.split(',');
12
12
  }
13
13
  exports.parseList = parseList;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9wYXJzZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwRUFBc0U7QUFFdEUsU0FBZ0IsZUFBZSxDQUFFLEtBQWE7SUFDMUMsNEJBQVUsQ0FBQyxvQkFBRSxDQUFDLHVCQUF1QixFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV2RSxPQUFPLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUpELDBDQUlDO0FBRUQsU0FBZ0IsU0FBUyxDQUFFLEdBQVc7SUFDbEMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFGRCw4QkFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzc2VydFR5cGUsIGlzIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUvdHlwZS1hc3NlcnRpb25zJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG9ydE51bWJlciAodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBwb3J0IG51bWJlcicsIHZhbHVlKTtcblxuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaXN0ICh2YWw6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdmFsLnNwbGl0KCcsJyk7XG59XG5cbiJdfQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9wYXJzZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwRUFBc0U7QUFFdEUsU0FBZ0IsZUFBZSxDQUFFLEtBQWE7SUFDMUMsSUFBQSw0QkFBVSxFQUFDLG9CQUFFLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXZFLE9BQU8sUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBSkQsMENBSUM7QUFFRCxTQUFnQixTQUFTLENBQUUsR0FBVztJQUNsQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUZELDhCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0VHlwZSwgaXMgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZS90eXBlLWFzc2VydGlvbnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3J0TnVtYmVyICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHBvcnQgbnVtYmVyJywgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpc3QgKHZhbDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB2YWwuc3BsaXQoJywnKTtcbn1cblxuIl19
@@ -10,7 +10,7 @@ const constants_1 = __importDefault(require("../configuration/constants"));
10
10
  const timer_1 = __importDefault(require("../utils/timer"));
11
11
  const get_any_key_1 = __importDefault(require("../utils/get-any-key"));
12
12
  const { MAX_AUTHENTICATION_DELAY } = constants_1.default.CLI.AUTHENTICATION_HELPER;
13
- const debugLog = debug_1.default('testcafe:cli:authentication-helper');
13
+ const debugLog = (0, debug_1.default)('testcafe:cli:authentication-helper');
14
14
  async function checkAuthentication(action, errorClass) {
15
15
  try {
16
16
  return { result: await action() };
@@ -27,11 +27,11 @@ async function authenticationHelper(action, errorClass, { interactive = true } =
27
27
  while (error && !timer.expired && interactive) {
28
28
  debugLog(error);
29
29
  log_1.default.write(information_message_1.SCREEN_RECORDING_PERMISSION_REQUEST);
30
- await Promise.race([timer.promise, get_any_key_1.default()]);
30
+ await Promise.race([timer.promise, (0, get_any_key_1.default)()]);
31
31
  ({ result, error } = await checkAuthentication(action, errorClass));
32
32
  }
33
33
  return { result, error };
34
34
  }
35
35
  exports.default = authenticationHelper;
36
36
  module.exports = exports.default;
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24taGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9hdXRoZW50aWNhdGlvbi1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsZ0RBQXdCO0FBQ3hCLDhFQUEyRjtBQUMzRiwyRUFBbUQ7QUFDbkQsMkRBQW1DO0FBQ25DLHVFQUE2QztBQUc3QyxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxtQkFBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztBQUV6RSxNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQWU3RCxLQUFLLFVBQVUsbUJBQW1CLENBQXVCLE1BQWlCLEVBQUUsVUFBMEI7SUFDbEcsSUFBSTtRQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLEVBQUUsRUFBRSxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxLQUFLLEVBQUU7UUFDVixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDO1lBQzlCLE1BQU0sS0FBSyxDQUFDO1FBRWhCLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUNwQjtBQUNMLENBQUM7QUFFYyxLQUFLLFVBQVUsb0JBQW9CLENBQzlDLE1BQWlCLEVBQ2pCLFVBQTBCLEVBQzFCLEVBQUUsV0FBVyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUU7SUFFM0IsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUV0RSxNQUFNLEtBQUssR0FBRyxJQUFJLGVBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBRWxELE9BQU8sS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxXQUFXLEVBQUU7UUFDM0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhCLGFBQUcsQ0FBQyxLQUFLLENBQUMseURBQW1DLENBQUMsQ0FBQztRQUUvQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLHFCQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakQsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBcEJELHVDQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7IFNDUkVFTl9SRUNPUkRJTkdfUEVSTUlTU0lPTl9SRVFVRVNUIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9ucy9pbmZvcm1hdGlvbi1tZXNzYWdlJztcbmltcG9ydCBDT05TVEFOVFMgZnJvbSAnLi4vY29uZmlndXJhdGlvbi9jb25zdGFudHMnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4uL3V0aWxzL3RpbWVyJztcbmltcG9ydCBnZXRBbnlLZXkgZnJvbSAnLi4vdXRpbHMvZ2V0LWFueS1rZXknO1xuXG5cbmNvbnN0IHsgTUFYX0FVVEhFTlRJQ0FUSU9OX0RFTEFZIH0gPSBDT05TVEFOVFMuQ0xJLkFVVEhFTlRJQ0FUSU9OX0hFTFBFUjtcblxuY29uc3QgZGVidWdMb2cgPSBkZWJ1ZygndGVzdGNhZmU6Y2xpOmF1dGhlbnRpY2F0aW9uLWhlbHBlcicpO1xuXG5pbnRlcmZhY2UgQWN0aW9uPFQ+IHtcbiAgICAoKTogUHJvbWlzZTxUPjtcbn1cblxuaW50ZXJmYWNlIENvbnN0cnVjdG9yPEM+IHtcbiAgICBuZXcgKCk6IEM7XG59XG5cbmludGVyZmFjZSBBdXRoZW50aWNhdGlvblJlc3VsdDxULCBFIGV4dGVuZHMgRXJyb3I+IHtcbiAgICByZXN1bHQ/OiBUO1xuICAgIGVycm9yPzogRTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tBdXRoZW50aWNhdGlvbiA8VCwgRSBleHRlbmRzIEVycm9yPiAoYWN0aW9uOiBBY3Rpb248VD4sIGVycm9yQ2xhc3M6IENvbnN0cnVjdG9yPEU+KTogUHJvbWlzZTxBdXRoZW50aWNhdGlvblJlc3VsdDxULCBFPj4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdDogYXdhaXQgYWN0aW9uKCkgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgZXJyb3JDbGFzcykpXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcblxuICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gYXV0aGVudGljYXRpb25IZWxwZXIgPFQsIEUgZXh0ZW5kcyBFcnJvcj4gKFxuICAgIGFjdGlvbjogQWN0aW9uPFQ+LFxuICAgIGVycm9yQ2xhc3M6IENvbnN0cnVjdG9yPEU+LFxuICAgIHsgaW50ZXJhY3RpdmUgPSB0cnVlIH0gPSB7fVxuKTogUHJvbWlzZTxBdXRoZW50aWNhdGlvblJlc3VsdDxULCBFPj4ge1xuICAgIGxldCB7IHJlc3VsdCwgZXJyb3IgfSA9IGF3YWl0IGNoZWNrQXV0aGVudGljYXRpb24oYWN0aW9uLCBlcnJvckNsYXNzKTtcblxuICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKE1BWF9BVVRIRU5USUNBVElPTl9ERUxBWSk7XG5cbiAgICB3aGlsZSAoZXJyb3IgJiYgIXRpbWVyLmV4cGlyZWQgJiYgaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgZGVidWdMb2coZXJyb3IpO1xuXG4gICAgICAgIGxvZy53cml0ZShTQ1JFRU5fUkVDT1JESU5HX1BFUk1JU1NJT05fUkVRVUVTVCk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFt0aW1lci5wcm9taXNlLCBnZXRBbnlLZXkoKV0pO1xuXG4gICAgICAgICh7IHJlc3VsdCwgZXJyb3IgfSA9IGF3YWl0IGNoZWNrQXV0aGVudGljYXRpb24oYWN0aW9uLCBlcnJvckNsYXNzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcmVzdWx0LCBlcnJvciB9O1xufVxuIl19
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24taGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9hdXRoZW50aWNhdGlvbi1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsZ0RBQXdCO0FBQ3hCLDhFQUEyRjtBQUMzRiwyRUFBbUQ7QUFDbkQsMkRBQW1DO0FBQ25DLHVFQUE2QztBQUc3QyxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxtQkFBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztBQUV6RSxNQUFNLFFBQVEsR0FBRyxJQUFBLGVBQUssRUFBQyxvQ0FBb0MsQ0FBQyxDQUFDO0FBZTdELEtBQUssVUFBVSxtQkFBbUIsQ0FBdUIsTUFBaUIsRUFBRSxVQUEwQjtJQUNsRyxJQUFJO1FBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sRUFBRSxFQUFFLENBQUM7S0FDckM7SUFDRCxPQUFPLEtBQUssRUFBRTtRQUNWLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUM7WUFDOUIsTUFBTSxLQUFLLENBQUM7UUFFaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0tBQ3BCO0FBQ0wsQ0FBQztBQUVjLEtBQUssVUFBVSxvQkFBb0IsQ0FDOUMsTUFBaUIsRUFDakIsVUFBMEIsRUFDMUIsRUFBRSxXQUFXLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRTtJQUUzQixJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sS0FBSyxHQUFHLElBQUksZUFBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFbEQsT0FBTyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLFdBQVcsRUFBRTtRQUMzQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEIsYUFBRyxDQUFDLEtBQUssQ0FBQyx5REFBbUMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBQSxxQkFBUyxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWpELENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztLQUN2RTtJQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQXBCRCx1Q0FvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgeyBTQ1JFRU5fUkVDT1JESU5HX1BFUk1JU1NJT05fUkVRVUVTVCB9IGZyb20gJy4uL25vdGlmaWNhdGlvbnMvaW5mb3JtYXRpb24tbWVzc2FnZSc7XG5pbXBvcnQgQ09OU1RBTlRTIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vY29uc3RhbnRzJztcbmltcG9ydCBUaW1lciBmcm9tICcuLi91dGlscy90aW1lcic7XG5pbXBvcnQgZ2V0QW55S2V5IGZyb20gJy4uL3V0aWxzL2dldC1hbnkta2V5JztcblxuXG5jb25zdCB7IE1BWF9BVVRIRU5USUNBVElPTl9ERUxBWSB9ID0gQ09OU1RBTlRTLkNMSS5BVVRIRU5USUNBVElPTl9IRUxQRVI7XG5cbmNvbnN0IGRlYnVnTG9nID0gZGVidWcoJ3Rlc3RjYWZlOmNsaTphdXRoZW50aWNhdGlvbi1oZWxwZXInKTtcblxuaW50ZXJmYWNlIEFjdGlvbjxUPiB7XG4gICAgKCk6IFByb21pc2U8VD47XG59XG5cbmludGVyZmFjZSBDb25zdHJ1Y3RvcjxDPiB7XG4gICAgbmV3ICgpOiBDO1xufVxuXG5pbnRlcmZhY2UgQXV0aGVudGljYXRpb25SZXN1bHQ8VCwgRSBleHRlbmRzIEVycm9yPiB7XG4gICAgcmVzdWx0PzogVDtcbiAgICBlcnJvcj86IEU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrQXV0aGVudGljYXRpb24gPFQsIEUgZXh0ZW5kcyBFcnJvcj4gKGFjdGlvbjogQWN0aW9uPFQ+LCBlcnJvckNsYXNzOiBDb25zdHJ1Y3RvcjxFPik6IFByb21pc2U8QXV0aGVudGljYXRpb25SZXN1bHQ8VCwgRT4+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IGF3YWl0IGFjdGlvbigpIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIGVycm9yQ2xhc3MpKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGF1dGhlbnRpY2F0aW9uSGVscGVyIDxULCBFIGV4dGVuZHMgRXJyb3I+IChcbiAgICBhY3Rpb246IEFjdGlvbjxUPixcbiAgICBlcnJvckNsYXNzOiBDb25zdHJ1Y3RvcjxFPixcbiAgICB7IGludGVyYWN0aXZlID0gdHJ1ZSB9ID0ge31cbik6IFByb21pc2U8QXV0aGVudGljYXRpb25SZXN1bHQ8VCwgRT4+IHtcbiAgICBsZXQgeyByZXN1bHQsIGVycm9yIH0gPSBhd2FpdCBjaGVja0F1dGhlbnRpY2F0aW9uKGFjdGlvbiwgZXJyb3JDbGFzcyk7XG5cbiAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcihNQVhfQVVUSEVOVElDQVRJT05fREVMQVkpO1xuXG4gICAgd2hpbGUgKGVycm9yICYmICF0aW1lci5leHBpcmVkICYmIGludGVyYWN0aXZlKSB7XG4gICAgICAgIGRlYnVnTG9nKGVycm9yKTtcblxuICAgICAgICBsb2cud3JpdGUoU0NSRUVOX1JFQ09SRElOR19QRVJNSVNTSU9OX1JFUVVFU1QpO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbdGltZXIucHJvbWlzZSwgZ2V0QW55S2V5KCldKTtcblxuICAgICAgICAoeyByZXN1bHQsIGVycm9yIH0gPSBhd2FpdCBjaGVja0F1dGhlbnRpY2F0aW9uKGFjdGlvbiwgZXJyb3JDbGFzcykpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJlc3VsdCwgZXJyb3IgfTtcbn1cbiJdfQ==