appium 2.0.0-beta.2 → 2.0.0-beta.23

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 (122) hide show
  1. package/README.md +9 -9
  2. package/build/check-npm-pack-files.js +23 -0
  3. package/build/commands-yml/parse.js +319 -0
  4. package/build/commands-yml/validator.js +130 -0
  5. package/build/index.js +19 -0
  6. package/build/lib/appium-config.schema.json +0 -0
  7. package/build/lib/appium.js +160 -53
  8. package/build/lib/cli/args.js +115 -279
  9. package/build/lib/cli/driver-command.js +11 -1
  10. package/build/lib/cli/extension-command.js +60 -8
  11. package/build/lib/cli/extension.js +30 -7
  12. package/build/lib/cli/npm.js +43 -29
  13. package/build/lib/cli/parser.js +156 -89
  14. package/build/lib/cli/plugin-command.js +11 -1
  15. package/build/lib/cli/utils.js +29 -3
  16. package/build/lib/config-file.js +141 -0
  17. package/build/lib/config.js +53 -65
  18. package/build/lib/driver-config.js +42 -19
  19. package/build/lib/drivers.js +8 -4
  20. package/build/lib/ext-config-io.js +165 -0
  21. package/build/lib/extension-config.js +130 -61
  22. package/build/lib/grid-register.js +22 -24
  23. package/build/lib/logger.js +3 -3
  24. package/build/lib/logsink.js +11 -13
  25. package/build/lib/main.js +197 -77
  26. package/build/lib/plugin-config.js +21 -11
  27. package/build/lib/plugins.js +4 -2
  28. package/build/lib/schema/appium-config-schema.js +253 -0
  29. package/build/lib/schema/arg-spec.js +120 -0
  30. package/build/lib/schema/cli-args.js +188 -0
  31. package/build/lib/schema/cli-transformers.js +76 -0
  32. package/build/lib/schema/index.js +36 -0
  33. package/build/lib/schema/keywords.js +72 -0
  34. package/build/lib/schema/schema.js +357 -0
  35. package/build/lib/utils.js +44 -99
  36. package/build/postinstall.js +90 -0
  37. package/build/test/cli/cli-e2e-specs.js +221 -0
  38. package/build/test/cli/cli-helpers.js +86 -0
  39. package/build/test/cli/cli-specs.js +71 -0
  40. package/build/test/cli/fixtures/test-driver/package.json +27 -0
  41. package/build/test/cli/schema-args-specs.js +48 -0
  42. package/build/test/cli/schema-e2e-specs.js +47 -0
  43. package/build/test/config-e2e-specs.js +112 -0
  44. package/build/test/config-file-e2e-specs.js +209 -0
  45. package/build/test/config-file-specs.js +281 -0
  46. package/build/test/config-specs.js +159 -0
  47. package/build/test/driver-e2e-specs.js +435 -0
  48. package/build/test/driver-specs.js +321 -0
  49. package/build/test/ext-config-io-specs.js +181 -0
  50. package/build/test/extension-config-specs.js +365 -0
  51. package/build/test/fixtures/allow-feat.txt +5 -0
  52. package/build/test/fixtures/caps.json +3 -0
  53. package/build/test/fixtures/config/allow-insecure.txt +3 -0
  54. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
  55. package/build/test/fixtures/config/appium.config.bad.json +32 -0
  56. package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
  57. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
  58. package/build/test/fixtures/config/appium.config.good.js +40 -0
  59. package/build/test/fixtures/config/appium.config.good.json +33 -0
  60. package/build/test/fixtures/config/appium.config.good.yaml +30 -0
  61. package/build/test/fixtures/config/appium.config.invalid.json +31 -0
  62. package/build/test/fixtures/config/appium.config.security-array.json +5 -0
  63. package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
  64. package/build/test/fixtures/config/appium.config.security-path.json +5 -0
  65. package/build/test/fixtures/config/driver-fake.config.json +8 -0
  66. package/build/test/fixtures/config/nodeconfig.json +3 -0
  67. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  68. package/build/test/fixtures/default-args.js +35 -0
  69. package/build/test/fixtures/deny-feat.txt +5 -0
  70. package/build/test/fixtures/driver.schema.js +20 -0
  71. package/build/test/fixtures/extensions.yaml +27 -0
  72. package/build/test/fixtures/flattened-schema.js +504 -0
  73. package/build/test/fixtures/plugin.schema.js +20 -0
  74. package/build/test/fixtures/schema-with-extensions.js +28 -0
  75. package/build/test/grid-register-specs.js +74 -0
  76. package/build/test/helpers.js +75 -0
  77. package/build/test/logger-specs.js +76 -0
  78. package/build/test/npm-specs.js +20 -0
  79. package/build/test/parser-specs.js +314 -0
  80. package/build/test/plugin-e2e-specs.js +316 -0
  81. package/build/test/schema/arg-spec-specs.js +70 -0
  82. package/build/test/schema/cli-args-specs.js +431 -0
  83. package/build/test/schema/schema-specs.js +389 -0
  84. package/build/test/utils-specs.js +266 -0
  85. package/index.js +11 -0
  86. package/lib/appium-config.schema.json +278 -0
  87. package/lib/appium.js +207 -65
  88. package/lib/cli/args.js +174 -375
  89. package/lib/cli/driver-command.js +4 -0
  90. package/lib/cli/extension-command.js +70 -5
  91. package/lib/cli/extension.js +25 -5
  92. package/lib/cli/npm.js +86 -18
  93. package/lib/cli/parser.js +257 -79
  94. package/lib/cli/plugin-command.js +4 -0
  95. package/lib/cli/utils.js +21 -1
  96. package/lib/config-file.js +227 -0
  97. package/lib/config.js +84 -63
  98. package/lib/driver-config.js +66 -11
  99. package/lib/drivers.js +4 -1
  100. package/lib/ext-config-io.js +287 -0
  101. package/lib/extension-config.js +225 -67
  102. package/lib/grid-register.js +27 -24
  103. package/lib/logger.js +1 -1
  104. package/lib/logsink.js +10 -7
  105. package/lib/main.js +214 -77
  106. package/lib/plugin-config.js +35 -6
  107. package/lib/plugins.js +1 -0
  108. package/lib/schema/appium-config-schema.js +287 -0
  109. package/lib/schema/arg-spec.js +222 -0
  110. package/lib/schema/cli-args.js +285 -0
  111. package/lib/schema/cli-transformers.js +123 -0
  112. package/lib/schema/index.js +2 -0
  113. package/lib/schema/keywords.js +135 -0
  114. package/lib/schema/schema.js +577 -0
  115. package/lib/utils.js +42 -88
  116. package/package.json +55 -84
  117. package/postinstall.js +71 -0
  118. package/types/appium-config.d.ts +197 -0
  119. package/types/types.d.ts +201 -0
  120. package/CHANGELOG.md +0 -3515
  121. package/build/lib/cli/parser-helpers.js +0 -82
  122. package/lib/cli/parser-helpers.js +0 -79
@@ -5,10 +5,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.ReadonlyMap = void 0;
9
+ exports.getPackageVersion = getPackageVersion;
10
+ exports.insertAppiumPrefixes = insertAppiumPrefixes;
8
11
  exports.inspectObject = inspectObject;
9
12
  exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
10
- exports.insertAppiumPrefixes = insertAppiumPrefixes;
11
- exports.getPackageVersion = getPackageVersion;
12
13
  exports.pullSettings = pullSettings;
13
14
  exports.removeAppiumPrefixes = removeAppiumPrefixes;
14
15
  exports.rootDir = void 0;
@@ -19,9 +20,9 @@ var _lodash = _interopRequireDefault(require("lodash"));
19
20
 
20
21
  var _logger = _interopRequireDefault(require("./logger"));
21
22
 
22
- var _appiumBaseDriver = require("appium-base-driver");
23
+ var _baseDriver = require("@appium/base-driver");
23
24
 
24
- var _findRoot = _interopRequireDefault(require("find-root"));
25
+ var _support = require("@appium/support");
25
26
 
26
27
  const W3C_APPIUM_PREFIX = 'appium';
27
28
 
@@ -63,22 +64,21 @@ function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraint
63
64
 
64
65
  const hasJSONWPCaps = _lodash.default.isPlainObject(jsonwpCapabilities);
65
66
 
66
- let protocol = null;
67
67
  let desiredCaps = {};
68
68
  let processedW3CCapabilities = null;
69
69
  let processedJsonwpCapabilities = null;
70
70
 
71
- if (!hasJSONWPCaps && !hasW3CCaps) {
71
+ if (!hasW3CCaps) {
72
72
  return {
73
- protocol: _appiumBaseDriver.PROTOCOLS.W3C,
74
- error: new Error('Either JSONWP or W3C capabilities should be provided')
73
+ protocol: _baseDriver.PROTOCOLS.W3C,
74
+ error: new Error('W3C capabilities should be provided')
75
75
  };
76
76
  }
77
77
 
78
78
  const {
79
- W3C,
80
- MJSONWP
81
- } = _appiumBaseDriver.PROTOCOLS;
79
+ W3C
80
+ } = _baseDriver.PROTOCOLS;
81
+ const protocol = W3C;
82
82
  jsonwpCapabilities = _lodash.default.cloneDeep(jsonwpCapabilities);
83
83
  w3cCapabilities = _lodash.default.cloneDeep(w3cCapabilities);
84
84
  defaultCapabilities = _lodash.default.cloneDeep(defaultCapabilities);
@@ -117,61 +117,23 @@ function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraint
117
117
  }
118
118
 
119
119
  if (hasJSONWPCaps) {
120
- protocol = MJSONWP;
121
- desiredCaps = jsonwpCapabilities;
122
120
  processedJsonwpCapabilities = { ...jsonwpCapabilities
123
121
  };
124
122
  }
125
123
 
126
124
  if (hasW3CCaps) {
127
- protocol = W3C;
128
- let isFixingNeededForW3cCaps = false;
129
-
130
125
  try {
131
- desiredCaps = (0, _appiumBaseDriver.processCapabilities)(w3cCapabilities, constraints, true);
126
+ desiredCaps = (0, _baseDriver.processCapabilities)(w3cCapabilities, constraints, true);
132
127
  } catch (error) {
133
- if (!hasJSONWPCaps) {
134
- return {
135
- desiredCaps,
136
- processedJsonwpCapabilities,
137
- processedW3CCapabilities,
138
- protocol,
139
- error
140
- };
141
- }
142
-
143
128
  _logger.default.info(`Could not parse W3C capabilities: ${error.message}`);
144
129
 
145
- isFixingNeededForW3cCaps = true;
146
- }
147
-
148
- if (hasJSONWPCaps && !isFixingNeededForW3cCaps) {
149
- const differingKeys = _lodash.default.difference(_lodash.default.keys(removeAppiumPrefixes(processedJsonwpCapabilities)), _lodash.default.keys(removeAppiumPrefixes(desiredCaps)));
150
-
151
- if (!_lodash.default.isEmpty(differingKeys)) {
152
- _logger.default.info(`The following capabilities were provided in the JSONWP desired capabilities that are missing ` + `in W3C capabilities: ${JSON.stringify(differingKeys)}`);
153
-
154
- isFixingNeededForW3cCaps = true;
155
- }
156
- }
157
-
158
- if (isFixingNeededForW3cCaps && hasJSONWPCaps) {
159
- _logger.default.info('Trying to fix W3C capabilities by merging them with JSONWP caps');
160
-
161
- w3cCapabilities = fixW3cCapabilities(w3cCapabilities, jsonwpCapabilities);
162
-
163
- try {
164
- desiredCaps = (0, _appiumBaseDriver.processCapabilities)(w3cCapabilities, constraints, true);
165
- } catch (error) {
166
- _logger.default.warn(`Could not parse fixed W3C capabilities: ${error.message}. Falling back to JSONWP protocol`);
167
-
168
- return {
169
- desiredCaps: processedJsonwpCapabilities,
170
- processedJsonwpCapabilities,
171
- processedW3CCapabilities: null,
172
- protocol: MJSONWP
173
- };
174
- }
130
+ return {
131
+ desiredCaps,
132
+ processedJsonwpCapabilities,
133
+ processedW3CCapabilities,
134
+ protocol,
135
+ error
136
+ };
175
137
  }
176
138
 
177
139
  processedW3CCapabilities = {
@@ -189,45 +151,6 @@ function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraint
189
151
  };
190
152
  }
191
153
 
192
- function fixW3cCapabilities(w3cCaps, jsonwpCaps) {
193
- const result = {
194
- firstMatch: w3cCaps.firstMatch || [],
195
- alwaysMatch: w3cCaps.alwaysMatch || {}
196
- };
197
-
198
- const keysToInsert = _lodash.default.keys(jsonwpCaps);
199
-
200
- const removeMatchingKeys = match => {
201
- _lodash.default.pull(keysToInsert, match);
202
-
203
- const colonIndex = match.indexOf(':');
204
-
205
- if (colonIndex >= 0 && match.length > colonIndex) {
206
- _lodash.default.pull(keysToInsert, match.substring(colonIndex + 1));
207
- }
208
-
209
- if (keysToInsert.includes(`${W3C_APPIUM_PREFIX}:${match}`)) {
210
- _lodash.default.pull(keysToInsert, `${W3C_APPIUM_PREFIX}:${match}`);
211
- }
212
- };
213
-
214
- for (const firstMatchEntry of result.firstMatch) {
215
- for (const pair of _lodash.default.toPairs(firstMatchEntry)) {
216
- removeMatchingKeys(pair[0]);
217
- }
218
- }
219
-
220
- for (const pair of _lodash.default.toPairs(result.alwaysMatch)) {
221
- removeMatchingKeys(pair[0]);
222
- }
223
-
224
- for (const key of keysToInsert) {
225
- result.alwaysMatch[key] = jsonwpCaps[key];
226
- }
227
-
228
- return result;
229
- }
230
-
231
154
  function insertAppiumPrefixes(caps) {
232
155
  const STANDARD_CAPS = ['browserName', 'browserVersion', 'platformName', 'acceptInsecureCerts', 'pageLoadStrategy', 'proxy', 'setWindowRect', 'timeouts', 'unhandledPromptBehavior'];
233
156
  let prefixedCaps = {};
@@ -288,8 +211,30 @@ function pullSettings(caps) {
288
211
  return result;
289
212
  }
290
213
 
291
- const rootDir = (0, _findRoot.default)(__dirname);
292
- exports.rootDir = rootDir;require('source-map-support').install();
214
+ const rootDir = _support.fs.findRoot(__dirname);
215
+
216
+ exports.rootDir = rootDir;
217
+
218
+ class ReadonlyMap extends Map {
219
+ set(key, value) {
220
+ if (this.has(key)) {
221
+ throw new Error(`${key} is already set`);
222
+ }
223
+
224
+ return super.set(key, value);
225
+ }
226
+
227
+ delete(key) {
228
+ throw new Error(`${key} cannot be deleted`);
229
+ }
230
+
231
+ clear() {
232
+ throw new Error(`Cannot clear ReadonlyMap`);
233
+ }
234
+
235
+ }
236
+
237
+ exports.ReadonlyMap = ReadonlyMap;require('source-map-support').install();
293
238
 
294
239
 
295
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImluc3BlY3RPYmplY3QiLCJhcmdzIiwiZ2V0VmFsdWVBcnJheSIsIm9iaiIsImluZGVudCIsIl8iLCJpc09iamVjdCIsInN0ckFyciIsImFyZyIsInZhbHVlIiwidG9QYWlycyIsInB1c2giLCJzaGlmdCIsImxvZ2dlciIsImluZm8iLCJ2YWwiLCJwYXJzZUNhcHNGb3JJbm5lckRyaXZlciIsImpzb253cENhcGFiaWxpdGllcyIsInczY0NhcGFiaWxpdGllcyIsImNvbnN0cmFpbnRzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImhhc1czQ0NhcHMiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiaGFzSlNPTldQQ2FwcyIsInByb3RvY29sIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJQUk9UT0NPTFMiLCJXM0MiLCJlcnJvciIsIkVycm9yIiwiTUpTT05XUCIsImNsb25lRGVlcCIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwS2V5IiwiZGVmYXVsdENhcFZhbHVlIiwiaXNDYXBBbHJlYWR5U2V0IiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsInJlbW92ZUFwcGl1bVByZWZpeGVzIiwicmVtb3ZlQXBwaXVtUHJlZml4IiwiYWx3YXlzTWF0Y2giLCJPYmplY3QiLCJhc3NpZ24iLCJpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMiLCJtZXNzYWdlIiwiZGlmZmVyaW5nS2V5cyIsImRpZmZlcmVuY2UiLCJrZXlzIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpeFczY0NhcGFiaWxpdGllcyIsIndhcm4iLCJpbnNlcnRBcHBpdW1QcmVmaXhlcyIsInczY0NhcHMiLCJqc29ud3BDYXBzIiwicmVzdWx0Iiwia2V5c1RvSW5zZXJ0IiwicmVtb3ZlTWF0Y2hpbmdLZXlzIiwibWF0Y2giLCJwdWxsIiwiY29sb25JbmRleCIsImluZGV4T2YiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJpbmNsdWRlcyIsInBhaXIiLCJrZXkiLCJjYXBzIiwiU1RBTkRBUkRfQ0FQUyIsInByZWZpeGVkQ2FwcyIsIm5hbWUiLCJmaXhlZENhcHMiLCJwcmVmaXgiLCJzdGFydHNXaXRoIiwiZ2V0UGFja2FnZVZlcnNpb24iLCJwa2dOYW1lIiwicGtnSW5mbyIsInJlcXVpcmUiLCJ2ZXJzaW9uIiwicHVsbFNldHRpbmdzIiwiZXhlYyIsInJvb3REaXIiLCJfX2Rpcm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsUUFBMUI7O0FBRUEsU0FBU0MsYUFBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsV0FBU0MsYUFBVCxDQUF3QkMsR0FBeEIsRUFBNkJDLE1BQU0sR0FBRyxJQUF0QyxFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdILEdBQVgsQ0FBTCxFQUFzQjtBQUNwQixhQUFPLENBQUNBLEdBQUQsQ0FBUDtBQUNEOztBQUVELFFBQUlJLE1BQU0sR0FBRyxDQUFDLEdBQUQsQ0FBYjs7QUFDQSxTQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLENBQVQsSUFBeUJKLGdCQUFFSyxPQUFGLENBQVVQLEdBQVYsQ0FBekIsRUFBeUM7QUFDdkMsVUFBSSxDQUFDRSxnQkFBRUMsUUFBRixDQUFXRyxLQUFYLENBQUwsRUFBd0I7QUFDdEJGLFFBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sS0FBSUksR0FBSSxLQUFJQyxLQUFNLEVBQXhDO0FBQ0QsT0FGRCxNQUVPO0FBQ0xBLFFBQUFBLEtBQUssR0FBR1AsYUFBYSxDQUFDTyxLQUFELEVBQVMsR0FBRUwsTUFBTyxJQUFsQixDQUFyQjtBQUNBRyxRQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBYSxHQUFFUCxNQUFPLEtBQUlJLEdBQUksS0FBSUMsS0FBSyxD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akUsZ0JBQUU4QixPQUFGLENBQVVtQyxJQUFWLENBQTlCLEVBQStDO0FBQzdDLFdBQU8sRUFBUDtBQUNEOztBQUVELFFBQU1aLE1BQU0sR0FBRyxFQUFmOztBQUNBLE9BQUssTUFBTSxDQUFDVyxHQUFELEVBQU01RCxLQUFOLENBQVgsSUFBMkJKLGdCQUFFSyxPQUFGLENBQVU0RCxJQUFWLENBQTNCLEVBQTRDO0FBQzFDLFVBQU1ULEtBQUssR0FBRyx1QkFBdUJzQixJQUF2QixDQUE0QmQsR0FBNUIsQ0FBZDs7QUFDQSxRQUFJLENBQUNSLEtBQUwsRUFBWTtBQUNWO0FBQ0Q7O0FBRURILElBQUFBLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUQsQ0FBTixDQUFOLEdBQW1CcEQsS0FBbkI7QUFDQSxXQUFPNkQsSUFBSSxDQUFDRCxHQUFELENBQVg7QUFDRDs7QUFDRCxTQUFPWCxNQUFQO0FBQ0Q7O0FBRUQsTUFBTTBCLE9BQU8sR0FBRyx1QkFBU0MsU0FBVCxDQUFoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHByb2Nlc3NDYXBhYmlsaXRpZXMsIFBST1RPQ09MUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgZmluZFJvb3QgZnJvbSAnZmluZC1yb290JztcblxuY29uc3QgVzNDX0FQUElVTV9QUkVGSVggPSAnYXBwaXVtJztcblxuZnVuY3Rpb24gaW5zcGVjdE9iamVjdCAoYXJncykge1xuICBmdW5jdGlvbiBnZXRWYWx1ZUFycmF5IChvYmosIGluZGVudCA9ICcgICcpIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkge1xuICAgICAgcmV0dXJuIFtvYmpdO1xuICAgIH1cblxuICAgIGxldCBzdHJBcnIgPSBbJ3snXTtcbiAgICBmb3IgKGxldCBbYXJnLCB2YWx1ZV0gb2YgXy50b1BhaXJzKG9iaikpIHtcbiAgICAgIGlmICghXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZUFycmF5KHZhbHVlLCBgJHtpbmRlbnR9ICBgKTtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlLnNoaWZ0KCl9YCk7XG4gICAgICAgIHN0ckFyci5wdXNoKC4uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fX1gKTtcbiAgICByZXR1cm4gc3RyQXJyO1xuICB9XG4gIGZvciAobGV0IFthcmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoYXJncykpIHtcbiAgICB2YWx1ZSA9IGdldFZhbHVlQXJyYXkodmFsdWUpO1xuICAgIGxvZ2dlci5pbmZvKGAgICR7YXJnfTogJHt2YWx1ZS5zaGlmdCgpfWApO1xuICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSkge1xuICAgICAgbG9nZ2VyLmluZm8odmFsKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGpzb253cENhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IHczY0NhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciAoanNvbndwQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzID0ge30sIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSB7fSkge1xuICAvLyBDaGVjayBpZiB0aGUgY2FsbGVyIHNlbnQgSlNPTldQIGNhcHMsIFczQyBjYXBzLCBvciBib3RoXG4gIGNvbnN0IGhhc1czQ0NhcHMgPSBfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzKSAmJlxuICAgIChfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdhbHdheXNNYXRjaCcpIHx8IF8uaGFzKHczY0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnKSk7XG4gIGNvbnN0IGhhc0pTT05XUENhcHMgPSBfLmlzUGxhaW5PYmplY3QoanNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgbGV0IHByb3RvY29sID0gbnVsbDtcbiAgbGV0IGRlc2lyZWRDYXBzID0ge307XG4gIGxldCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSBudWxsO1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gbnVsbDtcblxuICBpZiAoIWhhc0pTT05XUENhcHMgJiYgIWhhc1czQ0NhcHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IFBST1RPQ09MUy5XM0MsXG4gICAgICBlcnJvcjogbmV3IEVycm9yKCdFaXRoZXIgSlNPTldQIG9yIFczQyBjYXBhYmlsaXRpZXMgc2hvdWxkIGJlIHByb3ZpZGVkJyksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHtXM0MsIE1KU09OV1B9ID0gUFJPVE9DT0xTO1xuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuICBqc29ud3BDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBhYmlsaXRpZXMpO1xuICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcGFiaWxpdGllcyk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgICAgZm9yIChjb25zdCBbZGVmYXVsdENhcEtleSwgZGVmYXVsdENhcFZhbHVlXSBvZiBfLnRvUGFpcnMoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICAgICAgbGV0IGlzQ2FwQWxyZWFkeVNldCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBmaXJzdE1hdGNoIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZmlyc3RNYXRjaEVudHJ5KVxuICAgICAgICAgICAgICAmJiBfLmhhcyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhmaXJzdE1hdGNoRW50cnkpLCByZW1vdmVBcHBpdW1QcmVmaXgoZGVmYXVsdENhcEtleSkpKSB7XG4gICAgICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGFsd2F5c01hdGNoIGVudHJpZXNcbiAgICAgICAgaXNDYXBBbHJlYWR5U2V0ID0gaXNDYXBBbHJlYWR5U2V0IHx8IChfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKVxuICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKHczY0NhcGFiaWxpdGllcy5hbHdheXNNYXRjaCksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpO1xuICAgICAgICBpZiAoaXNDYXBBbHJlYWR5U2V0KSB7XG4gICAgICAgICAgLy8gU2tpcCBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgY2Fwc1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0eSBpZiBpdCBpcyBub3Qgb3ZlcnJpZGRlblxuICAgICAgICBpZiAoXy5pc0VtcHR5KHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoKSkge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoID0gW3tbZGVmYXVsdENhcEtleV06IGRlZmF1bHRDYXBWYWx1ZX1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoWzBdW2RlZmF1bHRDYXBLZXldID0gZGVmYXVsdENhcFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgICBqc29ud3BDYXBhYmlsaXRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCByZW1vdmVBcHBpdW1QcmVmaXhlcyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSwganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgTUpTT05XUCBjYXBzXG4gIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBNSlNPTldQO1xuICAgIGRlc2lyZWRDYXBzID0ganNvbndwQ2FwYWJpbGl0aWVzO1xuICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyA9IHsuLi5qc29ud3BDYXBhYmlsaXRpZXN9O1xuICB9XG5cbiAgLy8gR2V0IFczQyBjYXBzXG4gIGlmIChoYXNXM0NDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBXM0M7XG4gICAgLy8gQ2FsbCB0aGUgcHJvY2VzcyBjYXBhYmlsaXRpZXMgYWxnb3JpdGhtIHRvIGZpbmQgbWF0Y2hpbmcgY2FwcyBvbiB0aGUgVzNDXG4gICAgLy8gKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2psaXBwcy9zaW1wbGUtd2Qtc3BlYyNwcm9jZXNzaW5nLWNhcGFiaWxpdGllcylcbiAgICBsZXQgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFoYXNKU09OV1BDYXBzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzaXJlZENhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKGBDb3VsZCBub3QgcGFyc2UgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzSlNPTldQQ2FwcyAmJiAhaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzKSB7XG4gICAgICBjb25zdCBkaWZmZXJpbmdLZXlzID0gXy5kaWZmZXJlbmNlKF8ua2V5cyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMpKSwgXy5rZXlzKHJlbW92ZUFwcGl1bVByZWZpeGVzKGRlc2lyZWRDYXBzKSkpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoZGlmZmVyaW5nS2V5cykpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQgaW4gdGhlIEpTT05XUCBkZXNpcmVkIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBtaXNzaW5nIGAgK1xuICAgICAgICAgIGBpbiBXM0MgY2FwYWJpbGl0aWVzOiAke0pTT04uc3RyaW5naWZ5KGRpZmZlcmluZ0tleXMpfWApO1xuICAgICAgICBpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMgJiYgaGFzSlNPTldQQ2Fwcykge1xuICAgICAgbG9nZ2VyLmluZm8oJ1RyeWluZyB0byBmaXggVzNDIGNhcGFiaWxpdGllcyBieSBtZXJnaW5nIHRoZW0gd2l0aCBKU09OV1AgY2FwcycpO1xuICAgICAgdzNjQ2FwYWJpbGl0aWVzID0gZml4VzNjQ2FwYWJpbGl0aWVzKHczY0NhcGFiaWxpdGllcywganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDb3VsZCBub3QgcGFyc2UgZml4ZWQgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfS4gRmFsbGluZyBiYWNrIHRvIEpTT05XUCBwcm90b2NvbGApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc2lyZWRDYXBzOiBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllczogbnVsbCxcbiAgICAgICAgICBwcm90b2NvbDogTUpTT05XUCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgdzNjIGNhcGFiaWxpdGllcyBwYXlsb2FkIHRoYXQgY29udGFpbnMgb25seSB0aGUgbWF0Y2hpbmcgY2FwcyBpbiBgYWx3YXlzTWF0Y2hgXG4gICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgYWx3YXlzTWF0Y2g6IHsuLi5pbnNlcnRBcHBpdW1QcmVmaXhlcyhkZXNpcmVkQ2Fwcyl9LFxuICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIHByb3RvY29sfTtcbn1cblxuLyoqXG4gKiBUaGlzIGhlbHBlciBtZXRob2QgdHJpZXMgdG8gZml4IGNvcnJ1cHRlZCBXM0MgY2FwYWJpbGl0aWVzIGJ5XG4gKiBtZXJnaW5nIHRoZW0gdG8gZXhpc3RpbmcgSlNPTldQIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwcyBXM0MgY2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgY2FwYWJpbGl0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEZpeGVkIFczQyBjYXBhYmlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gZml4VzNjQ2FwYWJpbGl0aWVzICh3M2NDYXBzLCBqc29ud3BDYXBzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBmaXJzdE1hdGNoOiB3M2NDYXBzLmZpcnN0TWF0Y2ggfHwgW10sXG4gICAgYWx3YXlzTWF0Y2g6IHczY0NhcHMuYWx3YXlzTWF0Y2ggfHwge30sXG4gIH07XG4gIGNvbnN0IGtleXNUb0luc2VydCA9IF8ua2V5cyhqc29ud3BDYXBzKTtcbiAgY29uc3QgcmVtb3ZlTWF0Y2hpbmdLZXlzID0gKG1hdGNoKSA9PiB7XG4gICAgXy5wdWxsKGtleXNUb0luc2VydCwgbWF0Y2gpO1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBtYXRjaC5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGNvbG9uSW5kZXggPj0gMCAmJiBtYXRjaC5sZW5ndGggPiBjb2xvbkluZGV4KSB7XG4gICAgICBfLnB1bGwoa2V5c1RvSW5zZXJ0LCBtYXRjaC5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpKTtcbiAgICB9XG4gICAgaWYgKGtleXNUb0luc2VydC5pbmNsdWRlcyhgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHttYXRjaH1gKSkge1xuICAgICAgXy5wdWxsKGtleXNUb0luc2VydCwgYCR7VzNDX0FQUElVTV9QUkVGSVh9OiR7bWF0Y2h9YCk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mIHJlc3VsdC5maXJzdE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhmaXJzdE1hdGNoRW50cnkpKSB7XG4gICAgICByZW1vdmVNYXRjaGluZ0tleXMocGFpclswXSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhyZXN1bHQuYWx3YXlzTWF0Y2gpKSB7XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzKHBhaXJbMF0pO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvSW5zZXJ0KSB7XG4gICAgcmVzdWx0LmFsd2F5c01hdGNoW2tleV0gPSBqc29ud3BDYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNhcGFiaWxpdGllcyBvYmplY3RzIGFuZCBwcmVmaXhlcyBjYXBhYmlsaXRpZXMgd2l0aCBgYXBwaXVtOmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYXBzIERlc2lyZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICovXG5mdW5jdGlvbiBpbnNlcnRBcHBpdW1QcmVmaXhlcyAoY2Fwcykge1xuICAvLyBTdGFuZGFyZCwgbm9uLXByZWZpeGVkIGNhcGFiaWxpdGllcyAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi10YWJsZS1vZi1zdGFuZGFyZC1jYXBhYmlsaXRpZXMpXG4gIGNvbnN0IFNUQU5EQVJEX0NBUFMgPSBbXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlclZlcnNpb24nLFxuICAgICdwbGF0Zm9ybU5hbWUnLFxuICAgICdhY2NlcHRJbnNlY3VyZUNlcnRzJyxcbiAgICAncGFnZUxvYWRTdHJhdGVneScsXG4gICAgJ3Byb3h5JyxcbiAgICAnc2V0V2luZG93UmVjdCcsXG4gICAgJ3RpbWVvdXRzJyxcbiAgICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InXG4gIF07XG5cbiAgbGV0IHByZWZpeGVkQ2FwcyA9IHt9O1xuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGlmIChTVEFOREFSRF9DQVBTLmluY2x1ZGVzKG5hbWUpIHx8IG5hbWUuaW5jbHVkZXMoJzonKSkge1xuICAgICAgcHJlZml4ZWRDYXBzW25hbWVdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeGVkQ2Fwc1tgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHtuYW1lfWBdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmVmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeGVzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpKSB7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCBmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBmaXhlZENhcHNbcmVtb3ZlQXBwaXVtUHJlZml4KG5hbWUpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeCAoa2V5KSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke1czQ19BUFBJVU1fUFJFRklYfTpgO1xuICByZXR1cm4gXy5zdGFydHNXaXRoKGtleSwgcHJlZml4KSA/IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uIChwa2dOYW1lKSB7XG4gIGNvbnN0IHBrZ0luZm8gPSByZXF1aXJlKGAke3BrZ05hbWV9L3BhY2thZ2UuanNvbmApIHx8IHt9O1xuICByZXR1cm4gcGtnSW5mby52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFB1bGxzIHRoZSBpbml0aWFsIHZhbHVlcyBvZiBBcHBpdW0gc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gY2FwYWJpbGl0aWVzIGFyZ3VtZW50LlxuICogRWFjaCBzZXR0aW5nIGl0ZW0gbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICogYHNldHRpbmdbc2V0dGluZ19uYW1lXTogc2V0dGluZ192YWx1ZWBcbiAqIFRoZSBjYXBhYmlsaXRpZXMgYXJndW1lbnQgaXRzZWxmIGdldHMgbXV0YXRlZCwgc28gaXQgZG9lcyBub3QgY29udGFpbiBwYXJzZWRcbiAqIHNldHRpbmdzIGFueW1vcmUgdG8gYXZvaWQgZnVydGhlciBwYXJzaW5nIGlzc3Vlcy5cbiAqIENoZWNrXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9ibG9iL21hc3Rlci9kb2NzL2VuL2FkdmFuY2VkLWNvbmNlcHRzL3NldHRpbmdzLm1kXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhdmFpbGFibGUgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHs/T2JqZWN0fSBjYXBzIC0gQ2FwYWJpbGl0aWVzIGRpY3Rpb25hcnkuIEl0IGlzIG11dGF0ZWQgaWZcbiAqIG9uZSBvciBtb3JlIHNldHRpbmdzIGhhdmUgYmVlbiBwdWxsZWQgZnJvbSBpdFxuICogQHJldHVybiB7T2JqZWN0fSAtIEFuIGVtcHR5IGRpY3Rpb25hcnkgaWYgdGhlIGdpdmVuIGNhcHMgY29udGFpbnMgbm9cbiAqIHNldHRpbmcgaXRlbXMgb3IgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgcGFyc2VkIEFwcGl1bSBzZXR0aW5nIG5hbWVzIGFsb25nIHdpdGhcbiAqIHRoZWlyIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gcHVsbFNldHRpbmdzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpIHx8IF8uaXNFbXB0eShjYXBzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9cXGJzZXR0aW5nc1xcWyhcXFMrKVxcXSQvLmV4ZWMoa2V5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXN1bHRbbWF0Y2hbMV1dID0gdmFsdWU7XG4gICAgZGVsZXRlIGNhcHNba2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCByb290RGlyID0gZmluZFJvb3QoX19kaXJuYW1lKTtcblxuZXhwb3J0IHtcbiAgaW5zcGVjdE9iamVjdCwgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIGluc2VydEFwcGl1bVByZWZpeGVzLCByb290RGlyLFxuICBnZXRQYWNrYWdlVmVyc2lvbiwgcHVsbFNldHRpbmdzLCByZW1vdmVBcHBpdW1QcmVmaXhlcyxcbn07XG4iXSwiZmlsZSI6ImxpYi91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
240
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImluc3BlY3RPYmplY3QiLCJhcmdzIiwiZ2V0VmFsdWVBcnJheSIsIm9iaiIsImluZGVudCIsIl8iLCJpc09iamVjdCIsInN0ckFyciIsImFyZyIsInZhbHVlIiwidG9QYWlycyIsInB1c2giLCJzaGlmdCIsImxvZ2dlciIsImluZm8iLCJ2YWwiLCJwYXJzZUNhcHNGb3JJbm5lckRyaXZlciIsImpzb253cENhcGFiaWxpdGllcyIsInczY0NhcGFiaWxpdGllcyIsImNvbnN0cmFpbnRzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImhhc1czQ0NhcHMiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiaGFzSlNPTldQQ2FwcyIsImRlc2lyZWRDYXBzIiwicHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzIiwicHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzIiwicHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJXM0MiLCJlcnJvciIsIkVycm9yIiwiY2xvbmVEZWVwIiwiaXNFbXB0eSIsImRlZmF1bHRDYXBLZXkiLCJkZWZhdWx0Q2FwVmFsdWUiLCJpc0NhcEFscmVhZHlTZXQiLCJmaXJzdE1hdGNoRW50cnkiLCJmaXJzdE1hdGNoIiwicmVtb3ZlQXBwaXVtUHJlZml4ZXMiLCJyZW1vdmVBcHBpdW1QcmVmaXgiLCJhbHdheXNNYXRjaCIsIk9iamVjdCIsImFzc2lnbiIsIm1lc3NhZ2UiLCJpbnNlcnRBcHBpdW1QcmVmaXhlcyIsImNhcHMiLCJTVEFOREFSRF9DQVBTIiwicHJlZml4ZWRDYXBzIiwibmFtZSIsImluY2x1ZGVzIiwiZml4ZWRDYXBzIiwia2V5IiwicHJlZml4Iiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsImxlbmd0aCIsImdldFBhY2thZ2VWZXJzaW9uIiwicGtnTmFtZSIsInBrZ0luZm8iLCJyZXF1aXJlIiwidmVyc2lvbiIsInB1bGxTZXR0aW5ncyIsInJlc3VsdCIsIm1hdGNoIiwiZXhlYyIsInJvb3REaXIiLCJmcyIsImZpbmRSb290IiwiX19kaXJuYW1lIiwiUmVhZG9ubHlNYXAiLCJNYXAiLCJzZXQiLCJkZWxldGUiLCJjbGVhciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsUUFBMUI7O0FBRUEsU0FBU0MsYUFBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsV0FBU0MsYUFBVCxDQUF3QkMsR0FBeEIsRUFBNkJDLE1BQU0sR0FBRyxJQUF0QyxFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdILEdBQVgsQ0FBTCxFQUFzQjtBQUNwQixhQUFPLENBQUNBLEdBQUQsQ0FBUDtBQUNEOztBQUVELFFBQUlJLE1BQU0sR0FBRyxDQUFDLEdBQUQsQ0FBYjs7QUFDQSxTQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLENBQVQsSUFBeUJKLGdCQUFFSyxPQUFGLENBQVVQLEdBQVYsQ0FBekIsRUFBeUM7QUFDdkMsVUFBSSxDQUFDRSxnQkFBRUMsUUFBRixDQUFXRyxLQUFYLENBQUwsRUFBd0I7QUFDdEJGLFFBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sS0FBSUksR0FBSSxLQUFJQyxLQUFNLEVBQXhDO0FBQ0QsT0FGRCxNQUVPO0FBQ0xBLFFBQUFBLEtBQUssR0FBR1AsYUFBYSxDQUFDTyxLQUFELEVBQVMsR0FBRUwsTUFBTyxJQUFsQixDQUFyQjtBQUNBRyxRQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBYSxHQUFFUCxNQUFPLEtBQUlJLEdBQUksS0FBSUMsS0FBSyxDQUFDRyxLQUFOLEVBQWMsRUFBaEQ7QUFDQUwsUUFBQUEsTUFBTSxDQUFDSSxJQUFQLENBQVksR0FBR0YsS0FBZjtBQUNEO0FBQ0Y7O0FBQ0RGLElBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sR0FBdEI7QUFDQSxXQUFPRyxNQUFQO0FBQ0Q7O0FBQ0QsT0FB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QUtjLEdBQUwsQ0FBUzhCLEdBQVQsQ0FBSixFQUFtQjtBQUNqQixZQUFNLElBQUlyQixLQUFKLENBQVcsR0FBRXFCLEdBQUksaUJBQWpCLENBQU47QUFDRDs7QUFDRCxXQUFPLE1BQU1vQixHQUFOLENBQVVwQixHQUFWLEVBQWU1QyxLQUFmLENBQVA7QUFDRDs7QUFFRGlFLEVBQUFBLE1BQU0sQ0FBRXJCLEdBQUYsRUFBTztBQUNYLFVBQU0sSUFBSXJCLEtBQUosQ0FBVyxHQUFFcUIsR0FBSSxvQkFBakIsQ0FBTjtBQUNEOztBQUVEc0IsRUFBQUEsS0FBSyxHQUFJO0FBQ1AsVUFBTSxJQUFJM0MsS0FBSixDQUFXLDBCQUFYLENBQU47QUFDRDs7QUFsQjJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcHJvY2Vzc0NhcGFiaWxpdGllcywgUFJPVE9DT0xTIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IFczQ19BUFBJVU1fUFJFRklYID0gJ2FwcGl1bSc7XG5cbmZ1bmN0aW9uIGluc3BlY3RPYmplY3QgKGFyZ3MpIHtcbiAgZnVuY3Rpb24gZ2V0VmFsdWVBcnJheSAob2JqLCBpbmRlbnQgPSAnICAnKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHtcbiAgICAgIHJldHVybiBbb2JqXTtcbiAgICB9XG5cbiAgICBsZXQgc3RyQXJyID0gWyd7J107XG4gICAgZm9yIChsZXQgW2FyZywgdmFsdWVdIG9mIF8udG9QYWlycyhvYmopKSB7XG4gICAgICBpZiAoIV8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHN0ckFyci5wdXNoKGAke2luZGVudH0gICR7YXJnfTogJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZ2V0VmFsdWVBcnJheSh2YWx1ZSwgYCR7aW5kZW50fSAgYCk7XG4gICAgICAgIHN0ckFyci5wdXNoKGAke2luZGVudH0gICR7YXJnfTogJHt2YWx1ZS5zaGlmdCgpfWApO1xuICAgICAgICBzdHJBcnIucHVzaCguLi52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0ckFyci5wdXNoKGAke2luZGVudH19YCk7XG4gICAgcmV0dXJuIHN0ckFycjtcbiAgfVxuICBmb3IgKGxldCBbYXJnLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGFyZ3MpKSB7XG4gICAgdmFsdWUgPSBnZXRWYWx1ZUFycmF5KHZhbHVlKTtcbiAgICBsb2dnZXIuaW5mbyhgICAke2FyZ306ICR7dmFsdWUuc2hpZnQoKX1gKTtcbiAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHZhbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGFrZXMgdGhlIGNhcHMgdGhhdCB3ZXJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGFuZCB0cmFuc2xhdGVzIHRoZW1cbiAqIGludG8gY2FwcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBpbm5lciBkcml2ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc29ud3BDYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSB3M2NDYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25zdHJhaW50c1xuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIgKGpzb253cENhcGFiaWxpdGllcywgdzNjQ2FwYWJpbGl0aWVzLCBjb25zdHJhaW50cyA9IHt9LCBkZWZhdWx0Q2FwYWJpbGl0aWVzID0ge30pIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGNhbGxlciBzZW50IEpTT05XUCBjYXBzLCBXM0MgY2Fwcywgb3IgYm90aFxuICBjb25zdCBoYXNXM0NDYXBzID0gXy5pc1BsYWluT2JqZWN0KHczY0NhcGFiaWxpdGllcykgJiZcbiAgICAoXy5oYXModzNjQ2FwYWJpbGl0aWVzLCAnYWx3YXlzTWF0Y2gnKSB8fCBfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdmaXJzdE1hdGNoJykpO1xuICBjb25zdCBoYXNKU09OV1BDYXBzID0gXy5pc1BsYWluT2JqZWN0KGpzb253cENhcGFiaWxpdGllcyk7XG4gIGxldCBkZXNpcmVkQ2FwcyA9IHt9O1xuICBsZXQgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzID0gbnVsbDtcbiAgbGV0IHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyA9IG51bGw7XG5cbiAgaWYgKCFoYXNXM0NDYXBzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3RvY29sOiBQUk9UT0NPTFMuVzNDLFxuICAgICAgZXJyb3I6IG5ldyBFcnJvcignVzNDIGNhcGFiaWxpdGllcyBzaG91bGQgYmUgcHJvdmlkZWQnKSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qge1czQ30gPSBQUk9UT0NPTFM7XG4gIGNvbnN0IHByb3RvY29sID0gVzNDO1xuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuICBqc29ud3BDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBhYmlsaXRpZXMpO1xuICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcGFiaWxpdGllcyk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgICAgZm9yIChjb25zdCBbZGVmYXVsdENhcEtleSwgZGVmYXVsdENhcFZhbHVlXSBvZiBfLnRvUGFpcnMoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICAgICAgbGV0IGlzQ2FwQWxyZWFkeVNldCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBmaXJzdE1hdGNoIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZmlyc3RNYXRjaEVudHJ5KVxuICAgICAgICAgICAgICAmJiBfLmhhcyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhmaXJzdE1hdGNoRW50cnkpLCByZW1vdmVBcHBpdW1QcmVmaXgoZGVmYXVsdENhcEtleSkpKSB7XG4gICAgICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGFsd2F5c01hdGNoIGVudHJpZXNcbiAgICAgICAgaXNDYXBBbHJlYWR5U2V0ID0gaXNDYXBBbHJlYWR5U2V0IHx8IChfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKVxuICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKHczY0NhcGFiaWxpdGllcy5hbHdheXNNYXRjaCksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpO1xuICAgICAgICBpZiAoaXNDYXBBbHJlYWR5U2V0KSB7XG4gICAgICAgICAgLy8gU2tpcCBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgY2Fwc1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0eSBpZiBpdCBpcyBub3Qgb3ZlcnJpZGRlblxuICAgICAgICBpZiAoXy5pc0VtcHR5KHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoKSkge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoID0gW3tbZGVmYXVsdENhcEtleV06IGRlZmF1bHRDYXBWYWx1ZX1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoWzBdW2RlZmF1bHRDYXBLZXldID0gZGVmYXVsdENhcFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgICBqc29ud3BDYXBhYmlsaXRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCByZW1vdmVBcHBpdW1QcmVmaXhlcyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSwganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgTUpTT05XUCBjYXBzXG4gIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gey4uLmpzb253cENhcGFiaWxpdGllc307XG4gIH1cblxuICAvLyBHZXQgVzNDIGNhcHNcbiAgaWYgKGhhc1czQ0NhcHMpIHtcbiAgICAvLyBDYWxsIHRoZSBwcm9jZXNzIGNhcGFiaWxpdGllcyBhbGdvcml0aG0gdG8gZmluZCBtYXRjaGluZyBjYXBzIG9uIHRoZSBXM0NcbiAgICAvLyAoc2VlOiBodHRwczovL2dpdGh1Yi5jb20vamxpcHBzL3NpbXBsZS13ZC1zcGVjI3Byb2Nlc3NpbmctY2FwYWJpbGl0aWVzKVxuICAgIHRyeSB7XG4gICAgICBkZXNpcmVkQ2FwcyA9IHByb2Nlc3NDYXBhYmlsaXRpZXModzNjQ2FwYWJpbGl0aWVzLCBjb25zdHJhaW50cywgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBDb3VsZCBub3QgcGFyc2UgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVzaXJlZENhcHMsXG4gICAgICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyxcbiAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyB3M2MgY2FwYWJpbGl0aWVzIHBheWxvYWQgdGhhdCBjb250YWlucyBvbmx5IHRoZSBtYXRjaGluZyBjYXBzIGluIGBhbHdheXNNYXRjaGBcbiAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSB7XG4gICAgICBhbHdheXNNYXRjaDogey4uLmluc2VydEFwcGl1bVByZWZpeGVzKGRlc2lyZWRDYXBzKX0sXG4gICAgICBmaXJzdE1hdGNoOiBbe31dLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge2Rlc2lyZWRDYXBzLCBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcywgcHJvdG9jb2x9O1xufVxuXG4vKipcbiAqIFRha2VzIGEgY2FwYWJpbGl0aWVzIG9iamVjdHMgYW5kIHByZWZpeGVzIGNhcGFiaWxpdGllcyB3aXRoIGBhcHBpdW06YFxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgRGVzaXJlZCBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluc2VydEFwcGl1bVByZWZpeGVzIChjYXBzKSB7XG4gIC8vIFN0YW5kYXJkLCBub24tcHJlZml4ZWQgY2FwYWJpbGl0aWVzIChzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmRyaXZlci8jZGZuLXRhYmxlLW9mLXN0YW5kYXJkLWNhcGFiaWxpdGllcylcbiAgY29uc3QgU1RBTkRBUkRfQ0FQUyA9IFtcbiAgICAnYnJvd3Nlck5hbWUnLFxuICAgICdicm93c2VyVmVyc2lvbicsXG4gICAgJ3BsYXRmb3JtTmFtZScsXG4gICAgJ2FjY2VwdEluc2VjdXJlQ2VydHMnLFxuICAgICdwYWdlTG9hZFN0cmF0ZWd5JyxcbiAgICAncHJveHknLFxuICAgICdzZXRXaW5kb3dSZWN0JyxcbiAgICAndGltZW91dHMnLFxuICAgICd1bmhhbmRsZWRQcm9tcHRCZWhhdmlvcidcbiAgXTtcblxuICBsZXQgcHJlZml4ZWRDYXBzID0ge307XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgaWYgKFNUQU5EQVJEX0NBUFMuaW5jbHVkZXMobmFtZSkgfHwgbmFtZS5pbmNsdWRlcygnOicpKSB7XG4gICAgICBwcmVmaXhlZENhcHNbbmFtZV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZml4ZWRDYXBzW2Ake1czQ19BUFBJVU1fUFJFRklYfToke25hbWV9YF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZWZpeGVkQ2Fwcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXBwaXVtUHJlZml4ZXMgKGNhcHMpIHtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykpIHtcbiAgICByZXR1cm4gY2FwcztcbiAgfVxuXG4gIGNvbnN0IGZpeGVkQ2FwcyA9IHt9O1xuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGZpeGVkQ2Fwc1tyZW1vdmVBcHBpdW1QcmVmaXgobmFtZSldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGZpeGVkQ2Fwcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXBwaXVtUHJlZml4IChrZXkpIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7VzNDX0FQUElVTV9QUkVGSVh9OmA7XG4gIHJldHVybiBfLnN0YXJ0c1dpdGgoa2V5LCBwcmVmaXgpID8ga2V5LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSA6IGtleTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb24gKHBrZ05hbWUpIHtcbiAgY29uc3QgcGtnSW5mbyA9IHJlcXVpcmUoYCR7cGtnTmFtZX0vcGFja2FnZS5qc29uYCkgfHwge307XG4gIHJldHVybiBwa2dJbmZvLnZlcnNpb247XG59XG5cbi8qKlxuICogUHVsbHMgdGhlIGluaXRpYWwgdmFsdWVzIG9mIEFwcGl1bSBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiBjYXBhYmlsaXRpZXMgYXJndW1lbnQuXG4gKiBFYWNoIHNldHRpbmcgaXRlbSBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gKiBgc2V0dGluZ1tzZXR0aW5nX25hbWVdOiBzZXR0aW5nX3ZhbHVlYFxuICogVGhlIGNhcGFiaWxpdGllcyBhcmd1bWVudCBpdHNlbGYgZ2V0cyBtdXRhdGVkLCBzbyBpdCBkb2VzIG5vdCBjb250YWluIHBhcnNlZFxuICogc2V0dGluZ3MgYW55bW9yZSB0byBhdm9pZCBmdXJ0aGVyIHBhcnNpbmcgaXNzdWVzLlxuICogQ2hlY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vYWR2YW5jZWQtY29uY2VwdHMvc2V0dGluZ3MubWRcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGF2YWlsYWJsZSBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gez9PYmplY3R9IGNhcHMgLSBDYXBhYmlsaXRpZXMgZGljdGlvbmFyeS4gSXQgaXMgbXV0YXRlZCBpZlxuICogb25lIG9yIG1vcmUgc2V0dGluZ3MgaGF2ZSBiZWVuIHB1bGxlZCBmcm9tIGl0XG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gQW4gZW1wdHkgZGljdGlvbmFyeSBpZiB0aGUgZ2l2ZW4gY2FwcyBjb250YWlucyBub1xuICogc2V0dGluZyBpdGVtcyBvciBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBwYXJzZWQgQXBwaXVtIHNldHRpbmcgbmFtZXMgYWxvbmcgd2l0aFxuICogdGhlaXIgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBwdWxsU2V0dGluZ3MgKGNhcHMpIHtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykgfHwgXy5pc0VtcHR5KGNhcHMpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGNvbnN0IG1hdGNoID0gL1xcYnNldHRpbmdzXFxbKFxcUyspXFxdJC8uZXhlYyhrZXkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc3VsdFttYXRjaFsxXV0gPSB2YWx1ZTtcbiAgICBkZWxldGUgY2Fwc1trZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IHJvb3REaXIgPSBmcy5maW5kUm9vdChfX2Rpcm5hbWUpO1xuXG5cbi8qKlxuICogQSBNYXAgd2hlcmUgeW91IGNhbiBzZXQgcHJvcGVydGllcywgYnV0IG9ubHkgb25jZS4gQW5kIHlvdSBjYW4ndCByZW1vdmUgYW55dGhpbmcuIFNvIHRoZXJlLlxuICogQHRlbXBsYXRlIEssVlxuICogQGV4dGVuZHMge01hcDxLLFY+fVxuICovXG5jbGFzcyBSZWFkb25seU1hcCBleHRlbmRzIE1hcCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0t9IGtleVxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlXG4gICAqL1xuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gaXMgYWxyZWFkeSBzZXRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gY2Fubm90IGJlIGRlbGV0ZWRgKTtcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciBSZWFkb25seU1hcGApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGluc3BlY3RPYmplY3QsIHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBpbnNlcnRBcHBpdW1QcmVmaXhlcywgcm9vdERpcixcbiAgZ2V0UGFja2FnZVZlcnNpb24sIHB1bGxTZXR0aW5ncywgcmVtb3ZlQXBwaXVtUHJlZml4ZXMsIFJlYWRvbmx5TWFwXG59O1xuIl0sImZpbGUiOiJsaWIvdXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ require("source-map-support/register");
5
+
6
+ async function main() {
7
+ const driverEnv = process.env.npm_config_drivers;
8
+ const pluginEnv = process.env.npm_config_plugins;
9
+
10
+ if (!driverEnv && !pluginEnv) {
11
+ console.log('Not auto-installing any drivers or plugins');
12
+ return;
13
+ }
14
+
15
+ let extension;
16
+
17
+ try {
18
+ extension = require('./build/lib/cli/extension');
19
+ } catch (e) {
20
+ throw new Error(`Could not load extension CLI file; has the project been transpiled? ` + `(${e.message})`);
21
+ }
22
+
23
+ const {
24
+ DEFAULT_APPIUM_HOME,
25
+ DRIVER_TYPE,
26
+ PLUGIN_TYPE
27
+ } = require('./build/lib/extension-config');
28
+
29
+ const {
30
+ runExtensionCommand
31
+ } = extension;
32
+ const appiumHome = process.env.npm_config_appium_home || DEFAULT_APPIUM_HOME;
33
+ const specs = [[DRIVER_TYPE, driverEnv], [PLUGIN_TYPE, pluginEnv]];
34
+
35
+ for (const [type, extEnv] of specs) {
36
+ if (extEnv) {
37
+ for (const ext of extEnv.split(',')) {
38
+ try {
39
+ await checkAndInstallExtension({
40
+ runExtensionCommand,
41
+ appiumHome,
42
+ type,
43
+ ext
44
+ });
45
+ } catch (e) {
46
+ console.log(`There was an error checking and installing ${type} ${ext}: ${e.message}`);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ async function checkAndInstallExtension({
54
+ runExtensionCommand,
55
+ appiumHome,
56
+ type,
57
+ ext
58
+ }) {
59
+ const extList = await runExtensionCommand({
60
+ appiumHome,
61
+ [`${type}Command`]: 'list',
62
+ showInstalled: true,
63
+ suppressOutput: true
64
+ }, type);
65
+
66
+ if (extList[ext]) {
67
+ console.log(`The ${type} ${ext} was already installed, skipping...`);
68
+ return;
69
+ }
70
+
71
+ console.log(`Installing the ${type} ${ext}...`);
72
+ await runExtensionCommand({
73
+ appiumHome,
74
+ [`${type}Command`]: 'install',
75
+ [type]: ext,
76
+ suppressOutput: true
77
+ }, type);
78
+ }
79
+
80
+ if (require.main === module) {
81
+ main().then(() => {
82
+ process.exit(0);
83
+ }).catch(e => {
84
+ console.error(e);
85
+ process.exit(1);
86
+ });
87
+ }require('source-map-support').install();
88
+
89
+
90
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBvc3RpbnN0YWxsLmpzIl0sIm5hbWVzIjpbIm1haW4iLCJkcml2ZXJFbnYiLCJwcm9jZXNzIiwiZW52IiwibnBtX2NvbmZpZ19kcml2ZXJzIiwicGx1Z2luRW52IiwibnBtX2NvbmZpZ19wbHVnaW5zIiwiY29uc29sZSIsImxvZyIsImV4dGVuc2lvbiIsInJlcXVpcmUiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwiREVGQVVMVF9BUFBJVU1fSE9NRSIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJydW5FeHRlbnNpb25Db21tYW5kIiwiYXBwaXVtSG9tZSIsIm5wbV9jb25maWdfYXBwaXVtX2hvbWUiLCJzcGVjcyIsInR5cGUiLCJleHRFbnYiLCJleHQiLCJzcGxpdCIsImNoZWNrQW5kSW5zdGFsbEV4dGVuc2lvbiIsImV4dExpc3QiLCJzaG93SW5zdGFsbGVkIiwic3VwcHJlc3NPdXRwdXQiLCJtb2R1bGUiLCJ0aGVuIiwiZXhpdCIsImNhdGNoIiwiZXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBOzs7OztBQUdBLGVBQWVBLElBQWYsR0FBdUI7QUFDckIsUUFBTUMsU0FBUyxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsa0JBQTlCO0FBQ0EsUUFBTUMsU0FBUyxHQUFHSCxPQUFPLENBQUNDLEdBQVIsQ0FBWUcsa0JBQTlCOztBQUVBLE1BQUksQ0FBQ0wsU0FBRCxJQUFjLENBQUNJLFNBQW5CLEVBQThCO0FBQzVCRSxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSw0Q0FBWjtBQUNBO0FBQ0Q7O0FBRUQsTUFBSUMsU0FBSjs7QUFDQSxNQUFJO0FBQ0ZBLElBQUFBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLDJCQUFELENBQW5CO0FBQ0QsR0FGRCxDQUVFLE9BQU9DLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSUMsS0FBSixDQUFXLHNFQUFELEdBQ0MsSUFBR0QsQ0FBQyxDQUFDRSxPQUFRLEdBRHhCLENBQU47QUFFRDs7QUFFRCxRQUFNO0FBQUNDLElBQUFBLG1CQUFEO0FBQXNCQyxJQUFBQSxXQUF0QjtBQUFtQ0MsSUFBQUE7QUFBbkMsTUFBa0ROLE9BQU8sQ0FBQyw4QkFBRCxDQUEvRDs7QUFDQSxRQUFNO0FBQUNPLElBQUFBO0FBQUQsTUFBd0JSLFNBQTlCO0FBQ0EsUUFBTVMsVUFBVSxHQUFHaEIsT0FBTyxDQUFDQyxHQUFSLENBQVlnQixzQkFBWixJQUFzQ0wsbUJBQXpEO0FBQ0EsUUFBTU0sS0FBSyxHQUFHLENBQUMsQ0FBQ0wsV0FBRCxFQUFjZCxTQUFkLENBQUQsRUFBMkIsQ0FBQ2UsV0FBRCxFQUFjWCxTQUFkLENBQTNCLENBQWQ7O0FBRUEsT0FBSyxNQUFNLENBQUNnQixJQUFELEVBQU9DLE1BQVAsQ0FBWCxJQUE2QkYsS0FBN0IsRUFBb0M7QUFDbEMsUUFBSUUsTUFBSixFQUFZO0FBQ1YsV0FBSyxNQUFNQyxHQUFYLElBQWtCRCxNQUFNLENBQUNFLEtBQVAsQ0FBYSxHQUFiLENBQWxCLEVBQXFDO0FBQ25DLFlBQUk7QUFDRixnQkFBTUMsd0JBQXdCLENBQUM7QUFBQ1IsWUFBQUEsbUJBQUQ7QUFBc0JDLFlBQUFBLFVBQXRCO0FBQWtDRyxZQUFBQSxJQUFsQztBQUF3Q0UsWUFBQUE7QUFBeEMsV0FBRCxDQUE5QjtBQUNELFNBRkQsQ0FFRSxPQUFPWixDQUFQLEVBQVU7QUFDVkosVUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsOENBQTZDYSxJQUFLLElBQUdFLEdBQUksS0FBSVosQ0FBQyxDQUFDRSxPQUFRLEVBQXBGO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7QUFDRjs7QUFFRCxlQUFlWSx3QkFBZixDQUF5QztBQUN2Q1IsRUFBQUEsbUJBRHVDO0FBRXZDQyxFQUFBQSxVQUZ1QztBQUd2Q0csRUFBQUEsSUFIdUM7QUFJdkNFLEVBQUFBO0FBSnVDLENBQXpDLEVBS0c7QUFDRCxRQUFNRyxPQUFPLEdBQUcsTUFBTVQsbUJBQW1CLENBQUM7QUFDeENDLElBQUFBLFVBRHdDO0FBRXhDLEtBQUUsR0FBRUcsSUFBSyxTQUFULEdBQW9CLE1BRm9CO0FBR3hDTSxJQUFBQSxhQUFhLEVBQUUsSUFIeUI7QUFJeENDLElBQUFBLGNBQWMsRUFBRTtBQUp3QixHQUFELEVBS3RDUCxJQUxzQyxDQUF6Qzs7QUFNQSxNQUFJSyxPQUFPLENBQUNILEdBQUQsQ0FBWCxFQUFrQjtBQUNoQmhCLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLE9BQU1hLElBQUssSUFBR0UsR0FBSSxxQ0FBL0I7QUFDQTtBQUNEOztBQUNEaEIsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsa0JBQWlCYSxJQUFLLElBQUdFLEdBQUksS0FBMUM7QUFDQSxRQUFNTixtQkFBbUIsQ0FBQztBQUN4QkMsSUFBQUEsVUFEd0I7QUFFeEIsS0FBRSxHQUFFRyxJQUFLLFNBQVQsR0FBb0IsU0FGSTtBQUd4QixLQUFDQSxJQUFELEdBQVFFLEdBSGdCO0FBSXhCSyxJQUFBQSxjQUFjLEVBQUU7QUFKUSxHQUFELEVBS3RCUCxJQUxzQixDQUF6QjtBQU1EOztBQUVELElBQUlYLE9BQU8sQ0FBQ1YsSUFBUixLQUFpQjZCLE1BQXJCLEVBQTZCO0FBQzNCN0IsRUFBQUEsSUFBSSxHQUFHOEIsSUFBUCxDQUFZLE1BQU07QUFDaEI1QixJQUFBQSxPQUFPLENBQUM2QixJQUFSLENBQWEsQ0FBYjtBQUNELEdBRkQsRUFFR0MsS0FGSCxDQUVVckIsQ0FBRCxJQUFPO0FBQ2RKLElBQUFBLE9BQU8sQ0FBQzBCLEtBQVIsQ0FBY3RCLENBQWQ7QUFDQVQsSUFBQUEsT0FBTyxDQUFDNkIsSUFBUixDQUFhLENBQWI7QUFDRCxHQUxEO0FBTUQiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlLCBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuICovXG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4gKCkge1xuICBjb25zdCBkcml2ZXJFbnYgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2RyaXZlcnM7XG4gIGNvbnN0IHBsdWdpbkVudiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcGx1Z2lucztcblxuICBpZiAoIWRyaXZlckVudiAmJiAhcGx1Z2luRW52KSB7XG4gICAgY29uc29sZS5sb2coJ05vdCBhdXRvLWluc3RhbGxpbmcgYW55IGRyaXZlcnMgb3IgcGx1Z2lucycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBleHRlbnNpb247XG4gIHRyeSB7XG4gICAgZXh0ZW5zaW9uID0gcmVxdWlyZSgnLi9idWlsZC9saWIvY2xpL2V4dGVuc2lvbicpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9hZCBleHRlbnNpb24gQ0xJIGZpbGU7IGhhcyB0aGUgcHJvamVjdCBiZWVuIHRyYW5zcGlsZWQ/IGAgK1xuICAgICAgICAgICAgICAgICAgICBgKCR7ZS5tZXNzYWdlfSlgKTtcbiAgfVxuXG4gIGNvbnN0IHtERUZBVUxUX0FQUElVTV9IT01FLCBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEV9ID0gcmVxdWlyZSgnLi9idWlsZC9saWIvZXh0ZW5zaW9uLWNvbmZpZycpO1xuICBjb25zdCB7cnVuRXh0ZW5zaW9uQ29tbWFuZH0gPSBleHRlbnNpb247XG4gIGNvbnN0IGFwcGl1bUhvbWUgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2FwcGl1bV9ob21lIHx8IERFRkFVTFRfQVBQSVVNX0hPTUU7XG4gIGNvbnN0IHNwZWNzID0gW1tEUklWRVJfVFlQRSwgZHJpdmVyRW52XSwgW1BMVUdJTl9UWVBFLCBwbHVnaW5FbnZdXTtcblxuICBmb3IgKGNvbnN0IFt0eXBlLCBleHRFbnZdIG9mIHNwZWNzKSB7XG4gICAgaWYgKGV4dEVudikge1xuICAgICAgZm9yIChjb25zdCBleHQgb2YgZXh0RW52LnNwbGl0KCcsJykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjaGVja0FuZEluc3RhbGxFeHRlbnNpb24oe3J1bkV4dGVuc2lvbkNvbW1hbmQsIGFwcGl1bUhvbWUsIHR5cGUsIGV4dH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFRoZXJlIHdhcyBhbiBlcnJvciBjaGVja2luZyBhbmQgaW5zdGFsbGluZyAke3R5cGV9ICR7ZXh0fTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRJbnN0YWxsRXh0ZW5zaW9uICh7XG4gIHJ1bkV4dGVuc2lvbkNvbW1hbmQsXG4gIGFwcGl1bUhvbWUsXG4gIHR5cGUsXG4gIGV4dCxcbn0pIHtcbiAgY29uc3QgZXh0TGlzdCA9IGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQoe1xuICAgIGFwcGl1bUhvbWUsXG4gICAgW2Ake3R5cGV9Q29tbWFuZGBdOiAnbGlzdCcsXG4gICAgc2hvd0luc3RhbGxlZDogdHJ1ZSxcbiAgICBzdXBwcmVzc091dHB1dDogdHJ1ZSxcbiAgfSwgdHlwZSk7XG4gIGlmIChleHRMaXN0W2V4dF0pIHtcbiAgICBjb25zb2xlLmxvZyhgVGhlICR7dHlwZX0gJHtleHR9IHdhcyBhbHJlYWR5IGluc3RhbGxlZCwgc2tpcHBpbmcuLi5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5sb2coYEluc3RhbGxpbmcgdGhlICR7dHlwZX0gJHtleHR9Li4uYCk7XG4gIGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQoe1xuICAgIGFwcGl1bUhvbWUsXG4gICAgW2Ake3R5cGV9Q29tbWFuZGBdOiAnaW5zdGFsbCcsXG4gICAgW3R5cGVdOiBleHQsXG4gICAgc3VwcHJlc3NPdXRwdXQ6IHRydWUsXG4gIH0sIHR5cGUpO1xufVxuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgbWFpbigpLnRoZW4oKCkgPT4ge1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59XG4iXSwiZmlsZSI6InBvc3RpbnN0YWxsLmpzIiwic291cmNlUm9vdCI6Ii4uIn0=