appium 2.0.0-beta.4 → 2.0.0-beta.40

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 (151) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +204 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +257 -131
  5. package/build/lib/cli/args.d.ts +20 -0
  6. package/build/lib/cli/args.d.ts.map +1 -0
  7. package/build/lib/cli/args.js +96 -282
  8. package/build/lib/cli/driver-command.d.ts +36 -0
  9. package/build/lib/cli/driver-command.d.ts.map +1 -0
  10. package/build/lib/cli/driver-command.js +25 -18
  11. package/build/lib/cli/extension-command.d.ts +372 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +286 -156
  14. package/build/lib/cli/extension.d.ts +18 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +30 -17
  17. package/build/lib/cli/parser.d.ts +80 -0
  18. package/build/lib/cli/parser.d.ts.map +1 -0
  19. package/build/lib/cli/parser.js +152 -95
  20. package/build/lib/cli/plugin-command.d.ts +33 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +24 -19
  23. package/build/lib/cli/utils.d.ts +29 -0
  24. package/build/lib/cli/utils.d.ts.map +1 -0
  25. package/build/lib/cli/utils.js +27 -3
  26. package/build/lib/config-file.d.ts +100 -0
  27. package/build/lib/config-file.d.ts.map +1 -0
  28. package/build/lib/config-file.js +136 -0
  29. package/build/lib/config.d.ts +41 -0
  30. package/build/lib/config.d.ts.map +1 -0
  31. package/build/lib/config.js +92 -67
  32. package/build/lib/constants.d.ts +48 -0
  33. package/build/lib/constants.d.ts.map +1 -0
  34. package/build/lib/constants.js +60 -0
  35. package/build/lib/extension/driver-config.d.ts +81 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +177 -0
  38. package/build/lib/extension/extension-config.d.ts +242 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +436 -0
  41. package/build/lib/extension/index.d.ts +48 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +74 -0
  44. package/build/lib/extension/manifest.d.ts +174 -0
  45. package/build/lib/extension/manifest.d.ts.map +1 -0
  46. package/build/lib/extension/manifest.js +256 -0
  47. package/build/lib/extension/package-changed.d.ts +11 -0
  48. package/build/lib/extension/package-changed.d.ts.map +1 -0
  49. package/build/lib/extension/package-changed.js +68 -0
  50. package/build/lib/extension/plugin-config.d.ts +57 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +78 -0
  53. package/build/lib/grid-register.d.ts +10 -0
  54. package/build/lib/grid-register.d.ts.map +1 -0
  55. package/build/lib/grid-register.js +21 -25
  56. package/build/lib/logger.d.ts +3 -0
  57. package/build/lib/logger.d.ts.map +1 -0
  58. package/build/lib/logger.js +4 -6
  59. package/build/lib/logsink.d.ts +4 -0
  60. package/build/lib/logsink.d.ts.map +1 -0
  61. package/build/lib/logsink.js +14 -17
  62. package/build/lib/main.d.ts +55 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +189 -90
  65. package/build/lib/schema/arg-spec.d.ts +143 -0
  66. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  67. package/build/lib/schema/arg-spec.js +119 -0
  68. package/build/lib/schema/cli-args.d.ts +19 -0
  69. package/build/lib/schema/cli-args.d.ts.map +1 -0
  70. package/build/lib/schema/cli-args.js +180 -0
  71. package/build/lib/schema/cli-transformers.d.ts +5 -0
  72. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  73. package/build/lib/schema/cli-transformers.js +74 -0
  74. package/build/lib/schema/index.d.ts +3 -0
  75. package/build/lib/schema/index.d.ts.map +1 -0
  76. package/build/lib/schema/index.js +34 -0
  77. package/build/lib/schema/keywords.d.ts +24 -0
  78. package/build/lib/schema/keywords.d.ts.map +1 -0
  79. package/build/lib/schema/keywords.js +70 -0
  80. package/build/lib/schema/schema.d.ts +259 -0
  81. package/build/lib/schema/schema.d.ts.map +1 -0
  82. package/build/lib/schema/schema.js +452 -0
  83. package/build/lib/utils.d.ts +66 -0
  84. package/build/lib/utils.d.ts.map +1 -0
  85. package/build/lib/utils.js +35 -139
  86. package/build/tsconfig.tsbuildinfo +1 -0
  87. package/build/types/appium-manifest.d.ts +59 -0
  88. package/build/types/appium-manifest.d.ts.map +1 -0
  89. package/build/types/cli.d.ts +112 -0
  90. package/build/types/cli.d.ts.map +1 -0
  91. package/build/types/extension-manifest.d.ts +55 -0
  92. package/build/types/extension-manifest.d.ts.map +1 -0
  93. package/build/types/index.d.ts +16 -0
  94. package/build/types/index.d.ts.map +1 -0
  95. package/driver.d.ts +1 -0
  96. package/driver.js +14 -0
  97. package/index.js +11 -0
  98. package/lib/appium.js +517 -186
  99. package/lib/cli/args.js +269 -422
  100. package/lib/cli/driver-command.js +58 -23
  101. package/lib/cli/extension-command.js +612 -260
  102. package/lib/cli/extension.js +34 -16
  103. package/lib/cli/parser.js +241 -83
  104. package/lib/cli/plugin-command.js +48 -20
  105. package/lib/cli/utils.js +24 -10
  106. package/lib/config-file.js +219 -0
  107. package/lib/config.js +210 -91
  108. package/lib/constants.js +69 -0
  109. package/lib/extension/driver-config.js +249 -0
  110. package/lib/extension/extension-config.js +679 -0
  111. package/lib/extension/index.js +116 -0
  112. package/lib/extension/manifest.js +475 -0
  113. package/lib/extension/package-changed.js +64 -0
  114. package/lib/extension/plugin-config.js +113 -0
  115. package/lib/grid-register.js +49 -35
  116. package/lib/logger.js +1 -2
  117. package/lib/logsink.js +38 -33
  118. package/lib/main.js +303 -100
  119. package/lib/schema/arg-spec.js +229 -0
  120. package/lib/schema/cli-args.js +238 -0
  121. package/lib/schema/cli-transformers.js +115 -0
  122. package/lib/schema/index.js +2 -0
  123. package/lib/schema/keywords.js +136 -0
  124. package/lib/schema/schema.js +717 -0
  125. package/lib/utils.js +121 -140
  126. package/package.json +75 -85
  127. package/plugin.d.ts +1 -0
  128. package/plugin.js +13 -0
  129. package/scripts/autoinstall-extensions.js +177 -0
  130. package/support.d.ts +1 -0
  131. package/support.js +13 -0
  132. package/types/appium-manifest.ts +73 -0
  133. package/types/cli.ts +146 -0
  134. package/types/extension-manifest.ts +64 -0
  135. package/types/index.ts +21 -0
  136. package/CHANGELOG.md +0 -3515
  137. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  138. package/build/lib/cli/npm.js +0 -206
  139. package/build/lib/cli/parser-helpers.js +0 -82
  140. package/build/lib/driver-config.js +0 -77
  141. package/build/lib/drivers.js +0 -96
  142. package/build/lib/extension-config.js +0 -253
  143. package/build/lib/plugin-config.js +0 -59
  144. package/build/lib/plugins.js +0 -14
  145. package/lib/cli/npm.js +0 -183
  146. package/lib/cli/parser-helpers.js +0 -79
  147. package/lib/driver-config.js +0 -46
  148. package/lib/drivers.js +0 -81
  149. package/lib/extension-config.js +0 -209
  150. package/lib/plugin-config.js +0 -34
  151. package/lib/plugins.js +0 -10
@@ -0,0 +1,436 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.INSTALL_TYPE_NPM = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPES = exports.ExtensionConfig = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _bluebird = _interopRequireDefault(require("bluebird"));
15
+
16
+ var _path = _interopRequireDefault(require("path"));
17
+
18
+ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
19
+
20
+ var _semver = require("semver");
21
+
22
+ var _support = require("@appium/support");
23
+
24
+ var _extension = require("../cli/extension");
25
+
26
+ var _config = require("../config");
27
+
28
+ var _logger = _interopRequireDefault(require("../logger"));
29
+
30
+ var _schema = require("../schema/schema");
31
+
32
+ const INSTALL_TYPE_NPM = 'npm';
33
+ exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
34
+ const INSTALL_TYPE_LOCAL = 'local';
35
+ exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
36
+ const INSTALL_TYPE_GITHUB = 'github';
37
+ exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
38
+ const INSTALL_TYPE_GIT = 'git';
39
+ exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
40
+ const INSTALL_TYPES = new Set([INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM]);
41
+ exports.INSTALL_TYPES = INSTALL_TYPES;
42
+
43
+ class ExtensionConfig {
44
+ extensionType;
45
+ configKey;
46
+ installedExtensions;
47
+ log;
48
+ manifest;
49
+ _listDataCache;
50
+
51
+ constructor(extensionType, manifest) {
52
+ this.extensionType = extensionType;
53
+ this.configKey = `${extensionType}s`;
54
+ this.installedExtensions = manifest.getExtensionData(extensionType);
55
+ this.manifest = manifest;
56
+ }
57
+
58
+ get manifestPath() {
59
+ return this.manifest.manifestPath;
60
+ }
61
+
62
+ get appiumHome() {
63
+ return this.manifest.appiumHome;
64
+ }
65
+
66
+ getProblems(extName, extManifest) {
67
+ return [...this.getGenericConfigProblems(extManifest, extName), ...this.getConfigProblems(extManifest, extName), ...this.getSchemaProblems(extManifest, extName)];
68
+ }
69
+
70
+ async getWarnings(extName, extManifest) {
71
+ const [genericConfigWarnings, configWarnings] = await _bluebird.default.all([this.getGenericConfigWarnings(extManifest, extName), this.getConfigWarnings(extManifest, extName)]);
72
+ return [...genericConfigWarnings, ...configWarnings];
73
+ }
74
+
75
+ async getConfigWarnings(extManifest, extName) {
76
+ return [];
77
+ }
78
+
79
+ getValidationResultSummaries(errorMap = new Map(), warningMap = new Map()) {
80
+ const errorSummaries = [];
81
+
82
+ for (const [extName, problems] of errorMap.entries()) {
83
+ if (_lodash.default.isEmpty(problems)) {
84
+ continue;
85
+ }
86
+
87
+ errorSummaries.push(`${this.extensionType} "${extName}" had ${_support.util.pluralize('error', problems.length)} and will not be available:`);
88
+
89
+ for (const problem of problems) {
90
+ errorSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
91
+ }
92
+ }
93
+
94
+ const warningSummaries = [];
95
+
96
+ for (const [extName, warnings] of warningMap.entries()) {
97
+ if (_lodash.default.isEmpty(warnings)) {
98
+ continue;
99
+ }
100
+
101
+ const extTypeText = _lodash.default.capitalize(this.extensionType);
102
+
103
+ const problemEnumerationText = _support.util.pluralize('potential problem', warnings.length, true);
104
+
105
+ warningSummaries.push(`${extTypeText} "${extName}" has ${problemEnumerationText}: `);
106
+
107
+ for (const warning of warnings) {
108
+ warningSummaries.push(` - ${warning}`);
109
+ }
110
+ }
111
+
112
+ return {
113
+ errorSummaries,
114
+ warningSummaries
115
+ };
116
+ }
117
+
118
+ async _validate(exts) {
119
+ const errorMap = new Map();
120
+ const warningMap = new Map();
121
+
122
+ for (const [extName, extManifest] of _lodash.default.toPairs(exts)) {
123
+ const [errors, warnings] = await _bluebird.default.all([this.getProblems(extName, extManifest), this.getWarnings(extName, extManifest)]);
124
+
125
+ if (errors.length) {
126
+ delete exts[extName];
127
+ }
128
+
129
+ errorMap.set(extName, errors);
130
+ warningMap.set(extName, warnings);
131
+ }
132
+
133
+ const {
134
+ errorSummaries,
135
+ warningSummaries
136
+ } = this.getValidationResultSummaries(errorMap, warningMap);
137
+
138
+ if (!_lodash.default.isEmpty(errorSummaries)) {
139
+ _logger.default.error(`Appium encountered ${_support.util.pluralize('error', errorSummaries.length, true)} while validating ${this.configKey} found in manifest ${this.manifestPath}`);
140
+
141
+ for (const summary of errorSummaries) {
142
+ _logger.default.error(summary);
143
+ }
144
+ } else {
145
+ if (!_lodash.default.isEmpty(warningSummaries)) {
146
+ _logger.default.warn(`Appium encountered ${_support.util.pluralize('warning', warningSummaries.length, true)} while validating ${this.configKey} found in manifest ${this.manifestPath}`);
147
+
148
+ for (const summary of warningSummaries) {
149
+ _logger.default.warn(summary);
150
+ }
151
+ }
152
+ }
153
+
154
+ return exts;
155
+ }
156
+
157
+ async getListData() {
158
+ if (this._listDataCache) {
159
+ return this._listDataCache;
160
+ }
161
+
162
+ const CommandClass = _extension.commandClasses[this.extensionType];
163
+ const cmd = new CommandClass({
164
+ config: this,
165
+ json: true
166
+ });
167
+ const listData = await cmd.list({
168
+ showInstalled: true,
169
+ showUpdates: true
170
+ });
171
+ this._listDataCache = listData;
172
+ return listData;
173
+ }
174
+
175
+ async getGenericConfigWarnings(extManifest, extName) {
176
+ const {
177
+ appiumVersion,
178
+ installSpec,
179
+ installType,
180
+ pkgName
181
+ } = extManifest;
182
+ const warnings = [];
183
+ const invalidFields = [];
184
+
185
+ if (!_lodash.default.isString(installSpec)) {
186
+ invalidFields.push('installSpec');
187
+ }
188
+
189
+ if (!INSTALL_TYPES.has(installType)) {
190
+ invalidFields.push('installType');
191
+ }
192
+
193
+ const extTypeText = _lodash.default.capitalize(this.extensionType);
194
+
195
+ if (invalidFields.length) {
196
+ const invalidFieldsEnumerationText = _support.util.pluralize('invalid or missing field', invalidFields.length, true);
197
+
198
+ const invalidFieldsText = invalidFields.map(field => `"${field}"`).join(', ');
199
+ warnings.push(`${extTypeText} "${extName}" (package \`${pkgName}\`) has ${invalidFieldsEnumerationText} (${invalidFieldsText}) in \`extensions.yaml\`; this may cause upgrades done via the \`appium\` CLI tool to fail. Please reinstall with \`appium ${this.extensionType} uninstall ${extName}\` and \`appium ${this.extensionType} install ${extName}\` to attempt a fix.`);
200
+ }
201
+
202
+ const createPeerWarning = reason => `${extTypeText} "${extName}" (package \`${pkgName}\`) may be incompatible with the current version of Appium (v${_config.APPIUM_VER}) due to ${reason}`;
203
+
204
+ if (_lodash.default.isString(appiumVersion) && !(0, _semver.satisfies)(_config.APPIUM_VER, appiumVersion)) {
205
+ const listData = await this.getListData();
206
+ const extListData = listData[extName];
207
+
208
+ if (extListData !== null && extListData !== void 0 && extListData.installed) {
209
+ const {
210
+ updateVersion,
211
+ upToDate
212
+ } = extListData;
213
+
214
+ if (!upToDate) {
215
+ warnings.push(createPeerWarning(`its peer dependency on older Appium v${appiumVersion}. Please upgrade \`${pkgName}\` to v${updateVersion} or newer.`));
216
+ } else {
217
+ warnings.push(createPeerWarning(`its peer dependency on older Appium v${appiumVersion}. Please ask the developer of \`${pkgName}\` to update the peer dependency on Appium to v${_config.APPIUM_VER}.`));
218
+ }
219
+ }
220
+ } else if (!_lodash.default.isString(appiumVersion)) {
221
+ const listData = await this.getListData();
222
+ const extListData = listData[extName];
223
+
224
+ if (!(extListData !== null && extListData !== void 0 && extListData.upToDate) && extListData !== null && extListData !== void 0 && extListData.updateVersion) {
225
+ warnings.push(createPeerWarning(`an invalid or missing peer dependency on Appium. A newer version of \`${pkgName}\` is available; please attempt to upgrade "${extName}" to v${extListData.updateVersion} or newer.`));
226
+ } else {
227
+ warnings.push(createPeerWarning(`an invalid or missing peer dependency on Appium. Please ask the developer of \`${pkgName}\` to add a peer dependency on \`^appium@${_config.APPIUM_VER}\`.`));
228
+ }
229
+ }
230
+
231
+ return warnings;
232
+ }
233
+
234
+ getSchemaProblems(extManifest, extName) {
235
+ const problems = [];
236
+ const {
237
+ schema: argSchemaPath
238
+ } = extManifest;
239
+
240
+ if (ExtensionConfig.extDataHasSchema(extManifest)) {
241
+ if (_lodash.default.isString(argSchemaPath)) {
242
+ if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
243
+ try {
244
+ this.readExtensionSchema(extName, extManifest);
245
+ } catch (err) {
246
+ problems.push({
247
+ err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
248
+ val: argSchemaPath
249
+ });
250
+ }
251
+ } else {
252
+ problems.push({
253
+ err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
254
+ val: argSchemaPath
255
+ });
256
+ }
257
+ } else if (_lodash.default.isPlainObject(argSchemaPath)) {
258
+ try {
259
+ this.readExtensionSchema(extName, extManifest);
260
+ } catch (err) {
261
+ problems.push({
262
+ err: `Unable to register embedded schema; ${err.message}`,
263
+ val: argSchemaPath
264
+ });
265
+ }
266
+ } else {
267
+ problems.push({
268
+ err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
269
+ val: argSchemaPath
270
+ });
271
+ }
272
+ }
273
+
274
+ return problems;
275
+ }
276
+
277
+ getGenericConfigProblems(extManifest, extName) {
278
+ const {
279
+ version,
280
+ pkgName,
281
+ mainClass
282
+ } = extManifest;
283
+ const problems = [];
284
+
285
+ if (!_lodash.default.isString(version)) {
286
+ problems.push({
287
+ err: `Invalid or missing \`version\` field in my \`package.json\` and/or \`extensions.yaml\` (must be a string)`,
288
+ val: version
289
+ });
290
+ }
291
+
292
+ if (!_lodash.default.isString(pkgName)) {
293
+ problems.push({
294
+ err: `Invalid or missing \`name\` field in my \`package.json\` and/or \`extensions.yaml\` (must be a string)`,
295
+ val: pkgName
296
+ });
297
+ }
298
+
299
+ if (!_lodash.default.isString(mainClass)) {
300
+ problems.push({
301
+ err: `Invalid or missing \`appium.mainClass\` field in my \`package.json\` and/or \`mainClass\` field in \`extensions.yaml\` (must be a string)`,
302
+ val: mainClass
303
+ });
304
+ }
305
+
306
+ return problems;
307
+ }
308
+
309
+ getConfigProblems(extManifest, extName) {
310
+ return [];
311
+ }
312
+
313
+ async addExtension(extName, extManifest, {
314
+ write = true
315
+ } = {}) {
316
+ this.manifest.addExtension(this.extensionType, extName, extManifest);
317
+
318
+ if (write) {
319
+ await this.manifest.write();
320
+ }
321
+ }
322
+
323
+ async updateExtension(extName, extManifest, {
324
+ write = true
325
+ } = {}) {
326
+ this.installedExtensions[extName] = { ...this.installedExtensions[extName],
327
+ ...extManifest
328
+ };
329
+
330
+ if (write) {
331
+ await this.manifest.write();
332
+ }
333
+ }
334
+
335
+ async removeExtension(extName, {
336
+ write = true
337
+ } = {}) {
338
+ delete this.installedExtensions[extName];
339
+
340
+ if (write) {
341
+ await this.manifest.write();
342
+ }
343
+ }
344
+
345
+ print(activeNames) {
346
+ if (_lodash.default.isEmpty(this.installedExtensions)) {
347
+ _logger.default.info(`No ${this.configKey} have been installed in ${this.appiumHome}. Use the "appium ${this.extensionType}" ` + 'command to install the one(s) you want to use.');
348
+
349
+ return;
350
+ }
351
+
352
+ _logger.default.info(`Available ${this.configKey}:`);
353
+
354
+ for (const [extName, extManifest] of _lodash.default.toPairs(this.installedExtensions)) {
355
+ _logger.default.info(` - ${this.extensionDesc(extName, extManifest)}`);
356
+ }
357
+ }
358
+
359
+ extensionDesc(extName, extManifest) {
360
+ throw new Error('This must be implemented in a subclass');
361
+ }
362
+
363
+ getInstallPath(extName) {
364
+ return _path.default.join(this.appiumHome, 'node_modules', this.installedExtensions[extName].pkgName);
365
+ }
366
+
367
+ require(extName) {
368
+ const {
369
+ mainClass
370
+ } = this.installedExtensions[extName];
371
+ const reqPath = this.getInstallPath(extName);
372
+ let reqResolved;
373
+
374
+ try {
375
+ reqResolved = require.resolve(reqPath);
376
+ } catch (err) {
377
+ throw new ReferenceError(`Could not find a ${this.extensionType} installed at ${reqPath}`);
378
+ }
379
+
380
+ if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
381
+ _logger.default.debug(`Removing ${reqResolved} from require cache`);
382
+
383
+ delete require.cache[reqResolved];
384
+ }
385
+
386
+ _logger.default.debug(`Requiring ${this.extensionType} at ${reqPath}`);
387
+
388
+ const MainClass = require(reqPath)[mainClass];
389
+
390
+ if (!MainClass) {
391
+ throw new ReferenceError(`Could not find a class named "${mainClass}" exported by ${this.extensionType} "${extName}"`);
392
+ }
393
+
394
+ return MainClass;
395
+ }
396
+
397
+ isInstalled(extName) {
398
+ return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
399
+ }
400
+
401
+ static _readExtensionSchema(appiumHome, extType, extName, extManifest) {
402
+ const {
403
+ pkgName,
404
+ schema: argSchemaPath
405
+ } = extManifest;
406
+
407
+ if (!argSchemaPath) {
408
+ throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
409
+ }
410
+
411
+ let moduleObject;
412
+
413
+ if (_lodash.default.isString(argSchemaPath)) {
414
+ const schemaPath = (0, _resolveFrom.default)(appiumHome, _path.default.join(pkgName, argSchemaPath));
415
+ moduleObject = require(schemaPath);
416
+ } else {
417
+ moduleObject = argSchemaPath;
418
+ }
419
+
420
+ const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
421
+ (0, _schema.registerSchema)(extType, extName, schema);
422
+ return schema;
423
+ }
424
+
425
+ static extDataHasSchema(extManifest) {
426
+ return _lodash.default.isString(extManifest === null || extManifest === void 0 ? void 0 : extManifest.schema) || _lodash.default.isObject(extManifest === null || extManifest === void 0 ? void 0 : extManifest.schema);
427
+ }
428
+
429
+ readExtensionSchema(extName, extManifest) {
430
+ return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extManifest);
431
+ }
432
+
433
+ }
434
+
435
+ exports.ExtensionConfig = ExtensionConfig;
436
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTlNUQUxMX1RZUEVfTlBNIiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVTIiwiU2V0IiwiRXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uVHlwZSIsImNvbmZpZ0tleSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJsb2ciLCJtYW5pZmVzdCIsIl9saXN0RGF0YUNhY2hlIiwiY29uc3RydWN0b3IiLCJnZXRFeHRlbnNpb25EYXRhIiwibWFuaWZlc3RQYXRoIiwiYXBwaXVtSG9tZSIsImdldFByb2JsZW1zIiwiZXh0TmFtZSIsImV4dE1hbmlmZXN0IiwiZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIiwiZ2V0Q29uZmlnUHJvYmxlbXMiLCJnZXRTY2hlbWFQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZ2VuZXJpY0NvbmZpZ1dhcm5pbmdzIiwiY29uZmlnV2FybmluZ3MiLCJCIiwiYWxsIiwiZ2V0R2VuZXJpY0NvbmZpZ1dhcm5pbmdzIiwiZ2V0Q29uZmlnV2FybmluZ3MiLCJnZXRWYWxpZGF0aW9uUmVzdWx0U3VtbWFyaWVzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJwcm9ibGVtcyIsImVudHJpZXMiLCJfIiwiaXNFbXB0eSIsInB1c2giLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwicHJvYmxlbSIsImVyciIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWwiLCJ3YXJuaW5nU3VtbWFyaWVzIiwid2FybmluZ3MiLCJleHRUeXBlVGV4dCIsImNhcGl0YWxpemUiLCJwcm9ibGVtRW51bWVyYXRpb25UZXh0Iiwid2FybmluZyIsIl92YWxpZGF0ZSIsImV4dHMiLCJ0b1BhaXJzIiwiZXJyb3JzIiwic2V0IiwiZXJyb3IiLCJzdW1tYXJ5Iiwid2FybiIsImdldExpc3REYXRhIiwiQ29tbWFuZENsYXNzIiwiY29tbWFuZENsYXNzZXMiLCJjbWQiLCJjb25maWciLCJqc29uIiwibGlzdERhdGEiLCJsaXN0Iiwic2hvd0luc3RhbGxlZCIsInNob3dVcGRhdGVzIiwiYXBwaXVtVmVyc2lvbiIsImluc3RhbGxTcGVjIiwiaW5zdGFsbFR5cGUiLCJwa2dOYW1lIiwiaW52YWxpZEZpZWxkcyIsImlzU3RyaW5nIiwiaGFzIiwiaW52YWxpZEZpZWxkc0VudW1lcmF0aW9uVGV4dCIsImludmFsaWRGaWVsZHNUZXh0IiwibWFwIiwiZmllbGQiLCJqb2luIiwiY3JlYXRlUGVlcldhcm5pbmciLCJyZWFzb24iLCJBUFBJVU1fVkVSIiwic2F0aXNmaWVzIiwiZXh0TGlzdERhdGEiLCJpbnN0YWxsZWQiLCJ1cGRhdGVWZXJzaW9uIiwidXBUb0RhdGUiLCJzY2hlbWEiLCJhcmdTY2hlbWFQYXRoIiwiZXh0RGF0YUhhc1NjaGVtYSIsImlzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb24iLCJyZWFkRXh0ZW5zaW9uU2NoZW1hIiwibWVzc2FnZSIsIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJpc1BsYWluT2JqZWN0IiwidmVyc2lvbiIsIm1haW5DbGFzcyIsImFkZEV4dGVuc2lvbiIsIndyaXRlIiwidXBkYXRlRXh0ZW5zaW9uIiwicmVtb3ZlRXh0ZW5zaW9uIiwicHJpbnQiLCJhY3RpdmVOYW1lcyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRJbnN0YWxsUGF0aCIsInBhdGgiLCJyZXF1aXJlIiwicmVxUGF0aCIsInJlcVJlc29sdmVkIiwicmVzb2x2ZSIsIlJlZmVyZW5jZUVycm9yIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyIsImNhY2hlIiwiZGVidWciLCJNYWluQ2xhc3MiLCJpc0luc3RhbGxlZCIsImluY2x1ZGVzIiwiT2JqZWN0Iiwia2V5cyIsIl9yZWFkRXh0ZW5zaW9uU2NoZW1hIiwiZXh0VHlwZSIsIlR5cGVFcnJvciIsIm1vZHVsZU9iamVjdCIsInNjaGVtYVBhdGgiLCJyZXNvbHZlRnJvbSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwicmVnaXN0ZXJTY2hlbWEiLCJpc09iamVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgcmVzb2x2ZUZyb20gZnJvbSAncmVzb2x2ZS1mcm9tJztcbmltcG9ydCB7c2F0aXNmaWVzfSBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtjb21tYW5kQ2xhc3Nlc30gZnJvbSAnLi4vY2xpL2V4dGVuc2lvbic7XG5pbXBvcnQge0FQUElVTV9WRVJ9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQge1xuICBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLFxuICBpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uLFxuICByZWdpc3RlclNjaGVtYSxcbn0gZnJvbSAnLi4vc2NoZW1hL3NjaGVtYSc7XG5cbmNvbnN0IElOU1RBTExfVFlQRV9OUE0gPSAnbnBtJztcbmNvbnN0IElOU1RBTExfVFlQRV9MT0NBTCA9ICdsb2NhbCc7XG5jb25zdCBJTlNUQUxMX1RZUEVfR0lUSFVCID0gJ2dpdGh1Yic7XG5jb25zdCBJTlNUQUxMX1RZUEVfR0lUID0gJ2dpdCc7XG5cbi8qKiBAdHlwZSB7U2V0PEluc3RhbGxUeXBlPn0gKi9cbmNvbnN0IElOU1RBTExfVFlQRVMgPSBuZXcgU2V0KFtcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxuICBJTlNUQUxMX1RZUEVfTlBNLFxuXSk7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyBhYnN0cmFjdC4gSXQgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuXG4gKlxuICogU3ViY2xhc3NlcyBzaG91bGQgcHJvdmlkZSB0aGUgZ2VuZXJpYyBwYXJhbWV0ZXIgdG8gaW1wbGVtZW50LlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Db25maWcge1xuICAvKiogQHR5cGUge0V4dFR5cGV9ICovXG4gIGV4dGVuc2lvblR5cGU7XG5cbiAgLyoqIEB0eXBlIHtgJHtFeHRUeXBlfXNgfSAqL1xuICBjb25maWdLZXk7XG5cbiAgLyoqIEB0eXBlIHtFeHRSZWNvcmQ8RXh0VHlwZT59ICovXG4gIGluc3RhbGxlZEV4dGVuc2lvbnM7XG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1Mb2dnZXJ9ICovXG4gIGxvZztcblxuICAvKiogQHR5cGUge01hbmlmZXN0fSAqL1xuICBtYW5pZmVzdDtcblxuICAvKipcbiAgICogQHR5cGUge0V4dGVuc2lvbkxpc3REYXRhfVxuICAgKi9cbiAgX2xpc3REYXRhQ2FjaGU7XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtFeHRUeXBlfSBleHRlbnNpb25UeXBlIC0gVHlwZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtNYW5pZmVzdH0gbWFuaWZlc3QgLSBgTWFuaWZlc3RgIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihleHRlbnNpb25UeXBlLCBtYW5pZmVzdCkge1xuICAgIHRoaXMuZXh0ZW5zaW9uVHlwZSA9IGV4dGVuc2lvblR5cGU7XG4gICAgdGhpcy5jb25maWdLZXkgPSBgJHtleHRlbnNpb25UeXBlfXNgO1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IG1hbmlmZXN0LmdldEV4dGVuc2lvbkRhdGEoZXh0ZW5zaW9uVHlwZSk7XG4gICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICB9XG5cbiAgZ2V0IG1hbmlmZXN0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5tYW5pZmVzdFBhdGg7XG4gIH1cblxuICBnZXQgYXBwaXVtSG9tZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5hcHBpdW1Ib21lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGVycm9ycyBmb3IgYSBnaXZlbiBleHRlbnNpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHRNYW5pZmVzdFxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICBnZXRQcm9ibGVtcyhleHROYW1lLCBleHRNYW5pZmVzdCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLmdldEdlbmVyaWNDb25maWdQcm9ibGVtcyhleHRNYW5pZmVzdCwgZXh0TmFtZSksXG4gICAgICAuLi50aGlzLmdldENvbmZpZ1Byb2JsZW1zKGV4dE1hbmlmZXN0LCBleHROYW1lKSxcbiAgICAgIC4uLnRoaXMuZ2V0U2NoZW1hUHJvYmxlbXMoZXh0TWFuaWZlc3QsIGV4dE5hbWUpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2Ygd2FybmluZ3MgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FybmluZ3MoZXh0TmFtZSwgZXh0TWFuaWZlc3QpIHtcbiAgICBjb25zdCBbZ2VuZXJpY0NvbmZpZ1dhcm5pbmdzLCBjb25maWdXYXJuaW5nc10gPSBhd2FpdCBCLmFsbChbXG4gICAgICB0aGlzLmdldEdlbmVyaWNDb25maWdXYXJuaW5ncyhleHRNYW5pZmVzdCwgZXh0TmFtZSksXG4gICAgICB0aGlzLmdldENvbmZpZ1dhcm5pbmdzKGV4dE1hbmlmZXN0LCBleHROYW1lKSxcbiAgICBdKTtcblxuICAgIHJldHVybiBbLi4uZ2VuZXJpY0NvbmZpZ1dhcm5pbmdzLCAuLi5jb25maWdXYXJuaW5nc107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgZXh0ZW5zaW9uLXR5cGUtc3BlY2lmaWMgaXNzdWVzLiBUbyBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyxyZXF1aXJlLWF3YWl0XG4gIGFzeW5jIGdldENvbmZpZ1dhcm5pbmdzKGV4dE1hbmlmZXN0LCBleHROYW1lKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7TWFwPEV4dE5hbWU8RXh0VHlwZT4sRXh0TWFuaWZlc3RQcm9ibGVtW10+fSBbZXJyb3JNYXBdXG4gICAqIEBwYXJhbSB7TWFwPEV4dE5hbWU8RXh0VHlwZT4sc3RyaW5nW10+fSBbd2FybmluZ01hcF1cbiAgICovXG4gIGdldFZhbGlkYXRpb25SZXN1bHRTdW1tYXJpZXMoZXJyb3JNYXAgPSBuZXcgTWFwKCksIHdhcm5pbmdNYXAgPSBuZXcgTWFwKCkpIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBjb21wdXRlZCBzdHJpbmdzXG4gICAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgICAqL1xuICAgIGNvbnN0IGVycm9yU3VtbWFyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbZXh0TmFtZSwgcHJvYmxlbXNdIG9mIGVycm9yTWFwLmVudHJpZXMoKSkge1xuICAgICAgaWYgKF8uaXNFbXB0eShwcm9ibGVtcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdGhpcyBleHRlbnNpb24gZnJvbSB0aGUgbGlzdCBzaW5jZSBpdCdzIG5vdCB2YWxpZFxuICAgICAgZXJyb3JTdW1tYXJpZXMucHVzaChcbiAgICAgICAgYCR7dGhpcy5leHRlbnNpb25UeXBlfSBcIiR7ZXh0TmFtZX1cIiBoYWQgJHt1dGlsLnBsdXJhbGl6ZShcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHByb2JsZW1zLmxlbmd0aFxuICAgICAgICApfSBhbmQgd2lsbCBub3QgYmUgYXZhaWxhYmxlOmBcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHByb2JsZW0gb2YgcHJvYmxlbXMpIHtcbiAgICAgICAgZXJyb3JTdW1tYXJpZXMucHVzaChcbiAgICAgICAgICBgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgKyBgJHtKU09OLnN0cmluZ2lmeShwcm9ibGVtLnZhbCl9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCB3YXJuaW5nU3VtbWFyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbZXh0TmFtZSwgd2FybmluZ3NdIG9mIHdhcm5pbmdNYXAuZW50cmllcygpKSB7XG4gICAgICBpZiAoXy5pc0VtcHR5KHdhcm5pbmdzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dFR5cGVUZXh0ID0gXy5jYXBpdGFsaXplKHRoaXMuZXh0ZW5zaW9uVHlwZSk7XG4gICAgICBjb25zdCBwcm9ibGVtRW51bWVyYXRpb25UZXh0ID0gdXRpbC5wbHVyYWxpemUoJ3BvdGVudGlhbCBwcm9ibGVtJywgd2FybmluZ3MubGVuZ3RoLCB0cnVlKTtcbiAgICAgIHdhcm5pbmdTdW1tYXJpZXMucHVzaChgJHtleHRUeXBlVGV4dH0gXCIke2V4dE5hbWV9XCIgaGFzICR7cHJvYmxlbUVudW1lcmF0aW9uVGV4dH06IGApO1xuICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIHdhcm5pbmdTdW1tYXJpZXMucHVzaChgICAtICR7d2FybmluZ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge2Vycm9yU3VtbWFyaWVzLCB3YXJuaW5nU3VtbWFyaWVzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZXh0ZW5zaW9ucyBmb3IgcHJvYmxlbXMuICBUbyBiZSBjYWxsZWQgYnkgc3ViY2xhc3NlcycgYHZhbGlkYXRlYCBtZXRob2QuXG4gICAqXG4gICAqIEVycm9ycyBhbmQgd2FybmluZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGV4dHNgLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB7RXh0UmVjb3JkPEV4dFR5cGU+fSBleHRzIC0gTG9va3VwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byB7QGxpbmtjb2RlIEV4dE1hbmlmZXN0fSBvYmplY3RzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IFRoZSBzYW1lIGxvb2t1cCwgYnV0IHBpY2tpbmcgb25seSBlcnJvci1mcmVlIGV4dGVuc2lvbnNcbiAgICovXG4gIGFzeW5jIF92YWxpZGF0ZShleHRzKSB7XG4gICAgLyoqXG4gICAgICogTG9va3VwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byB7QGxpbmtjb2RlIEV4dE1hbmlmZXN0UHJvYmxlbSBFeHRNYW5pZmVzdFByb2JsZW1zfVxuICAgICAqIEB0eXBlIHtNYXA8RXh0TmFtZTxFeHRUeXBlPixFeHRNYW5pZmVzdFByb2JsZW1bXT59XG4gICAgICovXG4gICAgY29uc3QgZXJyb3JNYXAgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogTG9va3VwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byB3YXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7TWFwPEV4dE5hbWU8RXh0VHlwZT4sc3RyaW5nW10+fVxuICAgICAqL1xuICAgIGNvbnN0IHdhcm5pbmdNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHRNYW5pZmVzdF0gb2YgXy50b1BhaXJzKGV4dHMpKSB7XG4gICAgICBjb25zdCBbZXJyb3JzLCB3YXJuaW5nc10gPSBhd2FpdCBCLmFsbChbXG4gICAgICAgIHRoaXMuZ2V0UHJvYmxlbXMoZXh0TmFtZSwgZXh0TWFuaWZlc3QpLFxuICAgICAgICB0aGlzLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIF0pO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZGVsZXRlIGV4dHNbZXh0TmFtZV07XG4gICAgICB9XG4gICAgICBlcnJvck1hcC5zZXQoZXh0TmFtZSwgZXJyb3JzKTtcbiAgICAgIHdhcm5pbmdNYXAuc2V0KGV4dE5hbWUsIHdhcm5pbmdzKTtcbiAgICB9XG5cbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5nZXRWYWxpZGF0aW9uUmVzdWx0U3VtbWFyaWVzKFxuICAgICAgZXJyb3JNYXAsXG4gICAgICB3YXJuaW5nTWFwXG4gICAgKTtcblxuICAgIGlmICghXy5pc0VtcHR5KGVycm9yU3VtbWFyaWVzKSkge1xuICAgICAgbG9nLmVycm9yKFxuICAgICAgICBgQXBwaXVtIGVuY291bnRlcmVkICR7dXRpbC5wbHVyYWxpemUoXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvclN1bW1hcmllcy5sZW5ndGgsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApfSB3aGlsZSB2YWxpZGF0aW5nICR7dGhpcy5jb25maWdLZXl9IGZvdW5kIGluIG1hbmlmZXN0ICR7dGhpcy5tYW5pZmVzdFBhdGh9YFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBlcnJvclN1bW1hcmllcykge1xuICAgICAgICBsb2cuZXJyb3Ioc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9ubHkgZGlzcGxheSB3YXJuaW5ncyBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzIVxuXG4gICAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgICBsb2cud2FybihcbiAgICAgICAgICBgQXBwaXVtIGVuY291bnRlcmVkICR7dXRpbC5wbHVyYWxpemUoXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICB3YXJuaW5nU3VtbWFyaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApfSB3aGlsZSB2YWxpZGF0aW5nICR7dGhpcy5jb25maWdLZXl9IGZvdW5kIGluIG1hbmlmZXN0ICR7dGhpcy5tYW5pZmVzdFBhdGh9YFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2Ygd2FybmluZ1N1bW1hcmllcykge1xuICAgICAgICAgIGxvZy53YXJuKHN1bW1hcnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBsaXN0aW5nIGRhdGEgZm9yIGV4dGVuc2lvbnMgdmlhIGNvbW1hbmQgY2xhc3MuXG4gICAqIENhY2hlcyB0aGUgcmVzdWx0IGluIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29uZmlnLl9saXN0RGF0YUNhY2hlfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICovXG4gIGFzeW5jIGdldExpc3REYXRhKCkge1xuICAgIGlmICh0aGlzLl9saXN0RGF0YUNhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdERhdGFDYWNoZTtcbiAgICB9XG4gICAgY29uc3QgQ29tbWFuZENsYXNzID0gLyoqIEB0eXBlIHtFeHRDb21tYW5kPEV4dFR5cGU+fSAqLyAoY29tbWFuZENsYXNzZXNbdGhpcy5leHRlbnNpb25UeXBlXSk7XG4gICAgY29uc3QgY21kID0gbmV3IENvbW1hbmRDbGFzcyh7Y29uZmlnOiB0aGlzLCBqc29uOiB0cnVlfSk7XG4gICAgY29uc3QgbGlzdERhdGEgPSBhd2FpdCBjbWQubGlzdCh7c2hvd0luc3RhbGxlZDogdHJ1ZSwgc2hvd1VwZGF0ZXM6IHRydWV9KTtcbiAgICB0aGlzLl9saXN0RGF0YUNhY2hlID0gbGlzdERhdGE7XG4gICAgcmV0dXJuIGxpc3REYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHdhcm5pbmdzIGZvciBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBCeSBkZWZpbml0aW9uLCBhIG5vbi1lbXB0eSBsaXN0IG9mIHdhcm5pbmdzIGRvZXMgX25vdF8gaW1wbHkgdGhlIGV4dGVuc2lvbiBjYW5ub3QgYmUgbG9hZGVkLFxuICAgKiBidXQgaXQgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkIG9yIG90aGVyd2lzZSB0aHJvdyBhbiBleGNlcHRpb24gYXQgcnVudGltZS5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEdlbmVyaWNDb25maWdXYXJuaW5ncyhleHRNYW5pZmVzdCwgZXh0TmFtZSkge1xuICAgIGNvbnN0IHthcHBpdW1WZXJzaW9uLCBpbnN0YWxsU3BlYywgaW5zdGFsbFR5cGUsIHBrZ05hbWV9ID0gZXh0TWFuaWZlc3Q7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcblxuICAgIGNvbnN0IGludmFsaWRGaWVsZHMgPSBbXTtcbiAgICBpZiAoIV8uaXNTdHJpbmcoaW5zdGFsbFNwZWMpKSB7XG4gICAgICBpbnZhbGlkRmllbGRzLnB1c2goJ2luc3RhbGxTcGVjJyk7XG4gICAgfVxuXG4gICAgaWYgKCFJTlNUQUxMX1RZUEVTLmhhcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIGludmFsaWRGaWVsZHMucHVzaCgnaW5zdGFsbFR5cGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRUeXBlVGV4dCA9IF8uY2FwaXRhbGl6ZSh0aGlzLmV4dGVuc2lvblR5cGUpO1xuXG4gICAgaWYgKGludmFsaWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkRmllbGRzRW51bWVyYXRpb25UZXh0ID0gdXRpbC5wbHVyYWxpemUoXG4gICAgICAgICdpbnZhbGlkIG9yIG1pc3NpbmcgZmllbGQnLFxuICAgICAgICBpbnZhbGlkRmllbGRzLmxlbmd0aCxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGludmFsaWRGaWVsZHNUZXh0ID0gaW52YWxpZEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgXCIke2ZpZWxkfVwiYCkuam9pbignLCAnKTtcblxuICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgYCR7ZXh0VHlwZVRleHR9IFwiJHtleHROYW1lfVwiIChwYWNrYWdlIFxcYCR7cGtnTmFtZX1cXGApIGhhcyAke2ludmFsaWRGaWVsZHNFbnVtZXJhdGlvblRleHR9ICgke2ludmFsaWRGaWVsZHNUZXh0fSkgaW4gXFxgZXh0ZW5zaW9ucy55YW1sXFxgOyB0aGlzIG1heSBjYXVzZSB1cGdyYWRlcyBkb25lIHZpYSB0aGUgXFxgYXBwaXVtXFxgIENMSSB0b29sIHRvIGZhaWwuIFBsZWFzZSByZWluc3RhbGwgd2l0aCBcXGBhcHBpdW0gJHt0aGlzLmV4dGVuc2lvblR5cGV9IHVuaW5zdGFsbCAke2V4dE5hbWV9XFxgIGFuZCBcXGBhcHBpdW0gJHt0aGlzLmV4dGVuc2lvblR5cGV9IGluc3RhbGwgJHtleHROYW1lfVxcYCB0byBhdHRlbXB0IGEgZml4LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscHMgY29uY2F0ZW5hdGUgd2FybmluZyBtZXNzYWdlcyByZWxhdGVkIHRvIHBlZXIgZGVwZW5kZW5jaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvblxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZVBlZXJXYXJuaW5nID0gKHJlYXNvbikgPT5cbiAgICAgIGAke2V4dFR5cGVUZXh0fSBcIiR7ZXh0TmFtZX1cIiAocGFja2FnZSBcXGAke3BrZ05hbWV9XFxgKSBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBBcHBpdW0gKHYke0FQUElVTV9WRVJ9KSBkdWUgdG8gJHtyZWFzb259YDtcblxuICAgIGlmIChfLmlzU3RyaW5nKGFwcGl1bVZlcnNpb24pICYmICFzYXRpc2ZpZXMoQVBQSVVNX1ZFUiwgYXBwaXVtVmVyc2lvbikpIHtcbiAgICAgIGNvbnN0IGxpc3REYXRhID0gYXdhaXQgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICAgICAgY29uc3QgZXh0TGlzdERhdGEgPSAvKiogQHR5cGUge0luc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfSAqLyAobGlzdERhdGFbZXh0TmFtZV0pO1xuICAgICAgaWYgKGV4dExpc3REYXRhPy5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge3VwZGF0ZVZlcnNpb24sIHVwVG9EYXRlfSA9IGV4dExpc3REYXRhO1xuICAgICAgICBpZiAoIXVwVG9EYXRlKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgICAgIGNyZWF0ZVBlZXJXYXJuaW5nKFxuICAgICAgICAgICAgICBgaXRzIHBlZXIgZGVwZW5kZW5jeSBvbiBvbGRlciBBcHBpdW0gdiR7YXBwaXVtVmVyc2lvbn0uIFBsZWFzZSB1cGdyYWRlIFxcYCR7cGtnTmFtZX1cXGAgdG8gdiR7dXBkYXRlVmVyc2lvbn0gb3IgbmV3ZXIuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgICAgIGNyZWF0ZVBlZXJXYXJuaW5nKFxuICAgICAgICAgICAgICBgaXRzIHBlZXIgZGVwZW5kZW5jeSBvbiBvbGRlciBBcHBpdW0gdiR7YXBwaXVtVmVyc2lvbn0uIFBsZWFzZSBhc2sgdGhlIGRldmVsb3BlciBvZiBcXGAke3BrZ05hbWV9XFxgIHRvIHVwZGF0ZSB0aGUgcGVlciBkZXBlbmRlbmN5IG9uIEFwcGl1bSB0byB2JHtBUFBJVU1fVkVSfS5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIV8uaXNTdHJpbmcoYXBwaXVtVmVyc2lvbikpIHtcbiAgICAgIGNvbnN0IGxpc3REYXRhID0gYXdhaXQgdGhpcy5nZXRMaXN0RGF0YSgpO1xuICAgICAgY29uc3QgZXh0TGlzdERhdGEgPSAvKiogQHR5cGUge0luc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfSAqLyAobGlzdERhdGFbZXh0TmFtZV0pO1xuICAgICAgaWYgKCFleHRMaXN0RGF0YT8udXBUb0RhdGUgJiYgZXh0TGlzdERhdGE/LnVwZGF0ZVZlcnNpb24pIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChcbiAgICAgICAgICBjcmVhdGVQZWVyV2FybmluZyhcbiAgICAgICAgICAgIGBhbiBpbnZhbGlkIG9yIG1pc3NpbmcgcGVlciBkZXBlbmRlbmN5IG9uIEFwcGl1bS4gQSBuZXdlciB2ZXJzaW9uIG9mIFxcYCR7cGtnTmFtZX1cXGAgaXMgYXZhaWxhYmxlOyBwbGVhc2UgYXR0ZW1wdCB0byB1cGdyYWRlIFwiJHtleHROYW1lfVwiIHRvIHYke2V4dExpc3REYXRhLnVwZGF0ZVZlcnNpb259IG9yIG5ld2VyLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgICAgIGNyZWF0ZVBlZXJXYXJuaW5nKFxuICAgICAgICAgICAgYGFuIGludmFsaWQgb3IgbWlzc2luZyBwZWVyIGRlcGVuZGVuY3kgb24gQXBwaXVtLiBQbGVhc2UgYXNrIHRoZSBkZXZlbG9wZXIgb2YgXFxgJHtwa2dOYW1lfVxcYCB0byBhZGQgYSBwZWVyIGRlcGVuZGVuY3kgb24gXFxgXmFwcGl1bUAke0FQUElVTV9WRVJ9XFxgLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YXJuaW5ncztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBsaXN0IG9mIHVucmVjb3ZlcmFibGUgZXJyb3JzIChpZiBhbnkpIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIF9pZl8gaXQgaGFzIGEgYHNjaGVtYWAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGEgKGZyb20gbWFuaWZlc3QpXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lIChmcm9tIG1hbmlmZXN0KVxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICBnZXRTY2hlbWFQcm9ibGVtcyhleHRNYW5pZmVzdCwgZXh0TmFtZSkge1xuICAgIC8qKiBAdHlwZSB7RXh0TWFuaWZlc3RQcm9ibGVtW119ICovXG4gICAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgICBjb25zdCB7c2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dE1hbmlmZXN0O1xuICAgIGlmIChFeHRlbnNpb25Db25maWcuZXh0RGF0YUhhc1NjaGVtYShleHRNYW5pZmVzdCkpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHRNYW5pZmVzdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIHNjaGVtYSBhdCBwYXRoICR7YXJnU2NoZW1hUGF0aH07ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgZXJyOiBgU2NoZW1hIGZpbGUgaGFzIHVuc3VwcG9ydGVkIGV4dGVuc2lvbi4gQWxsb3dlZDogJHtbXG4gICAgICAgICAgICAgIC4uLkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMsXG4gICAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnJlYWRFeHRlbnNpb25TY2hlbWEoZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGVycjogYFVuYWJsZSB0byByZWdpc3RlciBlbWJlZGRlZCBzY2hlbWE7ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgZXJyOiAnSW5jb3JyZWN0bHkgZm9ybWF0dGVkIHNjaGVtYSBmaWVsZDsgbXVzdCBiZSBhIHBhdGggdG8gYSBzY2hlbWEgZmlsZSBvciBhIHNjaGVtYSBvYmplY3QuJyxcbiAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvYmxlbXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiBnZW5lcmljIHVucmVjb3ZlcmFibGUgZXJyb3JzIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGEgKGZyb20gbWFuaWZlc3QpXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lIChmcm9tIG1hbmlmZXN0KVxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zKGV4dE1hbmlmZXN0LCBleHROYW1lKSB7XG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWUsIG1haW5DbGFzc30gPSBleHRNYW5pZmVzdDtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiBgSW52YWxpZCBvciBtaXNzaW5nIFxcYHZlcnNpb25cXGAgZmllbGQgaW4gbXkgXFxgcGFja2FnZS5qc29uXFxgIGFuZC9vciBcXGBleHRlbnNpb25zLnlhbWxcXGAgKG11c3QgYmUgYSBzdHJpbmcpYCxcbiAgICAgICAgdmFsOiB2ZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBrZ05hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiBgSW52YWxpZCBvciBtaXNzaW5nIFxcYG5hbWVcXGAgZmllbGQgaW4gbXkgXFxgcGFja2FnZS5qc29uXFxgIGFuZC9vciBcXGBleHRlbnNpb25zLnlhbWxcXGAgKG11c3QgYmUgYSBzdHJpbmcpYCxcbiAgICAgICAgdmFsOiBwa2dOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKG1haW5DbGFzcykpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6IGBJbnZhbGlkIG9yIG1pc3NpbmcgXFxgYXBwaXVtLm1haW5DbGFzc1xcYCBmaWVsZCBpbiBteSBcXGBwYWNrYWdlLmpzb25cXGAgYW5kL29yIFxcYG1haW5DbGFzc1xcYCBmaWVsZCBpbiBcXGBleHRlbnNpb25zLnlhbWxcXGAgKG11c3QgYmUgYSBzdHJpbmcpYCxcbiAgICAgICAgdmFsOiBtYWluQ2xhc3MsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvYmxlbXM7XG4gIH1cblxuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7RXh0TWFuaWZlc3RQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0Q29uZmlnUHJvYmxlbXMoZXh0TWFuaWZlc3QsIGV4dE5hbWUpIHtcbiAgICAvLyBzaG91ZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBzcGVjaWFsIHZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGlzIGV4dGVuc2lvbiB0eXBlXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLm1hbmlmZXN0LmFkZEV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblR5cGUsIGV4dE5hbWUsIGV4dE1hbmlmZXN0KTtcbiAgICBpZiAod3JpdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubWFuaWZlc3Qud3JpdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT58aW1wb3J0KCcuLi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQnKS5FeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0gPSB7XG4gICAgICAuLi50aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0sXG4gICAgICAuLi5leHRNYW5pZmVzdCxcbiAgICB9O1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnMsIGFuZCBvcHRpb25hbGx5IGF2b2lkIGEgd3JpdGUgdG8gdGhlIG1hbmlmZXN0IGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c30gW29wdHNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlRXh0ZW5zaW9uKGV4dE5hbWUsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICBkZWxldGUgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT5bXX0gW2FjdGl2ZU5hbWVzXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBwcmludChhY3RpdmVOYW1lcykge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBObyAke3RoaXMuY29uZmlnS2V5fSBoYXZlIGJlZW4gaW5zdGFsbGVkIGluICR7dGhpcy5hcHBpdW1Ib21lfS4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLidcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYEF2YWlsYWJsZSAke3RoaXMuY29uZmlnS2V5fTpgKTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHRNYW5pZmVzdF0gb2YgLyoqIEB0eXBlIHtbc3RyaW5nLCBFeHRNYW5pZmVzdDxFeHRUeXBlPl1bXX0gKi8gKFxuICAgICAgXy50b1BhaXJzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICApKSB7XG4gICAgICBsb2cuaW5mbyhgICAtICR7dGhpcy5leHRlbnNpb25EZXNjKGV4dE5hbWUsIGV4dE1hbmlmZXN0KX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBleHRlbnNpb24uIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZXh0ZW5zaW9uRGVzYyhleHROYW1lLCBleHRNYW5pZmVzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgc3ViY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0SW5zdGFsbFBhdGgoZXh0TmFtZSkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5hcHBpdW1Ib21lLCAnbm9kZV9tb2R1bGVzJywgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdLnBrZ05hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGV4dGVuc2lvbiBhbmQgcmV0dXJucyBpdHMgbWFpbiBjbGFzcyAoY29uc3RydWN0b3IpXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7RXh0Q2xhc3M8RXh0VHlwZT59XG4gICAqL1xuICByZXF1aXJlKGV4dE5hbWUpIHtcbiAgICBjb25zdCB7bWFpbkNsYXNzfSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBjb25zdCByZXFQYXRoID0gdGhpcy5nZXRJbnN0YWxsUGF0aChleHROYW1lKTtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgcmVxUmVzb2x2ZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlcVJlc29sdmVkID0gcmVxdWlyZS5yZXNvbHZlKHJlcVBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBDb3VsZCBub3QgZmluZCBhICR7dGhpcy5leHRlbnNpb25UeXBlfSBpbnN0YWxsZWQgYXQgJHtyZXFQYXRofWApO1xuICAgIH1cbiAgICAvLyBub3RlOiB0aGlzIHdpbGwgb25seSByZWxvYWQgdGhlIGVudHJ5IHBvaW50XG4gICAgaWYgKHByb2Nlc3MuZW52LkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyAmJiByZXF1aXJlLmNhY2hlW3JlcVJlc29sdmVkXSkge1xuICAgICAgbG9nLmRlYnVnKGBSZW1vdmluZyAke3JlcVJlc29sdmVkfSBmcm9tIHJlcXVpcmUgY2FjaGVgKTtcbiAgICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW3JlcVJlc29sdmVkXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBSZXF1aXJpbmcgJHt0aGlzLmV4dGVuc2lvblR5cGV9IGF0ICR7cmVxUGF0aH1gKTtcbiAgICBjb25zdCBNYWluQ2xhc3MgPSByZXF1aXJlKHJlcVBhdGgpW21haW5DbGFzc107XG4gICAgaWYgKCFNYWluQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGEgY2xhc3MgbmFtZWQgXCIke21haW5DbGFzc31cIiBleHBvcnRlZCBieSAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gXCIke2V4dE5hbWV9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gTWFpbkNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNJbnN0YWxsZWQoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyksIGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG1ldGhvZHMgb2Ygc3ViY2xhc3MuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWUgKHVuaXF1ZSB0byBpdHMgdHlwZSlcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8dW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIF9yZWFkRXh0ZW5zaW9uU2NoZW1hKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dE1hbmlmZXN0KSB7XG4gICAgY29uc3Qge3BrZ05hbWUsIHNjaGVtYTogYXJnU2NoZW1hUGF0aH0gPSBleHRNYW5pZmVzdDtcbiAgICBpZiAoIWFyZ1NjaGVtYVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBObyBcXGBzY2hlbWFcXGAgcHJvcGVydHkgZm91bmQgaW4gY29uZmlnIGZvciAke2V4dFR5cGV9ICR7cGtnTmFtZX0gLS0gd2h5IGlzIHRoaXMgZnVuY3Rpb24gYmVpbmcgY2FsbGVkP2BcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBtb2R1bGVPYmplY3Q7XG4gICAgaWYgKF8uaXNTdHJpbmcoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYVBhdGggPSByZXNvbHZlRnJvbShhcHBpdW1Ib21lLCBwYXRoLmpvaW4ocGtnTmFtZSwgYXJnU2NoZW1hUGF0aCkpO1xuICAgICAgbW9kdWxlT2JqZWN0ID0gcmVxdWlyZShzY2hlbWFQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kdWxlT2JqZWN0ID0gYXJnU2NoZW1hUGF0aDtcbiAgICB9XG4gICAgLy8gdGhpcyBzdWNrcy4gZGVmYXVsdCBleHBvcnRzIHNob3VsZCBiZSBkZXN0cm95ZWRcbiAgICBjb25zdCBzY2hlbWEgPSBtb2R1bGVPYmplY3QuX19lc01vZHVsZSA/IG1vZHVsZU9iamVjdC5kZWZhdWx0IDogbW9kdWxlT2JqZWN0O1xuICAgIHJlZ2lzdGVyU2NoZW1hKGV4dFR5cGUsIGV4dE5hbWUsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhIHNwZWNpZmljIHtAbGluayBFeHRNYW5pZmVzdH0gb2JqZWN0IGhhcyBhIGBzY2hlbWFgIHByb3AuXG4gICAqIFRoZSB7QGxpbmsgRXh0TWFuaWZlc3R9IG9iamVjdCBiZWNvbWVzIGEge0BsaW5rIEV4dE1hbmlmZXN0V2l0aFNjaGVtYX0gb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHJldHVybnMge2V4dE1hbmlmZXN0IGlzIEV4dE1hbmlmZXN0V2l0aFNjaGVtYTxFeHRUeXBlPn1cbiAgICovXG4gIHN0YXRpYyBleHREYXRhSGFzU2NoZW1hKGV4dE1hbmlmZXN0KSB7XG4gICAgcmV0dXJuIF8uaXNTdHJpbmcoZXh0TWFuaWZlc3Q/LnNjaGVtYSkgfHwgXy5pc09iamVjdChleHRNYW5pZmVzdD8uc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gcHJvdmlkZXMgYSBzY2hlbWEsIHRoaXMgd2lsbCBsb2FkIHRoZSBzY2hlbWEgYW5kIGF0dGVtcHQgdG9cbiAgICogcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc2NoZW1hIHJlZ2lzdHJhci5cbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gTmFtZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dE1hbmlmZXN0IC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fHVuZGVmaW5lZH1cbiAgICovXG4gIHJlYWRFeHRlbnNpb25TY2hlbWEoZXh0TmFtZSwgZXh0TWFuaWZlc3QpIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uQ29uZmlnLl9yZWFkRXh0ZW5zaW9uU2NoZW1hKFxuICAgICAgdGhpcy5hcHBpdW1Ib21lLFxuICAgICAgdGhpcy5leHRlbnNpb25UeXBlLFxuICAgICAgZXh0TmFtZSxcbiAgICAgIGV4dE1hbmlmZXN0XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge0lOU1RBTExfVFlQRV9OUE0sIElOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX0dJVEhVQiwgSU5TVEFMTF9UWVBFU307XG5cbi8qKlxuICogQW4gaXNzdWUgd2l0aCB0aGUge0BsaW5rY29kZSBFeHRNYW5pZmVzdH0gZm9yIGEgcGFydGljdWxhciBleHRlbnNpb24uXG4gKlxuICogVGhlIGV4aXN0YW5jZSBvZiBzdWNoIGFuIG9iamVjdCBpbXBsaWVzIHRoYXQgdGhlIGV4dGVuc2lvbiBjYW5ub3QgYmUgbG9hZGVkLlxuICogQHR5cGVkZWYgRXh0TWFuaWZlc3RQcm9ibGVtXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXJyIC0gRXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHthbnl9IHZhbCAtIEFzc29jaWF0ZWQgdmFsdWVcbiAqL1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb24gcHJvdmlkZWQgdG8gYW4ge0BsaW5rIEV4dGVuc2lvbkNvbmZpZ30gc3ViY2xhc3MuXG4gKiBAY2FsbGJhY2sgRXh0ZW5zaW9uTG9nRm5cbiAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3R9IE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWFuaWZlc3Q8VD59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWFuaWZlc3RXaXRoU2NoZW1hPFQ+fSBFeHRNYW5pZmVzdFdpdGhTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHROYW1lPFQ+fSBFeHROYW1lXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0Q2xhc3M8VD59IEV4dENsYXNzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0UmVjb3JkPFQ+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9jbGkvZXh0ZW5zaW9uJykuRXh0Q29tbWFuZDxUPn0gRXh0Q29tbWFuZFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdmFyaW91cyBtZXRob2RzIGluIHtAbGluayBFeHRlbnNpb25Db25maWd9XG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3dyaXRlPXRydWVdIFdoZXRoZXIgb3Igbm90IHRvIHdyaXRlIHRoZSBtYW5pZmVzdCB0byBkaXNrIGFmdGVyIGEgbXV0YXRpb24gb3BlcmF0aW9uXG4gKi9cblxuLyoqXG4gKiBBIHZhbGlkIGluc3RhbGwgdHlwZVxuICogQHR5cGVkZWYge3R5cGVvZiBJTlNUQUxMX1RZUEVfTlBNIHwgdHlwZW9mIElOU1RBTExfVFlQRV9HSVQgfCB0eXBlb2YgSU5TVEFMTF9UWVBFX0xPQ0FMIHwgdHlwZW9mIElOU1RBTExfVFlQRV9HSVRIVUJ9IEluc3RhbGxUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQnKS5FeHRlbnNpb25MaXN0RGF0YX0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24tY29tbWFuZCcpLkluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUEsTUFBTUEsZ0JBQWdCLEdBQUcsS0FBekI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsT0FBM0I7O0FBQ0EsTUFB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
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Loads extensions and creates `ExtensionConfig` instances.
3
+ *
4
+ * - Reads the manifest file, creating if necessary
5
+ * - Using the parsed extension data, creates/gets the `ExtensionConfig` subclass instances
6
+ * - Returns these instances
7
+ *
8
+ * If `appiumHome` is needed, use `resolveAppiumHome` from the `env` module in `@appium/support`.
9
+ * @param {string} appiumHome
10
+ * @returns {Promise<ExtensionConfigs>}
11
+ */
12
+ export function loadExtensions(appiumHome: string): Promise<ExtensionConfigs>;
13
+ /**
14
+ * Find any plugin name which has been installed, and which has been requested for activation by
15
+ * using the --use-plugins flag, and turn each one into its class, so we can send them as objects
16
+ * to the server init. We also want to send/assign them to the umbrella driver so it can use them
17
+ * to wrap command execution
18
+ *
19
+ * @param {import('./plugin-config').PluginConfig} pluginConfig - a plugin extension config
20
+ * @param {string[]} usePlugins
21
+ * @returns {PluginNameMap} Mapping of PluginClass to name
22
+ */
23
+ export function getActivePlugins(pluginConfig: import('./plugin-config').PluginConfig, usePlugins?: string[]): PluginNameMap;
24
+ /**
25
+ * Find any driver name which has been installed, and turn each one into its class, so we can send
26
+ * them as objects to the server init in case they need to add methods/routes or update the server.
27
+ * If the --drivers flag was given, this method only loads the given drivers.
28
+ *
29
+ * @param {import('./driver-config').DriverConfig} driverConfig - a driver extension config
30
+ * @param {string[]} [useDrivers] - optional list of drivers to load
31
+ * @returns {DriverNameMap}
32
+ */
33
+ export function getActiveDrivers(driverConfig: import('./driver-config').DriverConfig, useDrivers?: string[] | undefined): DriverNameMap;
34
+ /**
35
+ * A mapping of {@linkcode PluginClass } classes to their names.
36
+ */
37
+ export type PluginNameMap = Map<PluginClass, string>;
38
+ /**
39
+ * A mapping of {@linkcode DriverClass } classes to their names.
40
+ */
41
+ export type DriverNameMap = Map<DriverClass, string>;
42
+ export type PluginClass = import('@appium/types').PluginClass;
43
+ export type DriverClass = import('@appium/types').DriverClass;
44
+ export type ExtensionConfigs = {
45
+ driverConfig: import('./driver-config').DriverConfig;
46
+ pluginConfig: import('./plugin-config').PluginConfig;
47
+ };
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/extension/index.js"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,2CAHW,MAAM,GACJ,QAAQ,gBAAgB,CAAC,CAUrC;AAED;;;;;;;;;GASG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,eACtC,MAAM,EAAE,iBA2BlB;AAED;;;;;;;;GAQG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,oDAwBhD;;;;4BAIY,IAAI,WAAW,EAAC,MAAM,CAAC;;;;4BAKvB,IAAI,WAAW,EAAC,MAAM,CAAC;0BAIvB,OAAO,eAAe,EAAE,WAAW;0BACnC,OAAO,eAAe,EAAE,WAAW;;kBAKlC,OAAO,iBAAiB,EAAE,YAAY;kBACtC,OAAO,iBAAiB,EAAE,YAAY"}