appium-webdriveragent 4.3.0 → 4.4.1

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.
@@ -42,9 +42,10 @@ const LIB_SCHEME_TV = 'WebDriverAgentLib_tvOS';
42
42
  const xcodeLog = _support.logger.getLogger('Xcode');
43
43
 
44
44
  class XcodeBuild {
45
- constructor(xcodeVersion, device, args = {}) {
45
+ constructor(xcodeVersion, device, args = {}, log = null) {
46
46
  this.xcodeVersion = xcodeVersion;
47
47
  this.device = device;
48
+ this.log = log !== null && log !== void 0 ? log : _logger.default;
48
49
  this.realDevice = args.realDevice;
49
50
  this.agentPath = args.agentPath;
50
51
  this.bootstrapPath = args.bootstrapPath;
@@ -112,8 +113,7 @@ class XcodeBuild {
112
113
  stdout
113
114
  } = await (0, _teen_process.exec)('xcodebuild', ['-project', this.agentPath, '-showBuildSettings']));
114
115
  } catch (err) {
115
- _logger.default.warn(`Cannot retrieve WDA build settings. Original error: ${err.message}`);
116
-
116
+ this.log.warn(`Cannot retrieve WDA build settings. Original error: ${err.message}`);
117
117
  return;
118
118
  }
119
119
 
@@ -121,19 +121,15 @@ class XcodeBuild {
121
121
  const match = pattern.exec(stdout);
122
122
 
123
123
  if (!match) {
124
- _logger.default.warn(`Cannot parse WDA build dir from ${_lodash.default.truncate(stdout, {
124
+ this.log.warn(`Cannot parse WDA build dir from ${_lodash.default.truncate(stdout, {
125
125
  length: 300
126
126
  })}`);
127
-
128
127
  return;
129
128
  }
130
129
 
131
- _logger.default.debug(`Parsed BUILD_DIR configuration value: '${match[1]}'`);
132
-
130
+ this.log.debug(`Parsed BUILD_DIR configuration value: '${match[1]}'`);
133
131
  this.derivedDataPath = _path.default.dirname(_path.default.dirname(_path.default.normalize(match[1])));
134
-
135
- _logger.default.debug(`Got derived data root: '${this.derivedDataPath}'`);
136
-
132
+ this.log.debug(`Got derived data root: '${this.derivedDataPath}'`);
137
133
  return this.derivedDataPath;
138
134
  })();
139
135
 
@@ -147,8 +143,7 @@ class XcodeBuild {
147
143
  }
148
144
 
149
145
  async prebuild() {
150
- _logger.default.debug('Pre-building WDA before launching test');
151
-
146
+ this.log.debug('Pre-building WDA before launching test');
152
147
  this.usePrebuiltWDA = true;
153
148
  await this.start(true);
154
149
  this.xcodebuild = null;
@@ -161,8 +156,7 @@ class XcodeBuild {
161
156
  const runnerScheme = tmpIsTvOS ? RUNNER_SCHEME_TV : RUNNER_SCHEME_IOS;
162
157
 
163
158
  for (const scheme of [libScheme, runnerScheme]) {
164
- _logger.default.debug(`Cleaning the project scheme '${scheme}' to make sure there are no leftovers from previous installs`);
165
-
159
+ this.log.debug(`Cleaning the project scheme '${scheme}' to make sure there are no leftovers from previous installs`);
166
160
  await (0, _teen_process.exec)('xcodebuild', ['clean', '-project', this.agentPath, '-scheme', scheme]);
167
161
  }
168
162
  }
@@ -209,12 +203,11 @@ class XcodeBuild {
209
203
  if (versionMatch) {
210
204
  args.push(`IPHONEOS_DEPLOYMENT_TARGET=${versionMatch[1]}.${versionMatch[2]}`);
211
205
  } else {
212
- _logger.default.warn(`Cannot parse major and minor version numbers from platformVersion "${this.platformVersion}". ` + 'Will build for the default platform instead');
206
+ this.log.warn(`Cannot parse major and minor version numbers from platformVersion "${this.platformVersion}". ` + 'Will build for the default platform instead');
213
207
  }
214
208
 
215
209
  if (this.realDevice && this.xcodeConfigFile) {
216
- _logger.default.debug(`Using Xcode configuration file: '${this.xcodeConfigFile}'`);
217
-
210
+ this.log.debug(`Using Xcode configuration file: '${this.xcodeConfigFile}'`);
218
211
  args.push('-xcconfig', this.xcodeConfigFile);
219
212
  }
220
213
 
@@ -244,9 +237,7 @@ class XcodeBuild {
244
237
  cmd,
245
238
  args
246
239
  } = this.getCommand(buildOnly);
247
-
248
- _logger.default.debug(`Beginning ${buildOnly ? 'build' : 'test'} with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.bootstrapPath}'`);
249
-
240
+ this.log.debug(`Beginning ${buildOnly ? 'build' : 'test'} with command '${cmd} ${args.join(' ')}' ` + `in directory '${this.bootstrapPath}'`);
250
241
  const env = Object.assign({}, process.env, {
251
242
  USE_PORT: this.wdaRemotePort,
252
243
  WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId || _constants.WDA_RUNNER_BUNDLE_ID
@@ -270,16 +261,13 @@ class XcodeBuild {
270
261
  });
271
262
  let logXcodeOutput = !!this.showXcodeLog;
272
263
  const logMsg = _lodash.default.isBoolean(this.showXcodeLog) ? `Output from xcodebuild ${this.showXcodeLog ? 'will' : 'will not'} be logged` : 'Output from xcodebuild will only be logged if any errors are present there';
273
-
274
- _logger.default.debug(`${logMsg}. To change this, use 'showXcodeLog' desired capability`);
275
-
264
+ this.log.debug(`${logMsg}. To change this, use 'showXcodeLog' desired capability`);
276
265
  xcodebuild.on('output', (stdout, stderr) => {
277
266
  let out = stdout || stderr;
278
267
 
279
268
  if (out.includes('Writing diagnostic log for test session to')) {
280
269
  xcodebuild.logLocation = _lodash.default.first(_lodash.default.remove(out.trim().split('\n'), v => v.startsWith(_path.default.sep)));
281
-
282
- _logger.default.debug(`Log file for xcodebuild test: ${xcodebuild.logLocation}`);
270
+ xcodeLog.debug(`Log file for xcodebuild test: ${xcodebuild.logLocation}`);
283
271
  }
284
272
 
285
273
  const ignoreError = IGNORED_ERRORS.some(x => out.includes(x));
@@ -307,7 +295,7 @@ class XcodeBuild {
307
295
  this.xcodebuild._wda_error_message = '';
308
296
  return await new _bluebird.default((resolve, reject) => {
309
297
  this.xcodebuild.on('exit', async (code, signal) => {
310
- _logger.default.error(`xcodebuild exited with code '${code}' and signal '${signal}'`);
298
+ xcodeLog.error(`xcodebuild exited with code '${code}' and signal '${signal}'`);
311
299
 
312
300
  if (this.showXcodeLog && this.xcodebuild.logLocation) {
313
301
  xcodeLog.error(`Contents of xcodebuild log file '${this.xcodebuild.logLocation}':`);
@@ -319,7 +307,7 @@ class XcodeBuild {
319
307
  xcodeLog.error(line);
320
308
  }
321
309
  } catch (err) {
322
- _logger.default.error(`Unable to access xcodebuild log file: '${err.message}'`);
310
+ xcodeLog.error(`Unable to access xcodebuild log file: '${err.message}'`);
323
311
  }
324
312
  }
325
313
 
@@ -344,9 +332,7 @@ class XcodeBuild {
344
332
  }
345
333
  } catch (err) {
346
334
  let msg = `Unable to start WebDriverAgent: ${err}`;
347
-
348
- _logger.default.error(msg);
349
-
335
+ this.log.error(msg);
350
336
  reject(new Error(msg));
351
337
  }
352
338
  })();
@@ -354,8 +340,7 @@ class XcodeBuild {
354
340
  }
355
341
 
356
342
  async waitForStart(timer) {
357
- _logger.default.debug(`Waiting up to ${this.launchTimeout}ms for WebDriverAgent to start`);
358
-
343
+ this.log.debug(`Waiting up to ${this.launchTimeout}ms for WebDriverAgent to start`);
359
344
  let currentStatus = null;
360
345
 
361
346
  try {
@@ -375,9 +360,8 @@ class XcodeBuild {
375
360
  this.agentUrl = currentStatus.ios.ip;
376
361
  }
377
362
 
378
- _logger.default.debug(`WebDriverAgent information:`);
379
-
380
- _logger.default.debug(JSON.stringify(currentStatus, null, 2));
363
+ this.log.debug(`WebDriverAgent information:`);
364
+ this.log.debug(JSON.stringify(currentStatus, null, 2));
381
365
  } catch (err) {
382
366
  throw new Error(`Unable to connect to running WebDriverAgent: ${err.message}`);
383
367
  } finally {
@@ -389,11 +373,10 @@ class XcodeBuild {
389
373
  return currentStatus;
390
374
  }
391
375
 
392
- _logger.default.debug(`WebDriverAgent successfully started after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
376
+ this.log.debug(`WebDriverAgent successfully started after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
393
377
  } catch (err) {
394
- _logger.default.debug(err.message);
395
-
396
- _logger.default.warn(`Getting status of WebDriverAgent on device timed out. Continuing`);
378
+ this.log.debug(err.message);
379
+ this.log.warn(`Getting status of WebDriverAgent on device timed out. Continuing`);
397
380
  }
398
381
 
399
382
  return currentStatus;
@@ -410,4 +393,4 @@ var _default = XcodeBuild;
410
393
  exports.default = _default;require('source-map-support').install();
411
394
 
412
395
 
413
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZWJ1aWxkLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfU0lHTklOR19JRCIsIlBSRUJVSUxEX0RFTEFZIiwiUlVOTkVSX1NDSEVNRV9JT1MiLCJMSUJfU0NIRU1FX0lPUyIsIkVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCIsIkVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCIsIklHTk9SRURfRVJST1JTIiwiUlVOTkVSX1NDSEVNRV9UViIsIkxJQl9TQ0hFTUVfVFYiLCJ4Y29kZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsIlhjb2RlQnVpbGQiLCJjb25zdHJ1Y3RvciIsInhjb2RlVmVyc2lvbiIsImRldmljZSIsImFyZ3MiLCJyZWFsRGV2aWNlIiwiYWdlbnRQYXRoIiwiYm9vdHN0cmFwUGF0aCIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwicHJlYnVpbGRXREEiLCJ1c2VQcmVidWlsdFdEQSIsInVzZVNpbXBsZUJ1aWxkVGVzdCIsInVzZVhjdGVzdHJ1bkZpbGUiLCJsYXVuY2hUaW1lb3V0Iiwid2RhUmVtb3RlUG9ydCIsInVwZGF0ZWRXREFCdW5kbGVJZCIsImRlcml2ZWREYXRhUGF0aCIsIm1qcGVnU2VydmVyUG9ydCIsInByZWJ1aWxkRGVsYXkiLCJfIiwiaXNOdW1iZXIiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiaW5pdCIsIm5vU2Vzc2lvblByb3h5IiwiZGV2aXZlSW5mbyIsImlzUmVhbERldmljZSIsInVkaWQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsInJldHJpZXZlRGVyaXZlZERhdGFQYXRoIiwiX2Rlcml2ZWREYXRhUGF0aFByb21pc2UiLCJzdGRvdXQiLCJlcnIiLCJsb2ciLCJ3YXJuIiwibWVzc2FnZSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJ0cnVuY2F0ZSIsImxlbmd0aCIsImRlYnVnIiwicGF0aCIsImRpcm5hbWUiLCJub3JtYWxpemUiLCJyZXNldCIsInByZWJ1aWxkIiwic3RhcnQiLCJ4Y29kZWJ1aWxkIiwiQiIsImRlbGF5IiwiY2xlYW5Qcm9qZWN0IiwidG1wSXNUdk9TIiwibGliU2NoZW1lIiwicnVubmVyU2NoZW1lIiwic2NoZW1lIiwiZ2V0Q29tbWFuZCIsImJ1aWxkT25seSIsImNtZCIsImJ1aWxkQ21kIiwidGVzdENtZCIsInB1c2giLCJ2ZXJzaW9uTWF0Y2giLCJSZWdFeHAiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJqb2luIiwiT2JqZWN0IiwiYXNzaWduIiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiTUpQRUdfU0VSVkVSX1BPUlQiLCJ1cGdyYWRlVGltZXN0YW1wIiwiVVBHUkFERV9USU1FU1RBTVAiLCJTdWJQcm9jZXNzIiwiY3dkIiwiZGV0YWNoZWQiLCJzdGRpbyIsImxvZ1hjb2RlT3V0cHV0IiwibG9nTXNnIiwiaXNCb29sZWFuIiwib24iLCJzdGRlcnIiLCJvdXQiLCJpbmNsdWRlcyIsImxvZ0xvY2F0aW9uIiwiZmlyc3QiLCJyZW1vdmUiLCJ0cmltIiwic3BsaXQiLCJ2Iiwic3RhcnRzV2l0aCIsInNlcCIsImlnbm9yZUVycm9yIiwic29tZSIsIngiLCJfd2RhX2Vycm9yX29jY3VycmVkIiwibGluZSIsIkVPTCIsImVycm9yIiwiX3dkYV9lcnJvcl9tZXNzYWdlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvZGUiLCJzaWduYWwiLCJkYXRhIiwiZnMiLCJyZWFkRmlsZSIsInByb2Nlc3NFeGl0ZWQiLCJFcnJvciIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGF0dXMiLCJ3YWl0Rm9yU3RhcnQiLCJtc2ciLCJjdXJyZW50U3RhdHVzIiwicmV0cmllcyIsInBhcnNlSW50IiwicHJveHlUaW1lb3V0IiwidGltZW91dCIsImNvbW1hbmQiLCJpb3MiLCJpcCIsImFnZW50VXJsIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwicXVpdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxrQkFBa0IsR0FBRyxrQkFBM0I7QUFDQSxNQUFNQyxjQUFjLEdBQUcsQ0FBdkI7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxzQkFBMUI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsbUJBQXZCO0FBRUEsTUFBTUMsd0JBQXdCLEdBQUcsdUNBQWpDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsa0NBQWpDO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLENBQ3JCRix3QkFEcUIsRUFFckJDLHdCQUZxQixFQUdyQixxQ0FIcUIsQ0FBdkI7QUFNQSxNQUFNRSxnQkFBZ0IsR0FBRywyQkFBekI7QUFDQSxNQUFNQyxhQUFhLEdBQUcsd0JBQXRCOztBQUVBLE1BQU1DLFFBQVEsR0FBR0MsZ0JBQU9DLFNBQVAsQ0FBaUIsT0FBakIsQ0FBakI7O0FBR0EsTUFBTUMsVUFBTixDQUFpQjtBQUNmQyxFQUFBQSxXQUFXLENBQUVDLFlBQUYsRUFBZ0JDLE1BQWhCLEVBQXdCQyxJQUFJLEdBQUcsRUFBL0IsRUFBbUM7QUFDNUMsU0FBS0YsWUFBTCxHQUFvQkEsWUFBcEI7QUFFQSxTQUFLQyxNQUFMLEdBQWNBLE1BQWQ7QUFFQSxTQUFLRSxVQUFMLEdBQWtCRCxJQUFJLENBQUNDLFVBQXZCO0FBRUEsU0FBS0MsU0FBTCxHQUFpQkYsSUFBSSxDQUFDRSxTQUF0QjtBQUNBLFNBQUtD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OEJELFlBQTlCO0FBQ0Q7QUFDRixPQW5CSyxDQUFOOztBQXFCQSxVQUFJLEtBQUsxRSxVQUFMLENBQWdCK0QsYUFBcEIsRUFBbUM7QUFFakMsZUFBT1EsYUFBUDtBQUNEOztBQUVEdEYsc0JBQUlRLEtBQUosQ0FBVyw2Q0FBNEN3RSxLQUFLLENBQUNpQixXQUFOLEdBQW9CQyxjQUFwQixDQUFtQ0MsT0FBbkMsQ0FBMkMsQ0FBM0MsQ0FBOEMsSUFBckc7QUFDRCxLQTdCRCxDQTZCRSxPQUFPcEcsR0FBUCxFQUFZO0FBR1pDLHNCQUFJUSxLQUFKLENBQVVULEdBQUcsQ0FBQ0csT0FBZDs7QUFDQUYsc0JBQUlDLElBQUosQ0FBVSxrRUFBVjtBQUNEOztBQUNELFdBQU9xRixhQUFQO0FBQ0Q7O0FBRVMsUUFBSmMsSUFBSSxHQUFJO0FBQ1osVUFBTSx3QkFBWSxZQUFaLEVBQTBCLEtBQUtyRixVQUEvQixDQUFOO0FBQ0Q7O0FBcFhjOzs7ZUF3WEZ6RCxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgc2V0UmVhbERldmljZVNlY3VyaXR5LCBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSwgc2V0WGN0ZXN0cnVuRmlsZSxcbiAgdXBkYXRlUHJvamVjdEZpbGUsIHJlc2V0UHJvamVjdEZpbGUsIGtpbGxQcm9jZXNzLFxuICBnZXRXREFVcGdyYWRlVGltZXN0YW1wLCBpc1R2T1MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcbmltcG9ydCB7IFdEQV9SVU5ORVJfQlVORExFX0lEIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5cbmNvbnN0IERFRkFVTFRfU0lHTklOR19JRCA9ICdpUGhvbmUgRGV2ZWxvcGVyJztcbmNvbnN0IFBSRUJVSUxEX0RFTEFZID0gMDtcbmNvbnN0IFJVTk5FUl9TQ0hFTUVfSU9TID0gJ1dlYkRyaXZlckFnZW50UnVubmVyJztcbmNvbnN0IExJQl9TQ0hFTUVfSU9TID0gJ1dlYkRyaXZlckFnZW50TGliJztcblxuY29uc3QgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5UID0gJ0Vycm9yIHdyaXRpbmcgYXR0YWNobWVudCBkYXRhIHRvIGZpbGUnO1xuY29uc3QgRVJST1JfQ09QWUlOR19BVFRBQ0hNRU5UID0gJ0Vycm9yIGNvcHlpbmcgdGVzdGluZyBhdHRhY2htZW50JztcbmNvbnN0IElHTk9SRURfRVJST1JTID0gW1xuICBFUlJPUl9XUklUSU5HX0FUVEFDSE1FTlQsXG4gIEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCxcbiAgJ0ZhaWxlZCB0byByZW1vdmUgc2NyZWVuc2hvdCBhdCBwYXRoJyxcbl07XG5cbmNvbnN0IFJVTk5FUl9TQ0hFTUVfVFYgPSAnV2ViRHJpdmVyQWdlbnRSdW5uZXJfdHZPUyc7XG5jb25zdCBMSUJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50TGliX3R2T1MnO1xuXG5jb25zdCB4Y29kZUxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuY2xhc3MgWGNvZGVCdWlsZCB7XG4gIGNvbnN0cnVjdG9yICh4Y29kZVZlcnNpb24sIGRldmljZSwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy54Y29kZVZlcnNpb24gPSB4Y29kZVZlcnNpb247XG5cbiAgICB0aGlzLmRldmljZSA9IGRldmljZTtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cud2FybihgQ2Fubm90IHJldHJpZXZlIFdEQSBidWlsZCBzZXR0aW5ncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0dGVybiA9IC9eXFxzKkJVSUxEX0RJUlxccys9XFxzKyhcXC8uKikvbTtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgcGFyc2UgV0RBIGJ1aWxkIGRpciBmcm9tICR7Xy50cnVuY2F0ZShzdGRvdXQsIHtsZW5ndGg6IDMwMH0pfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICBsb2cuZGVidWcoYEdvdCBkZXJpdmVkIGRhdGEgcm9vdDogJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rlcml2ZWREYXRhUGF0aFByb21pc2U7XG4gIH1cblxuICBhc3luYyByZXNldCAoKSB7XG4gICAgLy8gaWYgbmVjZXNzYXJ5LCByZXNldCB0aGUgYnVuZGxlSWQgdG8gb3JpZ2luYWwgdmFsdWVcbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlICYmIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICBhd2FpdCByZXNldFByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcmVidWlsZCAoKSB7XG4gICAgLy8gZmlyc3QgZG8gYSBidWlsZCBwaGFzZVxuICAgIGxvZy5kZWJ1ZygnUHJlLWJ1aWxkaW5nIFdEQSBiZWZvcmUgbGF1bmNoaW5nIHRlc3QnKTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KHRydWUpO1xuXG4gICAgdGhpcy54Y29kZWJ1aWxkID0gbnVsbDtcblxuICAgIC8vIHBhdXNlIGEgbW9tZW50XG4gICAgYXdhaXQgQi5kZWxheSh0aGlzLnByZWJ1aWxkRGVsYXkpO1xuICB9XG5cbiAgYXN5bmMgY2xlYW5Qcm9qZWN0ICgpIHtcbiAgICBjb25zdCB0bXBJc1R2T1MgPSBpc1R2T1ModGhpcy5wbGF0Zm9ybU5hbWUpO1xuICAgIGNvbnN0IGxpYlNjaGVtZSA9IHRtcElzVHZPUyA/IExJQl9TQ0hFTUVfVFYgOiBMSUJfU0NIRU1FX0lPUztcbiAgICBjb25zdCBydW5uZXJTY2hlbWUgPSB0bXBJc1R2T1MgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG5cbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBbbGliU2NoZW1lLCBydW5uZXJTY2hlbWVdKSB7XG4gICAgICBsb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goYElQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUPSR7dmVyc2lvbk1hdGNoWzFdfS4ke3ZlcnNpb25NYXRjaFsyXX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCBwYXJzZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIGZyb20gcGxhdGZvcm1WZXJzaW9uIFwiJHt0aGlzLnBsYXRmb3JtVmVyc2lvbn1cIi4gYCArXG4gICAgICAgICdXaWxsIGJ1aWxkIGZvciB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBpbnN0ZWFkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhbERldmljZSAmJiB0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgbG9nLmRlYnVnKGBVc2luZyBYY29kZSBjb25maWd1cmF0aW9uIGZpbGU6ICcke3RoaXMueGNvZGVDb25maWdGaWxlfSdgKTtcbiAgICAgIGFyZ3MucHVzaCgnLXhjY29uZmlnJywgdGhpcy54Y29kZUNvbmZpZ0ZpbGUpO1xuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnYuQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUykge1xuICAgICAgLy8gVGhpcyBzb21ldGltZXMgaGVscHMgdG8gc3Vydml2ZSBYY29kZSB1cGRhdGVzXG4gICAgICBhcmdzLnB1c2goJ0dDQ19UUkVBVF9XQVJOSU5HU19BU19FUlJPUlM9MCcpO1xuICAgIH1cblxuICAgIC8vIEJlbG93IG9wdGlvbiBzbGlnaHRseSByZWR1Y2VzIGJ1aWxkIHRpbWUgaW4gZGVidWcgYnVpbGRcbiAgICAvLyB3aXRoIHByZXZlbnRpbmcgdG8gZ2VuZXJhdGUgYC9JbmRleC9EYXRhU3RvcmVgIHdoaWNoIGlzIHVzZWQgYnkgZGV2ZWxvcG1lbnRcbiAgICBhcmdzLnB1c2goJ0NPTVBJTEVSX0lOREVYX1NUT1JFX0VOQUJMRT1OTycpO1xuXG4gICAgcmV0dXJuIHtjbWQsIGFyZ3N9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU3ViUHJvY2VzcyAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMudXNlWGN0ZXN0cnVuRmlsZSAmJiB0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIGlmICh0aGlzLmtleWNoYWluUGF0aCAmJiB0aGlzLmtleWNoYWluUGFzc3dvcmQpIHtcbiAgICAgICAgYXdhaXQgc2V0UmVhbERldmljZVNlY3VyaXR5KHRoaXMua2V5Y2hhaW5QYXRoLCB0aGlzLmtleWNoYWluUGFzc3dvcmQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMueGNvZGVPcmdJZCAmJiB0aGlzLnhjb2RlU2lnbmluZ0lkICYmICF0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGF3YWl0IGdlbmVyYXRlWGNvZGVDb25maWdGaWxlKHRoaXMueGNvZGVPcmdJZCwgdGhpcy54Y29kZVNpZ25pbmdJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge2NtZCwgYXJnc30gPSB0aGlzLmdldENvbW1hbmQoYnVpbGRPbmx5KTtcbiAgICBsb2cuZGVidWcoYEJlZ2lubmluZyAke2J1aWxkT25seSA/ICdidWlsZCcgOiAndGVzdCd9IHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgICAgICAgICAgYGluIGRpcmVjdG9yeSAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuICAgIGNvbnN0IGVudiA9IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCB7XG4gICAgICBVU0VfUE9SVDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkIHx8IFdEQV9SVU5ORVJfQlVORExFX0lELFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9XZWJEcml2ZXJBZ2VudC9wdWxsLzEwNVxuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuICAgIGNvbnN0IHVwZ3JhZGVUaW1lc3RhbXAgPSBhd2FpdCBnZXRXREFVcGdyYWRlVGltZXN0YW1wKHRoaXMuYm9vdHN0cmFwUGF0aCk7XG4gICAgaWYgKHVwZ3JhZGVUaW1lc3RhbXApIHtcbiAgICAgIGVudi5VUEdSQURFX1RJTUVTVEFNUCA9IHVwZ3JhZGVUaW1lc3RhbXA7XG4gICAgfVxuICAgIGNvbnN0IHhjb2RlYnVpbGQgPSBuZXcgU3ViUHJvY2VzcyhjbWQsIGFyZ3MsIHtcbiAgICAgIGN3ZDogdGhpcy5ib290c3RyYXBQYXRoLFxuICAgICAgZW52LFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG5cbiAgICBsZXQgbG9nWGNvZGVPdXRwdXQgPSAhIXRoaXMuc2hvd1hjb2RlTG9nO1xuICAgIGNvbnN0IGxvZ01zZyA9IF8uaXNCb29sZWFuKHRoaXMuc2hvd1hjb2RlTG9nKVxuICAgICAgPyBgT3V0cHV0IGZyb20geGNvZGVidWlsZCAke3RoaXMuc2hvd1hjb2RlTG9nID8gJ3dpbGwnIDogJ3dpbGwgbm90J30gYmUgbG9nZ2VkYFxuICAgICAgOiAnT3V0cHV0IGZyb20geGNvZGVidWlsZCB3aWxsIG9ubHkgYmUgbG9nZ2VkIGlmIGFueSBlcnJvcnMgYXJlIHByZXNlbnQgdGhlcmUnO1xuICAgIGxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93WGNvZGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIHhjb2RlYnVpbGQub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgbGV0IG91dCA9IHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgICAvLyB3ZSB3YW50IHRvIHB1bGwgb3V0IHRoZSBsb2cgZmlsZSB0aGF0IGlzIGNyZWF0ZWQsIGFuZCBoaWdobGlnaHQgaXRcbiAgICAgIC8vIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzXG4gICAgICBpZiAob3V0LmluY2x1ZGVzKCdXcml0aW5nIGRpYWdub3N0aWMgbG9nIGZvciB0ZXN0IHNlc3Npb24gdG8nKSkge1xuICAgICAgICAvLyBwdWxsIG91dCB0aGUgZmlyc3QgbGluZSB0aGF0IGJlZ2lucyB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvclxuICAgICAgICAvLyB3aGljaCAqc2hvdWxkKiBiZSB0aGUgbGluZSBpbmRpY2F0aW5nIHRoZSBsb2cgZmlsZSBnZW5lcmF0ZWRcbiAgICAgICAgeGNvZGVidWlsZC5sb2dMb2NhdGlvbiA9IF8uZmlyc3QoXy5yZW1vdmUob3V0LnRyaW0oKS5zcGxpdCgnXFxuJyksICh2KSA9PiB2LnN0YXJ0c1dpdGgocGF0aC5zZXApKSk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgTG9nIGZpbGUgZm9yIHhjb2RlYnVpbGQgdGVzdDogJHt4Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBoYXZlIGFuIGVycm9yIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBsb2dzXG4gICAgICAvLyBvdGhlcndpc2UgdGhlIGZhaWx1cmUgaXMgaW5zY3J1dGlibGVcbiAgICAgIC8vIGJ1dCBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgY29uc3QgaWdub3JlRXJyb3IgPSBJR05PUkVEX0VSUk9SUy5zb21lKCh4KSA9PiBvdXQuaW5jbHVkZXMoeCkpO1xuICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICE9PSBmYWxzZSAmJiBvdXQuaW5jbHVkZXMoJ0Vycm9yIERvbWFpbj0nKSAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgbG9nWGNvZGVPdXRwdXQgPSB0cnVlO1xuXG4gICAgICAgIC8vIHRlcnJpYmxlIGhhY2sgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgeGNvZGUgcmV0dXJuIDAgYnV0IGlzIGZhaWxpbmdcbiAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gbm90IGxvZyBwZXJtaXNzaW9uIGVycm9ycyBmcm9tIHRyeWluZyB0byB3cml0ZSB0byBhdHRhY2htZW50cyBmb2xkZXJcbiAgICAgIGlmIChsb2dYY29kZU91dHB1dCAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdChFT0wpKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgIHhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlICs9IGAke0VPTH0ke2xpbmV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB4Y29kZWJ1aWxkO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgdGhpcy54Y29kZWJ1aWxkID0gYXdhaXQgdGhpcy5jcmVhdGVTdWJQcm9jZXNzKGJ1aWxkT25seSk7XG4gICAgLy8gU3RvcmUgeGNvZGVidWlsZCBtZXNzYWdlXG4gICAgdGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZSA9ICcnO1xuXG4gICAgLy8gd3JhcCB0aGUgc3RhcnQgcHJvY2VkdXJlIGluIGEgcHJvbWlzZSBzbyB0aGF0IHdlIGNhbiBjYXRjaCwgYW5kIHJlcG9ydCxcbiAgICAvLyBhbnkgc3RhcnR1cCBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGFzIGV2ZW50c1xuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnhjb2RlYnVpbGQub24oJ2V4aXQnLCBhc3luYyAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcihgeGNvZGVidWlsZCBleGl0ZWQgd2l0aCBjb2RlICcke2NvZGV9JyBhbmQgc2lnbmFsICcke3NpZ25hbH0nYCk7XG4gICAgICAgIC8vIHByaW50IG91dCB0aGUgeGNvZGVidWlsZCBmaWxlIGlmIHVzZXJzIGhhdmUgYXNrZWQgZm9yIGl0XG4gICAgICAgIGlmICh0aGlzLnNob3dYY29kZUxvZyAmJiB0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb24pIHtcbiAgICAgICAgICB4Y29kZUxvZy5lcnJvcihgQ29udGVudHMgb2YgeGNvZGVidWlsZCBsb2cgZmlsZSAnJHt0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb259JzpgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb24sICd1dGY4Jyk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLmVycm9yKGBVbmFibGUgdG8gYWNjZXNzIHhjb2RlYnVpbGQgbG9nIGZpbGU6ICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgfHwgKCFzaWduYWwgJiYgY29kZSAhPT0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgeGNvZGVidWlsZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX0ke0VPTH1gICtcbiAgICAgICAgICAgIGB4Y29kZWJ1aWxkIGVycm9yIG1lc3NhZ2U6JHtFT0x9JHt0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBqdXN0IGJ1aWxkaW5nLCB0aGUgcHJvY2VzcyB3aWxsIGV4aXQgYW5kIHRoYXQgaXMgb3VyIGZpbmlzaFxuICAgICAgICBpZiAoYnVpbGRPbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KHRydWUpO1xuICAgICAgICAgIGlmICghYnVpbGRPbmx5KSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnQodGltZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gc3RhcnQgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyfWA7XG4gICAgICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JTdGFydCAodGltZXIpIHtcbiAgICAvLyB0cnkgdG8gY29ubmVjdCBvbmNlIGV2ZXJ5IDAuNSBzZWNvbmRzLCB1bnRpbCBgbGF1bmNoVGltZW91dGAgaXMgdXBcbiAgICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt0aGlzLmxhdW5jaFRpbWVvdXR9bXMgZm9yIFdlYkRyaXZlckFnZW50IHRvIHN0YXJ0YCk7XG4gICAgbGV0IGN1cnJlbnRTdGF0dXMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0cmllcyA9IHBhcnNlSW50KHRoaXMubGF1bmNoVGltZW91dCAvIDUwMCwgMTApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCAxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAgIC8vIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGVsc2V3aGVyZSBhbmQgd2UgbmVlZCB0byBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3h5VGltZW91dCA9IHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dDtcbiAgICAgICAgdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0ID0gMTAwMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjdXJyZW50U3RhdHVzID0gYXdhaXQgdGhpcy5ub1Nlc3Npb25Qcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgICAgIGlmIChjdXJyZW50U3RhdHVzICYmIGN1cnJlbnRTdGF0dXMuaW9zICYmIGN1cnJlbnRTdGF0dXMuaW9zLmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFnZW50VXJsID0gY3VycmVudFN0YXR1cy5pb3MuaXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgaW5mb3JtYXRpb246YCk7XG4gICAgICAgICAgbG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KGN1cnJlbnRTdGF0dXMsIG51bGwsIDIpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29ubmVjdCB0byBydW5uaW5nIFdlYkRyaXZlckFnZW50OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IHByb3h5VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICByZXR1cm4gY3VycmVudFN0YXR1cztcbiAgICAgIH1cblxuICAgICAgbG9nLmRlYnVnKGBXZWJEcml2ZXJBZ2VudCBzdWNjZXNzZnVsbHkgc3RhcnRlZCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gYXQgdGhpcyBwb2ludCwgaWYgd2UgaGF2ZSBub3QgaGFkIGFueSBlcnJvcnMgZnJvbSB4Y29kZSBpdHNlbGYgKHJlcG9ydGVkXG4gICAgICAvLyBlbHNld2hlcmUpLCB3ZSBjYW4gbGV0IHRoaXMgZ28gdGhyb3VnaCBhbmQgdHJ5IHRvIGNyZWF0ZSB0aGUgc2Vzc2lvblxuICAgICAgbG9nLmRlYnVnKGVyci5tZXNzYWdlKTtcbiAgICAgIGxvZy53YXJuKGBHZXR0aW5nIHN0YXR1cyBvZiBXZWJEcml2ZXJBZ2VudCBvbiBkZXZpY2UgdGltZWQgb3V0LiBDb250aW51aW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgYXdhaXQga2lsbFByb2Nlc3MoJ3hjb2RlYnVpbGQnLCB0aGlzLnhjb2RlYnVpbGQpO1xuICB9XG59XG5cbmV4cG9ydCB7IFhjb2RlQnVpbGQgfTtcbmV4cG9ydCBkZWZhdWx0IFhjb2RlQnVpbGQ7XG4iXSwiZmlsZSI6ImxpYi94Y29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
396
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi94Y29kZWJ1aWxkLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfU0lHTklOR19JRCIsIlBSRUJVSUxEX0RFTEFZIiwiUlVOTkVSX1NDSEVNRV9JT1MiLCJMSUJfU0NIRU1FX0lPUyIsIkVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCIsIkVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCIsIklHTk9SRURfRVJST1JTIiwiUlVOTkVSX1NDSEVNRV9UViIsIkxJQl9TQ0hFTUVfVFYiLCJ4Y29kZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsIlhjb2RlQnVpbGQiLCJjb25zdHJ1Y3RvciIsInhjb2RlVmVyc2lvbiIsImRldmljZSIsImFyZ3MiLCJsb2ciLCJkZWZhdWx0TG9nZ2VyIiwicmVhbERldmljZSIsImFnZW50UGF0aCIsImJvb3RzdHJhcFBhdGgiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwic2hvd1hjb2RlTG9nIiwieGNvZGVDb25maWdGaWxlIiwieGNvZGVPcmdJZCIsInhjb2RlU2lnbmluZ0lkIiwia2V5Y2hhaW5QYXRoIiwia2V5Y2hhaW5QYXNzd29yZCIsInByZWJ1aWxkV0RBIiwidXNlUHJlYnVpbHRXREEiLCJ1c2VTaW1wbGVCdWlsZFRlc3QiLCJ1c2VYY3Rlc3RydW5GaWxlIiwibGF1bmNoVGltZW91dCIsIndkYVJlbW90ZVBvcnQiLCJ1cGRhdGVkV0RBQnVuZGxlSWQiLCJkZXJpdmVkRGF0YVBhdGgiLCJtanBlZ1NlcnZlclBvcnQiLCJwcmVidWlsZERlbGF5IiwiXyIsImlzTnVtYmVyIiwiYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24iLCJyZXN1bHRCdW5kbGVQYXRoIiwicmVzdWx0QnVuZGxlVmVyc2lvbiIsImluaXQiLCJub1Nlc3Npb25Qcm94eSIsImRldml2ZUluZm8iLCJpc1JlYWxEZXZpY2UiLCJ1ZGlkIiwieGN0ZXN0cnVuRmlsZVBhdGgiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsIl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlIiwic3Rkb3V0IiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJwYXR0ZXJuIiwibWF0Y2giLCJleGVjIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJkZWJ1ZyIsInBhdGgiLCJkaXJuYW1lIiwibm9ybWFsaXplIiwicmVzZXQiLCJwcmVidWlsZCIsInN0YXJ0IiwieGNvZGVidWlsZCIsIkIiLCJkZWxheSIsImNsZWFuUHJvamVjdCIsInRtcElzVHZPUyIsImxpYlNjaGVtZSIsInJ1bm5lclNjaGVtZSIsInNjaGVtZSIsImdldENvbW1hbmQiLCJidWlsZE9ubHkiLCJjbWQiLCJidWlsZENtZCIsInRlc3RDbWQiLCJwdXNoIiwidmVyc2lvbk1hdGNoIiwiUmVnRXhwIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMiLCJjcmVhdGVTdWJQcm9jZXNzIiwiam9pbiIsIk9iamVjdCIsImFzc2lnbiIsIlVTRV9QT1JUIiwiV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVIiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsIk1KUEVHX1NFUlZFUl9QT1JUIiwidXBncmFkZVRpbWVzdGFtcCIsIlVQR1JBREVfVElNRVNUQU1QIiwiU3ViUHJvY2VzcyIsImN3ZCIsImRldGFjaGVkIiwic3RkaW8iLCJsb2dYY29kZU91dHB1dCIsImxvZ01zZyIsImlzQm9vbGVhbiIsIm9uIiwic3RkZXJyIiwib3V0IiwiaW5jbHVkZXMiLCJsb2dMb2NhdGlvbiIsImZpcnN0IiwicmVtb3ZlIiwidHJpbSIsInNwbGl0IiwidiIsInN0YXJ0c1dpdGgiLCJzZXAiLCJpZ25vcmVFcnJvciIsInNvbWUiLCJ4IiwiX3dkYV9lcnJvcl9vY2N1cnJlZCIsImxpbmUiLCJFT0wiLCJlcnJvciIsIl93ZGFfZXJyb3JfbWVzc2FnZSIsInJlc29sdmUiLCJyZWplY3QiLCJjb2RlIiwic2lnbmFsIiwiZGF0YSIsImZzIiwicmVhZEZpbGUiLCJwcm9jZXNzRXhpdGVkIiwiRXJyb3IiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhdHVzIiwid2FpdEZvclN0YXJ0IiwibXNnIiwiY3VycmVudFN0YXR1cyIsInJldHJpZXMiLCJwYXJzZUludCIsInByb3h5VGltZW91dCIsInRpbWVvdXQiLCJjb21tYW5kIiwiaW9zIiwiaXAiLCJhZ2VudFVybCIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsInF1aXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsa0JBQWtCLEdBQUcsa0JBQTNCO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLENBQXZCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsc0JBQTFCO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLG1CQUF2QjtBQUVBLE1BQU1DLHdCQUF3QixHQUFHLHVDQUFqQztBQUNBLE1BQU1DLHdCQUF3QixHQUFHLGtDQUFqQztBQUNBLE1BQU1DLGNBQWMsR0FBRyxDQUNyQkYsd0JBRHFCLEVBRXJCQyx3QkFGcUIsRUFHckIscUNBSHFCLENBQXZCO0FBTUEsTUFBTUUsZ0JBQWdCLEdBQUcsMkJBQXpCO0FBQ0EsTUFBTUMsYUFBYSxHQUFHLHdCQUF0Qjs7QUFFQSxNQUFNQyxRQUFRLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLE9BQWpCLENBQWpCOztBQUdBLE1BQU1DLFVBQU4sQ0FBaUI7QUFDZkMsRUFBQUEsV0FBVyxDQUFFQyxZQUFGLEVBQWdCQyxNQUFoQixFQUF3QkMsSUFBSSxHQUFHLEVBQS9CLEVBQW1DQyxHQUFHLEdBQUcsSUFBekMsRUFBK0M7QUFDeEQsU0FBS0gsWUFBTCxHQUFvQkEsWUFBcEI7QUFFQSxTQUFLQyxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxTQUFLRSxHQUFMLEdBQVdBLEdBQVgsYUFBV0EsR0FBWCxjQUFXQSxHQUFYLEdB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Q0QsZUFBS25JLEdBQUwsQ0FBUzhDLEtBQVQsQ0FBZ0IsNkJBQWhCO0FBQ0EsZUFBSzlDLEdBQUwsQ0FBUzhDLEtBQVQsQ0FBZXVGLElBQUksQ0FBQ0MsU0FBTCxDQUFlVixhQUFmLEVBQThCLElBQTlCLEVBQW9DLENBQXBDLENBQWY7QUFDRCxTQVBELENBT0UsT0FBT3RGLEdBQVAsRUFBWTtBQUNaLGdCQUFNLElBQUkrRSxLQUFKLENBQVcsZ0RBQStDL0UsR0FBRyxDQUFDRSxPQUFRLEVBQXRFLENBQU47QUFDRCxTQVRELFNBU1U7QUFDUixlQUFLVixjQUFMLENBQW9Ca0csT0FBcEIsR0FBOEJELFlBQTlCO0FBQ0Q7QUFDRixPQW5CSyxDQUFOOztBQXFCQSxVQUFJLEtBQUsxRSxVQUFMLENBQWdCK0QsYUFBcEIsRUFBbUM7QUFFakMsZUFBT1EsYUFBUDtBQUNEOztBQUVELFdBQUs1SCxHQUFMLENBQVM4QyxLQUFULENBQWdCLDZDQUE0Q3dFLEtBQUssQ0FBQ2lCLFdBQU4sR0FBb0JDLGNBQXBCLENBQW1DQyxPQUFuQyxDQUEyQyxDQUEzQyxDQUE4QyxJQUExRztBQUNELEtBN0JELENBNkJFLE9BQU9uRyxHQUFQLEVBQVk7QUFHWixXQUFLdEMsR0FBTCxDQUFTOEMsS0FBVCxDQUFlUixHQUFHLENBQUNFLE9BQW5CO0FBQ0EsV0FBS3hDLEdBQUwsQ0FBU3VDLElBQVQsQ0FBZSxrRUFBZjtBQUNEOztBQUNELFdBQU9xRixhQUFQO0FBQ0Q7O0FBRVMsUUFBSmMsSUFBSSxHQUFJO0FBQ1osVUFBTSx3QkFBWSxZQUFaLEVBQTBCLEtBQUtyRixVQUEvQixDQUFOO0FBQ0Q7O0FBclhjOzs7ZUF5WEYxRCxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIHNldFJlYWxEZXZpY2VTZWN1cml0eSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsIHNldFhjdGVzdHJ1bkZpbGUsXG4gIHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBraWxsUHJvY2VzcyxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgaXNUdk9TIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5jb25zdCBERUZBVUxUX1NJR05JTkdfSUQgPSAnaVBob25lIERldmVsb3Blcic7XG5jb25zdCBQUkVCVUlMRF9ERUxBWSA9IDA7XG5jb25zdCBSVU5ORVJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcic7XG5jb25zdCBMSUJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudExpYic7XG5cbmNvbnN0IEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCA9ICdFcnJvciB3cml0aW5nIGF0dGFjaG1lbnQgZGF0YSB0byBmaWxlJztcbmNvbnN0IEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCA9ICdFcnJvciBjb3B5aW5nIHRlc3RpbmcgYXR0YWNobWVudCc7XG5jb25zdCBJR05PUkVEX0VSUk9SUyA9IFtcbiAgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5ULFxuICBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQsXG4gICdGYWlsZWQgdG8gcmVtb3ZlIHNjcmVlbnNob3QgYXQgcGF0aCcsXG5dO1xuXG5jb25zdCBSVU5ORVJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50UnVubmVyX3R2T1MnO1xuY29uc3QgTElCX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudExpYl90dk9TJztcblxuY29uc3QgeGNvZGVMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmNsYXNzIFhjb2RlQnVpbGQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBkZXZpY2UsIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcmV0cmlldmUgV0RBIGJ1aWxkIHNldHRpbmdzLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqQlVJTERfRElSXFxzKz1cXHMrKFxcLy4qKS9tO1xuICAgICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIFdEQSBidWlsZCBkaXIgZnJvbSAke18udHJ1bmNhdGUoc3Rkb3V0LCB7bGVuZ3RoOiAzMDB9KX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRlcml2ZWQgZGF0YSByb290OiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICAvLyBpZiBuZWNlc3NhcnksIHJlc2V0IHRoZSBidW5kbGVJZCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpIHtcbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZWJ1aWxkICgpIHtcbiAgICAvLyBmaXJzdCBkbyBhIGJ1aWxkIHBoYXNlXG4gICAgdGhpcy5sb2cuZGVidWcoJ1ByZS1idWlsZGluZyBXREEgYmVmb3JlIGxhdW5jaGluZyB0ZXN0Jyk7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5zdGFydCh0cnVlKTtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IG51bGw7XG5cbiAgICAvLyBwYXVzZSBhIG1vbWVudFxuICAgIGF3YWl0IEIuZGVsYXkodGhpcy5wcmVidWlsZERlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFuUHJvamVjdCAoKSB7XG4gICAgY29uc3QgdG1wSXNUdk9TID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKTtcbiAgICBjb25zdCBsaWJTY2hlbWUgPSB0bXBJc1R2T1MgPyBMSUJfU0NIRU1FX1RWIDogTElCX1NDSEVNRV9JT1M7XG4gICAgY29uc3QgcnVubmVyU2NoZW1lID0gdG1wSXNUdk9TID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgW2xpYlNjaGVtZSwgcnVubmVyU2NoZW1lXSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goYElQSE9ORU9TX0RFUExPWU1FTlRfVEFSR0VUPSR7dmVyc2lvbk1hdGNoWzFdfS4ke3ZlcnNpb25NYXRjaFsyXX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgZnJvbSBwbGF0Zm9ybVZlcnNpb24gXCIke3RoaXMucGxhdGZvcm1WZXJzaW9ufVwiLiBgICtcbiAgICAgICAgJ1dpbGwgYnVpbGQgZm9yIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGluc3RlYWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlICYmIHRoaXMueGNvZGVDb25maWdGaWxlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVXNpbmcgWGNvZGUgY29uZmlndXJhdGlvbiBmaWxlOiAnJHt0aGlzLnhjb2RlQ29uZmlnRmlsZX0nYCk7XG4gICAgICBhcmdzLnB1c2goJy14Y2NvbmZpZycsIHRoaXMueGNvZGVDb25maWdGaWxlKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMpIHtcbiAgICAgIC8vIFRoaXMgc29tZXRpbWVzIGhlbHBzIHRvIHN1cnZpdmUgWGNvZGUgdXBkYXRlc1xuICAgICAgYXJncy5wdXNoKCdHQ0NfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTPTAnKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvdyBvcHRpb24gc2xpZ2h0bHkgcmVkdWNlcyBidWlsZCB0aW1lIGluIGRlYnVnIGJ1aWxkXG4gICAgLy8gd2l0aCBwcmV2ZW50aW5nIHRvIGdlbmVyYXRlIGAvSW5kZXgvRGF0YVN0b3JlYCB3aGljaCBpcyB1c2VkIGJ5IGRldmVsb3BtZW50XG4gICAgYXJncy5wdXNoKCdDT01QSUxFUl9JTkRFWF9TVE9SRV9FTkFCTEU9Tk8nKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVN1YlByb2Nlc3MgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgdGhpcy5yZWFsRGV2aWNlKSB7XG4gICAgICBpZiAodGhpcy5rZXljaGFpblBhdGggJiYgdGhpcy5rZXljaGFpblBhc3N3b3JkKSB7XG4gICAgICAgIGF3YWl0IHNldFJlYWxEZXZpY2VTZWN1cml0eSh0aGlzLmtleWNoYWluUGF0aCwgdGhpcy5rZXljaGFpblBhc3N3b3JkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnhjb2RlT3JnSWQgJiYgdGhpcy54Y29kZVNpZ25pbmdJZCAmJiAhdGhpcy54Y29kZUNvbmZpZ0ZpbGUpIHtcbiAgICAgICAgdGhpcy54Y29kZUNvbmZpZ0ZpbGUgPSBhd2FpdCBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSh0aGlzLnhjb2RlT3JnSWQsIHRoaXMueGNvZGVTaWduaW5nSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHtjbWQsIGFyZ3N9ID0gdGhpcy5nZXRDb21tYW5kKGJ1aWxkT25seSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEJlZ2lubmluZyAke2J1aWxkT25seSA/ICdidWlsZCcgOiAndGVzdCd9IHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgIGBpbiBkaXJlY3RvcnkgJyR7dGhpcy5ib290c3RyYXBQYXRofSdgKTtcbiAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCB8fCBXREFfUlVOTkVSX0JVTkRMRV9JRCxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5tanBlZ1NlcnZlclBvcnQpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vV2ViRHJpdmVyQWdlbnQvcHVsbC8xMDVcbiAgICAgIGVudi5NSlBFR19TRVJWRVJfUE9SVCA9IHRoaXMubWpwZWdTZXJ2ZXJQb3J0O1xuICAgIH1cbiAgICBjb25zdCB1cGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCh0aGlzLmJvb3RzdHJhcFBhdGgpO1xuICAgIGlmICh1cGdyYWRlVGltZXN0YW1wKSB7XG4gICAgICBlbnYuVVBHUkFERV9USU1FU1RBTVAgPSB1cGdyYWRlVGltZXN0YW1wO1xuICAgIH1cbiAgICBjb25zdCB4Y29kZWJ1aWxkID0gbmV3IFN1YlByb2Nlc3MoY21kLCBhcmdzLCB7XG4gICAgICBjd2Q6IHRoaXMuYm9vdHN0cmFwUGF0aCxcbiAgICAgIGVudixcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuXG4gICAgbGV0IGxvZ1hjb2RlT3V0cHV0ID0gISF0aGlzLnNob3dYY29kZUxvZztcbiAgICBjb25zdCBsb2dNc2cgPSBfLmlzQm9vbGVhbih0aGlzLnNob3dYY29kZUxvZylcbiAgICAgID8gYE91dHB1dCBmcm9tIHhjb2RlYnVpbGQgJHt0aGlzLnNob3dYY29kZUxvZyA/ICd3aWxsJyA6ICd3aWxsIG5vdCd9IGJlIGxvZ2dlZGBcbiAgICAgIDogJ091dHB1dCBmcm9tIHhjb2RlYnVpbGQgd2lsbCBvbmx5IGJlIGxvZ2dlZCBpZiBhbnkgZXJyb3JzIGFyZSBwcmVzZW50IHRoZXJlJztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93WGNvZGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIHhjb2RlYnVpbGQub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgbGV0IG91dCA9IHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgICAvLyB3ZSB3YW50IHRvIHB1bGwgb3V0IHRoZSBsb2cgZmlsZSB0aGF0IGlzIGNyZWF0ZWQsIGFuZCBoaWdobGlnaHQgaXRcbiAgICAgIC8vIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzXG4gICAgICBpZiAob3V0LmluY2x1ZGVzKCdXcml0aW5nIGRpYWdub3N0aWMgbG9nIGZvciB0ZXN0IHNlc3Npb24gdG8nKSkge1xuICAgICAgICAvLyBwdWxsIG91dCB0aGUgZmlyc3QgbGluZSB0aGF0IGJlZ2lucyB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvclxuICAgICAgICAvLyB3aGljaCAqc2hvdWxkKiBiZSB0aGUgbGluZSBpbmRpY2F0aW5nIHRoZSBsb2cgZmlsZSBnZW5lcmF0ZWRcbiAgICAgICAgeGNvZGVidWlsZC5sb2dMb2NhdGlvbiA9IF8uZmlyc3QoXy5yZW1vdmUob3V0LnRyaW0oKS5zcGxpdCgnXFxuJyksICh2KSA9PiB2LnN0YXJ0c1dpdGgocGF0aC5zZXApKSk7XG4gICAgICAgIHhjb2RlTG9nLmRlYnVnKGBMb2cgZmlsZSBmb3IgeGNvZGVidWlsZCB0ZXN0OiAke3hjb2RlYnVpbGQubG9nTG9jYXRpb259YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXJyb3Igd2Ugd2FudCB0byBvdXRwdXQgdGhlIGxvZ3NcbiAgICAgIC8vIG90aGVyd2lzZSB0aGUgZmFpbHVyZSBpcyBpbnNjcnV0aWJsZVxuICAgICAgLy8gYnV0IGRvIG5vdCBsb2cgcGVybWlzc2lvbiBlcnJvcnMgZnJvbSB0cnlpbmcgdG8gd3JpdGUgdG8gYXR0YWNobWVudHMgZm9sZGVyXG4gICAgICBjb25zdCBpZ25vcmVFcnJvciA9IElHTk9SRURfRVJST1JTLnNvbWUoKHgpID0+IG91dC5pbmNsdWRlcyh4KSk7XG4gICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgIT09IGZhbHNlICYmIG91dC5pbmNsdWRlcygnRXJyb3IgRG9tYWluPScpICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBsb2dYY29kZU91dHB1dCA9IHRydWU7XG5cbiAgICAgICAgLy8gdGVycmlibGUgaGFjayB0byBoYW5kbGUgY2FzZSB3aGVyZSB4Y29kZSByZXR1cm4gMCBidXQgaXMgZmFpbGluZ1xuICAgICAgICB4Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgaWYgKGxvZ1hjb2RlT3V0cHV0ICYmICFpZ25vcmVFcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KEVPTCkpIHtcbiAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX21lc3NhZ2UgKz0gYCR7RU9MfSR7bGluZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHhjb2RlYnVpbGQ7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICB0aGlzLnhjb2RlYnVpbGQgPSBhd2FpdCB0aGlzLmNyZWF0ZVN1YlByb2Nlc3MoYnVpbGRPbmx5KTtcbiAgICAvLyBTdG9yZSB4Y29kZWJ1aWxkIG1lc3NhZ2VcbiAgICB0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlID0gJyc7XG5cbiAgICAvLyB3cmFwIHRoZSBzdGFydCBwcm9jZWR1cmUgaW4gYSBwcm9taXNlIHNvIHRoYXQgd2UgY2FuIGNhdGNoLCBhbmQgcmVwb3J0LFxuICAgIC8vIGFueSBzdGFydHVwIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYXMgZXZlbnRzXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMueGNvZGVidWlsZC5vbignZXhpdCcsIGFzeW5jIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgeGNvZGVMb2cuZXJyb3IoYHhjb2RlYnVpbGQgZXhpdGVkIHdpdGggY29kZSAnJHtjb2RlfScgYW5kIHNpZ25hbCAnJHtzaWduYWx9J2ApO1xuICAgICAgICAvLyBwcmludCBvdXQgdGhlIHhjb2RlYnVpbGQgZmlsZSBpZiB1c2VycyBoYXZlIGFza2VkIGZvciBpdFxuICAgICAgICBpZiAodGhpcy5zaG93WGNvZGVMb2cgJiYgdGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IoYENvbnRlbnRzIG9mIHhjb2RlYnVpbGQgbG9nIGZpbGUgJyR7dGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufSc6YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy54Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uLCAndXRmOCcpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiBkYXRhLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgICAgICB4Y29kZUxvZy5lcnJvcihsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGBVbmFibGUgdG8gYWNjZXNzIHhjb2RlYnVpbGQgbG9nIGZpbGU6ICcke2Vyci5tZXNzYWdlfSdgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3Jfb2NjdXJyZWQgfHwgKCFzaWduYWwgJiYgY29kZSAhPT0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgeGNvZGVidWlsZCBmYWlsZWQgd2l0aCBjb2RlICR7Y29kZX0ke0VPTH1gICtcbiAgICAgICAgICAgIGB4Y29kZWJ1aWxkIGVycm9yIG1lc3NhZ2U6JHtFT0x9JHt0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBqdXN0IGJ1aWxkaW5nLCB0aGUgcHJvY2VzcyB3aWxsIGV4aXQgYW5kIHRoYXQgaXMgb3VyIGZpbmlzaFxuICAgICAgICBpZiAoYnVpbGRPbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KHRydWUpO1xuICAgICAgICAgIGlmICghYnVpbGRPbmx5KSB7XG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnQodGltZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gc3RhcnQgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyfWA7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IobXNnKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1zZykpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgd2FpdEZvclN0YXJ0ICh0aW1lcikge1xuICAgIC8vIHRyeSB0byBjb25uZWN0IG9uY2UgZXZlcnkgMC41IHNlY29uZHMsIHVudGlsIGBsYXVuY2hUaW1lb3V0YCBpcyB1cFxuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7dGhpcy5sYXVuY2hUaW1lb3V0fW1zIGZvciBXZWJEcml2ZXJBZ2VudCB0byBzdGFydGApO1xuICAgIGxldCBjdXJyZW50U3RhdHVzID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJldHJpZXMgPSBwYXJzZUludCh0aGlzLmxhdW5jaFRpbWVvdXQgLyA1MDAsIDEwKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm94eVRpbWVvdXQgPSB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQ7XG4gICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IDEwMDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3VycmVudFN0YXR1cyA9IGF3YWl0IHRoaXMubm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cyAmJiBjdXJyZW50U3RhdHVzLmlvcyAmJiBjdXJyZW50U3RhdHVzLmlvcy5pcCkge1xuICAgICAgICAgICAgdGhpcy5hZ2VudFVybCA9IGN1cnJlbnRTdGF0dXMuaW9zLmlwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgaW5mb3JtYXRpb246YCk7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoSlNPTi5zdHJpbmdpZnkoY3VycmVudFN0YXR1cywgbnVsbCwgMikpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjb25uZWN0IHRvIHJ1bm5pbmcgV2ViRHJpdmVyQWdlbnQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0ID0gcHJveHlUaW1lb3V0O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgIC8vIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGVsc2V3aGVyZSBhbmQgd2UgbmVlZCB0byBzaG9ydC1jaXJjdWl0XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgV2ViRHJpdmVyQWdlbnQgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgYWZ0ZXIgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGlmIHdlIGhhdmUgbm90IGhhZCBhbnkgZXJyb3JzIGZyb20geGNvZGUgaXRzZWxmIChyZXBvcnRlZFxuICAgICAgLy8gZWxzZXdoZXJlKSwgd2UgY2FuIGxldCB0aGlzIGdvIHRocm91Z2ggYW5kIHRyeSB0byBjcmVhdGUgdGhlIHNlc3Npb25cbiAgICAgIHRoaXMubG9nLmRlYnVnKGVyci5tZXNzYWdlKTtcbiAgICAgIHRoaXMubG9nLndhcm4oYEdldHRpbmcgc3RhdHVzIG9mIFdlYkRyaXZlckFnZW50IG9uIGRldmljZSB0aW1lZCBvdXQuIENvbnRpbnVpbmdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0dXM7XG4gIH1cblxuICBhc3luYyBxdWl0ICgpIHtcbiAgICBhd2FpdCBraWxsUHJvY2VzcygneGNvZGVidWlsZCcsIHRoaXMueGNvZGVidWlsZCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgWGNvZGVCdWlsZCB9O1xuZXhwb3J0IGRlZmF1bHQgWGNvZGVCdWlsZDtcbiJdLCJmaWxlIjoibGliL3hjb2RlYnVpbGQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -4,7 +4,7 @@ import url from 'url';
4
4
  import B from 'bluebird';
5
5
  import { JWProxy } from '@appium/base-driver';
6
6
  import { fs, util, plist, mkdirp } from '@appium/support';
7
- import log from './logger';
7
+ import defaultLogger from './logger';
8
8
  import { NoSessionProxy } from './no-session-proxy';
9
9
  import {
10
10
  getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort
@@ -24,10 +24,11 @@ const WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';
24
24
  const SHARED_RESOURCES_GUARD = new AsyncLock();
25
25
 
26
26
  class WebDriverAgent {
27
- constructor (xcodeVersion, args = {}) {
27
+ constructor (xcodeVersion, args = {}, log = null) {
28
28
  this.xcodeVersion = xcodeVersion;
29
29
 
30
30
  this.args = _.clone(args);
31
+ this.log = log ?? defaultLogger;
31
32
 
32
33
  this.device = args.device;
33
34
  this.platformVersion = args.platformVersion;
@@ -83,18 +84,18 @@ class WebDriverAgent {
83
84
  allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,
84
85
  resultBundlePath: args.resultBundlePath,
85
86
  resultBundleVersion: args.resultBundleVersion,
86
- });
87
+ }, this.log);
87
88
  }
88
89
 
89
90
  setWDAPaths (bootstrapPath, agentPath) {
90
91
  // allow the user to specify a place for WDA. This is undocumented and
91
92
  // only here for the purposes of testing development of WDA
92
93
  this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;
93
- log.info(`Using WDA path: '${this.bootstrapPath}'`);
94
+ this.log.info(`Using WDA path: '${this.bootstrapPath}'`);
94
95
 
95
96
  // for backward compatibility we need to be able to specify agentPath too
96
97
  this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');
97
- log.info(`Using WDA agent: '${this.agentPath}'`);
98
+ this.log.info(`Using WDA agent: '${this.agentPath}'`);
98
99
  }
99
100
 
100
101
  async cleanupObsoleteProcesses () {
@@ -103,17 +104,17 @@ class WebDriverAgent {
103
104
  !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));
104
105
 
105
106
  if (_.isEmpty(obsoletePids)) {
106
- log.debug(`No obsolete cached processes from previous WDA sessions ` +
107
+ this.log.debug(`No obsolete cached processes from previous WDA sessions ` +
107
108
  `listening on port ${this.url.port} have been found`);
108
109
  return;
109
110
  }
110
111
 
111
- log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +
112
+ this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +
112
113
  `from previous WDA sessions. Cleaning them up`);
113
114
  try {
114
115
  await exec('kill', obsoletePids);
115
116
  } catch (e) {
116
- log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +
117
+ this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +
117
118
  `Original error: ${e.message}`);
118
119
  }
119
120
  }
@@ -166,7 +167,7 @@ class WebDriverAgent {
166
167
  try {
167
168
  return await noSessionProxy.command('/status', 'GET');
168
169
  } catch (err) {
169
- log.debug(`WDA is not listening at '${this.url.href}'`);
170
+ this.log.debug(`WDA is not listening at '${this.url.href}'`);
170
171
  return null;
171
172
  }
172
173
  }
@@ -180,17 +181,17 @@ class WebDriverAgent {
180
181
  try {
181
182
  const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);
182
183
  if (_.isEmpty(bundleIds)) {
183
- log.debug('No WDAs on the device.');
184
+ this.log.debug('No WDAs on the device.');
184
185
  return;
185
186
  }
186
187
 
187
- log.debug(`Uninstalling WDAs: '${bundleIds}'`);
188
+ this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);
188
189
  for (const bundleId of bundleIds) {
189
190
  await this.device.removeApp(bundleId);
190
191
  }
191
192
  } catch (e) {
192
- log.debug(e);
193
- log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +
193
+ this.log.debug(e);
194
+ this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +
194
195
  `Original error: ${e.message}`);
195
196
  }
196
197
  }
@@ -198,54 +199,60 @@ class WebDriverAgent {
198
199
  async _cleanupProjectIfFresh () {
199
200
  const homeFolder = process.env.HOME;
200
201
  if (!homeFolder) {
201
- log.info('The HOME folder path cannot be determined');
202
+ this.log.info('The HOME folder path cannot be determined');
202
203
  return;
203
204
  }
204
205
 
205
206
  const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();
206
207
  if (!_.isInteger(currentUpgradeTimestamp)) {
207
- log.info('It is impossible to determine the timestamp of the package');
208
+ this.log.info('It is impossible to determine the timestamp of the package');
208
209
  return;
209
210
  }
210
211
 
211
212
  const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);
212
- if (await fs.exists(timestampPath)) {
213
+ const didTimestampExist = await fs.exists(timestampPath);
214
+ if (didTimestampExist) {
213
215
  try {
214
216
  await fs.access(timestampPath, fs.W_OK);
215
217
  } catch (ign) {
216
- log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +
218
+ this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +
217
219
  `Skipping sources cleanup`);
218
220
  return;
219
221
  }
220
222
  const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);
221
223
  if (_.isInteger(recentUpgradeTimestamp)) {
222
224
  if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {
223
- log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +
225
+ this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +
224
226
  `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);
225
227
  return;
226
228
  }
227
- log.info(`WebDriverAgent sources have been upgraded ` +
229
+ this.log.info(`WebDriverAgent sources have been upgraded ` +
228
230
  `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);
229
231
  } else {
230
- log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);
232
+ this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);
231
233
  }
232
234
  }
233
235
 
234
236
  try {
235
237
  await mkdirp(path.dirname(timestampPath));
236
238
  await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');
237
- log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +
239
+ this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +
238
240
  `at '${timestampPath}'`);
239
241
  } catch (e) {
240
- log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +
242
+ this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +
241
243
  `Original error: ${e.message}`);
242
244
  return;
243
245
  }
244
246
 
247
+ if (!didTimestampExist) {
248
+ this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
249
+ return;
250
+ }
251
+
245
252
  try {
246
253
  await this.xcodebuild.cleanProject();
247
254
  } catch (e) {
248
- log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);
255
+ this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);
249
256
  }
250
257
  }
251
258
 
@@ -274,13 +281,13 @@ class WebDriverAgent {
274
281
  */
275
282
  async launch (sessionId) {
276
283
  if (this.webDriverAgentUrl) {
277
- log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);
284
+ this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);
278
285
  this.url = this.webDriverAgentUrl;
279
286
  this.setupProxies(sessionId);
280
287
  return await this.getStatus();
281
288
  }
282
289
 
283
- log.info('Launching WebDriverAgent on the device');
290
+ this.log.info('Launching WebDriverAgent on the device');
284
291
 
285
292
  this.setupProxies(sessionId);
286
293
 
@@ -292,7 +299,7 @@ class WebDriverAgent {
292
299
  // useXctestrunFile and usePrebuiltWDA use existing dependencies
293
300
  // It depends on user side
294
301
  if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {
295
- log.info('Skipped WDA project cleanup according to the provided capabilities');
302
+ this.log.info('Skipped WDA project cleanup according to the provided capabilities');
296
303
  } else {
297
304
  const synchronizationKey = path.normalize(this.bootstrapPath);
298
305
  await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,
@@ -316,7 +323,7 @@ class WebDriverAgent {
316
323
  }
317
324
 
318
325
  async startWithIDB () {
319
- log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');
326
+ this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');
320
327
  const {wdaBundleId, testBundleId} = await this.prepareWDA();
321
328
  const env = {
322
329
  USE_PORT: this.wdaRemotePort,
@@ -371,6 +378,7 @@ class WebDriverAgent {
371
378
 
372
379
  setupProxies (sessionId) {
373
380
  const proxyOpts = {
381
+ log: this.log,
374
382
  server: this.url.hostname,
375
383
  port: this.url.port,
376
384
  base: this.basePath,
@@ -386,7 +394,7 @@ class WebDriverAgent {
386
394
  }
387
395
 
388
396
  async quit () {
389
- log.info('Shutting down sub-processes');
397
+ this.log.info('Shutting down sub-processes');
390
398
 
391
399
  await this.xcodebuild.quit();
392
400
  await this.xcodebuild.reset();
@@ -443,7 +451,7 @@ class WebDriverAgent {
443
451
  async setupCaching () {
444
452
  const status = await this.getStatus();
445
453
  if (!status || !status.build) {
446
- log.debug('WDA is currently not running. There is nothing to cache');
454
+ this.log.debug('WDA is currently not running. There is nothing to cache');
447
455
  return;
448
456
  }
449
457
 
@@ -453,20 +461,20 @@ class WebDriverAgent {
453
461
  } = status.build;
454
462
  // for real device
455
463
  if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {
456
- log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);
464
+ this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);
457
465
  return await this.uninstall();
458
466
  }
459
467
  // for simulator
460
468
  if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {
461
- log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);
469
+ this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);
462
470
  return await this.uninstall();
463
471
  }
464
472
 
465
473
  const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();
466
- log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);
467
- log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);
474
+ this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);
475
+ this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);
468
476
  if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {
469
- log.info('Will uninstall running WDA since it has different version in comparison to the one ' +
477
+ this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +
470
478
  `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);
471
479
  return await this.uninstall();
472
480
  }
@@ -474,7 +482,7 @@ class WebDriverAgent {
474
482
  const message = util.hasValue(productBundleIdentifier)
475
483
  ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`
476
484
  : `Will reuse previously cached WDA instance at '${this.url.href}'`;
477
- log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);
485
+ this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);
478
486
  this.webDriverAgentUrl = this.url.href;
479
487
  }
480
488