appium-uiautomator2-driver 2.29.9 → 2.29.11

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 (44) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/index.js +2 -3
  3. package/build/lib/commands/actions.js +4 -7
  4. package/build/lib/commands/actions.js.map +1 -1
  5. package/build/lib/commands/alert.js +4 -7
  6. package/build/lib/commands/alert.js.map +1 -1
  7. package/build/lib/commands/app-strings.js +2 -3
  8. package/build/lib/commands/app-strings.js.map +1 -1
  9. package/build/lib/commands/battery.js +3 -5
  10. package/build/lib/commands/battery.js.map +1 -1
  11. package/build/lib/commands/element.js +4 -7
  12. package/build/lib/commands/element.js.map +1 -1
  13. package/build/lib/commands/find.js +3 -5
  14. package/build/lib/commands/find.js.map +1 -1
  15. package/build/lib/commands/general.js +2 -3
  16. package/build/lib/commands/general.js.map +1 -1
  17. package/build/lib/commands/gestures.js +2 -3
  18. package/build/lib/commands/gestures.js.map +1 -1
  19. package/build/lib/commands/index.js +2 -3
  20. package/build/lib/commands/index.js.map +1 -1
  21. package/build/lib/commands/screenshot.js +2 -3
  22. package/build/lib/commands/screenshot.js.map +1 -1
  23. package/build/lib/commands/touch.js +2 -3
  24. package/build/lib/commands/touch.js.map +1 -1
  25. package/build/lib/commands/viewport.js +3 -5
  26. package/build/lib/commands/viewport.js.map +1 -1
  27. package/build/lib/css-converter.js +2 -3
  28. package/build/lib/css-converter.js.map +1 -1
  29. package/build/lib/desired-caps.js +2 -3
  30. package/build/lib/desired-caps.js.map +1 -1
  31. package/build/lib/driver.js +2 -3
  32. package/build/lib/driver.js.map +1 -1
  33. package/build/lib/extensions.js +3 -5
  34. package/build/lib/extensions.js.map +1 -1
  35. package/build/lib/helpers.js +2 -3
  36. package/build/lib/helpers.js.map +1 -1
  37. package/build/lib/logger.js +2 -3
  38. package/build/lib/logger.js.map +1 -1
  39. package/build/lib/method-map.js +2 -3
  40. package/build/lib/method-map.js.map +1 -1
  41. package/build/lib/uiautomator2.js +5 -9
  42. package/build/lib/uiautomator2.js.map +1 -1
  43. package/npm-shrinkwrap.json +4883 -0
  44. package/package.json +6 -4
@@ -19,12 +19,9 @@ const REQD_PARAMS = ['adb', 'tmpDir', 'host', 'systemPort', 'devicePort', 'disab
19
19
  const SERVER_LAUNCH_TIMEOUT = 30000;
20
20
  const SERVER_INSTALL_RETRIES = 20;
21
21
  const SERVICES_LAUNCH_TIMEOUT = 30000;
22
- const SERVER_PACKAGE_ID = 'io.appium.uiautomator2.server';
23
- exports.SERVER_PACKAGE_ID = SERVER_PACKAGE_ID;
24
- const SERVER_TEST_PACKAGE_ID = `${SERVER_PACKAGE_ID}.test`;
25
- exports.SERVER_TEST_PACKAGE_ID = SERVER_TEST_PACKAGE_ID;
26
- const INSTRUMENTATION_TARGET = `${SERVER_TEST_PACKAGE_ID}/androidx.test.runner.AndroidJUnitRunner`;
27
- exports.INSTRUMENTATION_TARGET = INSTRUMENTATION_TARGET;
22
+ const SERVER_PACKAGE_ID = exports.SERVER_PACKAGE_ID = 'io.appium.uiautomator2.server';
23
+ const SERVER_TEST_PACKAGE_ID = exports.SERVER_TEST_PACKAGE_ID = `${SERVER_PACKAGE_ID}.test`;
24
+ const INSTRUMENTATION_TARGET = exports.INSTRUMENTATION_TARGET = `${SERVER_TEST_PACKAGE_ID}/androidx.test.runner.AndroidJUnitRunner`;
28
25
  const instrumentationLogger = _support.logger.getLogger('Instrumentation');
29
26
  class UIA2Proxy extends _driver.JWProxy {
30
27
  async proxyCommand(url, method, body = null) {
@@ -322,6 +319,5 @@ class UiAutomator2Server {
322
319
  }
323
320
  }
324
321
  exports.UiAutomator2Server = UiAutomator2Server;
325
- var _default = UiAutomator2Server;
326
- exports.default = _default;
327
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2FzeW5jYm94IiwiX2FwcGl1bVVpYXV0b21hdG9yMlNlcnZlciIsIl9zdXBwb3J0IiwiX2JsdWViaXJkIiwiX2hlbHBlcnMiLCJfYXhpb3MiLCJfcGF0aCIsIlJFUURfUEFSQU1TIiwiU0VSVkVSX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX0lOU1RBTExfUkVUUklFUyIsIlNFUlZJQ0VTX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJleHBvcnRzIiwiU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCIsIklOU1RSVU1FTlRBVElPTl9UQVJHRVQiLCJpbnN0cnVtZW50YXRpb25Mb2dnZXIiLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJVSUEyUHJveHkiLCJKV1Byb3h5IiwicHJveHlDb21tYW5kIiwidXJsIiwibWV0aG9kIiwiYm9keSIsImRpZEluc3RydW1lbnRhdGlvbkV4aXQiLCJlcnJvcnMiLCJJbnZhbGlkQ29udGV4dEVycm9yIiwiVWlBdXRvbWF0b3IyU2VydmVyIiwiY29uc3RydWN0b3IiLCJsb2ciLCJvcHRzIiwicmVxIiwidXRpbCIsImhhc1ZhbHVlIiwiRXJyb3IiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInByb3h5T3B0cyIsInNlcnZlciIsImhvc3QiLCJwb3J0Iiwic3lzdGVtUG9ydCIsImtlZXBBbGl2ZSIsInJlYWRUaW1lb3V0IiwidGltZW91dCIsImp3cHJveHkiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJjb21tYW5kIiwicHJlcGFyZVNlcnZlclBhY2thZ2UiLCJhcHBQYXRoIiwiYXBwSWQiLCJ0bXBSb290IiwicmVzdWx0SW5mbyIsIndhc1NpZ25lZCIsImluc3RhbGxTdGF0ZSIsImFkYiIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiTk9UX0lOU1RBTExFRCIsImNoZWNrQXBrQ2VydCIsImhlbHBlcnMiLCJpc1dyaXRlYWJsZSIsIndhcm4iLCJkc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJiYXNlbmFtZSIsImZzIiwiY29weUZpbGUiLCJzaWduQXBwIiwiaXNBcHBJbnN0YWxsZWQiLCJTQU1FX1ZFUlNJT05fSU5TVEFMTEVEIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJpbnN0YWxsU2VydmVyQXBrIiwiaW5zdGFsbFRpbWVvdXQiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInBhY2thZ2VzSW5mbyIsIkIiLCJhbGwiLCJhcGtQYXRoIiwidGVzdEFwa1BhdGgiLCJtYXAiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsInNvbWUiLCJldmVyeSIsInNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiaW5jbHVkZXMiLCJpbmZvIiwic2lsZW50VW5pbnN0YWxsUGtnIiwicGtnSWQiLCJ1bmluc3RhbGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiaW5zdGFsbFBrZyIsInBrZ1BhdGgiLCJpbnN0YWxsIiwibm9JbmNyZW1lbnRhbCIsInJlcGxhY2UiLCJ0aW1lb3V0Q2FwTmFtZSIsInJpbXJhZiIsInZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5IiwiaXNQbVNlcnZpY2VBdmFpbGFibGUiLCJwbU91dHB1dCIsInBtRXJyb3IiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwic2hlbGwiLCJlIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yIiwibGluZSIsInNwbGl0Iiwic3RhcnRTZXNzaW9uIiwiY2FwcyIsImNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInNlcnZlclZlcnNpb24iLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwicmV0cmllcyIsIm1heFJldHJpZXMiLCJkZWxheUJldHdlZW5SZXRyaWVzIiwic3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiZXJyb3JBbmRUaHJvdyIsImRlbGF5IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJjYXBhYmlsaXRpZXMiLCJmaXJzdE1hdGNoIiwiYWx3YXlzTWF0Y2giLCJjbWQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwicHVzaCIsIl8iLCJpc0Jvb2xlYW4iLCJpbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiY3JlYXRlU3ViUHJvY2VzcyIsIm9uIiwic3Rkb3V0Iiwic3RkZXJyIiwib3V0cHV0IiwidHJpbSIsImNvZGUiLCJkZWxldGVTZXNzaW9uIiwic3RyaWN0Q2xlYW51cCIsImF4aW9zVGltZW91dCIsIndhaXRTdG9wIiwiYXhpb3MiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwicGx1cmFsaXplIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91aWF1dG9tYXRvcjIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEpXUHJveHksIGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7XG4gIFNFUlZFUl9BUEtfUEFUSCBhcyBhcGtQYXRoLFxuICBURVNUX0FQS19QQVRIIGFzIHRlc3RBcGtQYXRoLFxuICB2ZXJzaW9uIGFzIHNlcnZlclZlcnNpb25cbn0gZnJvbSAnYXBwaXVtLXVpYXV0b21hdG9yMi1zZXJ2ZXInO1xuaW1wb3J0IHtcbiAgdXRpbCwgbG9nZ2VyLCB0ZW1wRGlyLCBmcywgdGltaW5nXG59IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IFJFUURfUEFSQU1TID0gWydhZGInLCAndG1wRGlyJywgJ2hvc3QnLCAnc3lzdGVtUG9ydCcsICdkZXZpY2VQb3J0JywgJ2Rpc2FibGVXaW5kb3dBbmltYXRpb24nXTtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX0lOU1RBTExfUkVUUklFUyA9IDIwO1xuY29uc3QgU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNFUlZFUl9QQUNLQUdFX0lEID0gJ2lvLmFwcGl1bS51aWF1dG9tYXRvcjIuc2VydmVyJztcbmNvbnN0IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgPSBgJHtTRVJWRVJfUEFDS0FHRV9JRH0udGVzdGA7XG5jb25zdCBJTlNUUlVNRU5UQVRJT05fVEFSR0VUID0gYCR7U0VSVkVSX1RFU1RfUEFDS0FHRV9JRH0vYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyYDtcbmNvbnN0IGluc3RydW1lbnRhdGlvbkxvZ2dlciA9IGxvZ2dlci5nZXRMb2dnZXIoJ0luc3RydW1lbnRhdGlvbicpO1xuXG5jbGFzcyBVSUEyUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgYXN5bmMgcHJveHlDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoXG4gICAgICAgIGAnJHttZXRob2R9ICR7dXJsfScgY2Fubm90IGJlIHByb3hpZWQgdG8gVWlBdXRvbWF0b3IyIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICAndGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gJyArXG4gICAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBhbmQvb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBVaUF1dG9tYXRvcjJTZXJ2ZXIge1xuICBjb25zdHJ1Y3RvciAobG9nLCBvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRRF9QQVJBTVMpIHtcbiAgICAgIGlmICghb3B0cyB8fCAhdXRpbC5oYXNWYWx1ZShvcHRzW3JlcV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICcke3JlcX0nIGlzIHJlcXVpcmVkIWApO1xuICAgICAgfVxuICAgICAgdGhpc1tyZXFdID0gb3B0c1tyZXFdO1xuICAgIH1cbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlID0gb3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBsb2csXG4gICAgICBzZXJ2ZXI6IHRoaXMuaG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMuc3lzdGVtUG9ydCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChvcHRzLnJlYWRUaW1lb3V0ICYmIG9wdHMucmVhZFRpbWVvdXQgPiAwKSB7XG4gICAgICBwcm94eU9wdHMudGltZW91dCA9IG9wdHMucmVhZFRpbWVvdXQ7XG4gICAgfVxuICAgIHRoaXMuandwcm94eSA9IG5ldyBVSUEyUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVNlcnZlclBhY2thZ2UoYXBwUGF0aCwgYXBwSWQsIHRtcFJvb3QpIHtcbiAgICBjb25zdCByZXN1bHRJbmZvID0ge1xuICAgICAgd2FzU2lnbmVkOiBmYWxzZSxcbiAgICAgIGluc3RhbGxTdGF0ZTogdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgIGFwcFBhdGgsXG4gICAgICBhcHBJZCxcbiAgICB9O1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChyZXN1bHRJbmZvLmFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgcmVzdWx0SW5mby53YXNTaWduZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWF3YWl0IGhlbHBlcnMuaXNXcml0ZWFibGUoYXBwUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgICBgU2VydmVyIHBhY2thZ2UgYXQgJyR7YXBwUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICAgIGBXaWxsIGNvcHkgaXQgaW50byB0aGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGF0ICcke3RtcFJvb3R9JyBhcyBhIHdvcmthcm91bmQuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciBtYWtpbmcgdGhpcyBmaWxlIHdyaXRlYWJsZSBtYW51YWxseSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBzZXNzaW9uIHN0YXJ0dXAuYFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUGF0aCkpO1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZShhcHBQYXRoLCBkc3RQYXRoKTtcbiAgICAgICAgcmVzdWx0SW5mby5hcHBQYXRoID0gZHN0UGF0aDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgcmVzdWx0SW5mby5hcHBQYXRoKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwSWQgPT09IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgJiYgYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpKSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBpbiBnZXR0aW5nIHRoZSBzdGF0ZSBmb3IgdGhlIHRlc3Qgc2VydmVyLFxuICAgICAgLy8gc2luY2UgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgdmVyc2lvbiBpbmZvXG4gICAgICByZXN1bHRJbmZvLmluc3RhbGxTdGF0ZSA9IHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ7XG4gICAgfSBlbHNlIGlmIChhcHBJZCA9PT0gU0VSVkVSX1BBQ0tBR0VfSUQpIHtcbiAgICAgIHJlc3VsdEluZm8uaW5zdGFsbFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUocmVzdWx0SW5mby5hcHBQYXRoLCBhcHBJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdEluZm87XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGFwa3Mgb24gdG8gdGhlIGRldmljZSBvciBlbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbGxUaW1lb3V0IC0gSW5zdGFsbGF0aW9uIHRpbWVvdXRcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXJBcGsgKGluc3RhbGxUaW1lb3V0ID0gU0VSVkVSX0lOU1RBTExfUkVUUklFUyAqIDEwMDApIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VzSW5mbyA9IGF3YWl0IEIuYWxsKFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXBwUGF0aDogYXBrUGF0aCxcbiAgICAgICAgICAgIGFwcElkOiBTRVJWRVJfUEFDS0FHRV9JRCxcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBhcHBQYXRoOiB0ZXN0QXBrUGF0aCxcbiAgICAgICAgICAgIGFwcElkOiBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0ubWFwKCh7YXBwUGF0aCwgYXBwSWR9KSA9PiB0aGlzLnByZXBhcmVTZXJ2ZXJQYWNrYWdlKGFwcFBhdGgsIGFwcElkLCB0bXBSb290KSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXJ2ZXIgcGFja2FnZXMgc3RhdHVzOiAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzSW5mbyl9YCk7XG4gICAgICAvLyBXZSB3YW50IHRvIGVuZm9yY2UgdW5pbnN0YWxsIGluIGNhc2UgdGhlIGN1cnJlbnQgc2VydmVyIHBhY2thZ2UgaGFzIG5vdCBiZWVuIHNpZ25lZCBwcm9wZXJseVxuICAgICAgLy8gb3IgaWYgYW55IG9mIHNlcnZlciBwYWNrYWdlcyBpcyBub3QgaW5zdGFsbGVkLCB3aGlsZSB0aGUgb3RoZXIgZG9lc1xuICAgICAgY29uc3Qgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBwYWNrYWdlc0luZm8uc29tZSgoe3dhc1NpZ25lZH0pID0+ICF3YXNTaWduZWQpXG4gICAgICAgIHx8IChwYWNrYWdlc0luZm8uc29tZSgoe2luc3RhbGxTdGF0ZX0pID0+IGluc3RhbGxTdGF0ZSA9PT0gdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRClcbiAgICAgICAgICAgICYmICFwYWNrYWdlc0luZm8uZXZlcnkoKHtpbnN0YWxsU3RhdGV9KSA9PiBpbnN0YWxsU3RhdGUgPT09IHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQpKTtcbiAgICAgIC8vIEluc3RhbGwgbXVzdCBhbHdheXMgZm9sbG93IHVuaW5zdGFsbC4gQWxzbywgcGVyZm9ybSB0aGUgaW5zdGFsbCBpZlxuICAgICAgLy8gYW55IG9mIHNlcnZlciBwYWNrYWdlcyBpcyBub3QgaW5zdGFsbGVkIG9yIGlzIG91dGRhdGVkXG4gICAgICBjb25zdCBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBwYWNrYWdlc0luZm8uc29tZSgoe2luc3RhbGxTdGF0ZX0pID0+IFtcbiAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICBdLmluY2x1ZGVzKGluc3RhbGxTdGF0ZSkpO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU2VydmVyIHBhY2thZ2VzIGFyZSAke3Nob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA/ICcnIDogJ25vdCAnfWdvaW5nIHRvIGJlIChyZSlpbnN0YWxsZWRgKTtcbiAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgJiYgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRnVsbCBwYWNrYWdlcyByZWluc3RhbGwgaXMgZ29pbmcgdG8gYmUgcGVyZm9ybWVkJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgY29uc3Qgc2lsZW50VW5pbnN0YWxsUGtnID0gYXN5bmMgKHBrZ0lkKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhwa2dJZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBDYW5ub3QgdW5pbnN0YWxsICcke3BrZ0lkfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBCLmFsbChwYWNrYWdlc0luZm8ubWFwKCh7YXBwSWR9KSA9PiBzaWxlbnRVbmluc3RhbGxQa2coYXBwSWQpKSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxQa2cgPSBhc3luYyAocGtnUGF0aCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwocGtnUGF0aCwge1xuICAgICAgICAgICAgbm9JbmNyZW1lbnRhbDogdHJ1ZSxcbiAgICAgICAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBpbnN0YWxsVGltZW91dCxcbiAgICAgICAgICAgIHRpbWVvdXRDYXBOYW1lOiAndWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IEIuYWxsKHBhY2thZ2VzSW5mby5tYXAoKHthcHBQYXRofSkgPT4gaW5zdGFsbFBrZyhhcHBQYXRoKSkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSgpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkgKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7U0VSVklDRVNfTEFVTkNIX1RJTUVPVVR9bXMgZm9yIHNlcnZpY2VzIHRvIGJlIGF2YWlsYWJsZWApO1xuICAgIGxldCBpc1BtU2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIGxldCBwbU91dHB1dCA9ICcnO1xuICAgIGxldCBwbUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNQbVNlcnZpY2VBdmFpbGFibGUpIHtcbiAgICAgICAgICBwbUVycm9yID0gbnVsbDtcbiAgICAgICAgICBwbU91dHB1dCA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdpbnN0cnVtZW50YXRpb24nXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwbU91dHB1dC5pbmNsdWRlcygnQ291bGQgbm90IGFjY2VzcyB0aGUgUGFja2FnZSBNYW5hZ2VyJykpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoYFByb2JsZW0gcnVubmluZyBQYWNrYWdlIE1hbmFnZXI6ICR7cG1PdXRwdXR9YCk7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgIH0gZWxzZSBpZiAocG1PdXRwdXQuaW5jbHVkZXMoSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCkpIHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfScgaXMgYXZhaWxhYmxlYCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgICAgICAgaXNQbVNlcnZpY2VBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXBtRXJyb3IpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBpbnN0cnVtZW50YXRpb24gdGFyZ2V0IGlzIG5vdCBsaXN0ZWQgYnkgUGFja2FnZSBNYW5hZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1BtU2VydmljZUF2YWlsYWJsZTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYFVuYWJsZSB0byBmaW5kIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nOiAkeyhwbUVycm9yIHx8IHt9KS5tZXNzYWdlfWApO1xuICAgICAgaWYgKHBtT3V0cHV0KSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdBdmFpbGFibGUgdGFyZ2V0czonKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHBtT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGAgICAgJHtsaW5lLnJlcGxhY2UoJ2luc3RydW1lbnRhdGlvbjonLCAnJyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzKCk7XG4gICAgaWYgKGNhcHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24nIGlzIHNldC4gQXR0ZW1wdGluZyB0byB1c2UgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tIHRoZSBkZXZpY2VgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciAke3NlcnZlclZlcnNpb259YCk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gJyR7YXBrUGF0aH0nIGFuZCB0ZXN0IGZyb20gJyR7dGVzdEFwa1BhdGh9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXQgPSBjYXBzLnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQgfHwgU0VSVkVSX0xBVU5DSF9USU1FT1VUO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSAyO1xuICAgIGNvbnN0IGRlbGF5QmV0d2VlblJldHJpZXMgPSAzMDAwO1xuICAgIHdoaWxlIChyZXRyaWVzIDwgbWF4UmV0cmllcykge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXR9bXMgZm9yIFVpQXV0b21hdG9yMiB0byBiZSBvbmxpbmUuLi5gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcygpO1xuICAgICAgaWYgKCF0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIHNob3J0IGNpcmN1aXQgdG8gcmV0cnkgb3IgZmFpbCBmYXN0XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkIHdpdGhpbiAke3RpbWVvdXR9bXMgdGltZW91dC4gYFxuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4gJ1xuICAgICAgICAgICAgKyBgWW91IGNvdWxkIGFsc28gdHJ5IHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiAndWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXRyaWVzKys7XG4gICAgICBpZiAocmV0cmllcyA+PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ1RoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuICdcbiAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LicpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cud2FybihgVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyBiZWVuIHVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkLiBgXG4gICAgICAgICsgYFJldHJ5aW5nIFVpQXV0b21hdG9yMiBzdGFydHVwICgjJHtyZXRyaWVzfSBvZiAke21heFJldHJpZXMgLSAxfSlgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnModHJ1ZSk7XG4gICAgICBhd2FpdCBCLmRlbGF5KGRlbGF5QmV0d2VlblJldHJpZXMpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIHRvb2sgYFxuICAgICAgKyBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBmaXJzdE1hdGNoOiBbY2Fwc10sXG4gICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyAoKSB7XG4gICAgY29uc3QgY21kID0gWydhbScsICdpbnN0cnVtZW50JywgJy13J107XG4gICAgaWYgKHRoaXMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgY21kLnB1c2goJy0tbm8td2luZG93LWFuaW1hdGlvbicpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZSBHb29nbGUgYW5hbHl0aWNzIHRvIHByZXZlbnQgcG9zc2libGUgZmF0YWwgZXhjZXB0aW9uXG4gICAgY21kLnB1c2goJy1lJywgJ2Rpc2FibGVBbmFseXRpY3MnLCB0cnVlKTtcbiAgICBjbWQucHVzaChJTlNUUlVNRU5UQVRJT05fVEFSR0VUKTtcbiAgICBjb25zdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzID0gdGhpcy5hZGIuY3JlYXRlU3ViUHJvY2VzcyhbJ3NoZWxsJywgLi4uY21kXSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKGBUaGUgcHJvY2VzcyBoYXMgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IHRydWU7XG4gICAgfSk7XG4gICAgYXdhaXQgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2VydmVyIHNlc3Npb24nKTtcbiAgICAvLyByZWx5IG9uIGp3cHJveHkncyBpbnRlbGxpZ2VuY2UgdG8ga25vdyB3aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYW5kXG4gICAgLy8gZGVsZXRlIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBEaWQgbm90IGdldCBjb25maXJtYXRpb24gVWlBdXRvbWF0b3IyIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyAoc3RyaWN0Q2xlYW51cCA9IGZhbHNlKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYFBlcmZvcm1pbmcgJHtzdHJpY3RDbGVhbnVwID8gJ3N0cmljdCcgOiAnc2hhbGxvdyd9IGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnNgKTtcblxuICAgIGNvbnN0IGF4aW9zVGltZW91dCA9IDUwMDtcblxuICAgIGNvbnN0IHdhaXRTdG9wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHByb2Nlc3Mgc3RvcCBieSBzZW5kaW5nIGEgc3RhdHVzIHJlcXVlc3QgdG8gdGhlIHBvcnQuXG4gICAgICAvLyBXZSBvYnNlcnZlZCB0aGUgcHJvY2VzcyBzdG9wIGNvdWxkIGJlIGRlbGF5ZWQsIHRodXMgY2F1c2luZyB1bmV4cGVjdGVkIGNyYXNoZXNcbiAgICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNlc3Npb24gcHJlcGFyYXRpb24gcHJvY2Vzcy4gSXQgY2F1c2VkIGFuIGludmFsaWQgc2Vzc2lvbiBlcnJvciByZXNwb25zZVxuICAgICAgLy8gYnkgdGhlIHVpYTIgc2VydmVyLCBidXQgdGhhdCB3YXMgYmVjYXVzZSB0aGUgcHJvY2VzcyBzdG9wJ3MgZGVsYXkuXG4gICAgICBjb25zdCB0aW1lb3V0ID0gMzAwMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3N0YXR1c2AsXG4gICAgICAgICAgICAgIHRpbWVvdXQ6IGF4aW9zVGltZW91dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgd2FpdE1zOiB0aW1lb3V0LFxuICAgICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVGhlICR7U0VSVkVSX1RFU1RfUEFDS0FHRV9JRH0gcHJvY2VzcyBtaWdodCBmYWlsIHRvIHN0b3Agd2l0aGluICR7dGltZW91dH1tcyB0aW1lb3V0LmApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb25zYCxcbiAgICAgICAgdGltZW91dDogYXhpb3NUaW1lb3V0LFxuICAgICAgfSkpLmRhdGE7XG4gICAgICBjb25zdCBhY3RpdmVTZXNzaW9uSWRzID0gdmFsdWUubWFwKCh7aWR9KSA9PiBpZCkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgaWYgKGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgZm9sbG93aW5nIG9ic29sZXRlIHNlc3Npb25zIGFyZSBzdGlsbCBydW5uaW5nOiAke0pTT04uc3RyaW5naWZ5KGFjdGl2ZVNlc3Npb25JZHMpfWApO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnb2Jzb2xldGUgc2Vzc2lvbicsIGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgICAgYXdhaXQgQi5hbGwoYWN0aXZlU2Vzc2lvbklkc1xuICAgICAgICAgIC5tYXAoKGlkKSA9PiBheGlvcy5kZWxldGUoYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb24vJHtpZH1gKSlcbiAgICAgICAgKTtcbiAgICAgICAgLy8gTGV0IGFsbCBzZXNzaW9ucyB0byBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYE5vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgIGlmIChzdHJpY3RDbGVhbnVwKSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTA3NDlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxQcm9jZXNzZXNCeU5hbWUoJ3VpYXV0b21hdG9yJyk7XG4gICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgfVxuICAgIGF3YWl0IHdhaXRTdG9wKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVWlBdXRvbWF0b3IyU2VydmVyLCBJTlNUUlVNRU5UQVRJT05fVEFSR0VULCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCB9O1xuZXhwb3J0IGRlZmF1bHQgVWlBdXRvbWF0b3IyU2VydmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLHlCQUFBLEdBQUFILE9BQUE7QUFLQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFHQSxJQUFBSyxTQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxLQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFFQSxNQUFNUyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLHdCQUF3QixDQUFDO0FBQ25HLE1BQU1DLHFCQUFxQixHQUFHLEtBQUs7QUFDbkMsTUFBTUMsc0JBQXNCLEdBQUcsRUFBRTtBQUNqQyxNQUFNQyx1QkFBdUIsR0FBRyxLQUFLO0FBQ3JDLE1BQU1DLGlCQUFpQixHQUFHLCtCQUErQjtBQUFDQyxPQUFBLENBQUFELGlCQUFBLEdBQUFBLGlCQUFBO0FBQzFELE1BQU1FLHNCQUFzQixHQUFJLEdBQUVGLGlCQUFrQixPQUFNO0FBQUNDLE9BQUEsQ0FBQUMsc0JBQUEsR0FBQUEsc0JBQUE7QUFDM0QsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsc0JBQXVCLDBDQUF5QztBQUFDRCxPQUFBLENBQUFFLHNCQUFBLEdBQUFBLHNCQUFBO0FBQ25HLE1BQU1DLHFCQUFxQixHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztBQUVqRSxNQUFNQyxTQUFTLFNBQVNDLGVBQU8sQ0FBQztFQUM5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
322
+ var _default = exports.default = UiAutomator2Server;
323
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2FzeW5jYm94IiwiX2FwcGl1bVVpYXV0b21hdG9yMlNlcnZlciIsIl9zdXBwb3J0IiwiX2JsdWViaXJkIiwiX2hlbHBlcnMiLCJfYXhpb3MiLCJfcGF0aCIsIlJFUURfUEFSQU1TIiwiU0VSVkVSX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX0lOU1RBTExfUkVUUklFUyIsIlNFUlZJQ0VTX0xBVU5DSF9USU1FT1VUIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJleHBvcnRzIiwiU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCIsIklOU1RSVU1FTlRBVElPTl9UQVJHRVQiLCJpbnN0cnVtZW50YXRpb25Mb2dnZXIiLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJVSUEyUHJveHkiLCJKV1Byb3h5IiwicHJveHlDb21tYW5kIiwidXJsIiwibWV0aG9kIiwiYm9keSIsImRpZEluc3RydW1lbnRhdGlvbkV4aXQiLCJlcnJvcnMiLCJJbnZhbGlkQ29udGV4dEVycm9yIiwiVWlBdXRvbWF0b3IyU2VydmVyIiwiY29uc3RydWN0b3IiLCJsb2ciLCJvcHRzIiwicmVxIiwidXRpbCIsImhhc1ZhbHVlIiwiRXJyb3IiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInByb3h5T3B0cyIsInNlcnZlciIsImhvc3QiLCJwb3J0Iiwic3lzdGVtUG9ydCIsImtlZXBBbGl2ZSIsInJlYWRUaW1lb3V0IiwidGltZW91dCIsImp3cHJveHkiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJjb21tYW5kIiwicHJlcGFyZVNlcnZlclBhY2thZ2UiLCJhcHBQYXRoIiwiYXBwSWQiLCJ0bXBSb290IiwicmVzdWx0SW5mbyIsIndhc1NpZ25lZCIsImluc3RhbGxTdGF0ZSIsImFkYiIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiTk9UX0lOU1RBTExFRCIsImNoZWNrQXBrQ2VydCIsImhlbHBlcnMiLCJpc1dyaXRlYWJsZSIsIndhcm4iLCJkc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJiYXNlbmFtZSIsImZzIiwiY29weUZpbGUiLCJzaWduQXBwIiwiaXNBcHBJbnN0YWxsZWQiLCJTQU1FX1ZFUlNJT05fSU5TVEFMTEVEIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJpbnN0YWxsU2VydmVyQXBrIiwiaW5zdGFsbFRpbWVvdXQiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInBhY2thZ2VzSW5mbyIsIkIiLCJhbGwiLCJhcGtQYXRoIiwidGVzdEFwa1BhdGgiLCJtYXAiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsInNvbWUiLCJldmVyeSIsInNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiaW5jbHVkZXMiLCJpbmZvIiwic2lsZW50VW5pbnN0YWxsUGtnIiwicGtnSWQiLCJ1bmluc3RhbGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiaW5zdGFsbFBrZyIsInBrZ1BhdGgiLCJpbnN0YWxsIiwibm9JbmNyZW1lbnRhbCIsInJlcGxhY2UiLCJ0aW1lb3V0Q2FwTmFtZSIsInJpbXJhZiIsInZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5IiwiaXNQbVNlcnZpY2VBdmFpbGFibGUiLCJwbU91dHB1dCIsInBtRXJyb3IiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwic2hlbGwiLCJlIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yIiwibGluZSIsInNwbGl0Iiwic3RhcnRTZXNzaW9uIiwiY2FwcyIsImNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInNlcnZlclZlcnNpb24iLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwicmV0cmllcyIsIm1heFJldHJpZXMiLCJkZWxheUJldHdlZW5SZXRyaWVzIiwic3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiZXJyb3JBbmRUaHJvdyIsImRlbGF5IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJjYXBhYmlsaXRpZXMiLCJmaXJzdE1hdGNoIiwiYWx3YXlzTWF0Y2giLCJjbWQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwicHVzaCIsIl8iLCJpc0Jvb2xlYW4iLCJpbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiY3JlYXRlU3ViUHJvY2VzcyIsIm9uIiwic3Rkb3V0Iiwic3RkZXJyIiwib3V0cHV0IiwidHJpbSIsImNvZGUiLCJkZWxldGVTZXNzaW9uIiwic3RyaWN0Q2xlYW51cCIsImF4aW9zVGltZW91dCIsIndhaXRTdG9wIiwiYXhpb3MiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwicGx1cmFsaXplIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91aWF1dG9tYXRvcjIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEpXUHJveHksIGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7XG4gIFNFUlZFUl9BUEtfUEFUSCBhcyBhcGtQYXRoLFxuICBURVNUX0FQS19QQVRIIGFzIHRlc3RBcGtQYXRoLFxuICB2ZXJzaW9uIGFzIHNlcnZlclZlcnNpb25cbn0gZnJvbSAnYXBwaXVtLXVpYXV0b21hdG9yMi1zZXJ2ZXInO1xuaW1wb3J0IHtcbiAgdXRpbCwgbG9nZ2VyLCB0ZW1wRGlyLCBmcywgdGltaW5nXG59IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IFJFUURfUEFSQU1TID0gWydhZGInLCAndG1wRGlyJywgJ2hvc3QnLCAnc3lzdGVtUG9ydCcsICdkZXZpY2VQb3J0JywgJ2Rpc2FibGVXaW5kb3dBbmltYXRpb24nXTtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX0lOU1RBTExfUkVUUklFUyA9IDIwO1xuY29uc3QgU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNFUlZFUl9QQUNLQUdFX0lEID0gJ2lvLmFwcGl1bS51aWF1dG9tYXRvcjIuc2VydmVyJztcbmNvbnN0IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgPSBgJHtTRVJWRVJfUEFDS0FHRV9JRH0udGVzdGA7XG5jb25zdCBJTlNUUlVNRU5UQVRJT05fVEFSR0VUID0gYCR7U0VSVkVSX1RFU1RfUEFDS0FHRV9JRH0vYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyYDtcbmNvbnN0IGluc3RydW1lbnRhdGlvbkxvZ2dlciA9IGxvZ2dlci5nZXRMb2dnZXIoJ0luc3RydW1lbnRhdGlvbicpO1xuXG5jbGFzcyBVSUEyUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgYXN5bmMgcHJveHlDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoXG4gICAgICAgIGAnJHttZXRob2R9ICR7dXJsfScgY2Fubm90IGJlIHByb3hpZWQgdG8gVWlBdXRvbWF0b3IyIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICAndGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gJyArXG4gICAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBhbmQvb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBVaUF1dG9tYXRvcjJTZXJ2ZXIge1xuICBjb25zdHJ1Y3RvciAobG9nLCBvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRRF9QQVJBTVMpIHtcbiAgICAgIGlmICghb3B0cyB8fCAhdXRpbC5oYXNWYWx1ZShvcHRzW3JlcV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICcke3JlcX0nIGlzIHJlcXVpcmVkIWApO1xuICAgICAgfVxuICAgICAgdGhpc1tyZXFdID0gb3B0c1tyZXFdO1xuICAgIH1cbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlID0gb3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBsb2csXG4gICAgICBzZXJ2ZXI6IHRoaXMuaG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMuc3lzdGVtUG9ydCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChvcHRzLnJlYWRUaW1lb3V0ICYmIG9wdHMucmVhZFRpbWVvdXQgPiAwKSB7XG4gICAgICBwcm94eU9wdHMudGltZW91dCA9IG9wdHMucmVhZFRpbWVvdXQ7XG4gICAgfVxuICAgIHRoaXMuandwcm94eSA9IG5ldyBVSUEyUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVNlcnZlclBhY2thZ2UoYXBwUGF0aCwgYXBwSWQsIHRtcFJvb3QpIHtcbiAgICBjb25zdCByZXN1bHRJbmZvID0ge1xuICAgICAgd2FzU2lnbmVkOiBmYWxzZSxcbiAgICAgIGluc3RhbGxTdGF0ZTogdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgIGFwcFBhdGgsXG4gICAgICBhcHBJZCxcbiAgICB9O1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChyZXN1bHRJbmZvLmFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgcmVzdWx0SW5mby53YXNTaWduZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWF3YWl0IGhlbHBlcnMuaXNXcml0ZWFibGUoYXBwUGF0aCkpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgICBgU2VydmVyIHBhY2thZ2UgYXQgJyR7YXBwUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICAgIGBXaWxsIGNvcHkgaXQgaW50byB0aGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGF0ICcke3RtcFJvb3R9JyBhcyBhIHdvcmthcm91bmQuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciBtYWtpbmcgdGhpcyBmaWxlIHdyaXRlYWJsZSBtYW51YWxseSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBzZXNzaW9uIHN0YXJ0dXAuYFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUGF0aCkpO1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZShhcHBQYXRoLCBkc3RQYXRoKTtcbiAgICAgICAgcmVzdWx0SW5mby5hcHBQYXRoID0gZHN0UGF0aDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgcmVzdWx0SW5mby5hcHBQYXRoKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwSWQgPT09IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgJiYgYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpKSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBpbiBnZXR0aW5nIHRoZSBzdGF0ZSBmb3IgdGhlIHRlc3Qgc2VydmVyLFxuICAgICAgLy8gc2luY2UgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgdmVyc2lvbiBpbmZvXG4gICAgICByZXN1bHRJbmZvLmluc3RhbGxTdGF0ZSA9IHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLlNBTUVfVkVSU0lPTl9JTlNUQUxMRUQ7XG4gICAgfSBlbHNlIGlmIChhcHBJZCA9PT0gU0VSVkVSX1BBQ0tBR0VfSUQpIHtcbiAgICAgIHJlc3VsdEluZm8uaW5zdGFsbFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUocmVzdWx0SW5mby5hcHBQYXRoLCBhcHBJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdEluZm87XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGFwa3Mgb24gdG8gdGhlIGRldmljZSBvciBlbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbGxUaW1lb3V0IC0gSW5zdGFsbGF0aW9uIHRpbWVvdXRcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXJBcGsgKGluc3RhbGxUaW1lb3V0ID0gU0VSVkVSX0lOU1RBTExfUkVUUklFUyAqIDEwMDApIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VzSW5mbyA9IGF3YWl0IEIuYWxsKFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXBwUGF0aDogYXBrUGF0aCxcbiAgICAgICAgICAgIGFwcElkOiBTRVJWRVJfUEFDS0FHRV9JRCxcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBhcHBQYXRoOiB0ZXN0QXBrUGF0aCxcbiAgICAgICAgICAgIGFwcElkOiBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0ubWFwKCh7YXBwUGF0aCwgYXBwSWR9KSA9PiB0aGlzLnByZXBhcmVTZXJ2ZXJQYWNrYWdlKGFwcFBhdGgsIGFwcElkLCB0bXBSb290KSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXJ2ZXIgcGFja2FnZXMgc3RhdHVzOiAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzSW5mbyl9YCk7XG4gICAgICAvLyBXZSB3YW50IHRvIGVuZm9yY2UgdW5pbnN0YWxsIGluIGNhc2UgdGhlIGN1cnJlbnQgc2VydmVyIHBhY2thZ2UgaGFzIG5vdCBiZWVuIHNpZ25lZCBwcm9wZXJseVxuICAgICAgLy8gb3IgaWYgYW55IG9mIHNlcnZlciBwYWNrYWdlcyBpcyBub3QgaW5zdGFsbGVkLCB3aGlsZSB0aGUgb3RoZXIgZG9lc1xuICAgICAgY29uc3Qgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBwYWNrYWdlc0luZm8uc29tZSgoe3dhc1NpZ25lZH0pID0+ICF3YXNTaWduZWQpXG4gICAgICAgIHx8IChwYWNrYWdlc0luZm8uc29tZSgoe2luc3RhbGxTdGF0ZX0pID0+IGluc3RhbGxTdGF0ZSA9PT0gdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRClcbiAgICAgICAgICAgICYmICFwYWNrYWdlc0luZm8uZXZlcnkoKHtpbnN0YWxsU3RhdGV9KSA9PiBpbnN0YWxsU3RhdGUgPT09IHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQpKTtcbiAgICAgIC8vIEluc3RhbGwgbXVzdCBhbHdheXMgZm9sbG93IHVuaW5zdGFsbC4gQWxzbywgcGVyZm9ybSB0aGUgaW5zdGFsbCBpZlxuICAgICAgLy8gYW55IG9mIHNlcnZlciBwYWNrYWdlcyBpcyBub3QgaW5zdGFsbGVkIG9yIGlzIG91dGRhdGVkXG4gICAgICBjb25zdCBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBwYWNrYWdlc0luZm8uc29tZSgoe2luc3RhbGxTdGF0ZX0pID0+IFtcbiAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICBdLmluY2x1ZGVzKGluc3RhbGxTdGF0ZSkpO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU2VydmVyIHBhY2thZ2VzIGFyZSAke3Nob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA/ICcnIDogJ25vdCAnfWdvaW5nIHRvIGJlIChyZSlpbnN0YWxsZWRgKTtcbiAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgJiYgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnRnVsbCBwYWNrYWdlcyByZWluc3RhbGwgaXMgZ29pbmcgdG8gYmUgcGVyZm9ybWVkJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgY29uc3Qgc2lsZW50VW5pbnN0YWxsUGtnID0gYXN5bmMgKHBrZ0lkKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhwa2dJZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBDYW5ub3QgdW5pbnN0YWxsICcke3BrZ0lkfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBCLmFsbChwYWNrYWdlc0luZm8ubWFwKCh7YXBwSWR9KSA9PiBzaWxlbnRVbmluc3RhbGxQa2coYXBwSWQpKSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxQa2cgPSBhc3luYyAocGtnUGF0aCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwocGtnUGF0aCwge1xuICAgICAgICAgICAgbm9JbmNyZW1lbnRhbDogdHJ1ZSxcbiAgICAgICAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBpbnN0YWxsVGltZW91dCxcbiAgICAgICAgICAgIHRpbWVvdXRDYXBOYW1lOiAndWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IEIuYWxsKHBhY2thZ2VzSW5mby5tYXAoKHthcHBQYXRofSkgPT4gaW5zdGFsbFBrZyhhcHBQYXRoKSkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSgpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkgKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7U0VSVklDRVNfTEFVTkNIX1RJTUVPVVR9bXMgZm9yIHNlcnZpY2VzIHRvIGJlIGF2YWlsYWJsZWApO1xuICAgIGxldCBpc1BtU2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIGxldCBwbU91dHB1dCA9ICcnO1xuICAgIGxldCBwbUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNQbVNlcnZpY2VBdmFpbGFibGUpIHtcbiAgICAgICAgICBwbUVycm9yID0gbnVsbDtcbiAgICAgICAgICBwbU91dHB1dCA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdpbnN0cnVtZW50YXRpb24nXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwbU91dHB1dC5pbmNsdWRlcygnQ291bGQgbm90IGFjY2VzcyB0aGUgUGFja2FnZSBNYW5hZ2VyJykpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoYFByb2JsZW0gcnVubmluZyBQYWNrYWdlIE1hbmFnZXI6ICR7cG1PdXRwdXR9YCk7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgIH0gZWxzZSBpZiAocG1PdXRwdXQuaW5jbHVkZXMoSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCkpIHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfScgaXMgYXZhaWxhYmxlYCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgICAgICAgaXNQbVNlcnZpY2VBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXBtRXJyb3IpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBpbnN0cnVtZW50YXRpb24gdGFyZ2V0IGlzIG5vdCBsaXN0ZWQgYnkgUGFja2FnZSBNYW5hZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1BtU2VydmljZUF2YWlsYWJsZTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYFVuYWJsZSB0byBmaW5kIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nOiAkeyhwbUVycm9yIHx8IHt9KS5tZXNzYWdlfWApO1xuICAgICAgaWYgKHBtT3V0cHV0KSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKCdBdmFpbGFibGUgdGFyZ2V0czonKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHBtT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGAgICAgJHtsaW5lLnJlcGxhY2UoJ2luc3RydW1lbnRhdGlvbjonLCAnJyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzKCk7XG4gICAgaWYgKGNhcHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24nIGlzIHNldC4gQXR0ZW1wdGluZyB0byB1c2UgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tIHRoZSBkZXZpY2VgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgU3RhcnRpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciAke3NlcnZlclZlcnNpb259YCk7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gJyR7YXBrUGF0aH0nIGFuZCB0ZXN0IGZyb20gJyR7dGVzdEFwa1BhdGh9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXQgPSBjYXBzLnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQgfHwgU0VSVkVSX0xBVU5DSF9USU1FT1VUO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSAyO1xuICAgIGNvbnN0IGRlbGF5QmV0d2VlblJldHJpZXMgPSAzMDAwO1xuICAgIHdoaWxlIChyZXRyaWVzIDwgbWF4UmV0cmllcykge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXR9bXMgZm9yIFVpQXV0b21hdG9yMiB0byBiZSBvbmxpbmUuLi5gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcygpO1xuICAgICAgaWYgKCF0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIHNob3J0IGNpcmN1aXQgdG8gcmV0cnkgb3IgZmFpbCBmYXN0XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkIHdpdGhpbiAke3RpbWVvdXR9bXMgdGltZW91dC4gYFxuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4gJ1xuICAgICAgICAgICAgKyBgWW91IGNvdWxkIGFsc28gdHJ5IHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiAndWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXRyaWVzKys7XG4gICAgICBpZiAocmV0cmllcyA+PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ1RoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuICdcbiAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LicpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cud2FybihgVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyBiZWVuIHVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkLiBgXG4gICAgICAgICsgYFJldHJ5aW5nIFVpQXV0b21hdG9yMiBzdGFydHVwICgjJHtyZXRyaWVzfSBvZiAke21heFJldHJpZXMgLSAxfSlgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnModHJ1ZSk7XG4gICAgICBhd2FpdCBCLmRlbGF5KGRlbGF5QmV0d2VlblJldHJpZXMpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIHRvb2sgYFxuICAgICAgKyBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBmaXJzdE1hdGNoOiBbY2Fwc10sXG4gICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyAoKSB7XG4gICAgY29uc3QgY21kID0gWydhbScsICdpbnN0cnVtZW50JywgJy13J107XG4gICAgaWYgKHRoaXMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgY21kLnB1c2goJy0tbm8td2luZG93LWFuaW1hdGlvbicpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZSBHb29nbGUgYW5hbHl0aWNzIHRvIHByZXZlbnQgcG9zc2libGUgZmF0YWwgZXhjZXB0aW9uXG4gICAgY21kLnB1c2goJy1lJywgJ2Rpc2FibGVBbmFseXRpY3MnLCB0cnVlKTtcbiAgICBjbWQucHVzaChJTlNUUlVNRU5UQVRJT05fVEFSR0VUKTtcbiAgICBjb25zdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzID0gdGhpcy5hZGIuY3JlYXRlU3ViUHJvY2VzcyhbJ3NoZWxsJywgLi4uY21kXSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKGBUaGUgcHJvY2VzcyBoYXMgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IHRydWU7XG4gICAgfSk7XG4gICAgYXdhaXQgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2VydmVyIHNlc3Npb24nKTtcbiAgICAvLyByZWx5IG9uIGp3cHJveHkncyBpbnRlbGxpZ2VuY2UgdG8ga25vdyB3aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYW5kXG4gICAgLy8gZGVsZXRlIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBEaWQgbm90IGdldCBjb25maXJtYXRpb24gVWlBdXRvbWF0b3IyIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyAoc3RyaWN0Q2xlYW51cCA9IGZhbHNlKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYFBlcmZvcm1pbmcgJHtzdHJpY3RDbGVhbnVwID8gJ3N0cmljdCcgOiAnc2hhbGxvdyd9IGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnNgKTtcblxuICAgIGNvbnN0IGF4aW9zVGltZW91dCA9IDUwMDtcblxuICAgIGNvbnN0IHdhaXRTdG9wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHByb2Nlc3Mgc3RvcCBieSBzZW5kaW5nIGEgc3RhdHVzIHJlcXVlc3QgdG8gdGhlIHBvcnQuXG4gICAgICAvLyBXZSBvYnNlcnZlZCB0aGUgcHJvY2VzcyBzdG9wIGNvdWxkIGJlIGRlbGF5ZWQsIHRodXMgY2F1c2luZyB1bmV4cGVjdGVkIGNyYXNoZXNcbiAgICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNlc3Npb24gcHJlcGFyYXRpb24gcHJvY2Vzcy4gSXQgY2F1c2VkIGFuIGludmFsaWQgc2Vzc2lvbiBlcnJvciByZXNwb25zZVxuICAgICAgLy8gYnkgdGhlIHVpYTIgc2VydmVyLCBidXQgdGhhdCB3YXMgYmVjYXVzZSB0aGUgcHJvY2VzcyBzdG9wJ3MgZGVsYXkuXG4gICAgICBjb25zdCB0aW1lb3V0ID0gMzAwMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3N0YXR1c2AsXG4gICAgICAgICAgICAgIHRpbWVvdXQ6IGF4aW9zVGltZW91dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgd2FpdE1zOiB0aW1lb3V0LFxuICAgICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgVGhlICR7U0VSVkVSX1RFU1RfUEFDS0FHRV9JRH0gcHJvY2VzcyBtaWdodCBmYWlsIHRvIHN0b3Agd2l0aGluICR7dGltZW91dH1tcyB0aW1lb3V0LmApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb25zYCxcbiAgICAgICAgdGltZW91dDogYXhpb3NUaW1lb3V0LFxuICAgICAgfSkpLmRhdGE7XG4gICAgICBjb25zdCBhY3RpdmVTZXNzaW9uSWRzID0gdmFsdWUubWFwKCh7aWR9KSA9PiBpZCkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgaWYgKGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgZm9sbG93aW5nIG9ic29sZXRlIHNlc3Npb25zIGFyZSBzdGlsbCBydW5uaW5nOiAke0pTT04uc3RyaW5naWZ5KGFjdGl2ZVNlc3Npb25JZHMpfWApO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnb2Jzb2xldGUgc2Vzc2lvbicsIGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgICAgYXdhaXQgQi5hbGwoYWN0aXZlU2Vzc2lvbklkc1xuICAgICAgICAgIC5tYXAoKGlkKSA9PiBheGlvcy5kZWxldGUoYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3Nlc3Npb24vJHtpZH1gKSlcbiAgICAgICAgKTtcbiAgICAgICAgLy8gTGV0IGFsbCBzZXNzaW9ucyB0byBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYE5vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgIGlmIChzdHJpY3RDbGVhbnVwKSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTA3NDlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxQcm9jZXNzZXNCeU5hbWUoJ3VpYXV0b21hdG9yJyk7XG4gICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgfVxuICAgIGF3YWl0IHdhaXRTdG9wKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVWlBdXRvbWF0b3IyU2VydmVyLCBJTlNUUlVNRU5UQVRJT05fVEFSR0VULCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCB9O1xuZXhwb3J0IGRlZmF1bHQgVWlBdXRvbWF0b3IyU2VydmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLHlCQUFBLEdBQUFILE9BQUE7QUFLQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFHQSxJQUFBSyxTQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxLQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFFQSxNQUFNUyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLHdCQUF3QixDQUFDO0FBQ25HLE1BQU1DLHFCQUFxQixHQUFHLEtBQUs7QUFDbkMsTUFBTUMsc0JBQXNCLEdBQUcsRUFBRTtBQUNqQyxNQUFNQyx1QkFBdUIsR0FBRyxLQUFLO0FBQ3JDLE1BQU1DLGlCQUFpQixHQUFBQyxPQUFBLENBQUFELGlCQUFBLEdBQUcsK0JBQStCO0FBQ3pELE1BQU1FLHNCQUFzQixHQUFBRCxPQUFBLENBQUFDLHNCQUFBLEdBQUksR0FBRUYsaUJBQWtCLE9BQU07QUFDMUQsTUFBTUcsc0JBQXNCLEdBQUFGLE9BQUEsQ0FBQUUsc0JBQUEsR0FBSSxHQUFFRCxzQkFBdUIsMENBQXlDO0FBQ2xHLE1BQU1FLHFCQUFxQixHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztBQUVqRSxNQUFNQyxTQUFTLFNBQVNDLGVBQU8sQ0FBQztFQUM5QixNQUFNQyxZQUFZQSxDQUFFQyxHQUFHLEVBQUVDLE1BQU0s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
@@ -1 +1 @@
1
- {"version":3,"file":"uiautomator2.js","names":["_lodash","_interopRequireDefault","require","_driver","_asyncbox","_appiumUiautomator2Server","_support","_bluebird","_helpers","_axios","_path","REQD_PARAMS","SERVER_LAUNCH_TIMEOUT","SERVER_INSTALL_RETRIES","SERVICES_LAUNCH_TIMEOUT","SERVER_PACKAGE_ID","exports","SERVER_TEST_PACKAGE_ID","INSTRUMENTATION_TARGET","instrumentationLogger","logger","getLogger","UIA2Proxy","JWProxy","proxyCommand","url","method","body","didInstrumentationExit","errors","InvalidContextError","UiAutomator2Server","constructor","log","opts","req","util","hasValue","Error","disableSuppressAccessibilityService","proxyOpts","server","host","port","systemPort","keepAlive","readTimeout","timeout","jwproxy","proxyReqRes","bind","command","prepareServerPackage","appPath","appId","tmpRoot","resultInfo","wasSigned","installState","adb","APP_INSTALL_STATE","NOT_INSTALLED","checkApkCert","helpers","isWriteable","warn","dstPath","path","resolve","basename","fs","copyFile","signApp","isAppInstalled","SAME_VERSION_INSTALLED","getApplicationInstallState","installServerApk","installTimeout","tempDir","openDir","packagesInfo","B","all","apkPath","testApkPath","map","debug","JSON","stringify","shouldUninstallServerPackages","some","every","shouldInstallServerPackages","OLDER_VERSION_INSTALLED","includes","info","silentUninstallPkg","pkgId","uninstallApk","err","message","installPkg","pkgPath","install","noIncremental","replace","timeoutCapName","rimraf","verifyServicesAvailability","isPmServiceAvailable","pmOutput","pmError","waitForCondition","shell","e","waitMs","intervalMs","error","line","split","startSession","caps","cleanupAutomationLeftovers","skipServerInstallation","serverVersion","uiautomator2ServerLaunchTimeout","timer","timing","Timer","start","retries","maxRetries","delayBetweenRetries","startInstrumentationProcess","errorAndThrow","delay","getDuration","asMilliSeconds","toFixed","capabilities","firstMatch","alwaysMatch","cmd","disableWindowAnimation","push","_","isBoolean","instrumentationProcess","createSubProcess","on","stdout","stderr","output","trim","code","deleteSession","strictCleanup","axiosTimeout","waitStop","axios","value","data","activeSessionIds","id","filter","Boolean","length","pluralize","delete","forceStop","ignore","killProcessesByName","_default","default"],"sources":["../../lib/uiautomator2.js"],"sourcesContent":["import _ from 'lodash';\nimport { JWProxy, errors } from 'appium/driver';\nimport { waitForCondition } from 'asyncbox';\nimport {\n SERVER_APK_PATH as apkPath,\n TEST_APK_PATH as testApkPath,\n version as serverVersion\n} from 'appium-uiautomator2-server';\nimport {\n util, logger, tempDir, fs, timing\n} from 'appium/support';\nimport B from 'bluebird';\nimport helpers from './helpers';\nimport axios from 'axios';\nimport path from 'path';\n\nconst REQD_PARAMS = ['adb', 'tmpDir', 'host', 'systemPort', 'devicePort', 'disableWindowAnimation'];\nconst SERVER_LAUNCH_TIMEOUT = 30000;\nconst SERVER_INSTALL_RETRIES = 20;\nconst SERVICES_LAUNCH_TIMEOUT = 30000;\nconst SERVER_PACKAGE_ID = 'io.appium.uiautomator2.server';\nconst SERVER_TEST_PACKAGE_ID = `${SERVER_PACKAGE_ID}.test`;\nconst INSTRUMENTATION_TARGET = `${SERVER_TEST_PACKAGE_ID}/androidx.test.runner.AndroidJUnitRunner`;\nconst instrumentationLogger = logger.getLogger('Instrumentation');\n\nclass UIA2Proxy extends JWProxy {\n async proxyCommand (url, method, body = null) {\n if (this.didInstrumentationExit) {\n throw new errors.InvalidContextError(\n `'${method} ${url}' cannot be proxied to UiAutomator2 server because ` +\n 'the instrumentation process is not running (probably crashed). ' +\n 'Check the server log and/or the logcat output for more details');\n }\n return await super.proxyCommand(url, method, body);\n }\n}\n\nclass UiAutomator2Server {\n constructor (log, opts = {}) {\n for (let req of REQD_PARAMS) {\n if (!opts || !util.hasValue(opts[req])) {\n throw new Error(`Option '${req}' is required!`);\n }\n this[req] = opts[req];\n }\n this.log = log;\n this.disableSuppressAccessibilityService = opts.disableSuppressAccessibilityService;\n const proxyOpts = {\n log,\n server: this.host,\n port: this.systemPort,\n keepAlive: true,\n };\n if (opts.readTimeout && opts.readTimeout > 0) {\n proxyOpts.timeout = opts.readTimeout;\n }\n this.jwproxy = new UIA2Proxy(proxyOpts);\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n this.proxyCommand = this.jwproxy.command.bind(this.jwproxy);\n this.jwproxy.didInstrumentationExit = false;\n }\n\n async prepareServerPackage(appPath, appId, tmpRoot) {\n const resultInfo = {\n wasSigned: false,\n installState: this.adb.APP_INSTALL_STATE.NOT_INSTALLED,\n appPath,\n appId,\n };\n\n if (await this.adb.checkApkCert(resultInfo.appPath, appId)) {\n resultInfo.wasSigned = true;\n } else {\n if (!await helpers.isWriteable(appPath)) {\n this.log.warn(\n `Server package at '${appPath}' is not writeable. ` +\n `Will copy it into the temporary location at '${tmpRoot}' as a workaround. ` +\n `Consider making this file writeable manually in order to improve the performance of session startup.`\n );\n const dstPath = path.resolve(tmpRoot, path.basename(appPath));\n await fs.copyFile(appPath, dstPath);\n resultInfo.appPath = dstPath;\n }\n await helpers.signApp(this.adb, resultInfo.appPath);\n }\n\n if (appId === SERVER_TEST_PACKAGE_ID && await this.adb.isAppInstalled(appId)) {\n // There is no point in getting the state for the test server,\n // since it does not contain any version info\n resultInfo.installState = this.adb.APP_INSTALL_STATE.SAME_VERSION_INSTALLED;\n } else if (appId === SERVER_PACKAGE_ID) {\n resultInfo.installState = await this.adb.getApplicationInstallState(resultInfo.appPath, appId);\n }\n\n return resultInfo;\n }\n\n /**\n * Installs the apks on to the device or emulator.\n *\n * @param {number} installTimeout - Installation timeout\n */\n async installServerApk (installTimeout = SERVER_INSTALL_RETRIES * 1000) {\n const tmpRoot = await tempDir.openDir();\n try {\n const packagesInfo = await B.all(\n [\n {\n appPath: apkPath,\n appId: SERVER_PACKAGE_ID,\n }, {\n appPath: testApkPath,\n appId: SERVER_TEST_PACKAGE_ID,\n },\n ].map(({appPath, appId}) => this.prepareServerPackage(appPath, appId, tmpRoot))\n );\n\n this.log.debug(`Server packages status: ${JSON.stringify(packagesInfo)}`);\n // We want to enforce uninstall in case the current server package has not been signed properly\n // or if any of server packages is not installed, while the other does\n const shouldUninstallServerPackages = packagesInfo.some(({wasSigned}) => !wasSigned)\n || (packagesInfo.some(({installState}) => installState === this.adb.APP_INSTALL_STATE.NOT_INSTALLED)\n && !packagesInfo.every(({installState}) => installState === this.adb.APP_INSTALL_STATE.NOT_INSTALLED));\n // Install must always follow uninstall. Also, perform the install if\n // any of server packages is not installed or is outdated\n const shouldInstallServerPackages = shouldUninstallServerPackages || packagesInfo.some(({installState}) => [\n this.adb.APP_INSTALL_STATE.NOT_INSTALLED,\n this.adb.APP_INSTALL_STATE.OLDER_VERSION_INSTALLED,\n ].includes(installState));\n this.log.info(`Server packages are ${shouldInstallServerPackages ? '' : 'not '}going to be (re)installed`);\n if (shouldInstallServerPackages && shouldUninstallServerPackages) {\n this.log.info('Full packages reinstall is going to be performed');\n }\n if (shouldUninstallServerPackages) {\n const silentUninstallPkg = async (pkgId) => {\n try {\n await this.adb.uninstallApk(pkgId);\n } catch (err) {\n this.log.info(`Cannot uninstall '${pkgId}': ${err.message}`);\n }\n };\n await B.all(packagesInfo.map(({appId}) => silentUninstallPkg(appId)));\n }\n if (shouldInstallServerPackages) {\n const installPkg = async (pkgPath) => {\n await this.adb.install(pkgPath, {\n noIncremental: true,\n replace: true,\n timeout: installTimeout,\n timeoutCapName: 'uiautomator2ServerInstallTimeout'\n });\n };\n await B.all(packagesInfo.map(({appPath}) => installPkg(appPath)));\n }\n } finally {\n await fs.rimraf(tmpRoot);\n }\n\n await this.verifyServicesAvailability();\n }\n\n async verifyServicesAvailability () {\n this.log.debug(`Waiting up to ${SERVICES_LAUNCH_TIMEOUT}ms for services to be available`);\n let isPmServiceAvailable = false;\n let pmOutput = '';\n let pmError = null;\n try {\n await waitForCondition(async () => {\n if (!isPmServiceAvailable) {\n pmError = null;\n pmOutput = '';\n try {\n pmOutput = await this.adb.shell(['pm', 'list', 'instrumentation']);\n } catch (e) {\n pmError = e;\n }\n if (pmOutput.includes('Could not access the Package Manager')) {\n pmError = new Error(`Problem running Package Manager: ${pmOutput}`);\n pmOutput = ''; // remove output, so it is not printed below\n } else if (pmOutput.includes(INSTRUMENTATION_TARGET)) {\n pmOutput = ''; // remove output, so it is not printed below\n this.log.debug(`Instrumentation target '${INSTRUMENTATION_TARGET}' is available`);\n // eslint-disable-next-line require-atomic-updates\n isPmServiceAvailable = true;\n } else if (!pmError) {\n pmError = new Error('The instrumentation target is not listed by Package Manager');\n }\n }\n return isPmServiceAvailable;\n }, {\n waitMs: SERVICES_LAUNCH_TIMEOUT,\n intervalMs: 1000,\n });\n } catch (err) {\n this.log.error(`Unable to find instrumentation target '${INSTRUMENTATION_TARGET}': ${(pmError || {}).message}`);\n if (pmOutput) {\n this.log.debug('Available targets:');\n for (const line of pmOutput.split('\\n')) {\n this.log.debug(` ${line.replace('instrumentation:', '')}`);\n }\n }\n }\n }\n\n async startSession (caps) {\n await this.cleanupAutomationLeftovers();\n if (caps.skipServerInstallation) {\n this.log.info(`'skipServerInstallation' is set. Attempting to use UIAutomator2 server from the device`);\n } else {\n this.log.info(`Starting UIAutomator2 server ${serverVersion}`);\n this.log.info(`Using UIAutomator2 server from '${apkPath}' and test from '${testApkPath}'`);\n }\n\n const timeout = caps.uiautomator2ServerLaunchTimeout || SERVER_LAUNCH_TIMEOUT;\n const timer = new timing.Timer().start();\n let retries = 0;\n const maxRetries = 2;\n const delayBetweenRetries = 3000;\n while (retries < maxRetries) {\n this.log.info(`Waiting up to ${timeout}ms for UiAutomator2 to be online...`);\n this.jwproxy.didInstrumentationExit = false;\n await this.startInstrumentationProcess();\n if (!this.jwproxy.didInstrumentationExit) {\n try {\n await waitForCondition(async () => {\n try {\n await this.jwproxy.command('/status', 'GET');\n return true;\n } catch (err) {\n // short circuit to retry or fail fast\n return this.jwproxy.didInstrumentationExit;\n }\n }, {\n waitMs: timeout,\n intervalMs: 1000,\n });\n } catch (err) {\n this.log.errorAndThrow(`The instrumentation process cannot be initialized within ${timeout}ms timeout. `\n + 'Make sure the application under test does not crash and investigate the logcat output. '\n + `You could also try to increase the value of 'uiautomator2ServerLaunchTimeout' capability`);\n }\n }\n if (!this.jwproxy.didInstrumentationExit) {\n break;\n }\n\n retries++;\n if (retries >= maxRetries) {\n this.log.errorAndThrow('The instrumentation process cannot be initialized. '\n + 'Make sure the application under test does not crash and investigate the logcat output.');\n }\n this.log.warn(`The instrumentation process has been unexpectedly terminated. `\n + `Retrying UiAutomator2 startup (#${retries} of ${maxRetries - 1})`);\n await this.cleanupAutomationLeftovers(true);\n await B.delay(delayBetweenRetries);\n }\n\n this.log.debug(`The initialization of the instrumentation process took `\n + `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n await this.jwproxy.command('/session', 'POST', {\n capabilities: {\n firstMatch: [caps],\n alwaysMatch: {},\n }\n });\n }\n\n async startInstrumentationProcess () {\n const cmd = ['am', 'instrument', '-w'];\n if (this.disableWindowAnimation) {\n cmd.push('--no-window-animation');\n }\n if (_.isBoolean(this.disableSuppressAccessibilityService)) {\n cmd.push('-e', 'DISABLE_SUPPRESS_ACCESSIBILITY_SERVICES', this.disableSuppressAccessibilityService);\n }\n // Disable Google analytics to prevent possible fatal exception\n cmd.push('-e', 'disableAnalytics', true);\n cmd.push(INSTRUMENTATION_TARGET);\n const instrumentationProcess = this.adb.createSubProcess(['shell', ...cmd]);\n instrumentationProcess.on('output', (stdout, stderr) => {\n const output = _.trim(stdout || stderr);\n if (output) {\n instrumentationLogger.debug(output);\n }\n });\n instrumentationProcess.on('exit', (code) => {\n instrumentationLogger.debug(`The process has exited with code ${code}`);\n this.jwproxy.didInstrumentationExit = true;\n });\n await instrumentationProcess.start(0);\n }\n\n async deleteSession () {\n this.log.debug('Deleting UiAutomator2 server session');\n // rely on jwproxy's intelligence to know what we're talking about and\n // delete the current session\n try {\n await this.jwproxy.command('/', 'DELETE');\n } catch (err) {\n this.log.warn(`Did not get confirmation UiAutomator2 deleteSession worked; ` +\n `Error was: ${err}`);\n }\n }\n\n async cleanupAutomationLeftovers (strictCleanup = false) {\n this.log.debug(`Performing ${strictCleanup ? 'strict' : 'shallow'} cleanup of automation leftovers`);\n\n const axiosTimeout = 500;\n\n const waitStop = async () => {\n // Wait for the process stop by sending a status request to the port.\n // We observed the process stop could be delayed, thus causing unexpected crashes\n // in the middle of the session preparation process. It caused an invalid session error response\n // by the uia2 server, but that was because the process stop's delay.\n const timeout = 3000;\n try {\n await waitForCondition(async () => {\n try {\n await axios({\n url: `http://${this.host}:${this.systemPort}/status`,\n timeout: axiosTimeout,\n });\n } catch (err) {\n return true;\n }\n }, {\n waitMs: timeout,\n intervalMs: 100,\n });\n } catch (err) {\n this.log.warn(`The ${SERVER_TEST_PACKAGE_ID} process might fail to stop within ${timeout}ms timeout.`);\n }\n };\n\n try {\n const {value} = (await axios({\n url: `http://${this.host}:${this.systemPort}/sessions`,\n timeout: axiosTimeout,\n })).data;\n const activeSessionIds = value.map(({id}) => id).filter(Boolean);\n if (activeSessionIds.length) {\n this.log.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);\n this.log.debug(`Cleaning up ${util.pluralize('obsolete session', activeSessionIds.length, true)}`);\n await B.all(activeSessionIds\n .map((id) => axios.delete(`http://${this.host}:${this.systemPort}/session/${id}`))\n );\n // Let all sessions to be properly terminated before continuing\n await B.delay(1000);\n } else {\n this.log.debug('No obsolete sessions have been detected');\n }\n } catch (e) {\n this.log.debug(`No obsolete sessions have been detected (${e.message})`);\n }\n\n try {\n await this.adb.forceStop(SERVER_TEST_PACKAGE_ID);\n } catch (ignore) {}\n if (strictCleanup) {\n // https://github.com/appium/appium/issues/10749\n try {\n await this.adb.killProcessesByName('uiautomator');\n } catch (ignore) {}\n }\n await waitStop();\n }\n}\n\nexport { UiAutomator2Server, INSTRUMENTATION_TARGET, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID };\nexport default UiAutomator2Server;\n"],"mappings":"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"}
1
+ {"version":3,"file":"uiautomator2.js","names":["_lodash","_interopRequireDefault","require","_driver","_asyncbox","_appiumUiautomator2Server","_support","_bluebird","_helpers","_axios","_path","REQD_PARAMS","SERVER_LAUNCH_TIMEOUT","SERVER_INSTALL_RETRIES","SERVICES_LAUNCH_TIMEOUT","SERVER_PACKAGE_ID","exports","SERVER_TEST_PACKAGE_ID","INSTRUMENTATION_TARGET","instrumentationLogger","logger","getLogger","UIA2Proxy","JWProxy","proxyCommand","url","method","body","didInstrumentationExit","errors","InvalidContextError","UiAutomator2Server","constructor","log","opts","req","util","hasValue","Error","disableSuppressAccessibilityService","proxyOpts","server","host","port","systemPort","keepAlive","readTimeout","timeout","jwproxy","proxyReqRes","bind","command","prepareServerPackage","appPath","appId","tmpRoot","resultInfo","wasSigned","installState","adb","APP_INSTALL_STATE","NOT_INSTALLED","checkApkCert","helpers","isWriteable","warn","dstPath","path","resolve","basename","fs","copyFile","signApp","isAppInstalled","SAME_VERSION_INSTALLED","getApplicationInstallState","installServerApk","installTimeout","tempDir","openDir","packagesInfo","B","all","apkPath","testApkPath","map","debug","JSON","stringify","shouldUninstallServerPackages","some","every","shouldInstallServerPackages","OLDER_VERSION_INSTALLED","includes","info","silentUninstallPkg","pkgId","uninstallApk","err","message","installPkg","pkgPath","install","noIncremental","replace","timeoutCapName","rimraf","verifyServicesAvailability","isPmServiceAvailable","pmOutput","pmError","waitForCondition","shell","e","waitMs","intervalMs","error","line","split","startSession","caps","cleanupAutomationLeftovers","skipServerInstallation","serverVersion","uiautomator2ServerLaunchTimeout","timer","timing","Timer","start","retries","maxRetries","delayBetweenRetries","startInstrumentationProcess","errorAndThrow","delay","getDuration","asMilliSeconds","toFixed","capabilities","firstMatch","alwaysMatch","cmd","disableWindowAnimation","push","_","isBoolean","instrumentationProcess","createSubProcess","on","stdout","stderr","output","trim","code","deleteSession","strictCleanup","axiosTimeout","waitStop","axios","value","data","activeSessionIds","id","filter","Boolean","length","pluralize","delete","forceStop","ignore","killProcessesByName","_default","default"],"sources":["../../lib/uiautomator2.js"],"sourcesContent":["import _ from 'lodash';\nimport { JWProxy, errors } from 'appium/driver';\nimport { waitForCondition } from 'asyncbox';\nimport {\n SERVER_APK_PATH as apkPath,\n TEST_APK_PATH as testApkPath,\n version as serverVersion\n} from 'appium-uiautomator2-server';\nimport {\n util, logger, tempDir, fs, timing\n} from 'appium/support';\nimport B from 'bluebird';\nimport helpers from './helpers';\nimport axios from 'axios';\nimport path from 'path';\n\nconst REQD_PARAMS = ['adb', 'tmpDir', 'host', 'systemPort', 'devicePort', 'disableWindowAnimation'];\nconst SERVER_LAUNCH_TIMEOUT = 30000;\nconst SERVER_INSTALL_RETRIES = 20;\nconst SERVICES_LAUNCH_TIMEOUT = 30000;\nconst SERVER_PACKAGE_ID = 'io.appium.uiautomator2.server';\nconst SERVER_TEST_PACKAGE_ID = `${SERVER_PACKAGE_ID}.test`;\nconst INSTRUMENTATION_TARGET = `${SERVER_TEST_PACKAGE_ID}/androidx.test.runner.AndroidJUnitRunner`;\nconst instrumentationLogger = logger.getLogger('Instrumentation');\n\nclass UIA2Proxy extends JWProxy {\n async proxyCommand (url, method, body = null) {\n if (this.didInstrumentationExit) {\n throw new errors.InvalidContextError(\n `'${method} ${url}' cannot be proxied to UiAutomator2 server because ` +\n 'the instrumentation process is not running (probably crashed). ' +\n 'Check the server log and/or the logcat output for more details');\n }\n return await super.proxyCommand(url, method, body);\n }\n}\n\nclass UiAutomator2Server {\n constructor (log, opts = {}) {\n for (let req of REQD_PARAMS) {\n if (!opts || !util.hasValue(opts[req])) {\n throw new Error(`Option '${req}' is required!`);\n }\n this[req] = opts[req];\n }\n this.log = log;\n this.disableSuppressAccessibilityService = opts.disableSuppressAccessibilityService;\n const proxyOpts = {\n log,\n server: this.host,\n port: this.systemPort,\n keepAlive: true,\n };\n if (opts.readTimeout && opts.readTimeout > 0) {\n proxyOpts.timeout = opts.readTimeout;\n }\n this.jwproxy = new UIA2Proxy(proxyOpts);\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n this.proxyCommand = this.jwproxy.command.bind(this.jwproxy);\n this.jwproxy.didInstrumentationExit = false;\n }\n\n async prepareServerPackage(appPath, appId, tmpRoot) {\n const resultInfo = {\n wasSigned: false,\n installState: this.adb.APP_INSTALL_STATE.NOT_INSTALLED,\n appPath,\n appId,\n };\n\n if (await this.adb.checkApkCert(resultInfo.appPath, appId)) {\n resultInfo.wasSigned = true;\n } else {\n if (!await helpers.isWriteable(appPath)) {\n this.log.warn(\n `Server package at '${appPath}' is not writeable. ` +\n `Will copy it into the temporary location at '${tmpRoot}' as a workaround. ` +\n `Consider making this file writeable manually in order to improve the performance of session startup.`\n );\n const dstPath = path.resolve(tmpRoot, path.basename(appPath));\n await fs.copyFile(appPath, dstPath);\n resultInfo.appPath = dstPath;\n }\n await helpers.signApp(this.adb, resultInfo.appPath);\n }\n\n if (appId === SERVER_TEST_PACKAGE_ID && await this.adb.isAppInstalled(appId)) {\n // There is no point in getting the state for the test server,\n // since it does not contain any version info\n resultInfo.installState = this.adb.APP_INSTALL_STATE.SAME_VERSION_INSTALLED;\n } else if (appId === SERVER_PACKAGE_ID) {\n resultInfo.installState = await this.adb.getApplicationInstallState(resultInfo.appPath, appId);\n }\n\n return resultInfo;\n }\n\n /**\n * Installs the apks on to the device or emulator.\n *\n * @param {number} installTimeout - Installation timeout\n */\n async installServerApk (installTimeout = SERVER_INSTALL_RETRIES * 1000) {\n const tmpRoot = await tempDir.openDir();\n try {\n const packagesInfo = await B.all(\n [\n {\n appPath: apkPath,\n appId: SERVER_PACKAGE_ID,\n }, {\n appPath: testApkPath,\n appId: SERVER_TEST_PACKAGE_ID,\n },\n ].map(({appPath, appId}) => this.prepareServerPackage(appPath, appId, tmpRoot))\n );\n\n this.log.debug(`Server packages status: ${JSON.stringify(packagesInfo)}`);\n // We want to enforce uninstall in case the current server package has not been signed properly\n // or if any of server packages is not installed, while the other does\n const shouldUninstallServerPackages = packagesInfo.some(({wasSigned}) => !wasSigned)\n || (packagesInfo.some(({installState}) => installState === this.adb.APP_INSTALL_STATE.NOT_INSTALLED)\n && !packagesInfo.every(({installState}) => installState === this.adb.APP_INSTALL_STATE.NOT_INSTALLED));\n // Install must always follow uninstall. Also, perform the install if\n // any of server packages is not installed or is outdated\n const shouldInstallServerPackages = shouldUninstallServerPackages || packagesInfo.some(({installState}) => [\n this.adb.APP_INSTALL_STATE.NOT_INSTALLED,\n this.adb.APP_INSTALL_STATE.OLDER_VERSION_INSTALLED,\n ].includes(installState));\n this.log.info(`Server packages are ${shouldInstallServerPackages ? '' : 'not '}going to be (re)installed`);\n if (shouldInstallServerPackages && shouldUninstallServerPackages) {\n this.log.info('Full packages reinstall is going to be performed');\n }\n if (shouldUninstallServerPackages) {\n const silentUninstallPkg = async (pkgId) => {\n try {\n await this.adb.uninstallApk(pkgId);\n } catch (err) {\n this.log.info(`Cannot uninstall '${pkgId}': ${err.message}`);\n }\n };\n await B.all(packagesInfo.map(({appId}) => silentUninstallPkg(appId)));\n }\n if (shouldInstallServerPackages) {\n const installPkg = async (pkgPath) => {\n await this.adb.install(pkgPath, {\n noIncremental: true,\n replace: true,\n timeout: installTimeout,\n timeoutCapName: 'uiautomator2ServerInstallTimeout'\n });\n };\n await B.all(packagesInfo.map(({appPath}) => installPkg(appPath)));\n }\n } finally {\n await fs.rimraf(tmpRoot);\n }\n\n await this.verifyServicesAvailability();\n }\n\n async verifyServicesAvailability () {\n this.log.debug(`Waiting up to ${SERVICES_LAUNCH_TIMEOUT}ms for services to be available`);\n let isPmServiceAvailable = false;\n let pmOutput = '';\n let pmError = null;\n try {\n await waitForCondition(async () => {\n if (!isPmServiceAvailable) {\n pmError = null;\n pmOutput = '';\n try {\n pmOutput = await this.adb.shell(['pm', 'list', 'instrumentation']);\n } catch (e) {\n pmError = e;\n }\n if (pmOutput.includes('Could not access the Package Manager')) {\n pmError = new Error(`Problem running Package Manager: ${pmOutput}`);\n pmOutput = ''; // remove output, so it is not printed below\n } else if (pmOutput.includes(INSTRUMENTATION_TARGET)) {\n pmOutput = ''; // remove output, so it is not printed below\n this.log.debug(`Instrumentation target '${INSTRUMENTATION_TARGET}' is available`);\n // eslint-disable-next-line require-atomic-updates\n isPmServiceAvailable = true;\n } else if (!pmError) {\n pmError = new Error('The instrumentation target is not listed by Package Manager');\n }\n }\n return isPmServiceAvailable;\n }, {\n waitMs: SERVICES_LAUNCH_TIMEOUT,\n intervalMs: 1000,\n });\n } catch (err) {\n this.log.error(`Unable to find instrumentation target '${INSTRUMENTATION_TARGET}': ${(pmError || {}).message}`);\n if (pmOutput) {\n this.log.debug('Available targets:');\n for (const line of pmOutput.split('\\n')) {\n this.log.debug(` ${line.replace('instrumentation:', '')}`);\n }\n }\n }\n }\n\n async startSession (caps) {\n await this.cleanupAutomationLeftovers();\n if (caps.skipServerInstallation) {\n this.log.info(`'skipServerInstallation' is set. Attempting to use UIAutomator2 server from the device`);\n } else {\n this.log.info(`Starting UIAutomator2 server ${serverVersion}`);\n this.log.info(`Using UIAutomator2 server from '${apkPath}' and test from '${testApkPath}'`);\n }\n\n const timeout = caps.uiautomator2ServerLaunchTimeout || SERVER_LAUNCH_TIMEOUT;\n const timer = new timing.Timer().start();\n let retries = 0;\n const maxRetries = 2;\n const delayBetweenRetries = 3000;\n while (retries < maxRetries) {\n this.log.info(`Waiting up to ${timeout}ms for UiAutomator2 to be online...`);\n this.jwproxy.didInstrumentationExit = false;\n await this.startInstrumentationProcess();\n if (!this.jwproxy.didInstrumentationExit) {\n try {\n await waitForCondition(async () => {\n try {\n await this.jwproxy.command('/status', 'GET');\n return true;\n } catch (err) {\n // short circuit to retry or fail fast\n return this.jwproxy.didInstrumentationExit;\n }\n }, {\n waitMs: timeout,\n intervalMs: 1000,\n });\n } catch (err) {\n this.log.errorAndThrow(`The instrumentation process cannot be initialized within ${timeout}ms timeout. `\n + 'Make sure the application under test does not crash and investigate the logcat output. '\n + `You could also try to increase the value of 'uiautomator2ServerLaunchTimeout' capability`);\n }\n }\n if (!this.jwproxy.didInstrumentationExit) {\n break;\n }\n\n retries++;\n if (retries >= maxRetries) {\n this.log.errorAndThrow('The instrumentation process cannot be initialized. '\n + 'Make sure the application under test does not crash and investigate the logcat output.');\n }\n this.log.warn(`The instrumentation process has been unexpectedly terminated. `\n + `Retrying UiAutomator2 startup (#${retries} of ${maxRetries - 1})`);\n await this.cleanupAutomationLeftovers(true);\n await B.delay(delayBetweenRetries);\n }\n\n this.log.debug(`The initialization of the instrumentation process took `\n + `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n await this.jwproxy.command('/session', 'POST', {\n capabilities: {\n firstMatch: [caps],\n alwaysMatch: {},\n }\n });\n }\n\n async startInstrumentationProcess () {\n const cmd = ['am', 'instrument', '-w'];\n if (this.disableWindowAnimation) {\n cmd.push('--no-window-animation');\n }\n if (_.isBoolean(this.disableSuppressAccessibilityService)) {\n cmd.push('-e', 'DISABLE_SUPPRESS_ACCESSIBILITY_SERVICES', this.disableSuppressAccessibilityService);\n }\n // Disable Google analytics to prevent possible fatal exception\n cmd.push('-e', 'disableAnalytics', true);\n cmd.push(INSTRUMENTATION_TARGET);\n const instrumentationProcess = this.adb.createSubProcess(['shell', ...cmd]);\n instrumentationProcess.on('output', (stdout, stderr) => {\n const output = _.trim(stdout || stderr);\n if (output) {\n instrumentationLogger.debug(output);\n }\n });\n instrumentationProcess.on('exit', (code) => {\n instrumentationLogger.debug(`The process has exited with code ${code}`);\n this.jwproxy.didInstrumentationExit = true;\n });\n await instrumentationProcess.start(0);\n }\n\n async deleteSession () {\n this.log.debug('Deleting UiAutomator2 server session');\n // rely on jwproxy's intelligence to know what we're talking about and\n // delete the current session\n try {\n await this.jwproxy.command('/', 'DELETE');\n } catch (err) {\n this.log.warn(`Did not get confirmation UiAutomator2 deleteSession worked; ` +\n `Error was: ${err}`);\n }\n }\n\n async cleanupAutomationLeftovers (strictCleanup = false) {\n this.log.debug(`Performing ${strictCleanup ? 'strict' : 'shallow'} cleanup of automation leftovers`);\n\n const axiosTimeout = 500;\n\n const waitStop = async () => {\n // Wait for the process stop by sending a status request to the port.\n // We observed the process stop could be delayed, thus causing unexpected crashes\n // in the middle of the session preparation process. It caused an invalid session error response\n // by the uia2 server, but that was because the process stop's delay.\n const timeout = 3000;\n try {\n await waitForCondition(async () => {\n try {\n await axios({\n url: `http://${this.host}:${this.systemPort}/status`,\n timeout: axiosTimeout,\n });\n } catch (err) {\n return true;\n }\n }, {\n waitMs: timeout,\n intervalMs: 100,\n });\n } catch (err) {\n this.log.warn(`The ${SERVER_TEST_PACKAGE_ID} process might fail to stop within ${timeout}ms timeout.`);\n }\n };\n\n try {\n const {value} = (await axios({\n url: `http://${this.host}:${this.systemPort}/sessions`,\n timeout: axiosTimeout,\n })).data;\n const activeSessionIds = value.map(({id}) => id).filter(Boolean);\n if (activeSessionIds.length) {\n this.log.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);\n this.log.debug(`Cleaning up ${util.pluralize('obsolete session', activeSessionIds.length, true)}`);\n await B.all(activeSessionIds\n .map((id) => axios.delete(`http://${this.host}:${this.systemPort}/session/${id}`))\n );\n // Let all sessions to be properly terminated before continuing\n await B.delay(1000);\n } else {\n this.log.debug('No obsolete sessions have been detected');\n }\n } catch (e) {\n this.log.debug(`No obsolete sessions have been detected (${e.message})`);\n }\n\n try {\n await this.adb.forceStop(SERVER_TEST_PACKAGE_ID);\n } catch (ignore) {}\n if (strictCleanup) {\n // https://github.com/appium/appium/issues/10749\n try {\n await this.adb.killProcessesByName('uiautomator');\n } catch (ignore) {}\n }\n await waitStop();\n }\n}\n\nexport { UiAutomator2Server, INSTRUMENTATION_TARGET, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID };\nexport default UiAutomator2Server;\n"],"mappings":"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"}