appium-android-driver 5.2.10 → 5.3.0

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 (41) hide show
  1. package/README.md +0 -38
  2. package/build/index.js +2 -4
  3. package/build/lib/android-helpers.js +77 -7
  4. package/build/lib/bootstrap.js +24 -7
  5. package/build/lib/commands/actions.js +2 -4
  6. package/build/lib/commands/alert.js +2 -4
  7. package/build/lib/commands/app-management.js +55 -5
  8. package/build/lib/commands/context.js +2 -4
  9. package/build/lib/commands/coverage.js +2 -4
  10. package/build/lib/commands/element.js +2 -4
  11. package/build/lib/commands/emu-console.js +2 -4
  12. package/build/lib/commands/execute.js +8 -4
  13. package/build/lib/commands/file-actions.js +2 -4
  14. package/build/lib/commands/find.js +2 -4
  15. package/build/lib/commands/general.js +2 -4
  16. package/build/lib/commands/ime.js +2 -4
  17. package/build/lib/commands/index.js +2 -4
  18. package/build/lib/commands/intent.js +2 -4
  19. package/build/lib/commands/log.js +2 -4
  20. package/build/lib/commands/media-projection.js +2 -4
  21. package/build/lib/commands/network.js +2 -4
  22. package/build/lib/commands/performance.js +2 -4
  23. package/build/lib/commands/recordscreen.js +11 -8
  24. package/build/lib/commands/shell.js +2 -4
  25. package/build/lib/commands/streamscreen.js +2 -4
  26. package/build/lib/commands/system-bars.js +2 -4
  27. package/build/lib/commands/touch.js +2 -4
  28. package/build/lib/desired-caps.js +2 -4
  29. package/build/lib/driver.js +11 -8
  30. package/build/lib/logger.js +2 -4
  31. package/build/lib/uiautomator.js +2 -4
  32. package/build/lib/unlock-helpers.js +2 -4
  33. package/build/lib/webview-helpers.js +3 -5
  34. package/lib/android-helpers.js +64 -3
  35. package/lib/bootstrap.js +25 -3
  36. package/lib/commands/app-management.js +134 -2
  37. package/lib/commands/execute.js +6 -0
  38. package/lib/commands/recordscreen.js +6 -3
  39. package/lib/driver.js +9 -4
  40. package/lib/webview-helpers.js +1 -1
  41. package/package.json +44 -25
@@ -340,7 +340,7 @@ helpers.getWebViewsMapping = async function getWebViewsMapping(adb, {
340
340
  process
341
341
  });
342
342
  } else if (WEBVIEWS_DETAILS_CACHE.has(key)) {
343
- WEBVIEWS_DETAILS_CACHE.del(key);
343
+ WEBVIEWS_DETAILS_CACHE.delete(key);
344
344
  }
345
345
  }
346
346
 
@@ -449,7 +449,5 @@ helpers.createChromedriverCaps = function createChromedriverCaps(opts, deviceId,
449
449
  };
450
450
 
451
451
  var _default = helpers;
452
- exports.default = _default;require('source-map-support').install();
453
-
454
-
455
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3dlYnZpZXctaGVscGVycy5qcyIsIm5hbWVzIjpbIk5BVElWRV9XSU4iLCJXRUJWSUVXX1dJTiIsIkNIUk9NSVVNX1dJTiIsIldFQlZJRVdfQkFTRSIsIldFQlZJRVdfUElEX1BBVFRFUk4iLCJSZWdFeHAiLCJXRUJWSUVXX1BLR19QQVRURVJOIiwiREVWVE9PTFNfU09DS0VUX1BBVFRFUk4iLCJDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4iLCJDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQiLCJDSFJPTUVfUEFDS0FHRV9OQU1FIiwiS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMiLCJERVZUT09MU19QT1JUU19SQU5HRSIsIldFQlZJRVdTX0RFVEFJTFNfQ0FDSEUiLCJMUlUiLCJtYXgiLCJ1cGRhdGVBZ2VPbkdldCIsIkNEUF9SRVFfVElNRU9VVCIsIkRFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsImhlbHBlcnMiLCJ0b0RldGFpbHNDYWNoZUtleSIsImFkYiIsIndlYnZpZXciLCJjdXJEZXZpY2VJZCIsImdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyIsIm91dCIsInNoZWxsIiwibmFtZXMiLCJhbGxNYXRjaGVzIiwibGluZSIsInNwbGl0IiwiZmxhZ3MiLCJzdCIsInNvY2tQYXRoIiwidHJpbSIsInN0YXJ0c1dpdGgiLCJwdXNoIiwidGVzdCIsIl8iLCJpc0VtcHR5IiwibG9nZ2VyIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGVuZ3RoIiwicGx1cmFsaXplIiwidW5pcSIsIndlYnZpZXdzRnJvbVByb2NzIiwiZGV2aWNlU29ja2V0Iiwic29ja2V0TmFtZXMiLCJ3ZWJ2aWV3cyIsInNvY2tldE5hbWUiLCJwcm9jIiwic29ja2V0TmFtZU1hdGNoIiwiZXhlYyIsImNyb3Nzd2Fsa01hdGNoIiwiYWxsb2NhdGVEZXZ0b29sc1BvcnQiLCJ3ZWJ2aWV3RGV2dG9vbHNQb3J0IiwicmVtb3RlUG9ydCIsInJlcGxhY2UiLCJzdGFydFBvcnQiLCJlbmRQb3J0IiwibG9jYWxQb3J0IiwiZmluZEFQb3J0Tm90SW5Vc2UiLCJlIiwiRXJyb3IiLCJhZGJFeGVjIiwiY29sbGVjdFdlYnZpZXdzRGV0YWlscyIsIndlYnZpZXdzTWFwcGluZyIsIm9wdHMiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsImVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiIsImluZm8iLCJkZXRhaWxDb2xsZWN0b3JzIiwiaXRlbSIsImNkcEluZm8iLCJwYWdlcyIsImNkcExpc3QiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsIkIiLCJhbGwiLCJheGlvcyIsInVybCIsImRhdGEiLCJwcm9jRnJvbVdlYnZpZXciLCJwaWRNYXRjaCIsInBpZCIsInBrZyIsImdldE5hbWVCeVBpZCIsInBhcnNlV2Vidmlld05hbWVzIiwiaXNDaHJvbWVTZXNzaW9uIiwicmVzdWx0Iiwid2Vidmlld05hbWUiLCJnZXRXZWJWaWV3c01hcHBpbmciLCJhbmRyb2lkRGV2aWNlU29ja2V0Iiwid2Vidmlld01hcHBpbmciLCJ3dk5hbWUiLCJwcm9jZXNzIiwidW5kZWZpbmVkIiwicGtnTWF0Y2giLCJuYW1lIiwiaWQiLCJ3YXJuIiwibWVzc2FnZSIsImtleSIsInNldCIsImhhcyIsImRlbCIsImdldFdlYnZpZXdEZXRhaWxzIiwiZ2V0IiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsImRldmljZUlkIiwid2ViVmlld0RldGFpbHMiLCJjYXBzIiwiY2hyb21lT3B0aW9ucyIsImFuZHJvaWRQYWNrYWdlIiwiYXBwUGFja2FnZSIsImlzQm9vbGVhbiIsImNocm9tZVVzZVJ1bm5pbmdBcHAiLCJhbmRyb2lkVXNlUnVubmluZ0FwcCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYW5kcm9pZEFjdGl2aXR5IiwiY2hyb21lQW5kcm9pZFByb2Nlc3MiLCJhbmRyb2lkUHJvY2VzcyIsInRvTG93ZXIiLCJicm93c2VyTmFtZSIsImFwcEFjdGl2aXR5IiwicGFnZUxvYWRTdHJhdGVneSIsImlzQ2hyb21lIiwiaW5jbHVkZXMiLCJhbmRyb2lkRGV2aWNlU2VyaWFsIiwiaXNQbGFpbk9iamVjdCIsImxvZ2dpbmdQcmVmcyIsImNocm9tZUxvZ2dpbmdQcmVmcyIsImVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyIsIm5ld1ByZWYiLCJwZXJmb3JtYW5jZSIsIk9iamVjdCIsImFzc2lnbiIsIkFyZ3VtZW50cyIsImFyZ3MiLCJwcm90ZWN0ZWRDYXBOYW1lcyIsIm9wdCIsInZhbCIsInRvUGFpcnMiLCJpc1VuZGVmaW5lZCIsIm9wdE5hbWUiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvd2Vidmlldy1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5cbmNvbnN0IE5BVElWRV9XSU4gPSAnTkFUSVZFX0FQUCc7XG5jb25zdCBXRUJWSUVXX1dJTiA9ICdXRUJWSUVXJztcbmNvbnN0IENIUk9NSVVNX1dJTiA9ICdDSFJPTUlVTSc7XG5jb25zdCBXRUJWSUVXX0JBU0UgPSBgJHtXRUJWSUVXX1dJTn1fYDtcbmNvbnN0IFdFQlZJRVdfUElEX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtXRUJWSUVXX0JBU0V9KFxcXFxkKylgKTtcbmNvbnN0IFdFQlZJRVdfUEtHX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtXRUJWSUVXX0JBU0V9KFteXFxcXGRcXFxcc11bXFxcXHcuXSopYCk7XG5jb25zdCBERVZUT09MU19TT0NLRVRfUEFUVEVSTiA9IC9AW1xcdy5dK19kZXZ0b29sc19yZW1vdGVfPyhcXGQrKT9cXGIvO1xuY29uc3QgQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOID0gL0AoW1xcdy5dKylfZGV2dG9vbHNfcmVtb3RlXFxiLztcbmNvbnN0IENIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCA9ICdjaHJvbWVfZGV2dG9vbHNfcmVtb3RlJztcbmNvbnN0IENIUk9NRV9QQUNLQUdFX05BTUUgPSAnY29tLmFuZHJvaWQuY2hyb21lJztcbmNvbnN0IEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTID0gW1xuICBDSFJPTUVfUEFDS0FHRV9OQU1FLFxuICAnY29tLmNocm9tZS5iZXRhJyxcbiAgJ2NvbS5jaHJvbWUuZGV2JyxcbiAgJ2NvbS5jaHJvbWUuY2FuYXJ5Jyxcbl07XG5jb25zdCBERVZUT09MU19QT1JUU19SQU5HRSA9IFsxMDkwMCwgMTEwMDBdO1xuY29uc3QgV0VCVklFV1NfREVUQUlMU19DQUNIRSA9IG5ldyBMUlUoe1xuICBtYXg6IDEwMCxcbiAgdXBkYXRlQWdlT25HZXQ6IHRydWUsXG59KTtcbmNvbnN0IENEUF9SRVFfVElNRU9VVCA9IDIwMDA7IC8vIG1zXG5jb25zdCBERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ2FuZHJvaWRfZGV2dG9vbHNfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogNywgdHJ5UmVjb3Zlcnk6IHRydWV9XG4pO1xuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmZ1bmN0aW9uIHRvRGV0YWlsc0NhY2hlS2V5IChhZGIsIHdlYnZpZXcpIHtcbiAgcmV0dXJuIGAke2FkYj8uY3VyRGV2aWNlSWR9OiR7d2Vidmlld31gO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIGxpc3Qgb2YgYW5kcm9pZCBzeXN0ZW0gcHJvY2Vzc2VzIGFuZCByZXR1cm5zIG9uZXNcbiAqIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzXG4gKiBTZWUgaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSAtIGEgbGlzdCBvZiBtYXRjaGluZyB3ZWJ2aWV3IHNvY2tldCBuYW1lcyAoaW5jbHVkaW5nIHRoZSBsZWFkaW5nICdAJylcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzIChhZGIpIHtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgJy9wcm9jL25ldC91bml4J10pO1xuICBjb25zdCBuYW1lcyA9IFtdO1xuICBjb25zdCBhbGxNYXRjaGVzID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgLy8gTnVtIFJlZkNvdW50IFByb3RvY29sIEZsYWdzIFR5cGUgU3QgSW5vZGUgUGF0aFxuICAgIGNvbnN0IFssLCwgZmxhZ3MsLCBzdCwsIHNvY2tQYXRoXSA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKCFzb2NrUGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChzb2NrUGF0aC5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgIGFsbE1hdGNoZXMucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgfVxuICAgIGlmIChmbGFncyAhPT0gJzAwMDEwMDAwJyB8fCBzdCAhPT0gJzAxJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghREVWVE9PTFNfU09DS0VUX1BBVFRFUk4udGVzdChzb2NrUGF0aCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG5hbWVzLnB1c2goc29ja1BhdGgpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkobmFtZXMpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBubyBhY3RpdmUgZGV2dG9vbHMgc29ja2V0cycpO1xuICAgIGlmICghXy5pc0VtcHR5KGFsbE1hdGNoZXMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYE90aGVyIHNvY2tldHMgYXJlOiAke0pTT04uc3RyaW5naWZ5KGFsbE1hdGNoZXMsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuZGVidWcoYFBhcnNlZCAke25hbWVzLmxlbmd0aH0gYWN0aXZlIGRldnRvb2xzICR7dXRpbC5wbHVyYWxpemUoJ3NvY2tldCcsIG5hbWVzLmxlbmd0aCwgZmFsc2UpfTogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShuYW1lcykpO1xuICB9XG4gIC8vIHNvbWV0aW1lcyB0aGUgd2VidmlldyBwcm9jZXNzIHNob3dzIHVwIG11bHRpcGxlIHRpbWVzIHBlciBhcHBcbiAgcmV0dXJuIF8udW5pcShuYW1lcyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld1Byb2NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIC0gVGhlIHdlYnZpZXcgcHJvY2VzcyBuYW1lIChhcyByZXR1cm5lZCBieVxuICogZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyAtIFRoZSBhY3R1YWwgd2VidmlldyBjb250ZXh0IG5hbWVcbiAqL1xuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBhIGxpc3Qgb2Ygc3lzdGVtIHByb2Nlc3NlcyB0aGF0IGxvb2sgbGlrZSB3ZWJ2aWV3cyxcbiAqIGFuZCByZXR1cm5zIHRoZW0gYWxvbmcgd2l0aCB0aGUgd2VidmlldyBjb250ZXh0IG5hbWUgYXBwcm9wcmlhdGUgZm9yIGl0LlxuICogSWYgd2UgcGFzcyBpbiBhIGRldmljZVNvY2tldCwgd2Ugb25seSBhdHRlbXB0IHRvIGZpbmQgd2Vidmlld3Mgd2hpY2ggbWF0Y2hcbiAqIHRoYXQgc29ja2V0IG5hbWUgKHRoaXMgaXMgZm9yIGFwcHMgd2hpY2ggZW1iZWQgQ2hyb21pdW0sIHdoaWNoIGlzbid0IHRoZVxuICogc2FtZSBhcyBjaHJvbWUtYmFja2VkIHdlYnZpZXdzKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0gez9zdHJpbmd9IGRldmljZVNvY2tldCAtIHRoZSBleHBsaWN0bHktbmFtZWQgZGV2aWNlIHNvY2tldCB0byB1c2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48V2Vidmlld1Byb2M+fVxuICovXG5hc3luYyBmdW5jdGlvbiB3ZWJ2aWV3c0Zyb21Qcm9jcyAoYWRiLCBkZXZpY2VTb2NrZXQgPSBudWxsKSB7XG4gIGNvbnN0IHNvY2tldE5hbWVzID0gYXdhaXQgZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzKGFkYik7XG4gIGNvbnN0IHdlYnZpZXdzID0gW107XG4gIGZvciAoY29uc3Qgc29ja2V0TmFtZSBvZiBzb2NrZXROYW1lcykge1xuICAgIGlmIChkZXZpY2VTb2NrZXQgPT09IENIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCAmJiBzb2NrZXROYW1lID09PSBgQCR7ZGV2aWNlU29ja2V0fWApIHtcbiAgICAgIHdlYnZpZXdzLnB1c2goe1xuICAgICAgICBwcm9jOiBzb2NrZXROYW1lLFxuICAgICAgICB3ZWJ2aWV3OiBDSFJPTUlVTV9XSU4sXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldE5hbWVNYXRjaCA9IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjcm9zc3dhbGtNYXRjaCA9IENST1NTV0FMS19TT0NLRVRfUEFUVEVSTi5leGVjKHNvY2tldE5hbWUpO1xuICAgIGlmICghc29ja2V0TmFtZU1hdGNoWzFdICYmICFjcm9zc3dhbGtNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGRldmljZVNvY2tldCAmJiBzb2NrZXROYW1lID09PSBgQCR7ZGV2aWNlU29ja2V0fWAgfHwgIWRldmljZVNvY2tldCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IHNvY2tldE5hbWVNYXRjaFsxXVxuICAgICAgICAgID8gYCR7V0VCVklFV19CQVNFfSR7c29ja2V0TmFtZU1hdGNoWzFdfWBcbiAgICAgICAgICA6IGAke1dFQlZJRVdfQkFTRX0ke2Nyb3Nzd2Fsa01hdGNoWzFdfWAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdlYnZpZXdzO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlcyBhIGxvY2FsIHBvcnQgZm9yIGRldnRvb2xzIGNvbW11bmljYXRpb25cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHNvY2tldE5hbWUgVGhlIHJlbW90ZSBVbml4IHNvY2tldCBuYW1lXG4gKiBAcGFyYW0gez9udW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgVGhlIGxvY2FsIHBvcnQgbnVtYmVyIG9yIG51bGwgdG8gYXBwbHlcbiAqIGF1dG9kZXRlY3Rpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBsb2NhbCBwb3J0IG51bWJlciBpZiB0aGUgcmVtb3RlIHNvY2tldCBoYXMgYmVlbiBmb3J3YXJkZWRcbiAqIHN1Y2Nlc3NmdWxseSBvciBgbnVsbGAgb3RoZXJ3aXNlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGFsbG9jYXRpbmcgdGhlIGxvY2FsIHBvcnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWxsb2NhdGVEZXZ0b29sc1BvcnQgKGFkYiwgc29ja2V0TmFtZSwgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwpIHtcbiAgLy8gc29ja2V0IG5hbWVzIGNvbWUgd2l0aCAnQCcsIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYSBwYXJ0IG9mIHRoZSBhYnN0cmFjdFxuICAvLyByZW1vdGUgcG9ydCwgc28gcmVtb3ZlIGl0XG4gIGNvbnN0IHJlbW90ZVBvcnQgPSBzb2NrZXROYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICBsZXQgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZUT09MU19QT1JUU19SQU5HRTtcbiAgaWYgKHdlYnZpZXdEZXZ0b29sc1BvcnQpIHtcbiAgICBlbmRQb3J0ID0gd2Vidmlld0RldnRvb2xzUG9ydCArIChlbmRQb3J0IC0gc3RhcnRQb3J0KTtcbiAgICBzdGFydFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0O1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyByZW1vdGUgcG9ydCAke3JlbW90ZVBvcnR9IHRvIGEgbG9jYWwgYCArXG4gICAgYHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9YCk7XG4gIGlmICghd2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgWW91IGNvdWxkIHVzZSB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHkgdG8gY3VzdG9taXplIGAgK1xuICAgICAgYHRoZSBzdGFydGluZyBwb3J0IG51bWJlcmApO1xuICB9XG4gIHJldHVybiBhd2FpdCBERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IHRvIGZvcndhcmQgdGhlIERldnRvb2xzIHNvY2tldCBgICtcbiAgICAgICAgYGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fS4gWW91IGNvdWxkIHNldCB0aGUgc3RhcnRpbmcgcG9ydCBudW1iZXIgYCArXG4gICAgICAgIGBtYW51YWxseSBieSBwcm92aWRpbmcgdGhlICd3ZWJ2aWV3RGV2dG9vbHNQb3J0JyBjYXBhYmlsaXR5YCk7XG4gICAgfVxuICAgIGF3YWl0IGFkYi5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtsb2NhbFBvcnR9YCwgYGxvY2FsYWJzdHJhY3Q6JHtyZW1vdGVQb3J0fWBdKTtcbiAgICByZXR1cm4gbG9jYWxQb3J0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFRoZSBuYW1lIG9mIHRoZSBEZXZ0b29scyBVbml4IHNvY2tldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgVGhlIHdlYiB2aWV3IGFsaWFzLiBMb29rcyBsaWtlIGBXRUJWSUVXX2BcbiAqIHByZWZpeCBwbHVzIFBJRCBvciBwYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBXZWJ2aWV3IGluZm9ybWF0aW9uIGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFdlYnZpZXcgcGFnZXMgbGlzdCBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL2xpc3QgQ0RQIGVuZHBvaW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXRhaWxDb2xsZWN0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgc3RhcnRpbmcgcG9ydCB0byB1c2UgZm9yIHdlYnZpZXcgcGFnZVxuICogcHJlc2VuY2UgY2hlY2sgKGlmIG5vdCB0aGUgZGVmYXVsdCBvZiA5MjIyKS5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2VzIHByZXNlbmNlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBXaGV0aGVyIHRvIGNvbGxlY3RcbiAqIHdlYiB2aWV3IGRldGFpbHMgYW5kIHNlbmQgdGhlbSB0byBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3IsIHNvIGl0IGNvdWxkXG4gKiBzZWxlY3QgYSBiaW5hcnkgbW9yZSBwcmVjaXNlbHkgYmFzZWQgb24gdGhpcyBpbmZvLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIENocm9tZSBEZWJ1Z2dlciBQcm90b2NvbCBkYXRhIGNvbGxlY3Rpb24uXG4gKiBObyBlcnJvciBpcyB0aHJvd24gaWYgQ0RQIHJlcXVlc3QgZmFpbHMgLSBpbiBzdWNoIGNhc2Ugbm8gZGF0YSB3aWxsIGJlXG4gKiByZWNvcmRlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGB3ZWJ2aWV3c01hcHBpbmdgIGl0ZW0uXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdQcm9wcz59IHdlYnZpZXdzTWFwcGluZyBUaGUgY3VycmVudCB3ZWJ2aWV3cyBtYXBwaW5nXG4gKiAhISEgRWFjaCBpdGVtIG9mIHRoaXMgYXJyYXkgZ2V0cyBtdXRhdGVkIChgaW5mb2AvYHBhZ2VzYCBwcm9wZXJ0aWVzIGdldCBhZGRlZFxuICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBvcHRzYCkgaWYgdGhlIHJlcXVlc3RlZCBkZXRhaWxzIGhhdmUgYmVlblxuICogc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBmb3IgaXQgISEhXG4gKiBAcGFyYW0ge0RldGFpbENvbGxlY3Rpb25PcHRpb25zfSBvcHRzIElmIGJvdGggYGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzYCBhbmRcbiAqIGBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb25gIHByb3BlcnRpZXMgYXJlIGZhbHN5IHRoZW4gbm8gZGV0YWlscyBjb2xsZWN0aW9uXG4gKiBpcyBwZXJmb3JtZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFdlYnZpZXdzRGV0YWlscyAoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIG9wdHMgPSB7fSkge1xuICBpZiAoXy5pc0VtcHR5KHdlYnZpZXdzTWFwcGluZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSBudWxsLFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IG51bGwsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMpIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IGNoZWNraW5nIHdoZXRoZXIgd2Vidmlld3MgaGF2ZSBhY3RpdmUgcGFnZXM7IHVzZSB0aGUgYCArXG4gICAgICBgJ2Vuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzJyBjYXAgdG8gdHVybiB0aGlzIGNoZWNrIG9uYCk7XG4gIH1cblxuICBpZiAoIWVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY29sbGVjdGluZyB3ZWIgdmlldyBkZXRhaWxzLiBEZXRhaWxzIGNvbGxlY3Rpb24gbWlnaHQgaGVscCBgICtcbiAgICAgIGB0byBtYWtlIENocm9tZWRyaXZlciBpbml0aWFsaXphdGlvbiBtb3JlIHByZWNpc2UuIFVzZSB0aGUgJ2VuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbicgYCArXG4gICAgICBgY2FwIHRvIHR1cm4gaXQgb25gKTtcbiAgfVxuXG4gIGlmICghZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgIWVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENvbm5lY3QgdG8gZWFjaCBkZXZ0b29scyBzb2NrZXQgYW5kIHJldHJpZXZlIHdlYiB2aWV3IGRldGFpbHNcbiAgbG9nZ2VyLmRlYnVnKGBDb2xsZWN0aW5nIENEUCBkYXRhIG9mICR7dXRpbC5wbHVyYWxpemUoJ3dlYnZpZXcnLCB3ZWJ2aWV3c01hcHBpbmcubGVuZ3RoLCB0cnVlKX1gKTtcbiAgY29uc3QgZGV0YWlsQ29sbGVjdG9ycyA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgZGV0YWlsQ29sbGVjdG9ycy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgbG9jYWxQb3J0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgYWxsb2NhdGVEZXZ0b29sc1BvcnQoYWRiLCBpdGVtLnByb2MsIHdlYnZpZXdEZXZ0b29sc1BvcnQpO1xuICAgICAgICBpZiAoZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgaXRlbS5pbmZvID0gYXdhaXQgY2RwSW5mbyhsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgICAgICAgIGl0ZW0ucGFnZXMgPSBhd2FpdCBjZHBMaXN0KGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGxvY2FsUG9ydCkge1xuICAgICAgICAgIGF3YWl0IGFkYi5yZW1vdmVQb3J0Rm9yd2FyZChsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwoZGV0YWlsQ29sbGVjdG9ycyk7XG4gIGxvZ2dlci5kZWJ1ZyhgQ0RQIGRhdGEgY29sbGVjdGlvbiBjb21wbGV0ZWRgKTtcbn1cblxuLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvXG5hc3luYyBmdW5jdGlvbiBjZHBMaXN0IChsb2NhbFBvcnQpIHtcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke2xvY2FsUG9ydH0vanNvbi9saXN0YCxcbiAgICB0aW1lb3V0OiBDRFBfUkVRX1RJTUVPVVQsXG4gIH0pKS5kYXRhO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcEluZm8gKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL3ZlcnNpb25gLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8qKlxuICogVGFrZSBhIHdlYnZpZXcgbmFtZSBsaWtlIFdFQlZJRVdfNDI5NiBhbmQgdXNlICdhZGIgc2hlbGwgcHMnIHRvIGZpZ3VyZSBvdXRcbiAqIHdoaWNoIGFwcCBwYWNrYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHdlYnZpZXcuIE9uZSBvZiB0aGUgcmVhc29ucyB3ZVxuICogd2FudCB0byBkbyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB3ZSdyZSBsaXN0aW5nIHdlYnZpZXdzIGZvciB0aGUgYWN0dWFsIEFVVCxcbiAqIG5vdCBzb21lIG90aGVyIHJ1bm5pbmcgYXBwXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHdlYnZpZXcgLSBhIHdlYnZpZXcgcHJvY2VzcyBuYW1lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHAgcnVubmluZyB0aGUgd2Vidmlld1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgcHJvY2VzcyBuYW1lXG4gKi9cbmhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3ID0gYXN5bmMgZnVuY3Rpb24gcHJvY0Zyb21XZWJ2aWV3IChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3QgcGlkTWF0Y2ggPSBXRUJWSUVXX1BJRF9QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gIGlmICghcGlkTWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIFBJRCBmb3Igd2VidmlldyAnJHt3ZWJ2aWV3fSdgKTtcbiAgfVxuXG4gIGNvbnN0IHBpZCA9IHBpZE1hdGNoWzFdO1xuICBsb2dnZXIuZGVidWcoYCR7d2Vidmlld30gbWFwcGVkIHRvIHBpZCAke3BpZH1gKTtcbiAgbG9nZ2VyLmRlYnVnKGBHZXR0aW5nIHByb2Nlc3MgbmFtZSBmb3Igd2VidmlldyAnJHt3ZWJ2aWV3fSdgKTtcbiAgY29uc3QgcGtnID0gYXdhaXQgYWRiLmdldE5hbWVCeVBpZChwaWQpO1xuICBsb2dnZXIuZGVidWcoYEdvdCBwcm9jZXNzIG5hbWU6ICcke3BrZ30nYCk7XG4gIHJldHVybiBwa2c7XG59O1xuXG4vKipcbiAqIFBhcnNlIHdlYnZpZXcgbmFtZXMgZm9yIGdldENvbnRleHRzXG4gKlxuICogQHBhcmFtIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmcgU2VlIG5vdGUgb24gZ2V0V2ViVmlld3NNYXBwaW5nXG4gKiBAcGFyYW0ge0dldFdlYnZpZXdzT3B0c30gb3B0cyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSAtIGEgbGlzdCBvZiB3ZWJ2aWV3IG5hbWVzXG4gKi9cbmhlbHBlcnMucGFyc2VXZWJ2aWV3TmFtZXMgPSBmdW5jdGlvbiBwYXJzZVdlYnZpZXdOYW1lcyAod2Vidmlld3NNYXBwaW5nLCB7XG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgaXNDaHJvbWVTZXNzaW9uID0gZmFsc2Vcbn0gPSB7fSkge1xuICBpZiAoaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgcmV0dXJuIFtDSFJPTUlVTV9XSU5dO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3Qge3dlYnZpZXcsIHBhZ2VzLCBwcm9jLCB3ZWJ2aWV3TmFtZX0gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzICYmIHBhZ2VzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBTa2lwcGluZyB0aGUgd2VidmlldyAnJHt3ZWJ2aWV3fScgYXQgJyR7cHJvY30nIGAgK1xuICAgICAgICBgc2luY2UgaXQgaGFzIHJlcG9ydGVkIGhhdmluZyB6ZXJvIHBhZ2VzYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHdlYnZpZXdOYW1lKSB7XG4gICAgICByZXN1bHQucHVzaCh3ZWJ2aWV3TmFtZSk7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHJlc3VsdC5sZW5ndGgsIHRydWUpfTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRXZWJ2aWV3c09wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhbmRyb2lkRGV2aWNlU29ja2V0IFtudWxsXSAtIGRldmljZSBzb2NrZXQgbmFtZVxuICogQHByb3BlcnR5IHtib29sZWFufSBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyBbdHJ1ZV0gLSB3aGV0aGVyIHRvIGNoZWNrIGZvciB3ZWJ2aWV3XG4gKiBwYWdlIHByZXNlbmNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBbOTIyMl0gLSBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjay5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFt0cnVlXSAtIHdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3c01hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dFxuICovXG5cbi8qKlxuICogR2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgd2Vidmlld3MgbWFwcGluZyBieSBpbnRyb3NwZWN0aW5nIHByb2Nlc3NlcyB3aXRoIGFkYixcbiAqIHdoZXJlIHdlYnZpZXdzIGFyZSBsaXN0ZWQuIEl0J3MgcG9zc2libGUgdG8gcGFzcyBpbiBhICdkZXZpY2VTb2NrZXQnIGFyZywgd2hpY2hcbiAqIGxpbWl0cyB0aGUgd2VidmlldyBwb3NzaWJpbGl0aWVzIHRvIHRoZSBvbmUgcnVubmluZyBvbiB0aGUgQ2hyb21pdW0gZGV2dG9vbHNcbiAqIHNvY2tldCB3ZSdyZSBpbnRlcmVzdGVkIGluIChzZWUgbm90ZSBvbiB3ZWJ2aWV3c0Zyb21Qcm9jcykuIFdlIGNhbiBhbHNvXG4gKiBkaXJlY3QgdGhpcyBtZXRob2QgdG8gdmVyaWZ5IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHdlYnZpZXcgcHJvY2VzcyBhY3R1YWxseVxuICogaGFzIGFueSBwYWdlcyAoaWYgYSBwcm9jZXNzIGV4aXN0cyBidXQgbm8gcGFnZXMgYXJlIGZvdW5kLCBDaHJvbWVkcml2ZXIgd2lsbFxuICogbm90IGFjdHVhbGx5IGJlIGFibGUgdG8gY29ubmVjdCB0byBpdCwgc28gdGhpcyBzZXJ2ZXMgYXMgYSBndWFyZCBmb3IgdGhhdFxuICogc3RyYW5nZSBmYWlsdXJlIG1vZGUpLiBUaGUgc3RyYXRlZ3kgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW55IHBhZ2VzIGFyZVxuICogYWN0aXZlIGludm9sdmVzIHNlbmRpbmcgYSByZXF1ZXN0IHRvIHRoZSByZW1vdGUgZGVidWcgc2VydmVyIG9uIHRoZSBkZXZpY2UsXG4gKiBoZW5jZSBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIHBvcnQgb24gdGhlIGhvc3QgbWFjaGluZSB3aGljaFxuICogc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge0dldFdlYnZpZXdzT3B0c30gb3B0c1xuICpcbiAqIEByZXR1cm4ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZ1xuICovXG5oZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyA9IGFzeW5jIGZ1bmN0aW9uIGdldFdlYlZpZXdzTWFwcGluZyAoYWRiLCB7XG4gIGFuZHJvaWREZXZpY2VTb2NrZXQgPSBudWxsLFxuICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IHRydWUsXG4gIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsLFxuICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gPSB0cnVlXG59ID0ge30pIHtcbiAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIGEgbGlzdCBvZiBhdmFpbGFibGUgd2Vidmlld3MnKTtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld3NGcm9tUHJvY3MoYWRiLCBhbmRyb2lkRGV2aWNlU29ja2V0KTtcblxuICBhd2FpdCBjb2xsZWN0V2Vidmlld3NEZXRhaWxzKGFkYiwgd2Vidmlld3NNYXBwaW5nLCB7XG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uLFxuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQsXG4gIH0pO1xuXG4gIGZvciAoY29uc3Qgd2Vidmlld01hcHBpbmcgb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgY29uc3Qge3dlYnZpZXcsIGluZm99ID0gd2Vidmlld01hcHBpbmc7XG4gICAgd2Vidmlld01hcHBpbmcud2Vidmlld05hbWUgPSBudWxsO1xuXG4gICAgbGV0IHd2TmFtZSA9IHdlYnZpZXc7XG4gICAgbGV0IHByb2Nlc3MgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFhbmRyb2lkRGV2aWNlU29ja2V0KSB7XG4gICAgICBjb25zdCBwa2dNYXRjaCA9IFdFQlZJRVdfUEtHX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHdlYiB2aWV3IG5hbWUgY291bGQgZWl0aGVyIGJlIHN1ZmZpeGVkIHdpdGggUElEIG9yIHRoZSBwYWNrYWdlIG5hbWVcbiAgICAgICAgLy8gcGFja2FnZSBuYW1lcyBjb3VsZCBub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0XG4gICAgICAgIGNvbnN0IHBrZyA9IHBrZ01hdGNoID8gcGtnTWF0Y2hbMV0gOiBhd2FpdCBoZWxwZXJzLnByb2NGcm9tV2VidmlldyhhZGIsIHdlYnZpZXcpO1xuICAgICAgICB3dk5hbWUgPSBgJHtXRUJWSUVXX0JBU0V9JHtwa2d9YDtcbiAgICAgICAgY29uc3QgcGlkTWF0Y2ggPSBXRUJWSUVXX1BJRF9QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gICAgICAgIHByb2Nlc3MgPSB7XG4gICAgICAgICAgbmFtZTogcGtnLFxuICAgICAgICAgIGlkOiBwaWRNYXRjaCA/IHBpZE1hdGNoWzFdIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2Vidmlld01hcHBpbmcud2Vidmlld05hbWUgPSB3dk5hbWU7XG4gICAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3dk5hbWUpO1xuICAgIGlmIChpbmZvIHx8IHByb2Nlc3MpIHtcbiAgICAgIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuc2V0KGtleSwgeyBpbmZvLCBwcm9jZXNzIH0pO1xuICAgIH0gZWxzZSBpZiAoV0VCVklFV1NfREVUQUlMU19DQUNIRS5oYXMoa2V5KSkge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5kZWwoa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdlYnZpZXdzTWFwcGluZztcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHJvY2Vzc0luZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIFRoZSBwcm9jZXNzIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgVGhlIHByb2Nlc3MgaWQgKGlmIGNvdWxkIGJlIHJldHJpZXZlZClcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYlZpZXdEZXRhaWxzXG4gKiBAcHJvcGVydHkgez9Qcm9jZXNzSW5mb30gcHJvY2VzcyAtIFdlYiB2aWV3IHByb2Nlc3MgZGV0YWlsc1xuICogQHByb3BlcnR5IHtPYmplY3R9IGluZm8gLSBXZWIgdmlldyBkZXRhaWxzIGFzIHJldHVybmVkIGJ5IC9qc29uL3ZlcnNpb24gQ0RQIGVuZHBvaW50LCBmb3IgZXhhbXBsZTpcbiAqIHtcbiAqICBcIkJyb3dzZXJcIjogXCJDaHJvbWUvNzIuMC4zNjAxLjBcIixcbiAqICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xM182KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzIuMC4zNjAxLjAgU2FmYXJpLzUzNy4zNlwiLFxuICogIFwiVjgtVmVyc2lvblwiOiBcIjcuMi4yMzNcIixcbiAqICBcIldlYktpdC1WZXJzaW9uXCI6IFwiNTM3LjM2IChAY2ZlZGU5ZGIxZDE1NGRlMDQ2OGNiMDUzODQ3OWYzNGMwNzU1YTBmNClcIixcbiAqICBcIndlYlNvY2tldERlYnVnZ2VyVXJsXCI6IFwid3M6Ly9sb2NhbGhvc3Q6OTIyMi9kZXZ0b29scy9icm93c2VyL2IwYjhhNGZiLWJiMTctNDM1OS05NTMzLWE4ZDlmMzkwOGJkOFwiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgd2ViIHZpZXcgZGV0YWlscyBwcmV2aW91c2x5IGNhY2hlZCBieSBgZ2V0V2Vidmlld3NgIGNhbGxcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHdlYnZpZXcgVGhlIG5hbWUgb2YgdGhlIHdlYiB2aWV3XG4gKiBAcmV0dXJucyB7P1dlYlZpZXdEZXRhaWxzfSBFaXRoZXIgYHVuZGVmaW5lZGAgb3IgdGhlIHJlY2VudCB3ZWIgdmlldyBkZXRhaWxzXG4gKi9cbmhlbHBlcnMuZ2V0V2Vidmlld0RldGFpbHMgPSBmdW5jdGlvbiBnZXRXZWJ2aWV3RGV0YWlscyAoYWRiLCB3ZWJ2aWV3KSB7XG4gIGNvbnN0IGtleSA9IHRvRGV0YWlsc0NhY2hlS2V5KGFkYiwgd2Vidmlldyk7XG4gIHJldHVybiBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmdldChrZXkpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgQ2hyb21lIGRyaXZlciBjYXBhYmlsaXRpZXMgYmFzZWQgb24gdGhlIHByb3ZpZGVkXG4gKiBBcHBpdW0gY2FwYWJpbGl0aWVzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgVXNlci1wcm92aWRlZCBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gZGV2aWNlSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIEFuZHJvaWQgZGV2aWNlIHVuZGVyIHRlc3RcbiAqIEBwYXJhbSB7P1dlYlZpZXdEZXRhaWxzfSB3ZWJWaWV3RGV0YWlsc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGNhcGFiaWxpdGllcyBvYmplY3QuXG4gKiBTZWUgaHR0cHM6Ly9jaHJvbWVkcml2ZXIuY2hyb21pdW0ub3JnL2NhcGFiaWxpdGllcyBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5oZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMgPSBmdW5jdGlvbiBjcmVhdGVDaHJvbWVkcml2ZXJDYXBzIChvcHRzLCBkZXZpY2VJZCwgd2ViVmlld0RldGFpbHMpIHtcbiAgY29uc3QgY2FwcyA9IHsgY2hyb21lT3B0aW9uczoge30gfTtcblxuICBjb25zdCBhbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lT3B0aW9ucz8uYW5kcm9pZFBhY2thZ2VcbiAgICB8fCBvcHRzLmFwcFBhY2thZ2VcbiAgICB8fCB3ZWJWaWV3RGV0YWlscz8uaW5mbz8uWydBbmRyb2lkLVBhY2thZ2UnXTtcbiAgaWYgKGFuZHJvaWRQYWNrYWdlKSB7XG4gICAgLy8gY2hyb21lZHJpdmVyIHJhaXNlcyBhbiBpbnZhbGlkIGFyZ3VtZW50IGVycm9yIHdoZW4gYW5kcm9pZFBhY2thZ2UgaXMgJ251bGwnXG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gYW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKF8uaXNCb29sZWFuKG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcCkpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFVzZVJ1bm5pbmdBcHAgPSBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHA7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlO1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHkgPSBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eTtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUHJvY2Vzcykge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcyA9IG9wdHMuY2hyb21lQW5kcm9pZFByb2Nlc3M7XG4gIH0gZWxzZSBpZiAod2ViVmlld0RldGFpbHM/LnByb2Nlc3M/Lm5hbWUgJiYgd2ViVmlld0RldGFpbHM/LnByb2Nlc3M/LmlkKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gd2ViVmlld0RldGFpbHMucHJvY2Vzcy5uYW1lO1xuICB9XG4gIGlmIChfLnRvTG93ZXIob3B0cy5icm93c2VyTmFtZSkgPT09ICdjaHJvbWl1bS13ZWJ2aWV3Jykge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHkgPSBvcHRzLmFwcEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLnBhZ2VMb2FkU3RyYXRlZ3kpIHtcbiAgICBjYXBzLnBhZ2VMb2FkU3RyYXRlZ3kgPSBvcHRzLnBhZ2VMb2FkU3RyYXRlZ3k7XG4gIH1cbiAgY29uc3QgaXNDaHJvbWUgPSBfLnRvTG93ZXIoY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlKSA9PT0gJ2Nocm9tZSc7XG4gIGlmIChfLmluY2x1ZGVzKEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTLCBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpIHx8IGlzQ2hyb21lKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBleHRyYWN0ZWQgcGFja2FnZSBmcm9tIGNvbnRleHQgbmFtZSwgaXQgY291bGQgY29tZSBpbiBhcyBiYXJlXG4gICAgLy8gXCJjaHJvbWVcIiwgYW5kIHNvIHdlIHNob3VsZCBtYWtlIHN1cmUgdGhlIGRldGFpbHMgYXJlIGNvcnJlY3QsIGluY2x1ZGluZ1xuICAgIC8vIG5vdCB1c2luZyBhbiBhY3Rpdml0eSBvciBwcm9jZXNzIGlkXG4gICAgaWYgKGlzQ2hyb21lKSB7XG4gICAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBDSFJPTUVfUEFDS0FHRV9OQU1FO1xuICAgIH1cbiAgICBkZWxldGUgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eTtcbiAgICBkZWxldGUgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzO1xuICB9XG4gIC8vIGFkZCBkZXZpY2UgaWQgZnJvbSBhZGJcbiAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWREZXZpY2VTZXJpYWwgPSBkZXZpY2VJZDtcblxuICBpZiAoXy5pc1BsYWluT2JqZWN0KG9wdHMubG9nZ2luZ1ByZWZzKSB8fCBfLmlzUGxhaW5PYmplY3Qob3B0cy5jaHJvbWVMb2dnaW5nUHJlZnMpKSB7XG4gICAgaWYgKG9wdHMubG9nZ2luZ1ByZWZzKSB7XG4gICAgICBsb2dnZXIud2FybihgVGhlICdsb2dnaW5nUHJlZnMnIGNhcCBpcyBkZXByZWNhdGVkOyB1c2UgdGhlICdjaHJvbWVMb2dnaW5nUHJlZnMnIGNhcCBpbnN0ZWFkYCk7XG4gICAgfVxuICAgIGNhcHMubG9nZ2luZ1ByZWZzID0gb3B0cy5jaHJvbWVMb2dnaW5nUHJlZnMgfHwgb3B0cy5sb2dnaW5nUHJlZnM7XG4gIH1cbiAgaWYgKG9wdHMuZW5hYmxlUGVyZm9ybWFuY2VMb2dnaW5nKSB7XG4gICAgbG9nZ2VyLndhcm4oYFRoZSAnZW5hYmxlUGVyZm9ybWFuY2VMb2dnaW5nJyBjYXAgaXMgZGVwcmVjYXRlZDsgc2ltcGx5IHVzZSBgICtcbiAgICAgIGB0aGUgJ2Nocm9tZUxvZ2dpbmdQcmVmcycgY2FwIGluc3RlYWQsIHdpdGggYSAncGVyZm9ybWFuY2UnIGtleSBzZXQgdG8gJ0FMTCdgKTtcbiAgICBjb25zdCBuZXdQcmVmID0ge3BlcmZvcm1hbmNlOiAnQUxMJ307XG4gICAgLy8gZG9uJ3Qgb3ZlcndyaXRlIG90aGVyIGxvZ2dpbmcgcHJlZnMgdGhhdCBoYXZlIGJlZW4gc2VudCBpbiBpZiB0aGV5IGV4aXN0XG4gICAgY2Fwcy5sb2dnaW5nUHJlZnMgPSBjYXBzLmxvZ2dpbmdQcmVmc1xuICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCBjYXBzLmxvZ2dpbmdQcmVmcywgbmV3UHJlZilcbiAgICAgIDogbmV3UHJlZjtcbiAgfVxuXG4gIGlmIChvcHRzLmNocm9tZU9wdGlvbnM/LkFyZ3VtZW50cykge1xuICAgIC8vIG1lcmdlIGBBcmd1bWVudHNgIGFuZCBgYXJnc2BcbiAgICBvcHRzLmNocm9tZU9wdGlvbnMuYXJncyA9IFsuLi4ob3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MgfHwgW10pLCAuLi5vcHRzLmNocm9tZU9wdGlvbnMuQXJndW1lbnRzXTtcbiAgICBkZWxldGUgb3B0cy5jaHJvbWVPcHRpb25zLkFyZ3VtZW50cztcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZygnUHJlY2FsY3VsYXRlZCBDaHJvbWVkcml2ZXIgY2FwYWJpbGl0aWVzOiAnICtcbiAgICBKU09OLnN0cmluZ2lmeShjYXBzLmNocm9tZU9wdGlvbnMsIG51bGwsIDIpKTtcblxuICBjb25zdCBwcm90ZWN0ZWRDYXBOYW1lcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtvcHQsIHZhbF0gb2YgXy50b1BhaXJzKG9wdHMuY2hyb21lT3B0aW9ucykpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChjYXBzLmNocm9tZU9wdGlvbnNbb3B0XSkpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9uc1tvcHRdID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm90ZWN0ZWRDYXBOYW1lcy5wdXNoKG9wdCk7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KHByb3RlY3RlZENhcE5hbWVzKSkge1xuICAgIGxvZ2dlci5pbmZvKCdUaGUgZm9sbG93aW5nIENocm9tZWRyaXZlciBjYXBhYmlsaXRpZXMgY2Fubm90IGJlIG92ZXJyaWRkZW4gJyArXG4gICAgICAnYnkgdGhlIHByb3ZpZGVkIGNocm9tZU9wdGlvbnM6Jyk7XG4gICAgZm9yIChjb25zdCBvcHROYW1lIG9mIHByb3RlY3RlZENhcE5hbWVzKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgICAke29wdE5hbWV9ICgke0pTT04uc3RyaW5naWZ5KG9wdHMuY2hyb21lT3B0aW9uc1tvcHROYW1lXSl9KWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjYXBzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbmV4cG9ydCB7IGhlbHBlcnMsIE5BVElWRV9XSU4sIFdFQlZJRVdfV0lOLCBXRUJWSUVXX0JBU0UsIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsWUFBbkI7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHLFNBQXBCOztBQUNBLE1BQU1DLFlBQVksR0FBRyxVQUFyQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUksR0FB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
452
+ exports.default = _default;
453
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOQVRJVkVfV0lOIiwiV0VCVklFV19XSU4iLCJDSFJPTUlVTV9XSU4iLCJXRUJWSUVXX0JBU0UiLCJXRUJWSUVXX1BJRF9QQVRURVJOIiwiUmVnRXhwIiwiV0VCVklFV19QS0dfUEFUVEVSTiIsIkRFVlRPT0xTX1NPQ0tFVF9QQVRURVJOIiwiQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOIiwiQ0hST01JVU1fREVWVE9PTFNfU09DS0VUIiwiQ0hST01FX1BBQ0tBR0VfTkFNRSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiREVWVE9PTFNfUE9SVFNfUkFOR0UiLCJXRUJWSUVXU19ERVRBSUxTX0NBQ0hFIiwiTFJVIiwibWF4IiwidXBkYXRlQWdlT25HZXQiLCJDRFBfUkVRX1RJTUVPVVQiLCJERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQiLCJ1dGlsIiwiZ2V0TG9ja0ZpbGVHdWFyZCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJoZWxwZXJzIiwidG9EZXRhaWxzQ2FjaGVLZXkiLCJhZGIiLCJ3ZWJ2aWV3IiwiY3VyRGV2aWNlSWQiLCJnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MiLCJvdXQiLCJzaGVsbCIsIm5hbWVzIiwiYWxsTWF0Y2hlcyIsImxpbmUiLCJzcGxpdCIsImZsYWdzIiwic3QiLCJzb2NrUGF0aCIsInRyaW0iLCJzdGFydHNXaXRoIiwicHVzaCIsInRlc3QiLCJfIiwiaXNFbXB0eSIsImxvZ2dlciIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsInBsdXJhbGl6ZSIsInVuaXEiLCJ3ZWJ2aWV3c0Zyb21Qcm9jcyIsImRldmljZVNvY2tldCIsInNvY2tldE5hbWVzIiwid2Vidmlld3MiLCJzb2NrZXROYW1lIiwicHJvYyIsInNvY2tldE5hbWVNYXRjaCIsImV4ZWMiLCJjcm9zc3dhbGtNYXRjaCIsImFsbG9jYXRlRGV2dG9vbHNQb3J0Iiwid2Vidmlld0RldnRvb2xzUG9ydCIsInJlbW90ZVBvcnQiLCJyZXBsYWNlIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImxvY2FsUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwiZSIsIkVycm9yIiwiYWRiRXhlYyIsImNvbGxlY3RXZWJ2aWV3c0RldGFpbHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJvcHRzIiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJpbmZvIiwiZGV0YWlsQ29sbGVjdG9ycyIsIml0ZW0iLCJjZHBJbmZvIiwicGFnZXMiLCJjZHBMaXN0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJCIiwiYWxsIiwiYXhpb3MiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWxldGUiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYnZpZXctaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuXG5jb25zdCBOQVRJVkVfV0lOID0gJ05BVElWRV9BUFAnO1xuY29uc3QgV0VCVklFV19XSU4gPSAnV0VCVklFVyc7XG5jb25zdCBDSFJPTUlVTV9XSU4gPSAnQ0hST01JVU0nO1xuY29uc3QgV0VCVklFV19CQVNFID0gYCR7V0VCVklFV19XSU59X2A7XG5jb25zdCBXRUJWSUVXX1BJRF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7V0VCVklFV19CQVNFfShcXFxcZCspYCk7XG5jb25zdCBXRUJWSUVXX1BLR19QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7V0VCVklFV19CQVNFfShbXlxcXFxkXFxcXHNdW1xcXFx3Ll0qKWApO1xuY29uc3QgREVWVE9PTFNfU09DS0VUX1BBVFRFUk4gPSAvQFtcXHcuXStfZGV2dG9vbHNfcmVtb3RlXz8oXFxkKyk/XFxiLztcbmNvbnN0IENST1NTV0FMS19TT0NLRVRfUEFUVEVSTiA9IC9AKFtcXHcuXSspX2RldnRvb2xzX3JlbW90ZVxcYi87XG5jb25zdCBDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQgPSAnY2hyb21lX2RldnRvb2xzX3JlbW90ZSc7XG5jb25zdCBDSFJPTUVfUEFDS0FHRV9OQU1FID0gJ2NvbS5hbmRyb2lkLmNocm9tZSc7XG5jb25zdCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyA9IFtcbiAgQ0hST01FX1BBQ0tBR0VfTkFNRSxcbiAgJ2NvbS5jaHJvbWUuYmV0YScsXG4gICdjb20uY2hyb21lLmRldicsXG4gICdjb20uY2hyb21lLmNhbmFyeScsXG5dO1xuY29uc3QgREVWVE9PTFNfUE9SVFNfUkFOR0UgPSBbMTA5MDAsIDExMDAwXTtcbmNvbnN0IFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUgPSBuZXcgTFJVKHtcbiAgbWF4OiAxMDAsXG4gIHVwZGF0ZUFnZU9uR2V0OiB0cnVlLFxufSk7XG5jb25zdCBDRFBfUkVRX1RJTUVPVVQgPSAyMDAwOyAvLyBtc1xuY29uc3QgREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKFxuICBwYXRoLnJlc29sdmUob3MudG1wZGlyKCksICdhbmRyb2lkX2RldnRvb2xzX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDcsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5mdW5jdGlvbiB0b0RldGFpbHNDYWNoZUtleSAoYWRiLCB3ZWJ2aWV3KSB7XG4gIHJldHVybiBgJHthZGI/LmN1ckRldmljZUlkfToke3dlYnZpZXd9YDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSBsaXN0IG9mIGFuZHJvaWQgc3lzdGVtIHByb2Nlc3NlcyBhbmQgcmV0dXJucyBvbmVzXG4gKiB0aGF0IGxvb2sgbGlrZSB3ZWJ2aWV3c1xuICogU2VlIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZpY2UvYW5kcm9pZF9kZXZpY2VfaW5mb19xdWVyeS5jY1xuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2YgbWF0Y2hpbmcgd2VidmlldyBzb2NrZXQgbmFtZXMgKGluY2x1ZGluZyB0aGUgbGVhZGluZyAnQCcpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyAoYWRiKSB7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsICcvcHJvYy9uZXQvdW5peCddKTtcbiAgY29uc3QgbmFtZXMgPSBbXTtcbiAgY29uc3QgYWxsTWF0Y2hlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KCdcXG4nKSkge1xuICAgIC8vIE51bSBSZWZDb3VudCBQcm90b2NvbCBGbGFncyBUeXBlIFN0IElub2RlIFBhdGhcbiAgICBjb25zdCBbLCwsIGZsYWdzLCwgc3QsLCBzb2NrUGF0aF0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmICghc29ja1BhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc29ja1BhdGguc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICBhbGxNYXRjaGVzLnB1c2gobGluZS50cmltKCkpO1xuICAgIH1cbiAgICBpZiAoZmxhZ3MgIT09ICcwMDAxMDAwMCcgfHwgc3QgIT09ICcwMScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIURFVlRPT0xTX1NPQ0tFVF9QQVRURVJOLnRlc3Qoc29ja1BhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuYW1lcy5wdXNoKHNvY2tQYXRoKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KG5hbWVzKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbm8gYWN0aXZlIGRldnRvb2xzIHNvY2tldHMnKTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxNYXRjaGVzKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBPdGhlciBzb2NrZXRzIGFyZTogJHtKU09OLnN0cmluZ2lmeShhbGxNYXRjaGVzLCBudWxsLCAyKX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgJHtuYW1lcy5sZW5ndGh9IGFjdGl2ZSBkZXZ0b29scyAke3V0aWwucGx1cmFsaXplKCdzb2NrZXQnLCBuYW1lcy5sZW5ndGgsIGZhbHNlKX06IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZXMpKTtcbiAgfVxuICAvLyBzb21ldGltZXMgdGhlIHdlYnZpZXcgcHJvY2VzcyBzaG93cyB1cCBtdWx0aXBsZSB0aW1lcyBwZXIgYXBwXG4gIHJldHVybiBfLnVuaXEobmFtZXMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9jXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyAtIFRoZSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZSAoYXMgcmV0dXJuZWQgYnlcbiAqIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgLSBUaGUgYWN0dWFsIHdlYnZpZXcgY29udGV4dCBuYW1lXG4gKi9cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgYSBsaXN0IG9mIHN5c3RlbSBwcm9jZXNzZXMgdGhhdCBsb29rIGxpa2Ugd2Vidmlld3MsXG4gKiBhbmQgcmV0dXJucyB0aGVtIGFsb25nIHdpdGggdGhlIHdlYnZpZXcgY29udGV4dCBuYW1lIGFwcHJvcHJpYXRlIGZvciBpdC5cbiAqIElmIHdlIHBhc3MgaW4gYSBkZXZpY2VTb2NrZXQsIHdlIG9ubHkgYXR0ZW1wdCB0byBmaW5kIHdlYnZpZXdzIHdoaWNoIG1hdGNoXG4gKiB0aGF0IHNvY2tldCBuYW1lICh0aGlzIGlzIGZvciBhcHBzIHdoaWNoIGVtYmVkIENocm9taXVtLCB3aGljaCBpc24ndCB0aGVcbiAqIHNhbWUgYXMgY2hyb21lLWJhY2tlZCB3ZWJ2aWV3cykuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHs/c3RyaW5nfSBkZXZpY2VTb2NrZXQgLSB0aGUgZXhwbGljdGx5LW5hbWVkIGRldmljZSBzb2NrZXQgdG8gdXNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFdlYnZpZXdQcm9jPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2Vidmlld3NGcm9tUHJvY3MgKGFkYiwgZGV2aWNlU29ja2V0ID0gbnVsbCkge1xuICBjb25zdCBzb2NrZXROYW1lcyA9IGF3YWl0IGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyhhZGIpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IFtdO1xuICBmb3IgKGNvbnN0IHNvY2tldE5hbWUgb2Ygc29ja2V0TmFtZXMpIHtcbiAgICBpZiAoZGV2aWNlU29ja2V0ID09PSBDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gKSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2VidmlldzogQ0hST01JVU1fV0lOLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb2NrZXROYW1lTWF0Y2ggPSBERVZUT09MU19TT0NLRVRfUEFUVEVSTi5leGVjKHNvY2tldE5hbWUpO1xuICAgIGlmICghc29ja2V0TmFtZU1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY3Jvc3N3YWxrTWF0Y2ggPSBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaFsxXSAmJiAhY3Jvc3N3YWxrTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChkZXZpY2VTb2NrZXQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gIHx8ICFkZXZpY2VTb2NrZXQpIHtcbiAgICAgIHdlYnZpZXdzLnB1c2goe1xuICAgICAgICBwcm9jOiBzb2NrZXROYW1lLFxuICAgICAgICB3ZWJ2aWV3OiBzb2NrZXROYW1lTWF0Y2hbMV1cbiAgICAgICAgICA/IGAke1dFQlZJRVdfQkFTRX0ke3NvY2tldE5hbWVNYXRjaFsxXX1gXG4gICAgICAgICAgOiBgJHtXRUJWSUVXX0JBU0V9JHtjcm9zc3dhbGtNYXRjaFsxXX1gLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3cztcbn1cblxuLyoqXG4gKiBBbGxvY2F0ZXMgYSBsb2NhbCBwb3J0IGZvciBkZXZ0b29scyBjb21tdW5pY2F0aW9uXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb2NrZXROYW1lIFRoZSByZW1vdGUgVW5peCBzb2NrZXQgbmFtZVxuICogQHBhcmFtIHs/bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBsb2NhbCBwb3J0IG51bWJlciBvciBudWxsIHRvIGFwcGx5XG4gKiBhdXRvZGV0ZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbG9jYWwgcG9ydCBudW1iZXIgaWYgdGhlIHJlbW90ZSBzb2NrZXQgaGFzIGJlZW4gZm9yd2FyZGVkXG4gKiBzdWNjZXNzZnVsbHkgb3IgYG51bGxgIG90aGVyd2lzZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhbGxvY2F0aW5nIHRoZSBsb2NhbCBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFsbG9jYXRlRGV2dG9vbHNQb3J0IChhZGIsIHNvY2tldE5hbWUsIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsKSB7XG4gIC8vIHNvY2tldCBuYW1lcyBjb21lIHdpdGggJ0AnLCBidXQgdGhpcyBzaG91bGQgbm90IGJlIGEgcGFydCBvZiB0aGUgYWJzdHJhY3RcbiAgLy8gcmVtb3RlIHBvcnQsIHNvIHJlbW92ZSBpdFxuICBjb25zdCByZW1vdGVQb3J0ID0gc29ja2V0TmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgbGV0IFtzdGFydFBvcnQsIGVuZFBvcnRdID0gREVWVE9PTFNfUE9SVFNfUkFOR0U7XG4gIGlmICh3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgZW5kUG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQgKyAoZW5kUG9ydCAtIHN0YXJ0UG9ydCk7XG4gICAgc3RhcnRQb3J0ID0gd2Vidmlld0RldnRvb2xzUG9ydDtcbiAgfVxuICBsb2dnZXIuZGVidWcoYEZvcndhcmRpbmcgcmVtb3RlIHBvcnQgJHtyZW1vdGVQb3J0fSB0byBhIGxvY2FsIGAgK1xuICAgIGBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fWApO1xuICBpZiAoIXdlYnZpZXdEZXZ0b29sc1BvcnQpIHtcbiAgICBsb2dnZXIuZGVidWcoYFlvdSBjb3VsZCB1c2UgdGhlICd3ZWJ2aWV3RGV2dG9vbHNQb3J0JyBjYXBhYmlsaXR5IHRvIGN1c3RvbWl6ZSBgICtcbiAgICAgIGB0aGUgc3RhcnRpbmcgcG9ydCBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IHtcbiAgICBsZXQgbG9jYWxQb3J0O1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYW55IGZyZWUgcG9ydCB0byBmb3J3YXJkIHRoZSBEZXZ0b29scyBzb2NrZXQgYCArXG4gICAgICAgIGBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH0uIFlvdSBjb3VsZCBzZXQgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyIGAgK1xuICAgICAgICBgbWFudWFsbHkgYnkgcHJvdmlkaW5nIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eWApO1xuICAgIH1cbiAgICBhd2FpdCBhZGIuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7bG9jYWxQb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7cmVtb3RlUG9ydH1gXSk7XG4gICAgcmV0dXJuIGxvY2FsUG9ydDtcbiAgfSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBUaGUgbmFtZSBvZiB0aGUgRGV2dG9vbHMgVW5peCBzb2NrZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSB3ZWIgdmlldyBhbGlhcy4gTG9va3MgbGlrZSBgV0VCVklFV19gXG4gKiBwcmVmaXggcGx1cyBQSUQgb3IgcGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gV2VidmlldyBpbmZvcm1hdGlvbiBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL3ZlcnNpb24gQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBXZWJ2aWV3IHBhZ2VzIGxpc3QgYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi9saXN0IENEUCBlbmRwb2ludFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV0YWlsQ29sbGVjdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgVGhlIHN0YXJ0aW5nIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrIChpZiBub3QgdGhlIGRlZmF1bHQgb2YgOTIyMikuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyBXaGV0aGVyIHRvIGNoZWNrIGZvciB3ZWJ2aWV3XG4gKiBwYWdlcyBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gV2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBDaHJvbWUgRGVidWdnZXIgUHJvdG9jb2wgZGF0YSBjb2xsZWN0aW9uLlxuICogTm8gZXJyb3IgaXMgdGhyb3duIGlmIENEUCByZXF1ZXN0IGZhaWxzIC0gaW4gc3VjaCBjYXNlIG5vIGRhdGEgd2lsbCBiZVxuICogcmVjb3JkZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBgd2Vidmlld3NNYXBwaW5nYCBpdGVtLlxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgVGhlIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheTxXZWJ2aWV3UHJvcHM+fSB3ZWJ2aWV3c01hcHBpbmcgVGhlIGN1cnJlbnQgd2Vidmlld3MgbWFwcGluZ1xuICogISEhIEVhY2ggaXRlbSBvZiB0aGlzIGFycmF5IGdldHMgbXV0YXRlZCAoYGluZm9gL2BwYWdlc2AgcHJvcGVydGllcyBnZXQgYWRkZWRcbiAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgb3B0c2ApIGlmIHRoZSByZXF1ZXN0ZWQgZGV0YWlscyBoYXZlIGJlZW5cbiAqIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgZm9yIGl0ICEhIVxuICogQHBhcmFtIHtEZXRhaWxDb2xsZWN0aW9uT3B0aW9uc30gb3B0cyBJZiBib3RoIGBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlc2AgYW5kXG4gKiBgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uYCBwcm9wZXJ0aWVzIGFyZSBmYWxzeSB0aGVuIG5vIGRldGFpbHMgY29sbGVjdGlvblxuICogaXMgcGVyZm9ybWVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMgKGFkYiwgd2Vidmlld3NNYXBwaW5nLCBvcHRzID0ge30pIHtcbiAgaWYgKF8uaXNFbXB0eSh3ZWJ2aWV3c01hcHBpbmcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsLFxuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gbnVsbCxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gPSBudWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjaGVja2luZyB3aGV0aGVyIHdlYnZpZXdzIGhhdmUgYWN0aXZlIHBhZ2VzOyB1c2UgdGhlIGAgK1xuICAgICAgYCdlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcycgY2FwIHRvIHR1cm4gdGhpcyBjaGVjayBvbmApO1xuICB9XG5cbiAgaWYgKCFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IGNvbGxlY3Rpbmcgd2ViIHZpZXcgZGV0YWlscy4gRGV0YWlscyBjb2xsZWN0aW9uIG1pZ2h0IGhlbHAgYCArXG4gICAgICBgdG8gbWFrZSBDaHJvbWVkcml2ZXIgaW5pdGlhbGl6YXRpb24gbW9yZSBwcmVjaXNlLiBVc2UgdGhlICdlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24nIGAgK1xuICAgICAgYGNhcCB0byB0dXJuIGl0IG9uYCk7XG4gIH1cblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzICYmICFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDb25uZWN0IHRvIGVhY2ggZGV2dG9vbHMgc29ja2V0IGFuZCByZXRyaWV2ZSB3ZWIgdmlldyBkZXRhaWxzXG4gIGxvZ2dlci5kZWJ1ZyhgQ29sbGVjdGluZyBDRFAgZGF0YSBvZiAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3Jywgd2Vidmlld3NNYXBwaW5nLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gIGNvbnN0IGRldGFpbENvbGxlY3RvcnMgPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGRldGFpbENvbGxlY3RvcnMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGxvY2FsUG9ydDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGFsbG9jYXRlRGV2dG9vbHNQb3J0KGFkYiwgaXRlbS5wcm9jLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0KTtcbiAgICAgICAgaWYgKGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgICAgICAgIGl0ZW0uaW5mbyA9IGF3YWl0IGNkcEluZm8obG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMpIHtcbiAgICAgICAgICBpdGVtLnBhZ2VzID0gYXdhaXQgY2RwTGlzdChsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChsb2NhbFBvcnQpIHtcbiAgICAgICAgICBhd2FpdCBhZGIucmVtb3ZlUG9ydEZvcndhcmQobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGRldGFpbENvbGxlY3RvcnMpO1xuICBsb2dnZXIuZGVidWcoYENEUCBkYXRhIGNvbGxlY3Rpb24gY29tcGxldGVkYCk7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwTGlzdCAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vbGlzdGAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvXG5hc3luYyBmdW5jdGlvbiBjZHBJbmZvIChsb2NhbFBvcnQpIHtcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke2xvY2FsUG9ydH0vanNvbi92ZXJzaW9uYCxcbiAgICB0aW1lb3V0OiBDRFBfUkVRX1RJTUVPVVQsXG4gIH0pKS5kYXRhO1xufVxuXG4vKipcbiAqIFRha2UgYSB3ZWJ2aWV3IG5hbWUgbGlrZSBXRUJWSUVXXzQyOTYgYW5kIHVzZSAnYWRiIHNoZWxsIHBzJyB0byBmaWd1cmUgb3V0XG4gKiB3aGljaCBhcHAgcGFja2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhhdCB3ZWJ2aWV3LiBPbmUgb2YgdGhlIHJlYXNvbnMgd2VcbiAqIHdhbnQgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgd2UncmUgbGlzdGluZyB3ZWJ2aWV3cyBmb3IgdGhlIGFjdHVhbCBBVVQsXG4gKiBub3Qgc29tZSBvdGhlciBydW5uaW5nIGFwcFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IC0gYSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwIHJ1bm5pbmcgdGhlIHdlYnZpZXdcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIHByb2Nlc3MgbmFtZVxuICovXG5oZWxwZXJzLnByb2NGcm9tV2VidmlldyA9IGFzeW5jIGZ1bmN0aW9uIHByb2NGcm9tV2VidmlldyAoYWRiLCB3ZWJ2aWV3KSB7XG4gIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICBpZiAoIXBpZE1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBQSUQgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIH1cblxuICBjb25zdCBwaWQgPSBwaWRNYXRjaFsxXTtcbiAgbG9nZ2VyLmRlYnVnKGAke3dlYnZpZXd9IG1hcHBlZCB0byBwaWQgJHtwaWR9YCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR2V0dGluZyBwcm9jZXNzIG5hbWUgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIGNvbnN0IHBrZyA9IGF3YWl0IGFkYi5nZXROYW1lQnlQaWQocGlkKTtcbiAgbG9nZ2VyLmRlYnVnKGBHb3QgcHJvY2VzcyBuYW1lOiAnJHtwa2d9J2ApO1xuICByZXR1cm4gcGtnO1xufTtcblxuLyoqXG4gKiBQYXJzZSB3ZWJ2aWV3IG5hbWVzIGZvciBnZXRDb250ZXh0c1xuICpcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHMgU2VlIG5vdGUgb24gZ2V0V2ViVmlld3NNYXBwaW5nXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2Ygd2VidmlldyBuYW1lc1xuICovXG5oZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzID0gZnVuY3Rpb24gcGFyc2VXZWJ2aWV3TmFtZXMgKHdlYnZpZXdzTWFwcGluZywge1xuICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IHRydWUsXG4gIGlzQ2hyb21lU2Vzc2lvbiA9IGZhbHNlXG59ID0ge30pIHtcbiAgaWYgKGlzQ2hyb21lU2Vzc2lvbikge1xuICAgIHJldHVybiBbQ0hST01JVU1fV0lOXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IHt3ZWJ2aWV3LCBwYWdlcywgcHJvYywgd2Vidmlld05hbWV9IG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGlmIChlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiBwYWdlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgU2tpcHBpbmcgdGhlIHdlYnZpZXcgJyR7d2Vidmlld30nIGF0ICcke3Byb2N9JyBgICtcbiAgICAgICAgYHNpbmNlIGl0IGhhcyByZXBvcnRlZCBoYXZpbmcgemVybyBwYWdlc2ApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh3ZWJ2aWV3TmFtZSkge1xuICAgICAgcmVzdWx0LnB1c2god2Vidmlld05hbWUpO1xuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ3dlYnZpZXcnLCByZXN1bHQubGVuZ3RoLCB0cnVlKX06ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0V2Vidmlld3NPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYW5kcm9pZERldmljZVNvY2tldCBbbnVsbF0gLSBkZXZpY2Ugc29ja2V0IG5hbWVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgW3RydWVdIC0gd2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZSBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgWzkyMjJdIC0gcG9ydCB0byB1c2UgZm9yIHdlYnZpZXcgcGFnZVxuICogcHJlc2VuY2UgY2hlY2suXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBbdHJ1ZV0gLSB3aGV0aGVyIHRvIGNvbGxlY3RcbiAqIHdlYiB2aWV3IGRldGFpbHMgYW5kIHNlbmQgdGhlbSB0byBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3IsIHNvIGl0IGNvdWxkXG4gKiBzZWxlY3QgYSBiaW5hcnkgbW9yZSBwcmVjaXNlbHkgYmFzZWQgb24gdGhpcyBpbmZvLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld3NNYXBwaW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVyeSB7P3N0cmluZ30gd2Vidmlld05hbWUgQW4gYWN0dWFsIHdlYnZpZXcgbmFtZSBmb3Igc3dpdGNoaW5nIGNvbnRleHRcbiAqL1xuXG4vKipcbiAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzIG1hcHBpbmcgYnkgaW50cm9zcGVjdGluZyBwcm9jZXNzZXMgd2l0aCBhZGIsXG4gKiB3aGVyZSB3ZWJ2aWV3cyBhcmUgbGlzdGVkLiBJdCdzIHBvc3NpYmxlIHRvIHBhc3MgaW4gYSAnZGV2aWNlU29ja2V0JyBhcmcsIHdoaWNoXG4gKiBsaW1pdHMgdGhlIHdlYnZpZXcgcG9zc2liaWxpdGllcyB0byB0aGUgb25lIHJ1bm5pbmcgb24gdGhlIENocm9taXVtIGRldnRvb2xzXG4gKiBzb2NrZXQgd2UncmUgaW50ZXJlc3RlZCBpbiAoc2VlIG5vdGUgb24gd2Vidmlld3NGcm9tUHJvY3MpLiBXZSBjYW4gYWxzb1xuICogZGlyZWN0IHRoaXMgbWV0aG9kIHRvIHZlcmlmeSB3aGV0aGVyIGEgcGFydGljdWxhciB3ZWJ2aWV3IHByb2Nlc3MgYWN0dWFsbHlcbiAqIGhhcyBhbnkgcGFnZXMgKGlmIGEgcHJvY2VzcyBleGlzdHMgYnV0IG5vIHBhZ2VzIGFyZSBmb3VuZCwgQ2hyb21lZHJpdmVyIHdpbGxcbiAqIG5vdCBhY3R1YWxseSBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gaXQsIHNvIHRoaXMgc2VydmVzIGFzIGEgZ3VhcmQgZm9yIHRoYXRcbiAqIHN0cmFuZ2UgZmFpbHVyZSBtb2RlKS4gVGhlIHN0cmF0ZWd5IGZvciBjaGVja2luZyB3aGV0aGVyIGFueSBwYWdlcyBhcmVcbiAqIGFjdGl2ZSBpbnZvbHZlcyBzZW5kaW5nIGEgcmVxdWVzdCB0byB0aGUgcmVtb3RlIGRlYnVnIHNlcnZlciBvbiB0aGUgZGV2aWNlLFxuICogaGVuY2UgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBwb3J0IG9uIHRoZSBob3N0IG1hY2hpbmUgd2hpY2hcbiAqIHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGNvbW11bmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuaGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRXZWJWaWV3c01hcHBpbmcgKGFkYiwge1xuICBhbmRyb2lkRGV2aWNlU29ja2V0ID0gbnVsbCxcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzJyk7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdzRnJvbVByb2NzKGFkYiwgYW5kcm9pZERldmljZVNvY2tldCk7XG5cbiAgYXdhaXQgY29sbGVjdFdlYnZpZXdzRGV0YWlscyhhZGIsIHdlYnZpZXdzTWFwcGluZywge1xuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzLFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbixcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0LFxuICB9KTtcblxuICBmb3IgKGNvbnN0IHdlYnZpZXdNYXBwaW5nIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGNvbnN0IHt3ZWJ2aWV3LCBpbmZvfSA9IHdlYnZpZXdNYXBwaW5nO1xuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gbnVsbDtcblxuICAgIGxldCB3dk5hbWUgPSB3ZWJ2aWV3O1xuICAgIGxldCBwcm9jZXNzID0gdW5kZWZpbmVkO1xuICAgIGlmICghYW5kcm9pZERldmljZVNvY2tldCkge1xuICAgICAgY29uc3QgcGtnTWF0Y2ggPSBXRUJWSUVXX1BLR19QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyB3ZWIgdmlldyBuYW1lIGNvdWxkIGVpdGhlciBiZSBzdWZmaXhlZCB3aXRoIFBJRCBvciB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgIC8vIHBhY2thZ2UgbmFtZXMgY291bGQgbm90IHN0YXJ0IHdpdGggYSBkaWdpdFxuICAgICAgICBjb25zdCBwa2cgPSBwa2dNYXRjaCA/IHBrZ01hdGNoWzFdIDogYXdhaXQgaGVscGVycy5wcm9jRnJvbVdlYnZpZXcoYWRiLCB3ZWJ2aWV3KTtcbiAgICAgICAgd3ZOYW1lID0gYCR7V0VCVklFV19CQVNFfSR7cGtnfWA7XG4gICAgICAgIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgICBwcm9jZXNzID0ge1xuICAgICAgICAgIG5hbWU6IHBrZyxcbiAgICAgICAgICBpZDogcGlkTWF0Y2ggPyBwaWRNYXRjaFsxXSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gd3ZOYW1lO1xuICAgIGNvbnN0IGtleSA9IHRvRGV0YWlsc0NhY2hlS2V5KGFkYiwgd3ZOYW1lKTtcbiAgICBpZiAoaW5mbyB8fCBwcm9jZXNzKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLnNldChrZXksIHsgaW5mbywgcHJvY2VzcyB9KTtcbiAgICB9IGVsc2UgaWYgKFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuaGFzKGtleSkpIHtcbiAgICAgIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3c01hcHBpbmc7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2Nlc3NJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSBUaGUgcHJvY2VzcyBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkIFRoZSBwcm9jZXNzIGlkIChpZiBjb3VsZCBiZSByZXRyaWV2ZWQpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJWaWV3RGV0YWlsc1xuICogQHByb3BlcnR5IHs/UHJvY2Vzc0luZm99IHByb2Nlc3MgLSBXZWIgdmlldyBwcm9jZXNzIGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBpbmZvIC0gV2ViIHZpZXcgZGV0YWlscyBhcyByZXR1cm5lZCBieSAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludCwgZm9yIGV4YW1wbGU6XG4gKiB7XG4gKiAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzcyLjAuMzYwMS4wXCIsXG4gKiAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4zXCIsXG4gKiAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTNfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcyLjAuMzYwMS4wIFNhZmFyaS81MzcuMzZcIixcbiAqICBcIlY4LVZlcnNpb25cIjogXCI3LjIuMjMzXCIsXG4gKiAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQGNmZWRlOWRiMWQxNTRkZTA0NjhjYjA1Mzg0NzlmMzRjMDc1NWEwZjQpXCIsXG4gKiAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vbG9jYWxob3N0OjkyMjIvZGV2dG9vbHMvYnJvd3Nlci9iMGI4YTRmYi1iYjE3LTQzNTktOTUzMy1hOGQ5ZjM5MDhiZDhcIlxuICogfVxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHdlYiB2aWV3IGRldGFpbHMgcHJldmlvdXNseSBjYWNoZWQgYnkgYGdldFdlYnZpZXdzYCBjYWxsXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSBuYW1lIG9mIHRoZSB3ZWIgdmlld1xuICogQHJldHVybnMgez9XZWJWaWV3RGV0YWlsc30gRWl0aGVyIGB1bmRlZmluZWRgIG9yIHRoZSByZWNlbnQgd2ViIHZpZXcgZGV0YWlsc1xuICovXG5oZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzID0gZnVuY3Rpb24gZ2V0V2Vidmlld0RldGFpbHMgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHdlYnZpZXcpO1xuICByZXR1cm4gV0VCVklFV1NfREVUQUlMU19DQUNIRS5nZXQoa2V5KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIENocm9tZSBkcml2ZXIgY2FwYWJpbGl0aWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICogQXBwaXVtIGNhcGFiaWxpdGllc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFVzZXItcHJvdmlkZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGRldmljZUlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBbmRyb2lkIGRldmljZSB1bmRlciB0ZXN0XG4gKiBAcGFyYW0gez9XZWJWaWV3RGV0YWlsc30gd2ViVmlld0RldGFpbHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBjYXBhYmlsaXRpZXMgb2JqZWN0LlxuICogU2VlIGh0dHBzOi8vY2hyb21lZHJpdmVyLmNocm9taXVtLm9yZy9jYXBhYmlsaXRpZXMgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuaGVscGVycy5jcmVhdGVDaHJvbWVkcml2ZXJDYXBzID0gZnVuY3Rpb24gY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyAob3B0cywgZGV2aWNlSWQsIHdlYlZpZXdEZXRhaWxzKSB7XG4gIGNvbnN0IGNhcHMgPSB7IGNocm9tZU9wdGlvbnM6IHt9IH07XG5cbiAgY29uc3QgYW5kcm9pZFBhY2thZ2UgPSBvcHRzLmNocm9tZU9wdGlvbnM/LmFuZHJvaWRQYWNrYWdlXG4gICAgfHwgb3B0cy5hcHBQYWNrYWdlXG4gICAgfHwgd2ViVmlld0RldGFpbHM/LmluZm8/LlsnQW5kcm9pZC1QYWNrYWdlJ107XG4gIGlmIChhbmRyb2lkUGFja2FnZSkge1xuICAgIC8vIGNocm9tZWRyaXZlciByYWlzZXMgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aGVuIGFuZHJvaWRQYWNrYWdlIGlzICdudWxsJ1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlO1xuICB9XG4gIGlmIChfLmlzQm9vbGVhbihvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHApKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRVc2VSdW5uaW5nQXBwID0gb3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwO1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHkpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZFByb2Nlc3MpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSBvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzO1xuICB9IGVsc2UgaWYgKHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5uYW1lICYmIHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5pZCkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcyA9IHdlYlZpZXdEZXRhaWxzLnByb2Nlc3MubmFtZTtcbiAgfVxuICBpZiAoXy50b0xvd2VyKG9wdHMuYnJvd3Nlck5hbWUpID09PSAnY2hyb21pdW0td2VidmlldycpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICBpZiAob3B0cy5wYWdlTG9hZFN0cmF0ZWd5KSB7XG4gICAgY2Fwcy5wYWdlTG9hZFN0cmF0ZWd5ID0gb3B0cy5wYWdlTG9hZFN0cmF0ZWd5O1xuICB9XG4gIGNvbnN0IGlzQ2hyb21lID0gXy50b0xvd2VyKGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgPT09ICdjaHJvbWUnO1xuICBpZiAoXy5pbmNsdWRlcyhLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUywgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlKSB8fCBpc0Nocm9tZSkge1xuICAgIC8vIGlmIHdlIGhhdmUgZXh0cmFjdGVkIHBhY2thZ2UgZnJvbSBjb250ZXh0IG5hbWUsIGl0IGNvdWxkIGNvbWUgaW4gYXMgYmFyZVxuICAgIC8vIFwiY2hyb21lXCIsIGFuZCBzbyB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoZSBkZXRhaWxzIGFyZSBjb3JyZWN0LCBpbmNsdWRpbmdcbiAgICAvLyBub3QgdXNpbmcgYW4gYWN0aXZpdHkgb3IgcHJvY2VzcyBpZFxuICAgIGlmIChpc0Nocm9tZSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gQ0hST01FX1BBQ0tBR0VfTkFNRTtcbiAgICB9XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHk7XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcztcbiAgfVxuICAvLyBhZGQgZGV2aWNlIGlkIGZyb20gYWRiXG4gIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkRGV2aWNlU2VyaWFsID0gZGV2aWNlSWQ7XG5cbiAgaWYgKF8uaXNQbGFpbk9iamVjdChvcHRzLmxvZ2dpbmdQcmVmcykgfHwgXy5pc1BsYWluT2JqZWN0KG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzKSkge1xuICAgIGlmIChvcHRzLmxvZ2dpbmdQcmVmcykge1xuICAgICAgbG9nZ2VyLndhcm4oYFRoZSAnbG9nZ2luZ1ByZWZzJyBjYXAgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZGApO1xuICAgIH1cbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzIHx8IG9wdHMubG9nZ2luZ1ByZWZzO1xuICB9XG4gIGlmIChvcHRzLmVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZykge1xuICAgIGxvZ2dlci53YXJuKGBUaGUgJ2VuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHNpbXBseSB1c2UgYCArXG4gICAgICBgdGhlICdjaHJvbWVMb2dnaW5nUHJlZnMnIGNhcCBpbnN0ZWFkLCB3aXRoIGEgJ3BlcmZvcm1hbmNlJyBrZXkgc2V0IHRvICdBTEwnYCk7XG4gICAgY29uc3QgbmV3UHJlZiA9IHtwZXJmb3JtYW5jZTogJ0FMTCd9O1xuICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBvdGhlciBsb2dnaW5nIHByZWZzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgaW4gaWYgdGhleSBleGlzdFxuICAgIGNhcHMubG9nZ2luZ1ByZWZzID0gY2Fwcy5sb2dnaW5nUHJlZnNcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY2Fwcy5sb2dnaW5nUHJlZnMsIG5ld1ByZWYpXG4gICAgICA6IG5ld1ByZWY7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVPcHRpb25zPy5Bcmd1bWVudHMpIHtcbiAgICAvLyBtZXJnZSBgQXJndW1lbnRzYCBhbmQgYGFyZ3NgXG4gICAgb3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MgPSBbLi4uKG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzIHx8IFtdKSwgLi4ub3B0cy5jaHJvbWVPcHRpb25zLkFyZ3VtZW50c107XG4gICAgZGVsZXRlIG9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHM7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1ByZWNhbGN1bGF0ZWQgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllczogJyArXG4gICAgSlNPTi5zdHJpbmdpZnkoY2Fwcy5jaHJvbWVPcHRpb25zLCBudWxsLCAyKSk7XG5cbiAgY29uc3QgcHJvdGVjdGVkQ2FwTmFtZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbb3B0LCB2YWxdIG9mIF8udG9QYWlycyhvcHRzLmNocm9tZU9wdGlvbnMpKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0pKSB7XG4gICAgICBjYXBzLmNocm9tZU9wdGlvbnNbb3B0XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvdGVjdGVkQ2FwTmFtZXMucHVzaChvcHQpO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShwcm90ZWN0ZWRDYXBOYW1lcykpIHtcbiAgICBsb2dnZXIuaW5mbygnVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgY2FwYWJpbGl0aWVzIGNhbm5vdCBiZSBvdmVycmlkZGVuICcgK1xuICAgICAgJ2J5IHRoZSBwcm92aWRlZCBjaHJvbWVPcHRpb25zOicpO1xuICAgIGZvciAoY29uc3Qgb3B0TmFtZSBvZiBwcm90ZWN0ZWRDYXBOYW1lcykge1xuICAgICAgbG9nZ2VyLmluZm8oYCAgJHtvcHROYW1lfSAoJHtKU09OLnN0cmluZ2lmeShvcHRzLmNocm9tZU9wdGlvbnNbb3B0TmFtZV0pfSlgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2Fwcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG5leHBvcnQgeyBoZWxwZXJzLCBOQVRJVkVfV0lOLCBXRUJWSUVXX1dJTiwgV0VCVklFV19CQVNFLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFlBQW5COztBQUNBLE1BQU1DLFdBQVcsR0FBRyxTQUFwQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUcsVUFBckI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFJLEdBQUVGLFdBQVksR0FBcEM7O0FBQ0EsTUFBTUcsbUJBQW1CLEdBQUcsSUFB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
@@ -2,7 +2,7 @@ import _ from 'lodash';
2
2
  import path from 'path';
3
3
  import { retry, waitForCondition } from 'asyncbox';
4
4
  import logger from './logger';
5
- import { fs, util } from 'appium/support';
5
+ import { fs, util, tempDir } from 'appium/support';
6
6
  import { path as settingsApkPath } from 'io.appium.settings';
7
7
  import Bootstrap from './bootstrap';
8
8
  import B from 'bluebird';
@@ -14,6 +14,7 @@ import {
14
14
  import { EOL } from 'os';
15
15
  import semver from 'semver';
16
16
 
17
+ const MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';
17
18
  const PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds
18
19
  // https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc
19
20
  const CHROME_BROWSER_PACKAGE_ACTIVITY = {
@@ -536,6 +537,62 @@ helpers.setMockLocationApp = async function setMockLocationApp (adb, app) {
536
537
  }
537
538
  } catch (err) {
538
539
  logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);
540
+ return;
541
+ }
542
+ try {
543
+ let pkgIds = [];
544
+ if (await adb.fileExists(MOCK_APP_IDS_STORE)) {
545
+ try {
546
+ pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));
547
+ } catch (ign) {}
548
+ }
549
+ if (pkgIds.includes(app)) {
550
+ return;
551
+ }
552
+ pkgIds.push(app);
553
+ const tmpRoot = await tempDir.openDir();
554
+ const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));
555
+ try {
556
+ await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');
557
+ await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);
558
+ } finally {
559
+ await fs.rimraf(tmpRoot);
560
+ }
561
+ } catch (e) {
562
+ logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);
563
+ }
564
+ };
565
+
566
+ helpers.resetMockLocation = async function resetMockLocation (adb) {
567
+ try {
568
+ if (await adb.getApiLevel() < 23) {
569
+ await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);
570
+ return;
571
+ }
572
+
573
+ const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);
574
+ let pkgIds = [];
575
+ if (await adb.fileExists(MOCK_APP_IDS_STORE)) {
576
+ try {
577
+ pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));
578
+ } catch (ign) {}
579
+ }
580
+ const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;
581
+ // Only include currently installed packages
582
+ const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);
583
+ if (_.size(resultPkgs) <= 1) {
584
+ await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);
585
+ return;
586
+ }
587
+
588
+ logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);
589
+ await B.all(resultPkgs.map((pkgId) => (async () => {
590
+ try {
591
+ await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);
592
+ } catch (ign) {}
593
+ })()));
594
+ } catch (err) {
595
+ logger.warn(`Unable to reset mock location: ${err.message}`);
539
596
  }
540
597
  };
541
598
 
@@ -777,8 +834,12 @@ helpers.initDevice = async function initDevice (adb, opts) {
777
834
  await helpers.pushSettingsApp(adb, shouldThrowError, opts);
778
835
  }
779
836
 
780
- if (!helpers.isEmulator(adb, opts) && (mockLocationApp || _.isUndefined(mockLocationApp))) {
781
- await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);
837
+ if (!helpers.isEmulator(adb, opts)) {
838
+ if (mockLocationApp || _.isUndefined(mockLocationApp)) {
839
+ await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);
840
+ } else {
841
+ await helpers.resetMockLocation(adb);
842
+ }
782
843
  }
783
844
 
784
845
  if (language || locale) {
package/lib/bootstrap.js CHANGED
@@ -4,7 +4,7 @@ import path from 'path';
4
4
  import _ from 'lodash';
5
5
  import { errorFromCode } from 'appium/driver';
6
6
  import B from 'bluebird';
7
- import { logger } from 'appium/support';
7
+ import { logger, fs } from 'appium/support';
8
8
 
9
9
 
10
10
  const log = logger.getLogger('AndroidBootstrap');
@@ -14,6 +14,29 @@ const COMMAND_TYPES = {
14
14
  };
15
15
  const SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;
16
16
 
17
+ /**
18
+ * Calculates the path to the current module's root folder
19
+ *
20
+ * @returns {string} The full path to module root
21
+ * @throws {Error} If the current module root folder cannot be determined
22
+ */
23
+ const getModuleRoot = _.memoize(async function getModuleRoot () {
24
+ let currentDir = path.dirname(path.resolve(__filename));
25
+ let isAtFsRoot = false;
26
+ while (!isAtFsRoot) {
27
+ const manifestPath = path.join(currentDir, 'package.json');
28
+ try {
29
+ if (await fs.exists(manifestPath) &&
30
+ JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {
31
+ return currentDir;
32
+ }
33
+ } catch (ign) {}
34
+ currentDir = path.dirname(currentDir);
35
+ isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;
36
+ }
37
+ throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');
38
+ });
39
+
17
40
  class AndroidBootstrap {
18
41
  constructor (adb, systemPort = 4724, webSocket = undefined) {
19
42
  this.adb = adb;
@@ -35,9 +58,8 @@ class AndroidBootstrap {
35
58
 
36
59
  async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {
37
60
  try {
38
- const rootDir = path.resolve(__dirname, '..', '..');
39
61
  const startDetector = (s) => /Appium Socket Server Ready/.test(s);
40
- const bootstrapJar = path.resolve(rootDir, 'bootstrap', 'bin', 'AppiumBootstrap.jar');
62
+ const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');
41
63
 
42
64
  await this.init();
43
65
  await this.adb.forwardPort(this.systemPort, 4724);
@@ -7,7 +7,23 @@ import { errors } from 'appium/driver';
7
7
  const APP_EXTENSIONS = ['.apk', '.apks'];
8
8
  const RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';
9
9
 
10
- let commands = {};
10
+ const commands = {};
11
+
12
+ /**
13
+ * Assert the presence of particular keys in the given object
14
+ *
15
+ * @param {string|Array<string>} argNames one or more key names
16
+ * @param {Object} opts the object to check
17
+ * @returns {Object} the same given object
18
+ */
19
+ function requireArgs (argNames, opts = {}) {
20
+ for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {
21
+ if (!_.has(opts, argName)) {
22
+ throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);
23
+ }
24
+ }
25
+ return opts;
26
+ }
11
27
 
12
28
  /**
13
29
  * Verify whether an application is installed or not
@@ -19,6 +35,22 @@ commands.isAppInstalled = async function isAppInstalled (appId) {
19
35
  return await this.adb.isAppInstalled(appId);
20
36
  };
21
37
 
38
+ /**
39
+ * @typedef {Object} MobileAppInstalledOptions
40
+ * @property {string} appId - Application package identifier. Must be always provided.
41
+ */
42
+
43
+ /**
44
+ * Verify whether an application is installed or not
45
+ *
46
+ * @param {MobileAppInstalledOptions} opts
47
+ * @returns {boolean} Same as in `isAppInstalled`
48
+ */
49
+ commands.mobileIsAppInstalled = async function mobileIsAppInstalled (opts = {}) {
50
+ const { appId } = requireArgs('appId', opts);
51
+ return await this.isAppInstalled(appId);
52
+ };
53
+
22
54
  /**
23
55
  * Queries the current state of the app.
24
56
  *
@@ -47,12 +79,29 @@ commands.queryAppState = async function queryAppState (appId) {
47
79
  return APP_STATE.RUNNING_IN_BACKGROUND;
48
80
  };
49
81
 
82
+ /**
83
+ * @typedef {Object} MobileQueryAppStateOptions
84
+ * @property {string} appId - Application package identifier. Must be always provided.
85
+ */
86
+
87
+ /**
88
+ * Queries the current state of the app.
89
+ *
90
+ * @param {MobileQueryAppStateOptions} opts
91
+ * @returns {number} Same as in `queryAppState`
92
+ */
93
+ commands.mobileQueryAppState = async function mobileQueryAppState (opts = {}) {
94
+ const { appId } = requireArgs('appId', opts);
95
+ return await this.queryAppState(appId);
96
+ };
97
+
50
98
  /**
51
99
  * Activates the given application or launches it if necessary.
52
- * The action is done with monkey tool and literally simulates
100
+ * The action literally simulates
53
101
  * clicking the corresponding application icon on the dashboard.
54
102
  *
55
103
  * @param {string} appId - Application package identifier
104
+ * @throws {Error} If the app cannot be activated
56
105
  */
57
106
  commands.activateApp = async function activateApp (appId) {
58
107
  this.log.debug(`Activating '${appId}'`);
@@ -104,6 +153,24 @@ commands.activateApp = async function activateApp (appId) {
104
153
  }
105
154
  };
106
155
 
156
+ /**
157
+ * @typedef {Object} MobileActivateAppOptions
158
+ * @property {string} appId - Application package identifier. Must be always provided.
159
+ */
160
+
161
+ /**
162
+ * Activates the given application or launches it if necessary.
163
+ * The action literally simulates
164
+ * clicking the corresponding application icon on the dashboard.
165
+ *
166
+ * @param {MobileActivateAppOptions} opts
167
+ * @throws {Error} If the app cannot be activated
168
+ */
169
+ commands.mobileActivateApp = async function mobileActivateApp (opts = {}) {
170
+ const { appId } = requireArgs('appId', opts);
171
+ return await this.activateApp(appId);
172
+ };
173
+
107
174
  /**
108
175
  * @typedef {Object} UninstallOptions
109
176
  * @property {number} timeout [20000] - The count of milliseconds to wait until the
@@ -125,6 +192,23 @@ commands.removeApp = async function removeApp (appId, options = {}) {
125
192
  return await this.adb.uninstallApk(appId, options);
126
193
  };
127
194
 
195
+ /**
196
+ * @typedef {Object} MobileRemoveAppOptions
197
+ * @property {string} appId - Application package identifier. Must be always provided.
198
+ */
199
+
200
+ /**
201
+ * Remove the corresponding application if is installed.
202
+ * The call is ignored if the app is not installed.
203
+ *
204
+ * @param {MobileRemoveAppOptions} opts
205
+ * @returns {boolean} Same as in `removeApp`
206
+ */
207
+ commands.mobileRemoveApp = async function mobileRemoveApp (opts = {}) {
208
+ const { appId } = requireArgs('appId', opts);
209
+ return await this.removeApp(appId, opts);
210
+ };
211
+
128
212
  /**
129
213
  * @typedef {Object} TerminateOptions
130
214
  * @property {number|string} timeout [500] - The count of milliseconds to wait until the
@@ -157,6 +241,25 @@ commands.terminateApp = async function terminateApp (appId, options = {}) {
157
241
  return true;
158
242
  };
159
243
 
244
+ /**
245
+ * @typedef {Object} MobileTerminateAppOptions
246
+ * @property {string} appId - Application package identifier. Must be always provided.
247
+ * @property {number|string} timeout [500] - The count of milliseconds to wait until the
248
+ * app is terminated.
249
+ */
250
+
251
+ /**
252
+ * Terminates the app if it is running.
253
+ *
254
+ * @param {MobileTerminateAppOptions} opts
255
+ * @returns {boolean} Same as in `terminateApp`
256
+ * @throws {Error} if the app has not been terminated within the given timeout.
257
+ */
258
+ commands.mobileTerminateApp = async function mobileTerminateApp (opts = {}) {
259
+ const { appId } = requireArgs('appId', opts);
260
+ return await this.terminateApp(appId, opts);
261
+ };
262
+
160
263
  /**
161
264
  * @typedef {Object} InstallOptions
162
265
  * @property {number} timeout [60000] - The count of milliseconds to wait until the
@@ -186,6 +289,35 @@ commands.installApp = async function installApp (appPath, options = {}) {
186
289
  await this.adb.install(localPath, options);
187
290
  };
188
291
 
292
+ /**
293
+ * @typedef {Object} MobileInstallAppOptions
294
+ * @property {string} appPath - The local apk path or a remote url. Must be always provided.
295
+ * @property {number} timeout [60000] - The count of milliseconds to wait until the
296
+ * app is installed.
297
+ * @property {boolean} allowTestPackages [false] - Set to true in order to allow test
298
+ * packages installation.
299
+ * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard
300
+ * instead of the device memory.
301
+ * @property {boolean} grantPermissions [false] - Set to true in order to grant all the
302
+ * permissions requested in the application's manifest
303
+ * automatically after the installation is completed
304
+ * under Android 6+.
305
+ * @property {boolean} replace [true] - Set it to false if you don't want
306
+ * the application to be upgraded/reinstalled
307
+ * if it is already present on the device.
308
+ */
309
+
310
+ /**
311
+ * Installs the given application to the device under test
312
+ *
313
+ * @param {MobileInstallAppOptions} opts
314
+ * @throws {Error} if the given apk does not exist or is not reachable
315
+ */
316
+ commands.mobileInstallApp = async function mobileInstallApp (opts = {}) {
317
+ const { appPath } = requireArgs('appPath', opts);
318
+ return await this.installApp(appPath, opts);
319
+ };
320
+
189
321
  /**
190
322
  * @typedef {Object} ClearAppOptions
191
323
  * @property {!string} appId The identifier of the application package to be cleared
@@ -48,6 +48,12 @@ extensions.executeMobile = async function executeMobile (mobileCommand, opts = {
48
48
 
49
49
  deleteFile: 'mobileDeleteFile',
50
50
 
51
+ isAppInstalled: 'mobileIsAppInstalled',
52
+ queryAppState: 'mobileQueryAppState',
53
+ activateApp: 'mobileActivateApp',
54
+ removeApp: 'mobileRemoveApp',
55
+ terminateApp: 'mobileTerminateApp',
56
+ installApp: 'mobileInstallApp',
51
57
  clearApp: 'mobileClearApp',
52
58
 
53
59
  startService: 'mobileStartService',
@@ -93,11 +93,14 @@ async function scheduleScreenRecord (adb, recordingProperties, log = null) {
93
93
  : MAX_RECORDING_TIME_SEC;
94
94
  log?.debug(`Starting the next ${chunkDuration}s-chunk ` +
95
95
  `of screen recording in order to achieve ${timeLimitInt}s total duration`);
96
- scheduleScreenRecord(adb, recordingProperties, log)
97
- .catch((e) => {
96
+ (async () => {
97
+ try {
98
+ await scheduleScreenRecord(adb, recordingProperties, log);
99
+ } catch (e) {
98
100
  log?.error(e.stack);
99
101
  recordingProperties.stopped = true;
100
- });
102
+ }
103
+ })();
101
104
  });
102
105
 
103
106
  await recordingProc.start(0);
package/lib/driver.js CHANGED
@@ -263,11 +263,16 @@ class AndroidDriver extends BaseDriver {
263
263
  this.bootstrap = new helpers.bootstrap(this.adb, this.opts.bootstrapPort, this.opts.websocket);
264
264
  await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);
265
265
  // handling unexpected shutdown
266
- this.bootstrap.onUnexpectedShutdown.catch(async (err) => { // eslint-disable-line promise/prefer-await-to-callbacks
267
- if (!this.bootstrap.ignoreUnexpectedShutdown) {
268
- await this.startUnexpectedShutdown(err);
266
+ (async () => {
267
+ try {
268
+ await this.bootstrap.onUnexpectedShutdown;
269
+ } catch (err) {
270
+ if (!this.bootstrap.ignoreUnexpectedShutdown) {
271
+ await this.startUnexpectedShutdown(err);
272
+ }
269
273
  }
270
- });
274
+ })();
275
+
271
276
 
272
277
  if (!this.opts.skipUnlock) {
273
278
  // Let's try to unlock the device
@@ -421,7 +421,7 @@ helpers.getWebViewsMapping = async function getWebViewsMapping (adb, {
421
421
  if (info || process) {
422
422
  WEBVIEWS_DETAILS_CACHE.set(key, { info, process });
423
423
  } else if (WEBVIEWS_DETAILS_CACHE.has(key)) {
424
- WEBVIEWS_DETAILS_CACHE.del(key);
424
+ WEBVIEWS_DETAILS_CACHE.delete(key);
425
425
  }
426
426
  }
427
427
  return webviewsMapping;