appium 2.0.0-beta.18 → 2.0.0-beta.21

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 (54) hide show
  1. package/build/lib/appium-config.schema.json +0 -0
  2. package/build/lib/appium.js +84 -69
  3. package/build/lib/cli/argparse-actions.js +1 -1
  4. package/build/lib/cli/args.js +87 -223
  5. package/build/lib/cli/extension-command.js +2 -2
  6. package/build/lib/cli/extension.js +14 -6
  7. package/build/lib/cli/parser.js +142 -106
  8. package/build/lib/cli/utils.js +1 -1
  9. package/build/lib/config-file.js +141 -0
  10. package/build/lib/config.js +42 -64
  11. package/build/lib/driver-config.js +41 -20
  12. package/build/lib/drivers.js +1 -1
  13. package/build/lib/ext-config-io.js +165 -0
  14. package/build/lib/extension-config.js +110 -60
  15. package/build/lib/grid-register.js +19 -21
  16. package/build/lib/logsink.js +1 -1
  17. package/build/lib/main.js +135 -72
  18. package/build/lib/plugin-config.js +17 -8
  19. package/build/lib/schema/appium-config-schema.js +252 -0
  20. package/build/lib/schema/arg-spec.js +120 -0
  21. package/build/lib/schema/cli-args.js +173 -0
  22. package/build/lib/schema/cli-transformers.js +76 -0
  23. package/build/lib/schema/index.js +36 -0
  24. package/build/lib/schema/keywords.js +62 -0
  25. package/build/lib/schema/schema.js +357 -0
  26. package/build/lib/utils.js +26 -35
  27. package/lib/appium-config.schema.json +277 -0
  28. package/lib/appium.js +99 -75
  29. package/lib/cli/args.js +138 -335
  30. package/lib/cli/extension-command.js +7 -6
  31. package/lib/cli/extension.js +12 -4
  32. package/lib/cli/parser.js +248 -96
  33. package/lib/config-file.js +227 -0
  34. package/lib/config.js +71 -61
  35. package/lib/driver-config.js +66 -11
  36. package/lib/ext-config-io.js +287 -0
  37. package/lib/extension-config.js +209 -66
  38. package/lib/grid-register.js +24 -21
  39. package/lib/main.js +139 -68
  40. package/lib/plugin-config.js +32 -2
  41. package/lib/schema/appium-config-schema.js +286 -0
  42. package/lib/schema/arg-spec.js +218 -0
  43. package/lib/schema/cli-args.js +273 -0
  44. package/lib/schema/cli-transformers.js +123 -0
  45. package/lib/schema/index.js +2 -0
  46. package/lib/schema/keywords.js +119 -0
  47. package/lib/schema/schema.js +577 -0
  48. package/lib/utils.js +29 -52
  49. package/package.json +17 -11
  50. package/types/appium-config.d.ts +197 -0
  51. package/types/types.d.ts +201 -0
  52. package/LICENSE +0 -201
  53. package/build/lib/cli/parser-helpers.js +0 -106
  54. package/lib/cli/parser-helpers.js +0 -106
@@ -5,14 +5,13 @@ 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
- exports.getExtensionArgs = getExtensionArgs;
15
- exports.validateExtensionArgs = validateExtensionArgs;
16
15
  exports.rootDir = void 0;
17
16
 
18
17
  require("source-map-support/register");
@@ -60,35 +59,6 @@ function inspectObject(args) {
60
59
  }
61
60
  }
62
61
 
63
- function getExtensionArgs(extensionArgs, extensionName) {
64
- if (!_lodash.default.has(extensionArgs, extensionName)) {
65
- return {};
66
- }
67
-
68
- if (!_lodash.default.isPlainObject(extensionArgs[extensionName])) {
69
- throw new TypeError(`Driver or plugin arguments must be plain objects`);
70
- }
71
-
72
- return extensionArgs[extensionName];
73
- }
74
-
75
- function ensureNoUnknownArgs(extensionArgs, argsConstraints) {
76
- const knownArgNames = Object.keys(argsConstraints);
77
-
78
- const unknownArgs = _lodash.default.difference(Object.keys(extensionArgs), knownArgNames);
79
-
80
- if (unknownArgs.length > 0) {
81
- throw new Error(`Some arguments were not recognized: ${JSON.stringify(unknownArgs)}. ` + `Are you sure they are in the list of supported args? ${JSON.stringify(knownArgNames)}`);
82
- }
83
- }
84
-
85
- function validateExtensionArgs(extensionArgs, argsConstraints) {
86
- if (!_lodash.default.isEmpty(extensionArgs) && !_lodash.default.isEmpty(argsConstraints)) {
87
- ensureNoUnknownArgs(extensionArgs, argsConstraints);
88
- (0, _baseDriver.validateCaps)(extensionArgs, argsConstraints);
89
- }
90
- }
91
-
92
62
  function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraints = {}, defaultCapabilities = {}) {
93
63
  const hasW3CCaps = _lodash.default.isPlainObject(w3cCapabilities) && (_lodash.default.has(w3cCapabilities, 'alwaysMatch') || _lodash.default.has(w3cCapabilities, 'firstMatch'));
94
64
 
@@ -243,7 +213,28 @@ function pullSettings(caps) {
243
213
 
244
214
  const rootDir = _support.fs.findRoot(__dirname);
245
215
 
246
- exports.rootDir = rootDir;require('source-map-support').install();
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();
247
238
 
248
239
 
249
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImluc3BlY3RPYmplY3QiLCJhcmdzIiwiZ2V0VmFsdWVBcnJheSIsIm9iaiIsImluZGVudCIsIl8iLCJpc09iamVjdCIsInN0ckFyciIsImFyZyIsInZhbHVlIiwidG9QYWlycyIsInB1c2giLCJzaGlmdCIsImxvZ2dlciIsImluZm8iLCJ2YWwiLCJnZXRFeHRlbnNpb25BcmdzIiwiZXh0ZW5zaW9uQXJncyIsImV4dGVuc2lvbk5hbWUiLCJoYXMiLCJpc1BsYWluT2JqZWN0IiwiVHlwZUVycm9yIiwiZW5zdXJlTm9Vbmtub3duQXJncyIsImFyZ3NDb25zdHJhaW50cyIsImtub3duQXJnTmFtZXMiLCJPYmplY3QiLCJrZXlzIiwidW5rbm93bkFyZ3MiLCJkaWZmZXJlbmNlIiwibGVuZ3RoIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsaWRhdGVFeHRlbnNpb25BcmdzIiwiaXNFbXB0eSIsInBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyIiwianNvbndwQ2FwYWJpbGl0aWVzIiwidzNjQ2FwYWJpbGl0aWVzIiwiY29uc3RyYWludHMiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwiaGFzVzNDQ2FwcyIsImhhc0pTT05XUENhcHMiLCJkZXNpcmVkQ2FwcyIsInByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyIsInByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyIsInByb3RvY29sIiwiUFJPVE9DT0xTIiwiVzNDIiwiZXJyb3IiLCJjbG9uZURlZXAiLCJkZWZhdWx0Q2FwS2V5IiwiZGVmYXVsdENhcFZhbHVlIiwiaXNDYXBBbHJlYWR5U2V0IiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsInJlbW92ZUFwcGl1bVByZWZpeGVzIiwicmVtb3ZlQXBwaXVtUHJlZml4IiwiYWx3YXlzTWF0Y2giLCJhc3NpZ24iLCJtZXNzYWdlIiwiaW5zZXJ0QXBwaXVtUHJlZml4ZXMiLCJjYXBzIiwiU1RBTkRBUkRfQ0FQUyIsInByZWZpeGVkQ2FwcyIsIm5hbWUiLCJpbmNsdWRlcyIsImZpeGVkQ2FwcyIsImtleSIsInByZWZpeCIsInN0YXJ0c1dpdGgiLCJzdWJzdHJpbmciLCJnZXRQYWNrYWdlVmVyc2lvbiIsInBrZ05hbWUiLCJwa2dJbmZvIiwicmVxdWlyZSIsInZlcnNpb24iLCJwdWxsU2V0dGluZ3MiLCJyZXN1bHQiLCJtYXRjaCIsImV4ZWMiLCJyb290RGlyIiwiZnMiLCJmaW5kUm9vdCIsIl9fZGlybmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGlCQUFpQixHQUFHLFFBQTFCOztBQUVBLFNBQVNDLGFBQVQsQ0FBd0JDLElBQXhCLEVBQThCO0FBQzVCLFdBQVNDLGFBQVQsQ0FBd0JDLEdBQXhCLEVBQTZCQyxNQUFNLEdBQUcsSUFBdEMsRUFBNEM7QUFDMUMsUUFBSSxDQUFDQyxnQkFBRUMsUUFBRixDQUFXSCxHQUFYLENBQUwsRUFBc0I7QUFDcEIsYUFBTyxDQUFDQSxHQUFELENBQVA7QUFDRDs7QUFFRCxRQUFJSSxNQUFNLEdBQUcsQ0FBQyxHQUFELENBQWI7O0FBQ0EsU0FBSyxJQUFJLENBQUNDLEdBQUQsRUFBTUMsS0FBTixDQUFULElBQXlCSixnQkFBRUssT0FBRixDQUFVUCxHQUFWLENBQXpCLEVBQXlDO0FBQ3ZDLFVBQUksQ0FBQ0UsZ0JBQUVDLFFBQUYsQ0FBV0csS0FBWCxDQUFMLEVBQXdCO0FBQ3RCRixRQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBYSxHQUFFUCxNQUFPLEtBQUlJLEdBQUksS0FBSUMsS0FBTSxFQUF4QztBQUNELE9BRkQsTUFFTztBQUNMQSxRQUFBQSxLQUFLLEdBQUdQLGFBQWEsQ0FBQ08sS0FBRCxFQUFTLEdBQUVMLE1BQU8sSUFBbEIsQ0FBckI7QUFDQUcsUUFBQUEsTUFBTSxDQUFDSSxJQUFQLENBQWEsR0FBRVAsTUFBTyxLQUFJSSxHQUFJLEtBQUlDLEtBQUssQ0FB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U0FBT1UsTUFBUDtBQUNEOztBQUVELE1BQU1HLE9BQU8sR0FBR0MsWUFBR0MsUUFBSCxDQUFZQyxTQUFaLENBQWhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcHJvY2Vzc0NhcGFiaWxpdGllcywgUFJPVE9DT0xTLCB2YWxpZGF0ZUNhcHMgYXMgdmFsaWRhdGVBcmdzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IFczQ19BUFBJVU1fUFJFRklYID0gJ2FwcGl1bSc7XG5cbmZ1bmN0aW9uIGluc3BlY3RPYmplY3QgKGFyZ3MpIHtcbiAgZnVuY3Rpb24gZ2V0VmFsdWVBcnJheSAob2JqLCBpbmRlbnQgPSAnICAnKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHtcbiAgICAgIHJldHVybiBbb2JqXTtcbiAgICB9XG5cbiAgICBsZXQgc3RyQXJyID0gWyd7J107XG4gICAgZm9yIChsZXQgW2FyZywgdmFsdWVdIG9mIF8udG9QYWlycyhvYmopKSB7XG4gICAgICBpZiAoIV8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHN0ckFyci5wdXNoKGAke2luZGVudH0gICR7YXJnfTogJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZ2V0VmFsdWVBcnJheSh2YWx1ZSwgYCR7aW5kZW50fSAgYCk7XG4gICAgICAgIHN0ckFyci5wdXNoKGAke2luZGVudH0gICR7YXJnfTogJHt2YWx1ZS5zaGlmdCgpfWApO1xuICAgICAgICBzdHJBcnIucHVzaCguLi52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0ckFyci5wdXNoKGAke2luZGVudH19YCk7XG4gICAgcmV0dXJuIHN0ckFycjtcbiAgfVxuICBmb3IgKGxldCBbYXJnLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGFyZ3MpKSB7XG4gICAgdmFsdWUgPSBnZXRWYWx1ZUFycmF5KHZhbHVlKTtcbiAgICBsb2dnZXIuaW5mbyhgICAke2FyZ306ICR7dmFsdWUuc2hpZnQoKX1gKTtcbiAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHZhbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBzZXQgb2YgQ0xJIGFyZ3MgYW5kIHRoZSBuYW1lIG9mIGEgZHJpdmVyIG9yIHBsdWdpbiwgZXh0cmFjdCB0aG9zZSBhcmdzIGZvciB0aGF0IHBsdWdpblxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbkFyZ3MgLSBhcmd1bWVudHMgb2YgdGhlIGZvcm0ge1tleHROYW1lXToge1thcmdOYW1lXTogW2FyZ1ZhbHVlXX19XG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGFyZyBvYmplY3QgZm9yIHRoYXQgZXh0ZW5zaW9uIGFsb25lXG4gKi9cbmZ1bmN0aW9uIGdldEV4dGVuc2lvbkFyZ3MgKGV4dGVuc2lvbkFyZ3MsIGV4dGVuc2lvbk5hbWUpIHtcbiAgaWYgKCFfLmhhcyhleHRlbnNpb25BcmdzLCBleHRlbnNpb25OYW1lKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoIV8uaXNQbGFpbk9iamVjdChleHRlbnNpb25BcmdzW2V4dGVuc2lvbk5hbWVdKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYERyaXZlciBvciBwbHVnaW4gYXJndW1lbnRzIG11c3QgYmUgcGxhaW4gb2JqZWN0c2ApO1xuICB9XG4gIHJldHVybiBleHRlbnNpb25BcmdzW2V4dGVuc2lvbk5hbWVdO1xufVxuXG5cbi8qKlxuICogR2l2ZW4gYSBzZXQgb2YgYXJncyBhbmQgYSBzZXQgb2YgY29uc3RyYWludHMsIHRocm93IGFuIGVycm9yIGlmIGFueSBhcmdzIGFyZSBub3QgbWVudGlvbmVkIGluXG4gKiB0aGUgc2V0IG9mIGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZXh0ZW5zaW9uQXJncyB0aGUgYXJnc1xuICogQHBhcmFtIHtPYmplY3R9IGFyZ3NDb25zdHJhaW50cyB0aGUgY29uc3RyYWludHMgb2JqZWN0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW55IGFyZ3Mgd2VyZSBub3QgcmVjb2duaXplZFxuICovXG5mdW5jdGlvbiBlbnN1cmVOb1Vua25vd25BcmdzIChleHRlbnNpb25BcmdzLCBhcmdzQ29uc3RyYWludHMpIHtcbiAgY29uc3Qga25vd25BcmdOYW1lcyA9IE9iamVjdC5rZXlzKGFyZ3NDb25zdHJhaW50cyk7XG4gIGNvbnN0IHVua25vd25BcmdzID0gXy5kaWZmZXJlbmNlKE9iamVjdC5rZXlzKGV4dGVuc2lvbkFyZ3MpLCBrbm93bkFyZ05hbWVzKTtcbiAgaWYgKHVua25vd25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvbWUgYXJndW1lbnRzIHdlcmUgbm90IHJlY29nbml6ZWQ6ICR7SlNPTi5zdHJpbmdpZnkodW5rbm93bkFyZ3MpfS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBBcmUgeW91IHN1cmUgdGhleSBhcmUgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyZ3M/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25BcmdOYW1lcyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyBpbiBhIHNldCBvZiBkcml2ZXIvcGx1Z2luIGFyZ3MgcGFzc2VkIGluIGJ5IHVzZXIsIGFuZCBhcmcgY29uc3RyYWludHNcbiAqIGFuZCB0aHJvd3MgYW4gZXJyb3IgaWYgYW55IGFyZyBpcyB1bmtub3duIG9yIG9mIHRoZSBpbmNvcnJlY3QgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHRlbnNpb25BcmdzIC0gRHJpdmVyIG9yIFBsdWdpbiBzcGVjaWZpYyBhcmdzXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc0NvbnN0cmFpbnRzIC0gQ29uc3RyYWludHMgZm9yIGFyZ3VtZW50c1xuICogQHRocm93cyB7RXJyb3J9IGlmIGFueSBhcmdzIGFyZSBub3QgcmVjb2duaXplZCBvciBhcmUgb2YgYW4gaW52YWxpZCB0eXBlXG4qL1xuZnVuY3Rpb24gdmFsaWRhdGVFeHRlbnNpb25BcmdzIChleHRlbnNpb25BcmdzLCBhcmdzQ29uc3RyYWludHMpIHtcbiAgaWYgKCFfLmlzRW1wdHkoZXh0ZW5zaW9uQXJncykgJiYgIV8uaXNFbXB0eShhcmdzQ29uc3RyYWludHMpKSB7XG4gICAgZW5zdXJlTm9Vbmtub3duQXJncyhleHRlbnNpb25BcmdzLCBhcmdzQ29uc3RyYWludHMpO1xuICAgIHZhbGlkYXRlQXJncyhleHRlbnNpb25BcmdzLCBhcmdzQ29uc3RyYWludHMpO1xuICB9XG59XG5cblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGpzb253cENhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IHczY0NhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciAoanNvbndwQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzID0ge30sIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSB7fSkge1xuICAvLyBDaGVjayBpZiB0aGUgY2FsbGVyIHNlbnQgSlNPTldQIGNhcHMsIFczQyBjYXBzLCBvciBib3RoXG4gIGNvbnN0IGhhc1czQ0NhcHMgPSBfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzKSAmJlxuICAgIChfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdhbHdheXNNYXRjaCcpIHx8IF8uaGFzKHczY0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnKSk7XG4gIGNvbnN0IGhhc0pTT05XUENhcHMgPSBfLmlzUGxhaW5PYmplY3QoanNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgbGV0IGRlc2lyZWRDYXBzID0ge307XG4gIGxldCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSBudWxsO1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gbnVsbDtcblxuICBpZiAoIWhhc1czQ0NhcHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IFBST1RPQ09MUy5XM0MsXG4gICAgICBlcnJvcjogbmV3IEVycm9yKCdXM0MgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSBwcm92aWRlZCcpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7VzNDfSA9IFBST1RPQ09MUztcbiAgY29uc3QgcHJvdG9jb2wgPSBXM0M7XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IG11dGF0ZSB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG4gIGpzb253cENhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKGpzb253cENhcGFiaWxpdGllcyk7XG4gIHczY0NhcGFiaWxpdGllcyA9IF8uY2xvbmVEZWVwKHczY0NhcGFiaWxpdGllcyk7XG4gIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChkZWZhdWx0Q2FwYWJpbGl0aWVzKTtcblxuICBpZiAoIV8uaXNFbXB0eShkZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgIGlmIChoYXNXM0NDYXBzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZWZhdWx0Q2FwS2V5LCBkZWZhdWx0Q2FwVmFsdWVdIG9mIF8udG9QYWlycyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgICAgICBsZXQgaXNDYXBBbHJlYWR5U2V0ID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGZpcnN0TWF0Y2ggZW50cmllc1xuICAgICAgICBmb3IgKGNvbnN0IGZpcnN0TWF0Y2hFbnRyeSBvZiAodzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggfHwgW10pKSB7XG4gICAgICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChmaXJzdE1hdGNoRW50cnkpXG4gICAgICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKGZpcnN0TWF0Y2hFbnRyeSksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpIHtcbiAgICAgICAgICAgIGlzQ2FwQWxyZWFkeVNldCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gYWx3YXlzTWF0Y2ggZW50cmllc1xuICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSBpc0NhcEFscmVhZHlTZXQgfHwgKF8uaXNQbGFpbk9iamVjdCh3M2NDYXBhYmlsaXRpZXMuYWx3YXlzTWF0Y2gpXG4gICAgICAgICAgJiYgXy5oYXMocmVtb3ZlQXBwaXVtUHJlZml4ZXModzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKSwgcmVtb3ZlQXBwaXVtUHJlZml4KGRlZmF1bHRDYXBLZXkpKSk7XG4gICAgICAgIGlmIChpc0NhcEFscmVhZHlTZXQpIHtcbiAgICAgICAgICAvLyBTa2lwIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwcm92aWRlZCBjYXBzXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGFkZCB0aGUgZGVmYXVsdCBjYXBhYmlsaXR5IGlmIGl0IGlzIG5vdCBvdmVycmlkZGVuXG4gICAgICAgIGlmIChfLmlzRW1wdHkodzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2gpKSB7XG4gICAgICAgICAgdzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2ggPSBbe1tkZWZhdWx0Q2FwS2V5XTogZGVmYXVsdENhcFZhbHVlfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdzNjQ2FwYWJpbGl0aWVzLmZpcnN0TWF0Y2hbMF1bZGVmYXVsdENhcEtleV0gPSBkZWZhdWx0Q2FwVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0pTT05XUENhcHMpIHtcbiAgICAgIGpzb253cENhcGFiaWxpdGllcyA9IE9iamVjdC5hc3NpZ24oe30sIHJlbW92ZUFwcGl1bVByZWZpeGVzKGRlZmF1bHRDYXBhYmlsaXRpZXMpLCBqc29ud3BDYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBNSlNPTldQIGNhcHNcbiAgaWYgKGhhc0pTT05XUENhcHMpIHtcbiAgICBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMgPSB7Li4uanNvbndwQ2FwYWJpbGl0aWVzfTtcbiAgfVxuXG4gIC8vIEdldCBXM0MgY2Fwc1xuICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgIC8vIENhbGwgdGhlIHByb2Nlc3MgY2FwYWJpbGl0aWVzIGFsZ29yaXRobSB0byBmaW5kIG1hdGNoaW5nIGNhcHMgb24gdGhlIFczQ1xuICAgIC8vIChzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qbGlwcHMvc2ltcGxlLXdkLXNwZWMjcHJvY2Vzc2luZy1jYXBhYmlsaXRpZXMpXG4gICAgdHJ5IHtcbiAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmluZm8oYENvdWxkIG5vdCBwYXJzZSBXM0MgY2FwYWJpbGl0aWVzOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXNpcmVkQ2FwcyxcbiAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsXG4gICAgICAgIHByb3RvY29sLFxuICAgICAgICBlcnJvcixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHczYyBjYXBhYmlsaXRpZXMgcGF5bG9hZCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIG1hdGNoaW5nIGNhcHMgaW4gYGFsd2F5c01hdGNoYFxuICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyA9IHtcbiAgICAgIGFsd2F5c01hdGNoOiB7Li4uaW5zZXJ0QXBwaXVtUHJlZml4ZXMoZGVzaXJlZENhcHMpfSxcbiAgICAgIGZpcnN0TWF0Y2g6IFt7fV0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7ZGVzaXJlZENhcHMsIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcywgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLCBwcm90b2NvbH07XG59XG5cbi8qKlxuICogVGFrZXMgYSBjYXBhYmlsaXRpZXMgb2JqZWN0cyBhbmQgcHJlZml4ZXMgY2FwYWJpbGl0aWVzIHdpdGggYGFwcGl1bTpgXG4gKiBAcGFyYW0ge09iamVjdH0gY2FwcyBEZXNpcmVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0QXBwaXVtUHJlZml4ZXMgKGNhcHMpIHtcbiAgLy8gU3RhbmRhcmQsIG5vbi1wcmVmaXhlZCBjYXBhYmlsaXRpZXMgKHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNkZm4tdGFibGUtb2Ytc3RhbmRhcmQtY2FwYWJpbGl0aWVzKVxuICBjb25zdCBTVEFOREFSRF9DQVBTID0gW1xuICAgICdicm93c2VyTmFtZScsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAncGxhdGZvcm1OYW1lJyxcbiAgICAnYWNjZXB0SW5zZWN1cmVDZXJ0cycsXG4gICAgJ3BhZ2VMb2FkU3RyYXRlZ3knLFxuICAgICdwcm94eScsXG4gICAgJ3NldFdpbmRvd1JlY3QnLFxuICAgICd0aW1lb3V0cycsXG4gICAgJ3VuaGFuZGxlZFByb21wdEJlaGF2aW9yJ1xuICBdO1xuXG4gIGxldCBwcmVmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBpZiAoU1RBTkRBUkRfQ0FQUy5pbmNsdWRlcyhuYW1lKSB8fCBuYW1lLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIHByZWZpeGVkQ2Fwc1tuYW1lXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaXhlZENhcHNbYCR7VzNDX0FQUElVTV9QUkVGSVh9OiR7bmFtZX1gXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlZml4ZWRDYXBzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVBcHBpdW1QcmVmaXhlcyAoY2Fwcykge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSkge1xuICAgIHJldHVybiBjYXBzO1xuICB9XG5cbiAgY29uc3QgZml4ZWRDYXBzID0ge307XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgZml4ZWRDYXBzW3JlbW92ZUFwcGl1bVByZWZpeChuYW1lKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZml4ZWRDYXBzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVBcHBpdW1QcmVmaXggKGtleSkge1xuICBjb25zdCBwcmVmaXggPSBgJHtXM0NfQVBQSVVNX1BSRUZJWH06YDtcbiAgcmV0dXJuIF8uc3RhcnRzV2l0aChrZXksIHByZWZpeCkgPyBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpIDoga2V5O1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlVmVyc2lvbiAocGtnTmFtZSkge1xuICBjb25zdCBwa2dJbmZvID0gcmVxdWlyZShgJHtwa2dOYW1lfS9wYWNrYWdlLmpzb25gKSB8fCB7fTtcbiAgcmV0dXJuIHBrZ0luZm8udmVyc2lvbjtcbn1cblxuLyoqXG4gKiBQdWxscyB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgQXBwaXVtIHNldHRpbmdzIGZyb20gdGhlIGdpdmVuIGNhcGFiaWxpdGllcyBhcmd1bWVudC5cbiAqIEVhY2ggc2V0dGluZyBpdGVtIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAqIGBzZXR0aW5nW3NldHRpbmdfbmFtZV06IHNldHRpbmdfdmFsdWVgXG4gKiBUaGUgY2FwYWJpbGl0aWVzIGFyZ3VtZW50IGl0c2VsZiBnZXRzIG11dGF0ZWQsIHNvIGl0IGRvZXMgbm90IGNvbnRhaW4gcGFyc2VkXG4gKiBzZXR0aW5ncyBhbnltb3JlIHRvIGF2b2lkIGZ1cnRoZXIgcGFyc2luZyBpc3N1ZXMuXG4gKiBDaGVja1xuICogaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vYmxvYi9tYXN0ZXIvZG9jcy9lbi9hZHZhbmNlZC1jb25jZXB0cy9zZXR0aW5ncy5tZFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgYXZhaWxhYmxlIHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSB7P09iamVjdH0gY2FwcyAtIENhcGFiaWxpdGllcyBkaWN0aW9uYXJ5LiBJdCBpcyBtdXRhdGVkIGlmXG4gKiBvbmUgb3IgbW9yZSBzZXR0aW5ncyBoYXZlIGJlZW4gcHVsbGVkIGZyb20gaXRcbiAqIEByZXR1cm4ge09iamVjdH0gLSBBbiBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZSBnaXZlbiBjYXBzIGNvbnRhaW5zIG5vXG4gKiBzZXR0aW5nIGl0ZW1zIG9yIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHBhcnNlZCBBcHBpdW0gc2V0dGluZyBuYW1lcyBhbG9uZyB3aXRoXG4gKiB0aGVpciB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHB1bGxTZXR0aW5ncyAoY2Fwcykge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChjYXBzKSB8fCBfLmlzRW1wdHkoY2FwcykpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXFxic2V0dGluZ3NcXFsoXFxTKylcXF0kLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IHZhbHVlO1xuICAgIGRlbGV0ZSBjYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgcm9vdERpciA9IGZzLmZpbmRSb290KF9fZGlybmFtZSk7XG5cbmV4cG9ydCB7XG4gIGluc3BlY3RPYmplY3QsIHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBpbnNlcnRBcHBpdW1QcmVmaXhlcywgcm9vdERpcixcbiAgZ2V0UGFja2FnZVZlcnNpb24sIHB1bGxTZXR0aW5ncywgcmVtb3ZlQXBwaXVtUHJlZml4ZXMsIGdldEV4dGVuc2lvbkFyZ3MsXG4gIHZhbGlkYXRlRXh0ZW5zaW9uQXJnc1xufTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
240
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImluc3BlY3RPYmplY3QiLCJhcmdzIiwiZ2V0VmFsdWVBcnJheSIsIm9iaiIsImluZGVudCIsIl8iLCJpc09iamVjdCIsInN0ckFyciIsImFyZyIsInZhbHVlIiwidG9QYWlycyIsInB1c2giLCJzaGlmdCIsImxvZ2dlciIsImluZm8iLCJ2YWwiLCJwYXJzZUNhcHNGb3JJbm5lckRyaXZlciIsImpzb253cENhcGFiaWxpdGllcyIsInczY0NhcGFiaWxpdGllcyIsImNvbnN0cmFpbnRzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImhhc1czQ0NhcHMiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiaGFzSlNPTldQQ2FwcyIsImRlc2lyZWRDYXBzIiwicHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzIiwicHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzIiwicHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJXM0MiLCJlcnJvciIsIkVycm9yIiwiY2xvbmVEZWVwIiwiaXNFbXB0eSIsImRlZmF1bHRDYXBLZXkiLCJkZWZhdWx0Q2FwVmFsdWUiLCJpc0NhcEFscmVhZHlTZXQiLCJmaXJzdE1hdGNoRW50cnkiLCJmaXJzdE1hdGNoIiwicmVtb3ZlQXBwaXVtUHJlZml4ZXMiLCJyZW1vdmVBcHBpdW1QcmVmaXgiLCJhbHdheXNNYXRjaCIsIk9iamVjdCIsImFzc2lnbiIsIm1lc3NhZ2UiLCJpbnNlcnRBcHBpdW1QcmVmaXhlcyIsImNhcHMiLCJTVEFOREFSRF9DQVBTIiwicHJlZml4ZWRDYXBzIiwibmFtZSIsImluY2x1ZGVzIiwiZml4ZWRDYXBzIiwia2V5IiwicHJlZml4Iiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsImxlbmd0aCIsImdldFBhY2thZ2VWZXJzaW9uIiwicGtnTmFtZSIsInBrZ0luZm8iLCJyZXF1aXJlIiwidmVyc2lvbiIsInB1bGxTZXR0aW5ncyIsInJlc3VsdCIsIm1hdGNoIiwiZXhlYyIsInJvb3REaXIiLCJmcyIsImZpbmRSb290IiwiX19kaXJuYW1lIiwiUmVhZG9ubHlNYXAiLCJNYXAiLCJzZXQiLCJkZWxldGUiLCJjbGVhciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsUUFBMUI7O0FBRUEsU0FBU0MsYUFBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsV0FBU0MsYUFBVCxDQUF3QkMsR0FBeEIsRUFBNkJDLE1BQU0sR0FBRyxJQUF0QyxFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdILEdBQVgsQ0FBTCxFQUFzQjtBQUNwQixhQUFPLENBQUNBLEdBQUQsQ0FBUDtBQUNEOztBQUVELFFBQUlJLE1BQU0sR0FBRyxDQUFDLEdBQUQsQ0FBYjs7QUFDQSxTQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLENBQVQsSUFBeUJKLGdCQUFFSyxPQUFGLENBQVVQLEdBQVYsQ0FBekIsRUFBeUM7QUFDdkMsVUFBSSxDQUFDRSxnQkFBRUMsUUFBRixDQUFXRyxLQUFYLENBQUwsRUFBd0I7QUFDdEJGLFFBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sS0FBSUksR0FBSSxLQUFJQyxLQUFNLEVBQXhDO0FBQ0QsT0FGRCxNQUVPO0FBQ0xBLFFBQUFBLEtBQUssR0FBR1AsYUFBYSxDQUFDTyxLQUFELEVBQVMsR0FBRUwsTUFBTyxJQUFsQixDQUFyQjtBQUNBRyxRQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBYSxHQUFFUCxNQUFPLEtBQUlJLEdBQUksS0FBSUMsS0FBSyxDQUFDRyxLQUFOLEVBQWMsRUFBaEQ7QUFDQUwsUUFBQUEsTUFBTSxDQUFDSSxJQUFQLENBQVksR0FBR0YsS0FBZjtBQUNEO0FBQ0Y7O0FBQ0RGLElBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sR0FBdEI7QUFDQSxXQUFPRyxNQUFQO0FBQ0Q7O0FBQ0QsT0FB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QUtjLEdBQUwsQ0FBUzhCLEdBQVQsQ0FBSixFQUFtQjtBQUNqQixZQUFNLElBQUlyQixLQUFKLENBQVcsR0FBRXFCLEdBQUksaUJBQWpCLENBQU47QUFDRDs7QUFDRCxXQUFPLE1BQU1vQixHQUFOLENBQVVwQixHQUFWLEVBQWU1QyxLQUFmLENBQVA7QUFDRDs7QUFFRGlFLEVBQUFBLE1BQU0sQ0FBRXJCLEdBQUYsRUFBTztBQUNYLFVBQU0sSUFBSXJCLEtBQUosQ0FBVyxHQUFFcUIsR0FBSSxvQkFBakIsQ0FBTjtBQUNEOztBQUVEc0IsRUFBQUEsS0FBSyxHQUFJO0FBQ1AsVUFBTSxJQUFJM0MsS0FBSixDQUFXLDBCQUFYLENBQU47QUFDRDs7QUFsQjJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcHJvY2Vzc0NhcGFiaWxpdGllcywgUFJPVE9DT0xTIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IFczQ19BUFBJVU1fUFJFRklYID0gJ2FwcGl1bSc7XG5cbmZ1bmN0aW9uIGluc3BlY3RPYmplY3QgKGFyZ3MpIHtcbiAgZnVuY3Rpb24gZ2V0VmFsdWVBcnJheSAob2JqLCBpbmRlbnQgPSAnICAnKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHtcbiAgICAgIHJldHVybiBbb2JqXTtcbiAgICB9XG5cbiAgICBsZXQgc3RyQXJyID0gWyd7J107XG4gICAgZm9yIChsZXQgW2FyZywgdmFsdWVdIG9mIF8udG9QYWlycyhvYmopKSB7XG4gICAgICBpZiAoIV8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHN0ckFyci5wdXNoKGAke2luZGVudH0gICR7YXJnfTogJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZ2V0VmFsdWVBcnJheSh2YWx1ZSwgYCR7aW5kZW50fSAgYCk7XG4gICAgICAgIHN0ckFyci5wdXNoKGAke2luZGVudH0gICR7YXJnfTogJHt2YWx1ZS5zaGlmdCgpfWApO1xuICAgICAgICBzdHJBcnIucHVzaCguLi52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0ckFyci5wdXNoKGAke2luZGVudH19YCk7XG4gICAgcmV0dXJuIHN0ckFycjtcbiAgfVxuICBmb3IgKGxldCBbYXJnLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGFyZ3MpKSB7XG4gICAgdmFsdWUgPSBnZXRWYWx1ZUFycmF5KHZhbHVlKTtcbiAgICBsb2dnZXIuaW5mbyhgICAke2FyZ306ICR7dmFsdWUuc2hpZnQoKX1gKTtcbiAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHZhbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGFrZXMgdGhlIGNhcHMgdGhhdCB3ZXJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGFuZCB0cmFuc2xhdGVzIHRoZW1cbiAqIGludG8gY2FwcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBpbm5lciBkcml2ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc29ud3BDYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSB3M2NDYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25zdHJhaW50c1xuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDYXBhYmlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIgKGpzb253cENhcGFiaWxpdGllcywgdzNjQ2FwYWJpbGl0aWVzLCBjb25zdHJhaW50cyA9IHt9LCBkZWZhdWx0Q2FwYWJpbGl0aWVzID0ge30pIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGNhbGxlciBzZW50IEpTT05XUCBjYXBzLCBXM0MgY2Fwcywgb3IgYm90aFxuICBjb25zdCBoYXNXM0NDYXBzID0gXy5pc1BsYWluT2JqZWN0KHczY0NhcGFiaWxpdGllcykgJiZcbiAgICAoXy5oYXModzNjQ2FwYWJpbGl0aWVzLCAnYWx3YXlzTWF0Y2gnKSB8fCBfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdmaXJzdE1hdGNoJykpO1xuICBjb25zdCBoYXNKU09OV1BDYXBzID0gXy5pc1BsYWluT2JqZWN0KGpzb253cENhcGFiaWxpdGllcyk7XG4gIGxldCBkZXNpcmVkQ2FwcyA9IHt9O1xuICBsZXQgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzID0gbnVsbDtcbiAgbGV0IHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyA9IG51bGw7XG5cbiAgaWYgKCFoYXNXM0NDYXBzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3RvY29sOiBQUk9UT0NPTFMuVzNDLFxuICAgICAgZXJyb3I6IG5ldyBFcnJvcignVzNDIGNhcGFiaWxpdGllcyBzaG91bGQgYmUgcHJvdmlkZWQnKSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qge1czQ30gPSBQUk9UT0NPTFM7XG4gIGNvbnN0IHByb3RvY29sID0gVzNDO1xuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuICBqc29ud3BDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBhYmlsaXRpZXMpO1xuICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcGFiaWxpdGllcyk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgICAgZm9yIChjb25zdCBbZGVmYXVsdENhcEtleSwgZGVmYXVsdENhcFZhbHVlXSBvZiBfLnRvUGFpcnMoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICAgICAgbGV0IGlzQ2FwQWxyZWFkeVNldCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBmaXJzdE1hdGNoIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZmlyc3RNYXRjaEVudHJ5KVxuICAgICAgICAgICAgICAmJiBfLmhhcyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhmaXJzdE1hdGNoRW50cnkpLCByZW1vdmVBcHBpdW1QcmVmaXgoZGVmYXVsdENhcEtleSkpKSB7XG4gICAgICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGFsd2F5c01hdGNoIGVudHJpZXNcbiAgICAgICAgaXNDYXBBbHJlYWR5U2V0ID0gaXNDYXBBbHJlYWR5U2V0IHx8IChfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKVxuICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKHczY0NhcGFiaWxpdGllcy5hbHdheXNNYXRjaCksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpO1xuICAgICAgICBpZiAoaXNDYXBBbHJlYWR5U2V0KSB7XG4gICAgICAgICAgLy8gU2tpcCBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgY2Fwc1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0eSBpZiBpdCBpcyBub3Qgb3ZlcnJpZGRlblxuICAgICAgICBpZiAoXy5pc0VtcHR5KHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoKSkge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoID0gW3tbZGVmYXVsdENhcEtleV06IGRlZmF1bHRDYXBWYWx1ZX1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoWzBdW2RlZmF1bHRDYXBLZXldID0gZGVmYXVsdENhcFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgICBqc29ud3BDYXBhYmlsaXRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCByZW1vdmVBcHBpdW1QcmVmaXhlcyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSwganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgTUpTT05XUCBjYXBzXG4gIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gey4uLmpzb253cENhcGFiaWxpdGllc307XG4gIH1cblxuICAvLyBHZXQgVzNDIGNhcHNcbiAgaWYgKGhhc1czQ0NhcHMpIHtcbiAgICAvLyBDYWxsIHRoZSBwcm9jZXNzIGNhcGFiaWxpdGllcyBhbGdvcml0aG0gdG8gZmluZCBtYXRjaGluZyBjYXBzIG9uIHRoZSBXM0NcbiAgICAvLyAoc2VlOiBodHRwczovL2dpdGh1Yi5jb20vamxpcHBzL3NpbXBsZS13ZC1zcGVjI3Byb2Nlc3NpbmctY2FwYWJpbGl0aWVzKVxuICAgIHRyeSB7XG4gICAgICBkZXNpcmVkQ2FwcyA9IHByb2Nlc3NDYXBhYmlsaXRpZXModzNjQ2FwYWJpbGl0aWVzLCBjb25zdHJhaW50cywgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBDb3VsZCBub3QgcGFyc2UgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVzaXJlZENhcHMsXG4gICAgICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyxcbiAgICAgICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyB3M2MgY2FwYWJpbGl0aWVzIHBheWxvYWQgdGhhdCBjb250YWlucyBvbmx5IHRoZSBtYXRjaGluZyBjYXBzIGluIGBhbHdheXNNYXRjaGBcbiAgICBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSB7XG4gICAgICBhbHdheXNNYXRjaDogey4uLmluc2VydEFwcGl1bVByZWZpeGVzKGRlc2lyZWRDYXBzKX0sXG4gICAgICBmaXJzdE1hdGNoOiBbe31dLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge2Rlc2lyZWRDYXBzLCBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcywgcHJvdG9jb2x9O1xufVxuXG4vKipcbiAqIFRha2VzIGEgY2FwYWJpbGl0aWVzIG9iamVjdHMgYW5kIHByZWZpeGVzIGNhcGFiaWxpdGllcyB3aXRoIGBhcHBpdW06YFxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgRGVzaXJlZCBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluc2VydEFwcGl1bVByZWZpeGVzIChjYXBzKSB7XG4gIC8vIFN0YW5kYXJkLCBub24tcHJlZml4ZWQgY2FwYWJpbGl0aWVzIChzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmRyaXZlci8jZGZuLXRhYmxlLW9mLXN0YW5kYXJkLWNhcGFiaWxpdGllcylcbiAgY29uc3QgU1RBTkRBUkRfQ0FQUyA9IFtcbiAgICAnYnJvd3Nlck5hbWUnLFxuICAgICdicm93c2VyVmVyc2lvbicsXG4gICAgJ3BsYXRmb3JtTmFtZScsXG4gICAgJ2FjY2VwdEluc2VjdXJlQ2VydHMnLFxuICAgICdwYWdlTG9hZFN0cmF0ZWd5JyxcbiAgICAncHJveHknLFxuICAgICdzZXRXaW5kb3dSZWN0JyxcbiAgICAndGltZW91dHMnLFxuICAgICd1bmhhbmRsZWRQcm9tcHRCZWhhdmlvcidcbiAgXTtcblxuICBsZXQgcHJlZml4ZWRDYXBzID0ge307XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGNhcHMpKSB7XG4gICAgaWYgKFNUQU5EQVJEX0NBUFMuaW5jbHVkZXMobmFtZSkgfHwgbmFtZS5pbmNsdWRlcygnOicpKSB7XG4gICAgICBwcmVmaXhlZENhcHNbbmFtZV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZml4ZWRDYXBzW2Ake1czQ19BUFBJVU1fUFJFRklYfToke25hbWV9YF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZWZpeGVkQ2Fwcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXBwaXVtUHJlZml4ZXMgKGNhcHMpIHtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykpIHtcbiAgICByZXR1cm4gY2FwcztcbiAgfVxuXG4gIGNvbnN0IGZpeGVkQ2FwcyA9IHt9O1xuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGZpeGVkQ2Fwc1tyZW1vdmVBcHBpdW1QcmVmaXgobmFtZSldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGZpeGVkQ2Fwcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXBwaXVtUHJlZml4IChrZXkpIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7VzNDX0FQUElVTV9QUkVGSVh9OmA7XG4gIHJldHVybiBfLnN0YXJ0c1dpdGgoa2V5LCBwcmVmaXgpID8ga2V5LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSA6IGtleTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb24gKHBrZ05hbWUpIHtcbiAgY29uc3QgcGtnSW5mbyA9IHJlcXVpcmUoYCR7cGtnTmFtZX0vcGFja2FnZS5qc29uYCkgfHwge307XG4gIHJldHVybiBwa2dJbmZvLnZlcnNpb247XG59XG5cbi8qKlxuICogUHVsbHMgdGhlIGluaXRpYWwgdmFsdWVzIG9mIEFwcGl1bSBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiBjYXBhYmlsaXRpZXMgYXJndW1lbnQuXG4gKiBFYWNoIHNldHRpbmcgaXRlbSBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gKiBgc2V0dGluZ1tzZXR0aW5nX25hbWVdOiBzZXR0aW5nX3ZhbHVlYFxuICogVGhlIGNhcGFiaWxpdGllcyBhcmd1bWVudCBpdHNlbGYgZ2V0cyBtdXRhdGVkLCBzbyBpdCBkb2VzIG5vdCBjb250YWluIHBhcnNlZFxuICogc2V0dGluZ3MgYW55bW9yZSB0byBhdm9pZCBmdXJ0aGVyIHBhcnNpbmcgaXNzdWVzLlxuICogQ2hlY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vYWR2YW5jZWQtY29uY2VwdHMvc2V0dGluZ3MubWRcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGF2YWlsYWJsZSBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gez9PYmplY3R9IGNhcHMgLSBDYXBhYmlsaXRpZXMgZGljdGlvbmFyeS4gSXQgaXMgbXV0YXRlZCBpZlxuICogb25lIG9yIG1vcmUgc2V0dGluZ3MgaGF2ZSBiZWVuIHB1bGxlZCBmcm9tIGl0XG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gQW4gZW1wdHkgZGljdGlvbmFyeSBpZiB0aGUgZ2l2ZW4gY2FwcyBjb250YWlucyBub1xuICogc2V0dGluZyBpdGVtcyBvciBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBwYXJzZWQgQXBwaXVtIHNldHRpbmcgbmFtZXMgYWxvbmcgd2l0aFxuICogdGhlaXIgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBwdWxsU2V0dGluZ3MgKGNhcHMpIHtcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FwcykgfHwgXy5pc0VtcHR5KGNhcHMpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGNvbnN0IG1hdGNoID0gL1xcYnNldHRpbmdzXFxbKFxcUyspXFxdJC8uZXhlYyhrZXkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc3VsdFttYXRjaFsxXV0gPSB2YWx1ZTtcbiAgICBkZWxldGUgY2Fwc1trZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IHJvb3REaXIgPSBmcy5maW5kUm9vdChfX2Rpcm5hbWUpO1xuXG5cbi8qKlxuICogQSBNYXAgd2hlcmUgeW91IGNhbiBzZXQgcHJvcGVydGllcywgYnV0IG9ubHkgb25jZS4gQW5kIHlvdSBjYW4ndCByZW1vdmUgYW55dGhpbmcuIFNvIHRoZXJlLlxuICogQHRlbXBsYXRlIEssVlxuICogQGV4dGVuZHMge01hcDxLLFY+fVxuICovXG5jbGFzcyBSZWFkb25seU1hcCBleHRlbmRzIE1hcCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0t9IGtleVxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlXG4gICAqL1xuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gaXMgYWxyZWFkeSBzZXRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gY2Fubm90IGJlIGRlbGV0ZWRgKTtcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciBSZWFkb25seU1hcGApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGluc3BlY3RPYmplY3QsIHBhcnNlQ2Fwc0ZvcklubmVyRHJpdmVyLCBpbnNlcnRBcHBpdW1QcmVmaXhlcywgcm9vdERpcixcbiAgZ2V0UGFja2FnZVZlcnNpb24sIHB1bGxTZXR0aW5ncywgcmVtb3ZlQXBwaXVtUHJlZml4ZXMsIFJlYWRvbmx5TWFwXG59O1xuIl0sImZpbGUiOiJsaWIvdXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -0,0 +1,277 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "additionalProperties": false,
4
+ "description": "A schema for Appium configuration files",
5
+ "properties": {
6
+ "server": {
7
+ "additionalProperties": false,
8
+ "description": "Configuration when running Appium as a server",
9
+ "properties": {
10
+ "address": {
11
+ "$comment": "I think hostname covers both DNS and IPv4...could be wrong",
12
+ "appiumCliAliases": [
13
+ "a"
14
+ ],
15
+ "default": "0.0.0.0",
16
+ "description": "IP address to listen on",
17
+ "format": "hostname",
18
+ "title": "address config",
19
+ "type": "string"
20
+ },
21
+ "allow-cors": {
22
+ "description": "Whether the Appium server should allow web browser connections from any host",
23
+ "title": "allow-cors config",
24
+ "type": "boolean",
25
+ "default": false
26
+ },
27
+ "allow-insecure": {
28
+ "appiumCliTransformer": "csv",
29
+ "default": [],
30
+ "description": "Set which insecure features are allowed to run in this server's sessions. Features are defined on a driver level; see documentation for more details. Note that features defined via \"deny-insecure\" will be disabled, even if also listed here. If string, a path to a text file containing policy or a comma-delimited list.",
31
+ "items": {
32
+ "type": "string"
33
+ },
34
+ "title": "allow-insecure config",
35
+ "type": "array",
36
+ "uniqueItems": true
37
+ },
38
+ "base-path": {
39
+ "appiumCliAliases": [
40
+ "pa"
41
+ ],
42
+ "default": "",
43
+ "description": "Base path to use as the prefix for all webdriver routes running on the server",
44
+ "title": "base-path config",
45
+ "type": "string"
46
+ },
47
+ "callback-address": {
48
+ "appiumCliAliases": [
49
+ "ca"
50
+ ],
51
+ "description": "Callback IP address (default: same as \"address\")",
52
+ "title": "callback-address config",
53
+ "type": "string"
54
+ },
55
+ "callback-port": {
56
+ "appiumCliAliases": [
57
+ "cp"
58
+ ],
59
+ "default": 4723,
60
+ "description": "Callback port (default: same as \"port\")",
61
+ "maximum": 65535,
62
+ "minimum": 1,
63
+ "title": "callback-port config",
64
+ "type": "integer"
65
+ },
66
+ "debug-log-spacing": {
67
+ "default": false,
68
+ "description": "Add exaggerated spacing in logs to help with visual inspection",
69
+ "title": "debug-log-spacing config",
70
+ "type": "boolean"
71
+ },
72
+ "default-capabilities": {
73
+ "$comment": "TODO",
74
+ "appiumCliAliases": [
75
+ "dc"
76
+ ],
77
+ "description": "Set the default desired capabilities, which will be set on each session unless overridden by received capabilities. If a string, a path to a JSON file containing the capabilities, or raw JSON.",
78
+ "title": "default-capabilities config",
79
+ "type": "object"
80
+ },
81
+ "deny-insecure": {
82
+ "$comment": "Allowed values are defined by drivers",
83
+ "appiumCliTransformer": "csv",
84
+ "default": [],
85
+ "description": "Set which insecure features are not allowed to run in this server's sessions. Features are defined on a driver level; see documentation for more details. Features listed here will not be enabled even if also listed in \"allow-insecure\", and even if \"relaxed-security\" is enabled. If string, a path to a text file containing policy or a comma-delimited list.",
86
+ "items": {
87
+ "type": "string"
88
+ },
89
+ "title": "deny-insecure config",
90
+ "type": "array",
91
+ "uniqueItems": true
92
+ },
93
+ "driver": {
94
+ "description": "Driver-specific configuration. Keys should correspond to driver package names",
95
+ "properties": {},
96
+ "title": "driver config",
97
+ "type": "object"
98
+ },
99
+ "keep-alive-timeout": {
100
+ "appiumCliAliases": [
101
+ "ka"
102
+ ],
103
+ "default": 600,
104
+ "description": "Number of seconds the Appium server should apply as both the keep-alive timeout and the connection timeout for all requests. A value of 0 disables the timeout.",
105
+ "minimum": 0,
106
+ "title": "keep-alive-timeout config",
107
+ "type": "integer"
108
+ },
109
+ "local-timezone": {
110
+ "default": false,
111
+ "description": "Use local timezone for timestamps",
112
+ "title": "local-timezone config",
113
+ "type": "boolean"
114
+ },
115
+ "log": {
116
+ "appiumCliAliases": [
117
+ "g"
118
+ ],
119
+ "appiumCliDest": "logFile",
120
+ "description": "Also send log output to this file",
121
+ "title": "log config",
122
+ "type": "string"
123
+ },
124
+ "log-filters": {
125
+ "$comment": "TODO",
126
+ "description": "One or more log filtering rules",
127
+ "items": {
128
+ "type": "string"
129
+ },
130
+ "title": "log-filters config",
131
+ "type": "array"
132
+ },
133
+ "log-level": {
134
+ "appiumCliDest": "loglevel",
135
+ "default": "debug",
136
+ "description": "Log level (console[:file])",
137
+ "enum": [
138
+ "info",
139
+ "info:debug",
140
+ "info:info",
141
+ "info:warn",
142
+ "info:error",
143
+ "warn",
144
+ "warn:debug",
145
+ "warn:info",
146
+ "warn:warn",
147
+ "warn:error",
148
+ "error",
149
+ "error:debug",
150
+ "error:info",
151
+ "error:warn",
152
+ "error:error",
153
+ "debug",
154
+ "debug:debug",
155
+ "debug:info",
156
+ "debug:warn",
157
+ "debug:error"
158
+ ],
159
+ "title": "log-level config",
160
+ "type": "string"
161
+ },
162
+ "log-no-colors": {
163
+ "default": false,
164
+ "description": "Do not use color in console output",
165
+ "title": "log-no-colors config",
166
+ "type": "boolean"
167
+ },
168
+ "log-timestamp": {
169
+ "default": false,
170
+ "description": "Show timestamps in console output",
171
+ "title": "log-timestamp config",
172
+ "type": "boolean"
173
+ },
174
+ "long-stacktrace": {
175
+ "default": false,
176
+ "description": "Add long stack traces to log entries. Recommended for debugging only.",
177
+ "title": "long-stacktrace config",
178
+ "type": "boolean"
179
+ },
180
+ "no-perms-check": {
181
+ "default": false,
182
+ "description": "Do not check that needed files are readable and/or writable",
183
+ "title": "no-perms-check config",
184
+ "type": "boolean"
185
+ },
186
+ "nodeconfig": {
187
+ "$comment": "Selenium Grid 3 is unmaintained and Selenium Grid 4 no longer supports this file.",
188
+ "description": "Path to configuration JSON file to register Appium as a node with Selenium Grid 3; otherwise the configuration itself",
189
+ "title": "nodeconfig config",
190
+ "type": "object"
191
+ },
192
+ "plugin": {
193
+ "description": "Plugin-specific configuration. Keys should correspond to plugin package names",
194
+ "properties": {},
195
+ "title": "plugin config",
196
+ "type": "object"
197
+ },
198
+ "port": {
199
+ "appiumCliAliases": [
200
+ "p"
201
+ ],
202
+ "default": 4723,
203
+ "description": "Port to listen on",
204
+ "maximum": 65535,
205
+ "minimum": 1,
206
+ "title": "port config",
207
+ "type": "integer"
208
+ },
209
+ "relaxed-security": {
210
+ "default": false,
211
+ "description": "Disable additional security checks, so it is possible to use some advanced features, provided by drivers supporting this option. Only enable it if all the clients are in the trusted network and it's not the case if a client could potentially break out of the session sandbox. Specific features can be overridden by using \"deny-insecure\"",
212
+ "title": "relaxed-security config",
213
+ "type": "boolean"
214
+ },
215
+ "session-override": {
216
+ "default": false,
217
+ "description": "Enables session override (clobbering)",
218
+ "title": "session-override config",
219
+ "type": "boolean"
220
+ },
221
+ "strict-caps": {
222
+ "default": false,
223
+ "description": "Cause sessions to fail if desired caps are sent in that Appium does not recognize as valid for the selected device",
224
+ "title": "strict-caps config",
225
+ "type": "boolean"
226
+ },
227
+ "tmp": {
228
+ "appiumCliDest": "tmpDir",
229
+ "description": "Absolute path to directory Appium can use to manage temp files. Defaults to C:\\Windows\\Temp on Windows and /tmp otherwise.",
230
+ "title": "tmp config",
231
+ "type": "string"
232
+ },
233
+ "trace-dir": {
234
+ "description": "Absolute path to directory Appium can use to save iOS instrument traces; defaults to <tmp>/appium-instruments",
235
+ "title": "trace-dir config",
236
+ "type": "string"
237
+ },
238
+ "use-drivers": {
239
+ "appiumCliDescription": "A list of drivers to activate. Can be a comma-delimited string or path to CSV file. By default, all installed drivers will be activated.",
240
+ "default": [],
241
+ "description": "A list of drivers to activate. By default, all installed drivers will be activated.",
242
+ "items": {
243
+ "type": "string"
244
+ },
245
+ "title": "use-drivers config",
246
+ "type": "array",
247
+ "uniqueItems": true
248
+ },
249
+ "use-plugins": {
250
+ "appiumCliDescription": "A list of plugins to activate. Can be a comma-delimited string, path to CSV file, or the string \"all\" to use all installed plugins.",
251
+ "default": [],
252
+ "description": "A list of plugins to activate. To activate all plugins, the value should be an array with a single item \"all\".",
253
+ "items": {
254
+ "type": "string"
255
+ },
256
+ "title": "use-plugins config",
257
+ "type": "array",
258
+ "uniqueItems": true
259
+ },
260
+ "webhook": {
261
+ "$comment": "This should probably use a uri-template format to restrict the protocol to http/https",
262
+ "appiumCliAliases": [
263
+ "G"
264
+ ],
265
+ "description": "Also send log output to this http listener",
266
+ "format": "uri",
267
+ "title": "webhook config",
268
+ "type": "string"
269
+ }
270
+ },
271
+ "title": "server config",
272
+ "type": "object"
273
+ }
274
+ },
275
+ "title": "Appium Configuration",
276
+ "type": "object"
277
+ }