appium-android-driver 5.10.4 → 5.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/lib/android-helpers.js +1 -1
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +1 -1
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +52 -1
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +1 -1
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +1 -1
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +1 -1
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/execute.js +1 -1
  15. package/build/lib/commands/execute.js.map +1 -1
  16. package/build/lib/commands/file-actions.js +1 -1
  17. package/build/lib/commands/file-actions.js.map +1 -1
  18. package/build/lib/commands/find.js +1 -1
  19. package/build/lib/commands/find.js.map +1 -1
  20. package/build/lib/commands/general.js +1 -1
  21. package/build/lib/commands/general.js.map +1 -1
  22. package/build/lib/commands/ime.js +1 -1
  23. package/build/lib/commands/ime.js.map +1 -1
  24. package/build/lib/commands/index.js +1 -1
  25. package/build/lib/commands/index.js.map +1 -1
  26. package/build/lib/commands/intent.js +1 -1
  27. package/build/lib/commands/intent.js.map +1 -1
  28. package/build/lib/commands/keyboard.js +1 -1
  29. package/build/lib/commands/keyboard.js.map +1 -1
  30. package/build/lib/commands/log.js +1 -1
  31. package/build/lib/commands/log.js.map +1 -1
  32. package/build/lib/commands/media-projection.js +1 -1
  33. package/build/lib/commands/media-projection.js.map +1 -1
  34. package/build/lib/commands/network.js +6 -55
  35. package/build/lib/commands/network.js.map +1 -1
  36. package/build/lib/commands/performance.js +1 -1
  37. package/build/lib/commands/performance.js.map +1 -1
  38. package/build/lib/commands/permissions.js +1 -1
  39. package/build/lib/commands/permissions.js.map +1 -1
  40. package/build/lib/commands/recordscreen.js +1 -1
  41. package/build/lib/commands/recordscreen.js.map +1 -1
  42. package/build/lib/commands/streamscreen.js +1 -1
  43. package/build/lib/commands/streamscreen.js.map +1 -1
  44. package/build/lib/commands/touch.js +1 -1
  45. package/build/lib/commands/touch.js.map +1 -1
  46. package/build/lib/driver.js +1 -1
  47. package/build/lib/driver.js.map +1 -1
  48. package/build/lib/uiautomator.js +1 -1
  49. package/build/lib/uiautomator.js.map +1 -1
  50. package/build/lib/unlock-helpers.js +1 -1
  51. package/build/lib/unlock-helpers.js.map +1 -1
  52. package/build/lib/utils.js +1 -1
  53. package/build/lib/utils.js.map +1 -1
  54. package/build/lib/webview-helpers.js +1 -1
  55. package/build/lib/webview-helpers.js.map +1 -1
  56. package/lib/commands/actions.js +135 -0
  57. package/lib/commands/network.js +18 -90
  58. package/lib/utils.js +4 -3
  59. package/package.json +2 -2
@@ -239,4 +239,4 @@ helpers.PATTERN_UNLOCK = PATTERN_UNLOCK;
239
239
  helpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;
240
240
  var _default = helpers;
241
241
  exports.default = _default;
242
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfbG9kYXNoIiwiX3N1cHBvcnQiLCJQSU5fVU5MT0NLIiwiZXhwb3J0cyIsIlBJTl9VTkxPQ0tfS0VZX0VWRU5UIiwiUEFTU1dPUkRfVU5MT0NLIiwiUEFUVEVSTl9VTkxPQ0siLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJVTkxPQ0tfVFlQRVMiLCJLRVlDT0RFX05VTVBBRF9FTlRFUiIsIlVOTE9DS19XQUlUX1RJTUUiLCJJTlBVVF9LRVlTX1dBSVRfVElNRSIsIk5VTUJFUl9aRVJPX0tFWUNPREUiLCJoZWxwZXJzIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJjYXBzIiwidW5sb2NrS2V5IiwidW5sb2NrVHlwZSIsIl8iLCJpc05pbCIsIkVycm9yIiwiaW5jbHVkZXMiLCJ0ZXN0IiwidHJpbSIsImZhc3RVbmxvY2siLCJhZGIiLCJvcHRzIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwibG9nZ2VyIiwiaW5mbyIsIndhc0xvY2tFbmFibGVkIiwiaXNMb2NrRW5hYmxlZCIsImNsZWFyTG9ja0NyZWRlbnRpYWwiLCJjeWNsZVdha2VVcCIsImRpc21pc3NLZXlndWFyZCIsInNldExvY2tDcmVkZW50aWFsIiwiZW5jb2RlUGFzc3dvcmQiLCJrZXkiLCJyZXBsYWNlIiwic3RyaW5nS2V5VG9BcnIiLCJzcGxpdCIsImZpbmdlcnByaW50VW5sb2NrIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwiZ2V0QXBpTGV2ZWwiLCJmaW5nZXJwcmludCIsInNsZWVwIiwicGluVW5sb2NrIiwia2V5cyIsImVscyIsImZpbmRFbE9yRWxzIiwiaXNFbXB0eSIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBpbnMiLCJlbCIsInRleHQiLCJnZXRBdHRyaWJ1dGUiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsInBpbiIsImNsaWNrIiwid2FpdEZvclVubG9jayIsImlzU2NyZWVuTG9ja2VkIiwia2V5ZXZlbnQiLCJzaGVsbCIsInBhcnNlSW50IiwicGFzc3dvcmRVbmxvY2siLCJnZXRQYXR0ZXJuS2V5UG9zaXRpb24iLCJpbml0UG9zIiwicGllY2UiLCJjb2xzIiwieFBvcyIsIngiLCJNYXRoIiwicm91bmQiLCJ5UG9zIiwieSIsImNlaWwiLCJnZXRQYXR0ZXJuQWN0aW9ucyIsImFjdGlvbnMiLCJsYXN0UG9zIiwia2V5UG9zIiwicHVzaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJlbGVtZW50IiwibW92ZVRvIiwiZGlmZlgiLCJhYnMiLCJkaWZmWSIsInBhdHRlcm5VbmxvY2siLCJhcGlMZXZlbCIsImdldExvY2F0aW9uIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCIsInBlcmZvcm1Ub3VjaCIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91bmxvY2staGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBQSU5fVU5MT0NLID0gJ3Bpbic7XG5jb25zdCBQSU5fVU5MT0NLX0tFWV9FVkVOVCA9ICdwaW5XaXRoS2V5RXZlbnQnO1xuY29uc3QgUEFTU1dPUkRfVU5MT0NLID0gJ3Bhc3N3b3JkJztcbmNvbnN0IFBBVFRFUk5fVU5MT0NLID0gJ3BhdHRlcm4nO1xuY29uc3QgRklOR0VSUFJJTlRfVU5MT0NLID0gJ2ZpbmdlcnByaW50JztcbmNvbnN0IFVOTE9DS19UWVBFUyA9IFtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSyxcbiAgUEFUVEVSTl9VTkxPQ0ssIEZJTkdFUlBSSU5UX1VOTE9DS1xuXTtcbmNvbnN0IEtFWUNPREVfTlVNUEFEX0VOVEVSID0gNjY7XG5jb25zdCBVTkxPQ0tfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgSU5QVVRfS0VZU19XQUlUX1RJTUUgPSAxMDA7XG5jb25zdCBOVU1CRVJfWkVST19LRVlDT0RFID0gNztcblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5oZWxwZXJzLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzID0gZnVuY3Rpb24gdmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdW5sb2NrS2V5LFxuICAgIHVubG9ja1R5cGUsXG4gIH0gPSBjYXBzO1xuICBpZiAoXy5pc05pbCh1bmxvY2tLZXkpIHx8IHVubG9ja0tleSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egbm9uLWVtcHR5IHVubG9jayBrZXkgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgaWYgKFtQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCwgRklOR0VSUFJJTlRfVU5MT0NLXS5pbmNsdWRlcyh1bmxvY2tUeXBlKSkge1xuICAgIGlmICghL15bMC05XSskLy50ZXN0KF8udHJpbSh1bmxvY2tLZXkpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmxvY2sga2V5IHZhbHVlICcke3VubG9ja0tleX0nIG11c3Qgb25seSBjb25zaXN0IG9mIGRpZ2l0c2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmICh1bmxvY2tUeXBlID09PSBQQVRURVJOX1VOTE9DSykge1xuICAgIGlmICghL15bMS05XXsyLDl9JC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgaW5jbHVkZSBmcm9tIHR3byB0byBuaW5lIGRpZ2l0cyBpbiByYW5nZSAxLi45YCk7XG4gICAgfVxuICAgIGlmICgvKFsxLTldKS4qP1xcMS8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IGRlZmluZSBhIHZhbGlkIHBhdHRlcm4gd2hlcmUgcmVwZWF0cyBhcmUgbm90IGFsbG93ZWRgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFTU1dPUkRfVU5MT0NLKSB7XG4gICAgLy8gRG9udCB0cmltIHBhc3N3b3JkIGtleSwgeW91IGNhbiB1c2UgYmxhbmsgc3BhY2VzIGluIHlvdXIgYW5kcm9pZCBwYXNzd29yZFxuICAgIC8vIMKvXFxfKOODhClfL8KvXG4gICAgaWYgKCEvLns0LH0vZy50ZXN0KHVubG9ja0tleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1pbmltdW0gYWxsb3dlZCBsZW5ndGggb2YgdW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBpcyA0IGNoYXJhY3RlcnNgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVubG9jayB0eXBlICcke3VubG9ja1R5cGV9Jy4gYCArXG4gICAgICBgT25seSB0aGUgZm9sbG93aW5nIHVubG9jayB0eXBlcyBhcmUgc3VwcG9ydGVkOiAke1VOTE9DS19UWVBFU31gKTtcbiAgfVxuICByZXR1cm4gY2Fwcztcbn07XG5cbmhlbHBlcnMuZmFzdFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGZhc3RVbmxvY2sgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBjcmVkZW50aWFsLFxuICAgIGNyZWRlbnRpYWxUeXBlLFxuICB9ID0gb3B0cztcbiAgbG9nZ2VyLmluZm8oYFVubG9ja2luZyB0aGUgZGV2aWNlIHZpYSBBREIgdXNpbmcgJHtjcmVkZW50aWFsVHlwZX0gY3JlZGVudGlhbCAnJHtjcmVkZW50aWFsfSdgKTtcbiAgY29uc3Qgd2FzTG9ja0VuYWJsZWQgPSBhd2FpdCBhZGIuaXNMb2NrRW5hYmxlZCgpO1xuICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICBhd2FpdCBhZGIuY2xlYXJMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgICAvLyBub3Qgc3VyZSB3aHksIGJ1dCB0aGUgZGV2aWNlJ3Mgc2NyZWVuIHN0aWxsIHJlbWFpbnMgbG9ja2VkXG4gICAgLy8gaWYgYSBwcmVsaW1pbmFyeSB3YWtlIHVwIGN5Y2xlIGhhcyBub3QgYmVlbiBwZXJmb3JtZWRcbiAgICBhd2FpdCBhZGIuY3ljbGVXYWtlVXAoKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuaW5mbygnTm8gYWN0aXZlIGxvY2sgaGFzIGJlZW4gZGV0ZWN0ZWQuIFByb2NlZWRpbmcgdG8gdGhlIGtleWd1YXJkIGRpc21pc3NhbCcpO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh3YXNMb2NrRW5hYmxlZCkge1xuICAgICAgYXdhaXQgYWRiLnNldExvY2tDcmVkZW50aWFsKGNyZWRlbnRpYWxUeXBlLCBjcmVkZW50aWFsKTtcbiAgICB9XG4gIH1cbn07XG5cbmhlbHBlcnMuZW5jb2RlUGFzc3dvcmQgPSBmdW5jdGlvbiBlbmNvZGVQYXNzd29yZCAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC5yZXBsYWNlKC9cXHMvaWcsICclcycpO1xufTtcblxuaGVscGVycy5zdHJpbmdLZXlUb0FyciA9IGZ1bmN0aW9uIHN0cmluZ0tleVRvQXJyIChrZXkpIHtcbiAgcmV0dXJuIGAke2tleX1gLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcnKS5zcGxpdCgvXFxzKi8pO1xufTtcblxuaGVscGVycy5maW5nZXJwcmludFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50VW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5nZXJwcmludCB1bmxvY2sgb25seSB3b3JrcyBmb3IgQW5kcm9pZCA2KyBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCBhZGIuZmluZ2VycHJpbnQoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufTtcblxuaGVscGVycy5waW5VbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBwaW5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBpbiAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG4gIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyMSkge1xuICAgIGNvbnN0IGVscyA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuc3lzdGVtdWk6aWQvZGlnaXRfdGV4dCcsIHRydWUpO1xuICAgIGlmIChfLmlzRW1wdHkoZWxzKSkge1xuICAgICAgLy8gZmFsbGJhY2sgdG8gcGluIHdpdGgga2V5IGV2ZW50XG4gICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgfVxuICAgIGNvbnN0IHBpbnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIGVscykge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGRyaXZlci5nZXRBdHRyaWJ1dGUoJ3RleHQnLCB1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgICAgIHBpbnNbdGV4dF0gPSBlbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwaW4gb2Yga2V5cykge1xuICAgICAgY29uc3QgZWwgPSBwaW5zW3Bpbl07XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsIGBjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXkke3Bpbn1gLCBmYWxzZSk7XG4gICAgICBpZiAoZWwgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gcGluIHdpdGgga2V5IGV2ZW50XG4gICAgICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRyaXZlci5jbGljayh1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgd2FpdEZvclVubG9jayhhZGIpO1xufTtcblxuLyoqXG4gKiBXYWl0IGZvciB0aGUgZGlzcGxheSB0byBiZSB1bmxvY2tlZC5cbiAqIFNvbWUgZGV2aWNlcyBhdXRvbWF0aWNhbGx5IGFjY2VwdCB0eXBlZCAncGluJyBhbmQgJ3Bhc3N3b3JkJyBjb2RlXG4gKiB3aXRob3V0IHByZXNzaW5nIHRoZSBFbnRlciBrZXkuIEJ1dCBzb21lIGRldmljZXMgbmVlZCBpdC5cbiAqIFRoaXMgbWV0aG9kIHdhaXRzIGEgZmV3IHNlY29uZHMgZmlyc3QgZm9yIHN1Y2ggYXV0b21hdGljIGFjY2VwdGFuY2UgY2FzZS5cbiAqIElmIHRoZSBkZXZpY2UgaXMgc3RpbGwgbG9ja2VkLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIHNlbmRcbiAqIHRoZSBlbnRlciBrZXkgY29kZS5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIFRoZSBpbnN0YW5jZSBvZiBBREJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclVubG9jayAoYWRiKSB7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xuICBpZiAoIWF3YWl0IGFkYi5pc1NjcmVlbkxvY2tlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYWRiLmtleWV2ZW50KEtFWUNPREVfTlVNUEFEX0VOVEVSKTtcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59XG5cbmhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50ID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrV2l0aEtleUV2ZW50IChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gd2l0aCBrZXljb2RlICR7Y2FwYWJpbGl0aWVzLnVubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICBjb25zdCBrZXlzID0gaGVscGVycy5zdHJpbmdLZXlUb0FycihjYXBhYmlsaXRpZXMudW5sb2NrS2V5KTtcblxuICAvLyBTb21lIGRldmljZSBkb2VzIG5vdCBoYXZlIHN5c3RlbSBrZXkgaWRzIGxpa2UgJ2NvbS5hbmRyb2lkLmtleWd1YXJkOmlkL2tleSdcbiAgLy8gVGhlbiwgc2VuZGluZyBrZXlldmVudHMgYXJlIG1vcmUgcmVsaWFibGUgdG8gdW5sb2NrIHRoZSBzY3JlZW4uXG4gIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAvLyAncGluJyBpcyBudW1iZXIgKDAtOSkgaW4gc3RyaW5nLlxuICAgIC8vIE51bWJlciAnMCcgaXMga2V5Y29kZSAnNycuIG51bWJlciAnOScgaXMga2V5Y29kZSAnMTYnLlxuICAgIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgcGFyc2VJbnQocGluLCAxMCkgKyBOVU1CRVJfWkVST19LRVlDT0RFXSk7XG4gIH1cbiAgYXdhaXQgd2FpdEZvclVubG9jayhhZGIsIGRyaXZlcik7XG59O1xuXG5oZWxwZXJzLnBhc3N3b3JkVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGFzc3dvcmRVbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhc3N3b3JkICR7dW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIC8vIFJlcGxhY2UgYmxhbmsgc3BhY2VzIHdpdGggJXNcbiAgY29uc3Qga2V5ID0gaGVscGVycy5lbmNvZGVQYXNzd29yZCh1bmxvY2tLZXkpO1xuICAvLyBXaHkgYWRiID8gSXQgd2FzIGxlc3MgZmxha3lcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAndGV4dCcsIGtleV0pO1xuICAvLyBXaHkgc2xlZXBzID8gQXZvaWQgc29tZSBmbGFreW5lc3Mgd2FpdGluZyBmb3IgdGhlIGlucHV0IHRvIHJlY2VpdmUgdGhlIGtleXNcbiAgYXdhaXQgc2xlZXAoSU5QVVRfS0VZU19XQUlUX1RJTUUpO1xuICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIEtFWUNPREVfTlVNUEFEX0VOVEVSXSk7XG4gIC8vIFdhaXRzIGEgYml0IGZvciB0aGUgZGV2aWNlIHRvIGJlIHVubG9ja2VkXG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5nZXRQYXR0ZXJuS2V5UG9zaXRpb24gPSBmdW5jdGlvbiBnZXRQYXR0ZXJuS2V5UG9zaXRpb24gKGtleSwgaW5pdFBvcywgcGllY2UpIHtcbiAgLypcbiAgSG93IHRoZSBtYXRoIHdvcmtzOlxuICBXZSBoYXZlIDkgYnV0dG9ucyBkaXZpZGVkIGluIDMgY29sdW1ucyBhbmQgMyByb3dzIGluc2lkZSB0aGUgbG9ja1BhdHRlcm5WaWV3LFxuICBldmVyeSBidXR0b24gaGFzIGEgcG9zaXRpb24gb24gdGhlIHNjcmVlbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NrUGF0dGVyblZpZXcgc2luY2VcbiAgaXQgaXMgdGhlIHBhcmVudCB2aWV3IHJpZ2h0IGF0IHRoZSBtaWRkbGUgb2YgZWFjaCBjb2x1bW4gb3Igcm93LlxuICAqL1xuICBjb25zdCBjb2xzID0gMztcbiAgY29uc3QgcGlucyA9IDk7XG4gIGNvbnN0IHhQb3MgPSAoa2V5LCB4LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh4ICsgKChrZXkgJSBjb2xzKSB8fCBjb2xzKSAqIHBpZWNlIC0gcGllY2UgLyAyKTtcbiAgY29uc3QgeVBvcyA9IChrZXksIHksIHBpZWNlKSA9PiBNYXRoLnJvdW5kKHkgKyAoTWF0aC5jZWlsKCgoa2V5ICUgcGlucykgfHwgcGlucykgLyBjb2xzKSAqIHBpZWNlIC0gcGllY2UgLyAyKSk7XG4gIHJldHVybiB7XG4gICAgeDogeFBvcyhrZXksIGluaXRQb3MueCwgcGllY2UpLFxuICAgIHk6IHlQb3Moa2V5LCBpbml0UG9zLnksIHBpZWNlKVxuICB9O1xufTtcblxuaGVscGVycy5nZXRQYXR0ZXJuQWN0aW9ucyA9IGZ1bmN0aW9uIGdldFBhdHRlcm5BY3Rpb25zIChrZXlzLCBpbml0UG9zLCBwaWVjZSkge1xuICBjb25zdCBhY3Rpb25zID0gW107XG4gIGxldCBsYXN0UG9zO1xuICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IGtleVBvcyA9IGhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uKGtleSwgaW5pdFBvcywgcGllY2UpO1xuICAgIGlmIChrZXkgPT09IGtleXNbMF0pIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7YWN0aW9uOiAncHJlc3MnLCBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDoga2V5UG9zLngsIHk6IGtleVBvcy55fX0pO1xuICAgICAgbGFzdFBvcyA9IGtleVBvcztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBtb3ZlVG8gPSB7eDogMCwgeTogMH07XG4gICAgY29uc3QgZGlmZlggPSBrZXlQb3MueCAtIGxhc3RQb3MueDtcbiAgICBpZiAoZGlmZlggPiAwKSB7XG4gICAgICBtb3ZlVG8ueCA9IHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54ICs9IHBpZWNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGlmZlggPCAwKSB7XG4gICAgICBtb3ZlVG8ueCA9IC0xICogcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlgpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnggLT0gcGllY2U7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRpZmZZID0ga2V5UG9zLnkgLSBsYXN0UG9zLnk7XG4gICAgaWYgKGRpZmZZID4gMCkge1xuICAgICAgbW92ZVRvLnkgPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZZIDwgMCkge1xuICAgICAgbW92ZVRvLnkgPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZZKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby55IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgYWN0aW9uOiAnbW92ZVRvJyxcbiAgICAgIG9wdGlvbnM6IHtlbGVtZW50OiBudWxsLCB4OiBtb3ZlVG8ueCArIGxhc3RQb3MueCwgeTogbW92ZVRvLnkgKyBsYXN0UG9zLnl9XG4gICAgfSk7XG4gICAgbGFzdFBvcyA9IGtleVBvcztcbiAgfVxuICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3JlbGVhc2UnfSk7XG4gIHJldHVybiBhY3Rpb25zO1xufTtcblxuaGVscGVycy5wYXR0ZXJuVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGF0dGVyblVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBjb25zdCB7IHVubG9ja0tleSB9ID0gY2FwYWJpbGl0aWVzO1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGF0dGVybiAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICBjb25zdCBrZXlzID0gaGVscGVycy5zdHJpbmdLZXlUb0Fycih1bmxvY2tLZXkpO1xuICAvKiBXZSBzZXQgdGhlIGRldmljZSBwYXR0ZXJuIGJ1dHRvbnMgYXMgbnVtYmVyIG9mIGEgcmVndWxhciBwaG9uZVxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDEgMiAzIHxcbiAgICogIHwg4oCiIOKAoiDigKIgfCAtLT4gfCA0IDUgNiB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgICAgIHwgNyA4IDkgfFxuXG4gIFRoZSBwYXR0ZXJuIHZpZXcgYnV0dG9ucyBhcmUgbm90IHNlZWluZyBieSB0aGUgdWlhdXRvbWF0b3Igc2luY2UgdGhleSBhcmVcbiAgaW5jbHVkZWQgaW5zaWRlIGEgRnJhbWVMYXlvdXQsIHNvIHdlIGFyZSBnb2luZyB0byB0cnkgY2xpY2tpbmcgb24gdGhlIGJ1dHRvbnNcbiAgdXNpbmcgdGhlIHBhcmVudCB2aWV3IGJvdW5kcyBhbmQgbWF0aC5cbiAgKi9cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgY29uc3QgZWwgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJyxcbiAgICBgY29tLmFuZHJvaWQuJHthcGlMZXZlbCA+PSAyMSA/ICdzeXN0ZW11aScgOiAna2V5Z3VhcmQnfTppZC9sb2NrUGF0dGVyblZpZXdgLFxuICAgIGZhbHNlXG4gICk7XG4gIGNvbnN0IGluaXRQb3MgPSBhd2FpdCBkcml2ZXIuZ2V0TG9jYXRpb24odXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIGNvbnN0IHNpemUgPSBhd2FpdCBkcml2ZXIuZ2V0U2l6ZSh1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgLy8gR2V0IGFjdGlvbnMgdG8gcGVyZm9ybVxuICBjb25zdCBhY3Rpb25zID0gaGVscGVycy5nZXRQYXR0ZXJuQWN0aW9ucyhrZXlzLCBpbml0UG9zLCBzaXplLndpZHRoIC8gMyk7XG4gIC8vIFBlcmZvcm0gZ2VzdHVyZVxuICBhd2FpdCBkcml2ZXIucGVyZm9ybVRvdWNoKGFjdGlvbnMpO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMuUElOX1VOTE9DSyA9IFBJTl9VTkxPQ0s7XG5oZWxwZXJzLlBJTl9VTkxPQ0tfS0VZX0VWRU5UID0gUElOX1VOTE9DS19LRVlfRVZFTlQ7XG5oZWxwZXJzLlBBU1NXT1JEX1VOTE9DSyA9IFBBU1NXT1JEX1VOTE9DSztcbmhlbHBlcnMuUEFUVEVSTl9VTkxPQ0sgPSBQQVRURVJOX1VOTE9DSztcbmhlbHBlcnMuRklOR0VSUFJJTlRfVU5MT0NLID0gRklOR0VSUFJJTlRfVU5MT0NLO1xuXG5leHBvcnQge1xuICBQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCwgUEFTU1dPUkRfVU5MT0NLLCBQQVRURVJOX1VOTE9DSyxcbiAgRklOR0VSUFJJTlRfVU5MT0NLLCBoZWxwZXJzXG59O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFFQSxNQUFNSSxVQUFVLEdBQUcsS0FBSztBQUFDQyxPQUFBLENBQUFELFVBQUEsR0FBQUEsVUFBQTtBQUN6QixNQUFNRSxvQkFBb0IsR0FBRyxpQkFBaUI7QUFBQ0QsT0FBQSxDQUFBQyxvQkFBQSxHQUFBQSxvQkFBQTtBQUMvQyxNQUFNQyxl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
242
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfbG9kYXNoIiwiX3N1cHBvcnQiLCJQSU5fVU5MT0NLIiwiZXhwb3J0cyIsIlBJTl9VTkxPQ0tfS0VZX0VWRU5UIiwiUEFTU1dPUkRfVU5MT0NLIiwiUEFUVEVSTl9VTkxPQ0siLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJVTkxPQ0tfVFlQRVMiLCJLRVlDT0RFX05VTVBBRF9FTlRFUiIsIlVOTE9DS19XQUlUX1RJTUUiLCJJTlBVVF9LRVlTX1dBSVRfVElNRSIsIk5VTUJFUl9aRVJPX0tFWUNPREUiLCJoZWxwZXJzIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJjYXBzIiwidW5sb2NrS2V5IiwidW5sb2NrVHlwZSIsIl8iLCJpc05pbCIsIkVycm9yIiwiaW5jbHVkZXMiLCJ0ZXN0IiwidHJpbSIsImZhc3RVbmxvY2siLCJhZGIiLCJvcHRzIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwibG9nZ2VyIiwiaW5mbyIsIndhc0xvY2tFbmFibGVkIiwiaXNMb2NrRW5hYmxlZCIsImNsZWFyTG9ja0NyZWRlbnRpYWwiLCJjeWNsZVdha2VVcCIsImRpc21pc3NLZXlndWFyZCIsInNldExvY2tDcmVkZW50aWFsIiwiZW5jb2RlUGFzc3dvcmQiLCJrZXkiLCJyZXBsYWNlIiwic3RyaW5nS2V5VG9BcnIiLCJzcGxpdCIsImZpbmdlcnByaW50VW5sb2NrIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwiZ2V0QXBpTGV2ZWwiLCJmaW5nZXJwcmludCIsInNsZWVwIiwicGluVW5sb2NrIiwia2V5cyIsImVscyIsImZpbmRFbE9yRWxzIiwiaXNFbXB0eSIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBpbnMiLCJlbCIsInRleHQiLCJnZXRBdHRyaWJ1dGUiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsInBpbiIsImNsaWNrIiwid2FpdEZvclVubG9jayIsImlzU2NyZWVuTG9ja2VkIiwia2V5ZXZlbnQiLCJzaGVsbCIsInBhcnNlSW50IiwicGFzc3dvcmRVbmxvY2siLCJnZXRQYXR0ZXJuS2V5UG9zaXRpb24iLCJpbml0UG9zIiwicGllY2UiLCJjb2xzIiwieFBvcyIsIngiLCJNYXRoIiwicm91bmQiLCJ5UG9zIiwieSIsImNlaWwiLCJnZXRQYXR0ZXJuQWN0aW9ucyIsImFjdGlvbnMiLCJsYXN0UG9zIiwia2V5UG9zIiwicHVzaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJlbGVtZW50IiwibW92ZVRvIiwiZGlmZlgiLCJhYnMiLCJkaWZmWSIsInBhdHRlcm5VbmxvY2siLCJhcGlMZXZlbCIsImdldExvY2F0aW9uIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCIsInBlcmZvcm1Ub3VjaCIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91bmxvY2staGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBQSU5fVU5MT0NLID0gJ3Bpbic7XG5jb25zdCBQSU5fVU5MT0NLX0tFWV9FVkVOVCA9ICdwaW5XaXRoS2V5RXZlbnQnO1xuY29uc3QgUEFTU1dPUkRfVU5MT0NLID0gJ3Bhc3N3b3JkJztcbmNvbnN0IFBBVFRFUk5fVU5MT0NLID0gJ3BhdHRlcm4nO1xuY29uc3QgRklOR0VSUFJJTlRfVU5MT0NLID0gJ2ZpbmdlcnByaW50JztcbmNvbnN0IFVOTE9DS19UWVBFUyA9IFtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSyxcbiAgUEFUVEVSTl9VTkxPQ0ssIEZJTkdFUlBSSU5UX1VOTE9DS1xuXTtcbmNvbnN0IEtFWUNPREVfTlVNUEFEX0VOVEVSID0gNjY7XG5jb25zdCBVTkxPQ0tfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgSU5QVVRfS0VZU19XQUlUX1RJTUUgPSAxMDA7XG5jb25zdCBOVU1CRVJfWkVST19LRVlDT0RFID0gNztcblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5oZWxwZXJzLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzID0gZnVuY3Rpb24gdmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdW5sb2NrS2V5LFxuICAgIHVubG9ja1R5cGUsXG4gIH0gPSBjYXBzO1xuICBpZiAoXy5pc05pbCh1bmxvY2tLZXkpIHx8IHVubG9ja0tleSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egbm9uLWVtcHR5IHVubG9jayBrZXkgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgaWYgKFtQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCwgRklOR0VSUFJJTlRfVU5MT0NLXS5pbmNsdWRlcyh1bmxvY2tUeXBlKSkge1xuICAgIGlmICghL15bMC05XSskLy50ZXN0KF8udHJpbSh1bmxvY2tLZXkpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmxvY2sga2V5IHZhbHVlICcke3VubG9ja0tleX0nIG11c3Qgb25seSBjb25zaXN0IG9mIGRpZ2l0c2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmICh1bmxvY2tUeXBlID09PSBQQVRURVJOX1VOTE9DSykge1xuICAgIGlmICghL15bMS05XXsyLDl9JC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgaW5jbHVkZSBmcm9tIHR3byB0byBuaW5lIGRpZ2l0cyBpbiByYW5nZSAxLi45YCk7XG4gICAgfVxuICAgIGlmICgvKFsxLTldKS4qP1xcMS8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IGRlZmluZSBhIHZhbGlkIHBhdHRlcm4gd2hlcmUgcmVwZWF0cyBhcmUgbm90IGFsbG93ZWRgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFTU1dPUkRfVU5MT0NLKSB7XG4gICAgLy8gRG9udCB0cmltIHBhc3N3b3JkIGtleSwgeW91IGNhbiB1c2UgYmxhbmsgc3BhY2VzIGluIHlvdXIgYW5kcm9pZCBwYXNzd29yZFxuICAgIC8vIMKvXFxfKOODhClfL8KvXG4gICAgaWYgKCEvLns0LH0vZy50ZXN0KHVubG9ja0tleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1pbmltdW0gYWxsb3dlZCBsZW5ndGggb2YgdW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBpcyA0IGNoYXJhY3RlcnNgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVubG9jayB0eXBlICcke3VubG9ja1R5cGV9Jy4gYCArXG4gICAgICBgT25seSB0aGUgZm9sbG93aW5nIHVubG9jayB0eXBlcyBhcmUgc3VwcG9ydGVkOiAke1VOTE9DS19UWVBFU31gKTtcbiAgfVxuICByZXR1cm4gY2Fwcztcbn07XG5cbmhlbHBlcnMuZmFzdFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGZhc3RVbmxvY2sgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBjcmVkZW50aWFsLFxuICAgIGNyZWRlbnRpYWxUeXBlLFxuICB9ID0gb3B0cztcbiAgbG9nZ2VyLmluZm8oYFVubG9ja2luZyB0aGUgZGV2aWNlIHZpYSBBREIgdXNpbmcgJHtjcmVkZW50aWFsVHlwZX0gY3JlZGVudGlhbCAnJHtjcmVkZW50aWFsfSdgKTtcbiAgY29uc3Qgd2FzTG9ja0VuYWJsZWQgPSBhd2FpdCBhZGIuaXNMb2NrRW5hYmxlZCgpO1xuICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICBhd2FpdCBhZGIuY2xlYXJMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgICAvLyBub3Qgc3VyZSB3aHksIGJ1dCB0aGUgZGV2aWNlJ3Mgc2NyZWVuIHN0aWxsIHJlbWFpbnMgbG9ja2VkXG4gICAgLy8gaWYgYSBwcmVsaW1pbmFyeSB3YWtlIHVwIGN5Y2xlIGhhcyBub3QgYmVlbiBwZXJmb3JtZWRcbiAgICBhd2FpdCBhZGIuY3ljbGVXYWtlVXAoKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuaW5mbygnTm8gYWN0aXZlIGxvY2sgaGFzIGJlZW4gZGV0ZWN0ZWQuIFByb2NlZWRpbmcgdG8gdGhlIGtleWd1YXJkIGRpc21pc3NhbCcpO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh3YXNMb2NrRW5hYmxlZCkge1xuICAgICAgYXdhaXQgYWRiLnNldExvY2tDcmVkZW50aWFsKGNyZWRlbnRpYWxUeXBlLCBjcmVkZW50aWFsKTtcbiAgICB9XG4gIH1cbn07XG5cbmhlbHBlcnMuZW5jb2RlUGFzc3dvcmQgPSBmdW5jdGlvbiBlbmNvZGVQYXNzd29yZCAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC5yZXBsYWNlKC9cXHMvaWcsICclcycpO1xufTtcblxuaGVscGVycy5zdHJpbmdLZXlUb0FyciA9IGZ1bmN0aW9uIHN0cmluZ0tleVRvQXJyIChrZXkpIHtcbiAgcmV0dXJuIGAke2tleX1gLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcnKS5zcGxpdCgvXFxzKi8pO1xufTtcblxuaGVscGVycy5maW5nZXJwcmludFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50VW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5nZXJwcmludCB1bmxvY2sgb25seSB3b3JrcyBmb3IgQW5kcm9pZCA2KyBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCBhZGIuZmluZ2VycHJpbnQoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufTtcblxuaGVscGVycy5waW5VbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBwaW5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBpbiAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG4gIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyMSkge1xuICAgIGNvbnN0IGVscyA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuc3lzdGVtdWk6aWQvZGlnaXRfdGV4dCcsIHRydWUpO1xuICAgIGlmIChfLmlzRW1wdHkoZWxzKSkge1xuICAgICAgLy8gZmFsbGJhY2sgdG8gcGluIHdpdGgga2V5IGV2ZW50XG4gICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgfVxuICAgIGNvbnN0IHBpbnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIGVscykge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGRyaXZlci5nZXRBdHRyaWJ1dGUoJ3RleHQnLCB1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgICAgIHBpbnNbdGV4dF0gPSBlbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwaW4gb2Yga2V5cykge1xuICAgICAgY29uc3QgZWwgPSBwaW5zW3Bpbl07XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsIGBjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXkke3Bpbn1gLCBmYWxzZSk7XG4gICAgICBpZiAoZWwgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gcGluIHdpdGgga2V5IGV2ZW50XG4gICAgICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRyaXZlci5jbGljayh1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgd2FpdEZvclVubG9jayhhZGIpO1xufTtcblxuLyoqXG4gKiBXYWl0IGZvciB0aGUgZGlzcGxheSB0byBiZSB1bmxvY2tlZC5cbiAqIFNvbWUgZGV2aWNlcyBhdXRvbWF0aWNhbGx5IGFjY2VwdCB0eXBlZCAncGluJyBhbmQgJ3Bhc3N3b3JkJyBjb2RlXG4gKiB3aXRob3V0IHByZXNzaW5nIHRoZSBFbnRlciBrZXkuIEJ1dCBzb21lIGRldmljZXMgbmVlZCBpdC5cbiAqIFRoaXMgbWV0aG9kIHdhaXRzIGEgZmV3IHNlY29uZHMgZmlyc3QgZm9yIHN1Y2ggYXV0b21hdGljIGFjY2VwdGFuY2UgY2FzZS5cbiAqIElmIHRoZSBkZXZpY2UgaXMgc3RpbGwgbG9ja2VkLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIHNlbmRcbiAqIHRoZSBlbnRlciBrZXkgY29kZS5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIFRoZSBpbnN0YW5jZSBvZiBBREJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclVubG9jayAoYWRiKSB7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xuICBpZiAoIWF3YWl0IGFkYi5pc1NjcmVlbkxvY2tlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYWRiLmtleWV2ZW50KEtFWUNPREVfTlVNUEFEX0VOVEVSKTtcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59XG5cbmhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50ID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrV2l0aEtleUV2ZW50IChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gd2l0aCBrZXljb2RlICR7Y2FwYWJpbGl0aWVzLnVubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICBjb25zdCBrZXlzID0gaGVscGVycy5zdHJpbmdLZXlUb0FycihjYXBhYmlsaXRpZXMudW5sb2NrS2V5KTtcblxuICAvLyBTb21lIGRldmljZSBkb2VzIG5vdCBoYXZlIHN5c3RlbSBrZXkgaWRzIGxpa2UgJ2NvbS5hbmRyb2lkLmtleWd1YXJkOmlkL2tleSdcbiAgLy8gVGhlbiwgc2VuZGluZyBrZXlldmVudHMgYXJlIG1vcmUgcmVsaWFibGUgdG8gdW5sb2NrIHRoZSBzY3JlZW4uXG4gIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAvLyAncGluJyBpcyBudW1iZXIgKDAtOSkgaW4gc3RyaW5nLlxuICAgIC8vIE51bWJlciAnMCcgaXMga2V5Y29kZSAnNycuIG51bWJlciAnOScgaXMga2V5Y29kZSAnMTYnLlxuICAgIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgcGFyc2VJbnQocGluLCAxMCkgKyBOVU1CRVJfWkVST19LRVlDT0RFXSk7XG4gIH1cbiAgYXdhaXQgd2FpdEZvclVubG9jayhhZGIsIGRyaXZlcik7XG59O1xuXG5oZWxwZXJzLnBhc3N3b3JkVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGFzc3dvcmRVbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhc3N3b3JkICR7dW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIC8vIFJlcGxhY2UgYmxhbmsgc3BhY2VzIHdpdGggJXNcbiAgY29uc3Qga2V5ID0gaGVscGVycy5lbmNvZGVQYXNzd29yZCh1bmxvY2tLZXkpO1xuICAvLyBXaHkgYWRiID8gSXQgd2FzIGxlc3MgZmxha3lcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAndGV4dCcsIGtleV0pO1xuICAvLyBXaHkgc2xlZXBzID8gQXZvaWQgc29tZSBmbGFreW5lc3Mgd2FpdGluZyBmb3IgdGhlIGlucHV0IHRvIHJlY2VpdmUgdGhlIGtleXNcbiAgYXdhaXQgc2xlZXAoSU5QVVRfS0VZU19XQUlUX1RJTUUpO1xuICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIEtFWUNPREVfTlVNUEFEX0VOVEVSXSk7XG4gIC8vIFdhaXRzIGEgYml0IGZvciB0aGUgZGV2aWNlIHRvIGJlIHVubG9ja2VkXG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5nZXRQYXR0ZXJuS2V5UG9zaXRpb24gPSBmdW5jdGlvbiBnZXRQYXR0ZXJuS2V5UG9zaXRpb24gKGtleSwgaW5pdFBvcywgcGllY2UpIHtcbiAgLypcbiAgSG93IHRoZSBtYXRoIHdvcmtzOlxuICBXZSBoYXZlIDkgYnV0dG9ucyBkaXZpZGVkIGluIDMgY29sdW1ucyBhbmQgMyByb3dzIGluc2lkZSB0aGUgbG9ja1BhdHRlcm5WaWV3LFxuICBldmVyeSBidXR0b24gaGFzIGEgcG9zaXRpb24gb24gdGhlIHNjcmVlbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NrUGF0dGVyblZpZXcgc2luY2VcbiAgaXQgaXMgdGhlIHBhcmVudCB2aWV3IHJpZ2h0IGF0IHRoZSBtaWRkbGUgb2YgZWFjaCBjb2x1bW4gb3Igcm93LlxuICAqL1xuICBjb25zdCBjb2xzID0gMztcbiAgY29uc3QgcGlucyA9IDk7XG4gIGNvbnN0IHhQb3MgPSAoa2V5LCB4LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh4ICsgKChrZXkgJSBjb2xzKSB8fCBjb2xzKSAqIHBpZWNlIC0gcGllY2UgLyAyKTtcbiAgY29uc3QgeVBvcyA9IChrZXksIHksIHBpZWNlKSA9PiBNYXRoLnJvdW5kKHkgKyAoTWF0aC5jZWlsKCgoa2V5ICUgcGlucykgfHwgcGlucykgLyBjb2xzKSAqIHBpZWNlIC0gcGllY2UgLyAyKSk7XG4gIHJldHVybiB7XG4gICAgeDogeFBvcyhrZXksIGluaXRQb3MueCwgcGllY2UpLFxuICAgIHk6IHlQb3Moa2V5LCBpbml0UG9zLnksIHBpZWNlKVxuICB9O1xufTtcblxuaGVscGVycy5nZXRQYXR0ZXJuQWN0aW9ucyA9IGZ1bmN0aW9uIGdldFBhdHRlcm5BY3Rpb25zIChrZXlzLCBpbml0UG9zLCBwaWVjZSkge1xuICBjb25zdCBhY3Rpb25zID0gW107XG4gIGxldCBsYXN0UG9zO1xuICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IGtleVBvcyA9IGhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uKGtleSwgaW5pdFBvcywgcGllY2UpO1xuICAgIGlmIChrZXkgPT09IGtleXNbMF0pIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7YWN0aW9uOiAncHJlc3MnLCBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDoga2V5UG9zLngsIHk6IGtleVBvcy55fX0pO1xuICAgICAgbGFzdFBvcyA9IGtleVBvcztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBtb3ZlVG8gPSB7eDogMCwgeTogMH07XG4gICAgY29uc3QgZGlmZlggPSBrZXlQb3MueCAtIGxhc3RQb3MueDtcbiAgICBpZiAoZGlmZlggPiAwKSB7XG4gICAgICBtb3ZlVG8ueCA9IHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54ICs9IHBpZWNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGlmZlggPCAwKSB7XG4gICAgICBtb3ZlVG8ueCA9IC0xICogcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlgpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnggLT0gcGllY2U7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRpZmZZID0ga2V5UG9zLnkgLSBsYXN0UG9zLnk7XG4gICAgaWYgKGRpZmZZID4gMCkge1xuICAgICAgbW92ZVRvLnkgPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZZIDwgMCkge1xuICAgICAgbW92ZVRvLnkgPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZZKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby55IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgYWN0aW9uOiAnbW92ZVRvJyxcbiAgICAgIG9wdGlvbnM6IHtlbGVtZW50OiBudWxsLCB4OiBtb3ZlVG8ueCArIGxhc3RQb3MueCwgeTogbW92ZVRvLnkgKyBsYXN0UG9zLnl9XG4gICAgfSk7XG4gICAgbGFzdFBvcyA9IGtleVBvcztcbiAgfVxuICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3JlbGVhc2UnfSk7XG4gIHJldHVybiBhY3Rpb25zO1xufTtcblxuaGVscGVycy5wYXR0ZXJuVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGF0dGVyblVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBjb25zdCB7IHVubG9ja0tleSB9ID0gY2FwYWJpbGl0aWVzO1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGF0dGVybiAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICBjb25zdCBrZXlzID0gaGVscGVycy5zdHJpbmdLZXlUb0Fycih1bmxvY2tLZXkpO1xuICAvKiBXZSBzZXQgdGhlIGRldmljZSBwYXR0ZXJuIGJ1dHRvbnMgYXMgbnVtYmVyIG9mIGEgcmVndWxhciBwaG9uZVxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDEgMiAzIHxcbiAgICogIHwg4oCiIOKAoiDigKIgfCAtLT4gfCA0IDUgNiB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgICAgIHwgNyA4IDkgfFxuXG4gIFRoZSBwYXR0ZXJuIHZpZXcgYnV0dG9ucyBhcmUgbm90IHNlZWluZyBieSB0aGUgdWlhdXRvbWF0b3Igc2luY2UgdGhleSBhcmVcbiAgaW5jbHVkZWQgaW5zaWRlIGEgRnJhbWVMYXlvdXQsIHNvIHdlIGFyZSBnb2luZyB0byB0cnkgY2xpY2tpbmcgb24gdGhlIGJ1dHRvbnNcbiAgdXNpbmcgdGhlIHBhcmVudCB2aWV3IGJvdW5kcyBhbmQgbWF0aC5cbiAgKi9cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgY29uc3QgZWwgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJyxcbiAgICBgY29tLmFuZHJvaWQuJHthcGlMZXZlbCA+PSAyMSA/ICdzeXN0ZW11aScgOiAna2V5Z3VhcmQnfTppZC9sb2NrUGF0dGVyblZpZXdgLFxuICAgIGZhbHNlXG4gICk7XG4gIGNvbnN0IGluaXRQb3MgPSBhd2FpdCBkcml2ZXIuZ2V0TG9jYXRpb24odXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIGNvbnN0IHNpemUgPSBhd2FpdCBkcml2ZXIuZ2V0U2l6ZSh1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgLy8gR2V0IGFjdGlvbnMgdG8gcGVyZm9ybVxuICBjb25zdCBhY3Rpb25zID0gaGVscGVycy5nZXRQYXR0ZXJuQWN0aW9ucyhrZXlzLCBpbml0UG9zLCBzaXplLndpZHRoIC8gMyk7XG4gIC8vIFBlcmZvcm0gZ2VzdHVyZVxuICBhd2FpdCBkcml2ZXIucGVyZm9ybVRvdWNoKGFjdGlvbnMpO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMuUElOX1VOTE9DSyA9IFBJTl9VTkxPQ0s7XG5oZWxwZXJzLlBJTl9VTkxPQ0tfS0VZX0VWRU5UID0gUElOX1VOTE9DS19LRVlfRVZFTlQ7XG5oZWxwZXJzLlBBU1NXT1JEX1VOTE9DSyA9IFBBU1NXT1JEX1VOTE9DSztcbmhlbHBlcnMuUEFUVEVSTl9VTkxPQ0sgPSBQQVRURVJOX1VOTE9DSztcbmhlbHBlcnMuRklOR0VSUFJJTlRfVU5MT0NLID0gRklOR0VSUFJJTlRfVU5MT0NLO1xuXG5leHBvcnQge1xuICBQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCwgUEFTU1dPUkRfVU5MT0NLLCBQQVRURVJOX1VOTE9DSyxcbiAgRklOR0VSUFJJTlRfVU5MT0NLLCBoZWxwZXJzXG59O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFFQSxNQUFNSSxVQUFVLEdBQUcsS0FBSztBQUFDQyxPQUFBLENBQUFELFVBQUEsR0FBQUEsVUFBQTtBQUN6QixNQUFNRSxvQkFBb0IsR0FBRyxpQkFBaUI7QUFBQ0QsT0FBQSxDQUFBQyxvQkFBQSxHQUFBQSxvQkFBQTtBQUMvQyxNQUFNQyxl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
@@ -1 +1 @@
1
- {"version":3,"file":"unlock-helpers.js","names":["_logger","_interopRequireDefault","require","_asyncbox","_lodash","_support","PIN_UNLOCK","exports","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","FINGERPRINT_UNLOCK","UNLOCK_TYPES","KEYCODE_NUMPAD_ENTER","UNLOCK_WAIT_TIME","INPUT_KEYS_WAIT_TIME","NUMBER_ZERO_KEYCODE","helpers","validateUnlockCapabilities","caps","unlockKey","unlockType","_","isNil","Error","includes","test","trim","fastUnlock","adb","opts","credential","credentialType","logger","info","wasLockEnabled","isLockEnabled","clearLockCredential","cycleWakeUp","dismissKeyguard","setLockCredential","encodePassword","key","replace","stringKeyToArr","split","fingerprintUnlock","driver","capabilities","getApiLevel","fingerprint","sleep","pinUnlock","keys","els","findElOrEls","isEmpty","pinUnlockWithKeyEvent","pins","el","text","getAttribute","util","unwrapElement","pin","click","waitForUnlock","isScreenLocked","keyevent","shell","parseInt","passwordUnlock","getPatternKeyPosition","initPos","piece","cols","xPos","x","Math","round","yPos","y","ceil","getPatternActions","actions","lastPos","keyPos","push","action","options","element","moveTo","diffX","abs","diffY","patternUnlock","apiLevel","getLocation","size","getSize","width","performTouch","_default","default"],"sources":["../../lib/unlock-helpers.js"],"sourcesContent":["import logger from './logger';\nimport { sleep } from 'asyncbox';\nimport _ from 'lodash';\nimport { util } from '@appium/support';\n\nconst PIN_UNLOCK = 'pin';\nconst PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';\nconst PASSWORD_UNLOCK = 'password';\nconst PATTERN_UNLOCK = 'pattern';\nconst FINGERPRINT_UNLOCK = 'fingerprint';\nconst UNLOCK_TYPES = [\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK,\n PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n];\nconst KEYCODE_NUMPAD_ENTER = 66;\nconst UNLOCK_WAIT_TIME = 100;\nconst INPUT_KEYS_WAIT_TIME = 100;\nconst NUMBER_ZERO_KEYCODE = 7;\n\nconst helpers = {};\n\nhelpers.validateUnlockCapabilities = function validateUnlockCapabilities (caps = {}) {\n const {\n unlockKey,\n unlockType,\n } = caps;\n if (_.isNil(unlockKey) || unlockKey === '') {\n throw new Error('A non-empty unlock key value must be provided');\n }\n\n if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {\n if (!/^[0-9]+$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);\n }\n } else if (unlockType === PATTERN_UNLOCK) {\n if (!/^[1-9]{2,9}$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);\n }\n if (/([1-9]).*?\\1/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);\n }\n } else if (unlockType === PASSWORD_UNLOCK) {\n // Dont trim password key, you can use blank spaces in your android password\n // ¯\\_(ツ)_/¯\n if (!/.{4,}/g.test(unlockKey)) {\n throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);\n }\n } else {\n throw new Error(`Invalid unlock type '${unlockType}'. ` +\n `Only the following unlock types are supported: ${UNLOCK_TYPES}`);\n }\n return caps;\n};\n\nhelpers.fastUnlock = async function fastUnlock (adb, opts = {}) {\n const {\n credential,\n credentialType,\n } = opts;\n logger.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);\n const wasLockEnabled = await adb.isLockEnabled();\n if (wasLockEnabled) {\n await adb.clearLockCredential(credential);\n // not sure why, but the device's screen still remains locked\n // if a preliminary wake up cycle has not been performed\n await adb.cycleWakeUp();\n } else {\n logger.info('No active lock has been detected. Proceeding to the keyguard dismissal');\n }\n try {\n await adb.dismissKeyguard();\n } finally {\n if (wasLockEnabled) {\n await adb.setLockCredential(credentialType, credential);\n }\n }\n};\n\nhelpers.encodePassword = function encodePassword (key) {\n return `${key}`.replace(/\\s/ig, '%s');\n};\n\nhelpers.stringKeyToArr = function stringKeyToArr (key) {\n return `${key}`.trim().replace(/\\s+/g, '').split(/\\s*/);\n};\n\nhelpers.fingerprintUnlock = async function fingerprintUnlock (adb, driver, capabilities) {\n if (await adb.getApiLevel() < 23) {\n throw new Error('Fingerprint unlock only works for Android 6+ emulators');\n }\n await adb.fingerprint(capabilities.unlockKey);\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.pinUnlock = async function pinUnlock (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n if (await adb.getApiLevel() >= 21) {\n const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);\n if (_.isEmpty(els)) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n const pins = {};\n for (const el of els) {\n const text = await driver.getAttribute('text', util.unwrapElement(el));\n pins[text] = el;\n }\n for (const pin of keys) {\n const el = pins[pin];\n await driver.click(util.unwrapElement(el));\n }\n } else {\n for (const pin of keys) {\n const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);\n if (el === null) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n await driver.click(util.unwrapElement(el));\n }\n }\n await waitForUnlock(adb);\n};\n\n/**\n * Wait for the display to be unlocked.\n * Some devices automatically accept typed 'pin' and 'password' code\n * without pressing the Enter key. But some devices need it.\n * This method waits a few seconds first for such automatic acceptance case.\n * If the device is still locked, then this method will try to send\n * the enter key code.\n *\n * @param {ADB} adb The instance of ADB\n */\nasync function waitForUnlock (adb) {\n await sleep(UNLOCK_WAIT_TIME);\n if (!await adb.isScreenLocked()) {\n return;\n }\n\n await adb.keyevent(KEYCODE_NUMPAD_ENTER);\n await sleep(UNLOCK_WAIT_TIME);\n}\n\nhelpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n\n // Some device does not have system key ids like 'com.android.keyguard:id/key'\n // Then, sending keyevents are more reliable to unlock the screen.\n for (const pin of keys) {\n // 'pin' is number (0-9) in string.\n // Number '0' is keycode '7'. number '9' is keycode '16'.\n await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);\n }\n await waitForUnlock(adb, driver);\n};\n\nhelpers.passwordUnlock = async function passwordUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using password ${unlockKey}`);\n await adb.dismissKeyguard();\n // Replace blank spaces with %s\n const key = helpers.encodePassword(unlockKey);\n // Why adb ? It was less flaky\n await adb.shell(['input', 'text', key]);\n // Why sleeps ? Avoid some flakyness waiting for the input to receive the keys\n await sleep(INPUT_KEYS_WAIT_TIME);\n await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);\n // Waits a bit for the device to be unlocked\n await waitForUnlock(adb, driver);\n};\n\nhelpers.getPatternKeyPosition = function getPatternKeyPosition (key, initPos, piece) {\n /*\n How the math works:\n We have 9 buttons divided in 3 columns and 3 rows inside the lockPatternView,\n every button has a position on the screen corresponding to the lockPatternView since\n it is the parent view right at the middle of each column or row.\n */\n const cols = 3;\n const pins = 9;\n const xPos = (key, x, piece) => Math.round(x + ((key % cols) || cols) * piece - piece / 2);\n const yPos = (key, y, piece) => Math.round(y + (Math.ceil(((key % pins) || pins) / cols) * piece - piece / 2));\n return {\n x: xPos(key, initPos.x, piece),\n y: yPos(key, initPos.y, piece)\n };\n};\n\nhelpers.getPatternActions = function getPatternActions (keys, initPos, piece) {\n const actions = [];\n let lastPos;\n for (let key of keys) {\n const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);\n if (key === keys[0]) {\n actions.push({action: 'press', options: {element: null, x: keyPos.x, y: keyPos.y}});\n lastPos = keyPos;\n continue;\n }\n const moveTo = {x: 0, y: 0};\n const diffX = keyPos.x - lastPos.x;\n if (diffX > 0) {\n moveTo.x = piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x += piece;\n }\n } else if (diffX < 0) {\n moveTo.x = -1 * piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x -= piece;\n }\n }\n const diffY = keyPos.y - lastPos.y;\n if (diffY > 0) {\n moveTo.y = piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y += piece;\n }\n } else if (diffY < 0) {\n moveTo.y = -1 * piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y -= piece;\n }\n }\n actions.push({\n action: 'moveTo',\n options: {element: null, x: moveTo.x + lastPos.x, y: moveTo.y + lastPos.y}\n });\n lastPos = keyPos;\n }\n actions.push({action: 'release'});\n return actions;\n};\n\nhelpers.patternUnlock = async function patternUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using pattern ${unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(unlockKey);\n /* We set the device pattern buttons as number of a regular phone\n * | • • • | | 1 2 3 |\n * | • • • | --> | 4 5 6 |\n * | • • • | | 7 8 9 |\n\n The pattern view buttons are not seeing by the uiautomator since they are\n included inside a FrameLayout, so we are going to try clicking on the buttons\n using the parent view bounds and math.\n */\n const apiLevel = await adb.getApiLevel();\n const el = await driver.findElOrEls('id',\n `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`,\n false\n );\n const initPos = await driver.getLocation(util.unwrapElement(el));\n const size = await driver.getSize(util.unwrapElement(el));\n // Get actions to perform\n const actions = helpers.getPatternActions(keys, initPos, size.width / 3);\n // Perform gesture\n await driver.performTouch(actions);\n // Waits a bit for the device to be unlocked\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.PIN_UNLOCK = PIN_UNLOCK;\nhelpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;\nhelpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;\nhelpers.PATTERN_UNLOCK = PATTERN_UNLOCK;\nhelpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;\n\nexport {\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK,\n FINGERPRINT_UNLOCK, helpers\n};\nexport default helpers;\n"],"mappings":"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"}
1
+ {"version":3,"file":"unlock-helpers.js","names":["_logger","_interopRequireDefault","require","_asyncbox","_lodash","_support","PIN_UNLOCK","exports","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","FINGERPRINT_UNLOCK","UNLOCK_TYPES","KEYCODE_NUMPAD_ENTER","UNLOCK_WAIT_TIME","INPUT_KEYS_WAIT_TIME","NUMBER_ZERO_KEYCODE","helpers","validateUnlockCapabilities","caps","unlockKey","unlockType","_","isNil","Error","includes","test","trim","fastUnlock","adb","opts","credential","credentialType","logger","info","wasLockEnabled","isLockEnabled","clearLockCredential","cycleWakeUp","dismissKeyguard","setLockCredential","encodePassword","key","replace","stringKeyToArr","split","fingerprintUnlock","driver","capabilities","getApiLevel","fingerprint","sleep","pinUnlock","keys","els","findElOrEls","isEmpty","pinUnlockWithKeyEvent","pins","el","text","getAttribute","util","unwrapElement","pin","click","waitForUnlock","isScreenLocked","keyevent","shell","parseInt","passwordUnlock","getPatternKeyPosition","initPos","piece","cols","xPos","x","Math","round","yPos","y","ceil","getPatternActions","actions","lastPos","keyPos","push","action","options","element","moveTo","diffX","abs","diffY","patternUnlock","apiLevel","getLocation","size","getSize","width","performTouch","_default","default"],"sources":["../../lib/unlock-helpers.js"],"sourcesContent":["import logger from './logger';\nimport { sleep } from 'asyncbox';\nimport _ from 'lodash';\nimport { util } from '@appium/support';\n\nconst PIN_UNLOCK = 'pin';\nconst PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';\nconst PASSWORD_UNLOCK = 'password';\nconst PATTERN_UNLOCK = 'pattern';\nconst FINGERPRINT_UNLOCK = 'fingerprint';\nconst UNLOCK_TYPES = [\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK,\n PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n];\nconst KEYCODE_NUMPAD_ENTER = 66;\nconst UNLOCK_WAIT_TIME = 100;\nconst INPUT_KEYS_WAIT_TIME = 100;\nconst NUMBER_ZERO_KEYCODE = 7;\n\nconst helpers = {};\n\nhelpers.validateUnlockCapabilities = function validateUnlockCapabilities (caps = {}) {\n const {\n unlockKey,\n unlockType,\n } = caps;\n if (_.isNil(unlockKey) || unlockKey === '') {\n throw new Error('A non-empty unlock key value must be provided');\n }\n\n if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {\n if (!/^[0-9]+$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);\n }\n } else if (unlockType === PATTERN_UNLOCK) {\n if (!/^[1-9]{2,9}$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);\n }\n if (/([1-9]).*?\\1/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);\n }\n } else if (unlockType === PASSWORD_UNLOCK) {\n // Dont trim password key, you can use blank spaces in your android password\n // ¯\\_(ツ)_/¯\n if (!/.{4,}/g.test(unlockKey)) {\n throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);\n }\n } else {\n throw new Error(`Invalid unlock type '${unlockType}'. ` +\n `Only the following unlock types are supported: ${UNLOCK_TYPES}`);\n }\n return caps;\n};\n\nhelpers.fastUnlock = async function fastUnlock (adb, opts = {}) {\n const {\n credential,\n credentialType,\n } = opts;\n logger.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);\n const wasLockEnabled = await adb.isLockEnabled();\n if (wasLockEnabled) {\n await adb.clearLockCredential(credential);\n // not sure why, but the device's screen still remains locked\n // if a preliminary wake up cycle has not been performed\n await adb.cycleWakeUp();\n } else {\n logger.info('No active lock has been detected. Proceeding to the keyguard dismissal');\n }\n try {\n await adb.dismissKeyguard();\n } finally {\n if (wasLockEnabled) {\n await adb.setLockCredential(credentialType, credential);\n }\n }\n};\n\nhelpers.encodePassword = function encodePassword (key) {\n return `${key}`.replace(/\\s/ig, '%s');\n};\n\nhelpers.stringKeyToArr = function stringKeyToArr (key) {\n return `${key}`.trim().replace(/\\s+/g, '').split(/\\s*/);\n};\n\nhelpers.fingerprintUnlock = async function fingerprintUnlock (adb, driver, capabilities) {\n if (await adb.getApiLevel() < 23) {\n throw new Error('Fingerprint unlock only works for Android 6+ emulators');\n }\n await adb.fingerprint(capabilities.unlockKey);\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.pinUnlock = async function pinUnlock (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n if (await adb.getApiLevel() >= 21) {\n const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);\n if (_.isEmpty(els)) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n const pins = {};\n for (const el of els) {\n const text = await driver.getAttribute('text', util.unwrapElement(el));\n pins[text] = el;\n }\n for (const pin of keys) {\n const el = pins[pin];\n await driver.click(util.unwrapElement(el));\n }\n } else {\n for (const pin of keys) {\n const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);\n if (el === null) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n await driver.click(util.unwrapElement(el));\n }\n }\n await waitForUnlock(adb);\n};\n\n/**\n * Wait for the display to be unlocked.\n * Some devices automatically accept typed 'pin' and 'password' code\n * without pressing the Enter key. But some devices need it.\n * This method waits a few seconds first for such automatic acceptance case.\n * If the device is still locked, then this method will try to send\n * the enter key code.\n *\n * @param {ADB} adb The instance of ADB\n */\nasync function waitForUnlock (adb) {\n await sleep(UNLOCK_WAIT_TIME);\n if (!await adb.isScreenLocked()) {\n return;\n }\n\n await adb.keyevent(KEYCODE_NUMPAD_ENTER);\n await sleep(UNLOCK_WAIT_TIME);\n}\n\nhelpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n\n // Some device does not have system key ids like 'com.android.keyguard:id/key'\n // Then, sending keyevents are more reliable to unlock the screen.\n for (const pin of keys) {\n // 'pin' is number (0-9) in string.\n // Number '0' is keycode '7'. number '9' is keycode '16'.\n await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);\n }\n await waitForUnlock(adb, driver);\n};\n\nhelpers.passwordUnlock = async function passwordUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using password ${unlockKey}`);\n await adb.dismissKeyguard();\n // Replace blank spaces with %s\n const key = helpers.encodePassword(unlockKey);\n // Why adb ? It was less flaky\n await adb.shell(['input', 'text', key]);\n // Why sleeps ? Avoid some flakyness waiting for the input to receive the keys\n await sleep(INPUT_KEYS_WAIT_TIME);\n await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);\n // Waits a bit for the device to be unlocked\n await waitForUnlock(adb, driver);\n};\n\nhelpers.getPatternKeyPosition = function getPatternKeyPosition (key, initPos, piece) {\n /*\n How the math works:\n We have 9 buttons divided in 3 columns and 3 rows inside the lockPatternView,\n every button has a position on the screen corresponding to the lockPatternView since\n it is the parent view right at the middle of each column or row.\n */\n const cols = 3;\n const pins = 9;\n const xPos = (key, x, piece) => Math.round(x + ((key % cols) || cols) * piece - piece / 2);\n const yPos = (key, y, piece) => Math.round(y + (Math.ceil(((key % pins) || pins) / cols) * piece - piece / 2));\n return {\n x: xPos(key, initPos.x, piece),\n y: yPos(key, initPos.y, piece)\n };\n};\n\nhelpers.getPatternActions = function getPatternActions (keys, initPos, piece) {\n const actions = [];\n let lastPos;\n for (let key of keys) {\n const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);\n if (key === keys[0]) {\n actions.push({action: 'press', options: {element: null, x: keyPos.x, y: keyPos.y}});\n lastPos = keyPos;\n continue;\n }\n const moveTo = {x: 0, y: 0};\n const diffX = keyPos.x - lastPos.x;\n if (diffX > 0) {\n moveTo.x = piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x += piece;\n }\n } else if (diffX < 0) {\n moveTo.x = -1 * piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x -= piece;\n }\n }\n const diffY = keyPos.y - lastPos.y;\n if (diffY > 0) {\n moveTo.y = piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y += piece;\n }\n } else if (diffY < 0) {\n moveTo.y = -1 * piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y -= piece;\n }\n }\n actions.push({\n action: 'moveTo',\n options: {element: null, x: moveTo.x + lastPos.x, y: moveTo.y + lastPos.y}\n });\n lastPos = keyPos;\n }\n actions.push({action: 'release'});\n return actions;\n};\n\nhelpers.patternUnlock = async function patternUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using pattern ${unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(unlockKey);\n /* We set the device pattern buttons as number of a regular phone\n * | • • • | | 1 2 3 |\n * | • • • | --> | 4 5 6 |\n * | • • • | | 7 8 9 |\n\n The pattern view buttons are not seeing by the uiautomator since they are\n included inside a FrameLayout, so we are going to try clicking on the buttons\n using the parent view bounds and math.\n */\n const apiLevel = await adb.getApiLevel();\n const el = await driver.findElOrEls('id',\n `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`,\n false\n );\n const initPos = await driver.getLocation(util.unwrapElement(el));\n const size = await driver.getSize(util.unwrapElement(el));\n // Get actions to perform\n const actions = helpers.getPatternActions(keys, initPos, size.width / 3);\n // Perform gesture\n await driver.performTouch(actions);\n // Waits a bit for the device to be unlocked\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.PIN_UNLOCK = PIN_UNLOCK;\nhelpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;\nhelpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;\nhelpers.PATTERN_UNLOCK = PATTERN_UNLOCK;\nhelpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;\n\nexport {\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK,\n FINGERPRINT_UNLOCK, helpers\n};\nexport default helpers;\n"],"mappings":"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"}
@@ -19,4 +19,4 @@ function requireArgs(argNames, opts = {}) {
19
19
  }
20
20
  return opts;
21
21
  }
22
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJleHBvcnRzIiwicmVxdWlyZUFyZ3MiLCJhcmdOYW1lcyIsIm9wdHMiLCJhcmdOYW1lIiwiXyIsImlzQXJyYXkiLCJoYXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmV4cG9ydCBjb25zdCBBREJfU0hFTExfRkVBVFVSRSA9ICdhZGJfc2hlbGwnO1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFyZ3MgKGFyZ05hbWVzLCBvcHRzID0ge30pIHtcbiAgZm9yIChjb25zdCBhcmdOYW1lIG9mIChfLmlzQXJyYXkoYXJnTmFtZXMpID8gYXJnTmFtZXMgOiBbYXJnTmFtZXNdKSkge1xuICAgIGlmICghXy5oYXMob3B0cywgYXJnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke2FyZ05hbWV9JyBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRzO1xufSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRU8sTUFBTUUsaUJBQWlCLEdBQUcsV0FBVztBQUFDQyxPQUFBLENBQUFELGlCQUFBLEdBQUFBLGlCQUFBO0FBU3RDLFNBQVNFLFdBQVdBLENBQUVDLFFBQVEsRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2hELEtBQUssTUFBTUMsT0FBTyxJQUFLQyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0osUUFBUSxDQUFDLEdBQUdBLFFBQVEsR0FBRyxDQUFDQSxRQUFRLENBQUMsRUFBRztJQUNuRSxJQUFJLENBQUNHLGVBQUMsQ0FBQ0UsR0FBRyxDQUFDSixJQUFJLEVBQUVDLE9BQU8sQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSUksY0FBTSxDQUFDQyxvQkFBb0IsQ0FBRSxJQUFHTCxPQUFRLDZCQUE0QixDQUFDO0lBQ2pGO0VBQ0Y7RUFDQSxPQUFPRCxJQUFJO0FBQ2IifQ==
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJleHBvcnRzIiwicmVxdWlyZUFyZ3MiLCJhcmdOYW1lcyIsIm9wdHMiLCJhcmdOYW1lIiwiXyIsImlzQXJyYXkiLCJoYXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmV4cG9ydCBjb25zdCBBREJfU0hFTExfRkVBVFVSRSA9ICdhZGJfc2hlbGwnO1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAdGVtcGxhdGUge09iamVjdH0gVFxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGFyZ05hbWVzIG9uZSBvciBtb3JlIGtleSBuYW1lc1xuICogQHBhcmFtIHtUfSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtUfSB0aGUgc2FtZSBnaXZlbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBcmdzIChhcmdOYW1lcywgb3B0cyA9IHt9KSB7XG4gIGZvciAoY29uc3QgYXJnTmFtZSBvZiAoXy5pc0FycmF5KGFyZ05hbWVzKSA/IGFyZ05hbWVzIDogW2FyZ05hbWVzXSkpIHtcbiAgICBpZiAoIV8uaGFzKG9wdHMsIGFyZ05hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnJHthcmdOYW1lfScgYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0cztcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVPLE1BQU1FLGlCQUFpQixHQUFHLFdBQVc7QUFBQ0MsT0FBQSxDQUFBRCxpQkFBQSxHQUFBQSxpQkFBQTtBQVV0QyxTQUFTRSxXQUFXQSxDQUFFQyxRQUFRLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNoRCxLQUFLLE1BQU1DLE9BQU8sSUFBS0MsZUFBQyxDQUFDQyxPQUFPLENBQUNKLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLEdBQUcsQ0FBQ0EsUUFBUSxDQUFDLEVBQUc7SUFDbkUsSUFBSSxDQUFDRyxlQUFDLENBQUNFLEdBQUcsQ0FBQ0osSUFBSSxFQUFFQyxPQUFPLENBQUMsRUFBRTtNQUN6QixNQUFNLElBQUlJLGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUsSUFBR0wsT0FBUSw2QkFBNEIsQ0FBQztJQUNqRjtFQUNGO0VBQ0EsT0FBT0QsSUFBSTtBQUNiIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEO,MAAME,iBAAiB,GAAG,WAAW;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAStC,SAASE,WAAWA,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
1
+ {"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @template {Object} T\n * @param {string|string[]} argNames one or more key names\n * @param {T} opts the object to check\n * @returns {T} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEO,MAAME,iBAAiB,GAAG,WAAW;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAUtC,SAASE,WAAWA,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
@@ -349,4 +349,4 @@ helpers.createChromedriverCaps = function createChromedriverCaps(opts, deviceId,
349
349
  };
350
350
  var _default = helpers;
351
351
  exports.default = _default;
352
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2F4aW9zIiwiX3N1cHBvcnQiLCJfcG9ydHNjYW5uZXIiLCJfbHJ1Q2FjaGUiLCJfYmx1ZWJpcmQiLCJfcGF0aCIsIl9vcyIsIk5BVElWRV9XSU4iLCJleHBvcnRzIiwiV0VCVklFV19XSU4iLCJDSFJPTUlVTV9XSU4iLCJXRUJWSUVXX0JBU0UiLCJXRUJWSUVXX1BJRF9QQVRURVJOIiwiUmVnRXhwIiwiV0VCVklFV19QS0dfUEFUVEVSTiIsIkRFVlRPT0xTX1NPQ0tFVF9QQVRURVJOIiwiQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOIiwiQ0hST01JVU1fREVWVE9PTFNfU09DS0VUIiwiQ0hST01FX1BBQ0tBR0VfTkFNRSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiREVWVE9PTFNfUE9SVFNfUkFOR0UiLCJXRUJWSUVXU19ERVRBSUxTX0NBQ0hFIiwiTFJVIiwibWF4IiwidXBkYXRlQWdlT25HZXQiLCJDRFBfUkVRX1RJTUVPVVQiLCJERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQiLCJ1dGlsIiwiZ2V0TG9ja0ZpbGVHdWFyZCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJoZWxwZXJzIiwidG9EZXRhaWxzQ2FjaGVLZXkiLCJhZGIiLCJ3ZWJ2aWV3IiwiY3VyRGV2aWNlSWQiLCJnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MiLCJvdXQiLCJzaGVsbCIsIm5hbWVzIiwiYWxsTWF0Y2hlcyIsImxpbmUiLCJzcGxpdCIsImZsYWdzIiwic3QiLCJzb2NrUGF0aCIsInRyaW0iLCJzdGFydHNXaXRoIiwicHVzaCIsInRlc3QiLCJfIiwiaXNFbXB0eSIsImxvZ2dlciIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsInBsdXJhbGl6ZSIsInVuaXEiLCJ3ZWJ2aWV3c0Zyb21Qcm9jcyIsImRldmljZVNvY2tldCIsInNvY2tldE5hbWVzIiwid2Vidmlld3MiLCJzb2NrZXROYW1lIiwicHJvYyIsInNvY2tldE5hbWVNYXRjaCIsImV4ZWMiLCJjcm9zc3dhbGtNYXRjaCIsImFsbG9jYXRlRGV2dG9vbHNQb3J0Iiwid2Vidmlld0RldnRvb2xzUG9ydCIsInJlbW90ZVBvcnQiLCJyZXBsYWNlIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImxvY2FsUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwiZSIsIkVycm9yIiwiYWRiRXhlYyIsImNvbGxlY3RXZWJ2aWV3c0RldGFpbHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJvcHRzIiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJpbmZvIiwiZGV0YWlsQ29sbGVjdG9ycyIsIml0ZW0iLCJjZHBJbmZvIiwicGFnZXMiLCJjZHBMaXN0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJCIiwiYWxsIiwiYXhpb3MiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWxldGUiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiX29wdHMkY2hyb21lT3B0aW9ucyIsIl93ZWJWaWV3RGV0YWlscyRpbmZvIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlMiIsIl9vcHRzJGNocm9tZU9wdGlvbnMyIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYnZpZXctaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3QgTkFUSVZFX1dJTiA9ICdOQVRJVkVfQVBQJztcbmNvbnN0IFdFQlZJRVdfV0lOID0gJ1dFQlZJRVcnO1xuY29uc3QgQ0hST01JVU1fV0lOID0gJ0NIUk9NSVVNJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuY29uc3QgV0VCVklFV19QSURfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oXFxcXGQrKWApO1xuY29uc3QgV0VCVklFV19QS0dfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oW15cXFxcZFxcXFxzXVtcXFxcdy5dKilgKTtcbmNvbnN0IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOID0gL0BbXFx3Ll0rX2RldnRvb2xzX3JlbW90ZV8/KFxcZCspP1xcYi87XG5jb25zdCBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4gPSAvQChbXFx3Ll0rKV9kZXZ0b29sc19yZW1vdGVcXGIvO1xuY29uc3QgQ0hST01JVU1fREVWVE9PTFNfU09DS0VUID0gJ2Nocm9tZV9kZXZ0b29sc19yZW1vdGUnO1xuY29uc3QgQ0hST01FX1BBQ0tBR0VfTkFNRSA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgPSBbXG4gIENIUk9NRV9QQUNLQUdFX05BTUUsXG4gICdjb20uY2hyb21lLmJldGEnLFxuICAnY29tLmNocm9tZS5kZXYnLFxuICAnY29tLmNocm9tZS5jYW5hcnknLFxuXTtcbmNvbnN0IERFVlRPT0xTX1BPUlRTX1JBTkdFID0gWzEwOTAwLCAxMTAwMF07XG5jb25zdCBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAwLFxuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbn0pO1xuY29uc3QgQ0RQX1JFUV9USU1FT1VUID0gMjAwMDsgLy8gbXNcbmNvbnN0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAnYW5kcm9pZF9kZXZ0b29sc19wb3J0X2d1YXJkJyksXG4gIHt0aW1lb3V0OiA3LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuZnVuY3Rpb24gdG9EZXRhaWxzQ2FjaGVLZXkgKGFkYiwgd2Vidmlldykge1xuICByZXR1cm4gYCR7YWRiPy5jdXJEZXZpY2VJZH06JHt3ZWJ2aWV3fWA7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgbGlzdCBvZiBhbmRyb2lkIHN5c3RlbSBwcm9jZXNzZXMgYW5kIHJldHVybnMgb25lc1xuICogdGhhdCBsb29rIGxpa2Ugd2Vidmlld3NcbiAqIFNlZSBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIG1hdGNoaW5nIHdlYnZpZXcgc29ja2V0IG5hbWVzIChpbmNsdWRpbmcgdGhlIGxlYWRpbmcgJ0AnKVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MgKGFkYikge1xuICBjb25zdCBvdXQgPSBhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCAnL3Byb2MvbmV0L3VuaXgnXSk7XG4gIGNvbnN0IG5hbWVzID0gW107XG4gIGNvbnN0IGFsbE1hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICAvLyBOdW0gUmVmQ291bnQgUHJvdG9jb2wgRmxhZ3MgVHlwZSBTdCBJbm9kZSBQYXRoXG4gICAgY29uc3QgWywsLCBmbGFncywsIHN0LCwgc29ja1BhdGhdID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAoIXNvY2tQYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNvY2tQYXRoLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgYWxsTWF0Y2hlcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICB9XG4gICAgaWYgKGZsYWdzICE9PSAnMDAwMTAwMDAnIHx8IHN0ICE9PSAnMDEnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFERVZUT09MU19TT0NLRVRfUEFUVEVSTi50ZXN0KHNvY2tQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmFtZXMucHVzaChzb2NrUGF0aCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG5vIGFjdGl2ZSBkZXZ0b29scyBzb2NrZXRzJyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoYWxsTWF0Y2hlcykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgT3RoZXIgc29ja2V0cyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkoYWxsTWF0Y2hlcywgbnVsbCwgMil9YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkICR7bmFtZXMubGVuZ3RofSBhY3RpdmUgZGV2dG9vbHMgJHt1dGlsLnBsdXJhbGl6ZSgnc29ja2V0JywgbmFtZXMubGVuZ3RoLCBmYWxzZSl9OiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWVzKSk7XG4gIH1cbiAgLy8gc29tZXRpbWVzIHRoZSB3ZWJ2aWV3IHByb2Nlc3Mgc2hvd3MgdXAgbXVsdGlwbGUgdGltZXMgcGVyIGFwcFxuICByZXR1cm4gXy51bmlxKG5hbWVzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvY1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgLSBUaGUgd2VidmlldyBwcm9jZXNzIG5hbWUgKGFzIHJldHVybmVkIGJ5XG4gKiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IC0gVGhlIGFjdHVhbCB3ZWJ2aWV3IGNvbnRleHQgbmFtZVxuICovXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgbGlzdCBvZiBzeXN0ZW0gcHJvY2Vzc2VzIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzLFxuICogYW5kIHJldHVybnMgdGhlbSBhbG9uZyB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRleHQgbmFtZSBhcHByb3ByaWF0ZSBmb3IgaXQuXG4gKiBJZiB3ZSBwYXNzIGluIGEgZGV2aWNlU29ja2V0LCB3ZSBvbmx5IGF0dGVtcHQgdG8gZmluZCB3ZWJ2aWV3cyB3aGljaCBtYXRjaFxuICogdGhhdCBzb2NrZXQgbmFtZSAodGhpcyBpcyBmb3IgYXBwcyB3aGljaCBlbWJlZCBDaHJvbWl1bSwgd2hpY2ggaXNuJ3QgdGhlXG4gKiBzYW1lIGFzIGNocm9tZS1iYWNrZWQgd2Vidmlld3MpLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7P3N0cmluZ30gZGV2aWNlU29ja2V0IC0gdGhlIGV4cGxpY3RseS1uYW1lZCBkZXZpY2Ugc29ja2V0IHRvIHVzZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxXZWJ2aWV3UHJvYz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdlYnZpZXdzRnJvbVByb2NzIChhZGIsIGRldmljZVNvY2tldCA9IG51bGwpIHtcbiAgY29uc3Qgc29ja2V0TmFtZXMgPSBhd2FpdCBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MoYWRiKTtcbiAgY29uc3Qgd2Vidmlld3MgPSBbXTtcbiAgZm9yIChjb25zdCBzb2NrZXROYW1lIG9mIHNvY2tldE5hbWVzKSB7XG4gICAgaWYgKGRldmljZVNvY2tldCA9PT0gQ0hST01JVU1fREVWVE9PTFNfU09DS0VUICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IENIUk9NSVVNX1dJTixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0TmFtZU1hdGNoID0gREVWVE9PTFNfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNyb3Nzd2Fsa01hdGNoID0gQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2hbMV0gJiYgIWNyb3Nzd2Fsa01hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlU29ja2V0ICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCB8fCAhZGV2aWNlU29ja2V0KSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2Vidmlldzogc29ja2V0TmFtZU1hdGNoWzFdXG4gICAgICAgICAgPyBgJHtXRUJWSUVXX0JBU0V9JHtzb2NrZXROYW1lTWF0Y2hbMV19YFxuICAgICAgICAgIDogYCR7V0VCVklFV19CQVNFfSR7Y3Jvc3N3YWxrTWF0Y2hbMV19YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3M7XG59XG5cbi8qKlxuICogQWxsb2NhdGVzIGEgbG9jYWwgcG9ydCBmb3IgZGV2dG9vbHMgY29tbXVuaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ja2V0TmFtZSBUaGUgcmVtb3RlIFVuaXggc29ja2V0IG5hbWVcbiAqIEBwYXJhbSB7P251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgbG9jYWwgcG9ydCBudW1iZXIgb3IgbnVsbCB0byBhcHBseVxuICogYXV0b2RldGVjdGlvblxuICogQHJldHVybnMge251bWJlcn0gVGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlmIHRoZSByZW1vdGUgc29ja2V0IGhhcyBiZWVuIGZvcndhcmRlZFxuICogc3VjY2Vzc2Z1bGx5IG9yIGBudWxsYCBvdGhlcndpc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWxsb2NhdGluZyB0aGUgbG9jYWwgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBhbGxvY2F0ZURldnRvb2xzUG9ydCAoYWRiLCBzb2NrZXROYW1lLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCkge1xuICAvLyBzb2NrZXQgbmFtZXMgY29tZSB3aXRoICdAJywgYnV0IHRoaXMgc2hvdWxkIG5vdCBiZSBhIHBhcnQgb2YgdGhlIGFic3RyYWN0XG4gIC8vIHJlbW90ZSBwb3J0LCBzbyByZW1vdmUgaXRcbiAgY29uc3QgcmVtb3RlUG9ydCA9IHNvY2tldE5hbWUucmVwbGFjZSgvXkAvLCAnJyk7XG4gIGxldCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVlRPT0xTX1BPUlRTX1JBTkdFO1xuICBpZiAod2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGVuZFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0ICsgKGVuZFBvcnQgLSBzdGFydFBvcnQpO1xuICAgIHN0YXJ0UG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3J3YXJkaW5nIHJlbW90ZSBwb3J0ICR7cmVtb3RlUG9ydH0gdG8gYSBsb2NhbCBgICtcbiAgICBgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH1gKTtcbiAgaWYgKCF3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBZb3UgY291bGQgdXNlIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eSB0byBjdXN0b21pemUgYCArXG4gICAgICBgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgbGV0IGxvY2FsUG9ydDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgdG8gZm9yd2FyZCB0aGUgRGV2dG9vbHMgc29ja2V0IGAgK1xuICAgICAgICBgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9LiBZb3UgY291bGQgc2V0IHRoZSBzdGFydGluZyBwb3J0IG51bWJlciBgICtcbiAgICAgICAgYG1hbnVhbGx5IGJ5IHByb3ZpZGluZyB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHlgKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke2xvY2FsUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke3JlbW90ZVBvcnR9YF0pO1xuICAgIHJldHVybiBsb2NhbFBvcnQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldGFpbENvbGxlY3Rpb25PcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBzdGFydGluZyBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjayAoaWYgbm90IHRoZSBkZWZhdWx0IG9mIDkyMjIpLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgV2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZXMgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgQ2hyb21lIERlYnVnZ2VyIFByb3RvY29sIGRhdGEgY29sbGVjdGlvbi5cbiAqIE5vIGVycm9yIGlzIHRocm93biBpZiBDRFAgcmVxdWVzdCBmYWlscyAtIGluIHN1Y2ggY2FzZSBubyBkYXRhIHdpbGwgYmVcbiAqIHJlY29yZGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYHdlYnZpZXdzTWFwcGluZ2AgaXRlbS5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIFRoZSBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld1Byb3BzPn0gd2Vidmlld3NNYXBwaW5nIFRoZSBjdXJyZW50IHdlYnZpZXdzIG1hcHBpbmdcbiAqICEhISBFYWNoIGl0ZW0gb2YgdGhpcyBhcnJheSBnZXRzIG11dGF0ZWQgKGBpbmZvYC9gcGFnZXNgIHByb3BlcnRpZXMgZ2V0IGFkZGVkXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYG9wdHNgKSBpZiB0aGUgcmVxdWVzdGVkIGRldGFpbHMgaGF2ZSBiZWVuXG4gKiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGZvciBpdCAhISFcbiAqIEBwYXJhbSB7RGV0YWlsQ29sbGVjdGlvbk9wdGlvbnN9IG9wdHMgSWYgYm90aCBgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXNgIGFuZFxuICogYGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbmAgcHJvcGVydGllcyBhcmUgZmFsc3kgdGhlbiBubyBkZXRhaWxzIGNvbGxlY3Rpb25cbiAqIGlzIHBlcmZvcm1lZFxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0V2Vidmlld3NEZXRhaWxzIChhZGIsIHdlYnZpZXdzTWFwcGluZywgb3B0cyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkod2Vidmlld3NNYXBwaW5nKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IG51bGwsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gbnVsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY2hlY2tpbmcgd2hldGhlciB3ZWJ2aWV3cyBoYXZlIGFjdGl2ZSBwYWdlczsgdXNlIHRoZSBgICtcbiAgICAgIGAnZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMnIGNhcCB0byB0dXJuIHRoaXMgY2hlY2sgb25gKTtcbiAgfVxuXG4gIGlmICghZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjb2xsZWN0aW5nIHdlYiB2aWV3IGRldGFpbHMuIERldGFpbHMgY29sbGVjdGlvbiBtaWdodCBoZWxwIGAgK1xuICAgICAgYHRvIG1ha2UgQ2hyb21lZHJpdmVyIGluaXRpYWxpemF0aW9uIG1vcmUgcHJlY2lzZS4gVXNlIHRoZSAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJyBgICtcbiAgICAgIGBjYXAgdG8gdHVybiBpdCBvbmApO1xuICB9XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiAhZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ29ubmVjdCB0byBlYWNoIGRldnRvb2xzIHNvY2tldCBhbmQgcmV0cmlldmUgd2ViIHZpZXcgZGV0YWlsc1xuICBsb2dnZXIuZGVidWcoYENvbGxlY3RpbmcgQ0RQIGRhdGEgb2YgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHdlYnZpZXdzTWFwcGluZy5sZW5ndGgsIHRydWUpfWApO1xuICBjb25zdCBkZXRhaWxDb2xsZWN0b3JzID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBkZXRhaWxDb2xsZWN0b3JzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFBvcnQgPSBhd2FpdCBhbGxvY2F0ZURldnRvb2xzUG9ydChhZGIsIGl0ZW0ucHJvYywgd2Vidmlld0RldnRvb2xzUG9ydCk7XG4gICAgICAgIGlmIChlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICBpdGVtLmluZm8gPSBhd2FpdCBjZHBJbmZvKGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgICAgICAgaXRlbS5wYWdlcyA9IGF3YWl0IGNkcExpc3QobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobG9jYWxQb3J0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFkYi5yZW1vdmVQb3J0Rm9yd2FyZChsb2NhbFBvcnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChkZXRhaWxDb2xsZWN0b3JzKTtcbiAgbG9nZ2VyLmRlYnVnKGBDRFAgZGF0YSBjb2xsZWN0aW9uIGNvbXBsZXRlZGApO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcExpc3QgKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL2xpc3RgLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwSW5mbyAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vdmVyc2lvbmAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgd2VidmlldyBuYW1lIGxpa2UgV0VCVklFV180Mjk2IGFuZCB1c2UgJ2FkYiBzaGVsbCBwcycgdG8gZmlndXJlIG91dFxuICogd2hpY2ggYXBwIHBhY2thZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgd2Vidmlldy4gT25lIG9mIHRoZSByZWFzb25zIHdlXG4gKiB3YW50IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlJ3JlIGxpc3Rpbmcgd2Vidmlld3MgZm9yIHRoZSBhY3R1YWwgQVVULFxuICogbm90IHNvbWUgb3RoZXIgcnVubmluZyBhcHBcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyAtIGEgd2VidmlldyBwcm9jZXNzIG5hbWVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcCBydW5uaW5nIHRoZSB3ZWJ2aWV3XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIG5hbWVcbiAqL1xuaGVscGVycy5wcm9jRnJvbVdlYnZpZXcgPSBhc3luYyBmdW5jdGlvbiBwcm9jRnJvbVdlYnZpZXcgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgaWYgKCFwaWRNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgUElEIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICB9XG5cbiAgY29uc3QgcGlkID0gcGlkTWF0Y2hbMV07XG4gIGxvZ2dlci5kZWJ1ZyhgJHt3ZWJ2aWV3fSBtYXBwZWQgdG8gcGlkICR7cGlkfWApO1xuICBsb2dnZXIuZGVidWcoYEdldHRpbmcgcHJvY2VzcyBuYW1lIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICBjb25zdCBwa2cgPSBhd2FpdCBhZGIuZ2V0TmFtZUJ5UGlkKHBpZCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR290IHByb2Nlc3MgbmFtZTogJyR7cGtnfSdgKTtcbiAgcmV0dXJuIHBrZztcbn07XG5cbi8qKlxuICogUGFyc2Ugd2VidmlldyBuYW1lcyBmb3IgZ2V0Q29udGV4dHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIHdlYnZpZXcgbmFtZXNcbiAqL1xuaGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyA9IGZ1bmN0aW9uIHBhcnNlV2Vidmlld05hbWVzICh3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICBpc0Nocm9tZVNlc3Npb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIGlmIChpc0Nocm9tZVNlc3Npb24pIHtcbiAgICByZXR1cm4gW0NIUk9NSVVNX1dJTl07XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCB7d2VidmlldywgcGFnZXMsIHByb2MsIHdlYnZpZXdOYW1lfSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgcGFnZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFNraXBwaW5nIHRoZSB3ZWJ2aWV3ICcke3dlYnZpZXd9JyBhdCAnJHtwcm9jfScgYCArXG4gICAgICAgIGBzaW5jZSBpdCBoYXMgcmVwb3J0ZWQgaGF2aW5nIHplcm8gcGFnZXNgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAod2Vidmlld05hbWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHdlYnZpZXdOYW1lKTtcbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3JywgcmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFdlYnZpZXdzT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFuZHJvaWREZXZpY2VTb2NrZXQgW251bGxdIC0gZGV2aWNlIHNvY2tldCBuYW1lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFt0cnVlXSAtIHdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2UgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFs5MjIyXSAtIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gW3RydWVdIC0gd2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3Blcnkgez9zdHJpbmd9IHdlYnZpZXdOYW1lIEFuIGFjdHVhbCB3ZWJ2aWV3IG5hbWUgZm9yIHN3aXRjaGluZyBjb250ZXh0XG4gKi9cblxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cyBtYXBwaW5nIGJ5IGludHJvc3BlY3RpbmcgcHJvY2Vzc2VzIHdpdGggYWRiLFxuICogd2hlcmUgd2Vidmlld3MgYXJlIGxpc3RlZC4gSXQncyBwb3NzaWJsZSB0byBwYXNzIGluIGEgJ2RldmljZVNvY2tldCcgYXJnLCB3aGljaFxuICogbGltaXRzIHRoZSB3ZWJ2aWV3IHBvc3NpYmlsaXRpZXMgdG8gdGhlIG9uZSBydW5uaW5nIG9uIHRoZSBDaHJvbWl1bSBkZXZ0b29sc1xuICogc29ja2V0IHdlJ3JlIGludGVyZXN0ZWQgaW4gKHNlZSBub3RlIG9uIHdlYnZpZXdzRnJvbVByb2NzKS4gV2UgY2FuIGFsc29cbiAqIGRpcmVjdCB0aGlzIG1ldGhvZCB0byB2ZXJpZnkgd2hldGhlciBhIHBhcnRpY3VsYXIgd2VidmlldyBwcm9jZXNzIGFjdHVhbGx5XG4gKiBoYXMgYW55IHBhZ2VzIChpZiBhIHByb2Nlc3MgZXhpc3RzIGJ1dCBubyBwYWdlcyBhcmUgZm91bmQsIENocm9tZWRyaXZlciB3aWxsXG4gKiBub3QgYWN0dWFsbHkgYmUgYWJsZSB0byBjb25uZWN0IHRvIGl0LCBzbyB0aGlzIHNlcnZlcyBhcyBhIGd1YXJkIGZvciB0aGF0XG4gKiBzdHJhbmdlIGZhaWx1cmUgbW9kZSkuIFRoZSBzdHJhdGVneSBmb3IgY2hlY2tpbmcgd2hldGhlciBhbnkgcGFnZXMgYXJlXG4gKiBhY3RpdmUgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBkZWJ1ZyBzZXJ2ZXIgb24gdGhlIGRldmljZSxcbiAqIGhlbmNlIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lIHdoaWNoXG4gKiBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmhlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2ViVmlld3NNYXBwaW5nIChhZGIsIHtcbiAgYW5kcm9pZERldmljZVNvY2tldCA9IG51bGwsXG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IHRydWVcbn0gPSB7fSkge1xuICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cycpO1xuICBjb25zdCB3ZWJ2aWV3c01hcHBpbmcgPSBhd2FpdCB3ZWJ2aWV3c0Zyb21Qcm9jcyhhZGIsIGFuZHJvaWREZXZpY2VTb2NrZXQpO1xuXG4gIGF3YWl0IGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24sXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB3ZWJ2aWV3TWFwcGluZyBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBjb25zdCB7d2VidmlldywgaW5mb30gPSB3ZWJ2aWV3TWFwcGluZztcbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IG51bGw7XG5cbiAgICBsZXQgd3ZOYW1lID0gd2VidmlldztcbiAgICBsZXQgcHJvY2VzcyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFuZHJvaWREZXZpY2VTb2NrZXQpIHtcbiAgICAgIGNvbnN0IHBrZ01hdGNoID0gV0VCVklFV19QS0dfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViIHZpZXcgbmFtZSBjb3VsZCBlaXRoZXIgYmUgc3VmZml4ZWQgd2l0aCBQSUQgb3IgdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAvLyBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgICAgICAgY29uc3QgcGtnID0gcGtnTWF0Y2ggPyBwa2dNYXRjaFsxXSA6IGF3YWl0IGhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3KGFkYiwgd2Vidmlldyk7XG4gICAgICAgIHd2TmFtZSA9IGAke1dFQlZJRVdfQkFTRX0ke3BrZ31gO1xuICAgICAgICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgICAgcHJvY2VzcyA9IHtcbiAgICAgICAgICBuYW1lOiBwa2csXG4gICAgICAgICAgaWQ6IHBpZE1hdGNoID8gcGlkTWF0Y2hbMV0gOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IHd2TmFtZTtcbiAgICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHd2TmFtZSk7XG4gICAgaWYgKGluZm8gfHwgcHJvY2Vzcykge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5zZXQoa2V5LCB7IGluZm8sIHByb2Nlc3MgfSk7XG4gICAgfSBlbHNlIGlmIChXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmhhcyhrZXkpKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3NNYXBwaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9jZXNzSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgVGhlIHByb2Nlc3MgbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZCBUaGUgcHJvY2VzcyBpZCAoaWYgY291bGQgYmUgcmV0cmlldmVkKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2ViVmlld0RldGFpbHNcbiAqIEBwcm9wZXJ0eSB7P1Byb2Nlc3NJbmZvfSBwcm9jZXNzIC0gV2ViIHZpZXcgcHJvY2VzcyBkZXRhaWxzXG4gKiBAcHJvcGVydHkge09iamVjdH0gaW5mbyAtIFdlYiB2aWV3IGRldGFpbHMgYXMgcmV0dXJuZWQgYnkgL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnQsIGZvciBleGFtcGxlOlxuICoge1xuICogIFwiQnJvd3NlclwiOiBcIkNocm9tZS83Mi4wLjM2MDEuMFwiLFxuICogIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuM1wiLFxuICogIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzEzXzYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83Mi4wLjM2MDEuMCBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgXCJWOC1WZXJzaW9uXCI6IFwiNy4yLjIzM1wiLFxuICogIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEBjZmVkZTlkYjFkMTU0ZGUwNDY4Y2IwNTM4NDc5ZjM0YzA3NTVhMGY0KVwiLFxuICogIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovL2xvY2FsaG9zdDo5MjIyL2RldnRvb2xzL2Jyb3dzZXIvYjBiOGE0ZmItYmIxNy00MzU5LTk1MzMtYThkOWYzOTA4YmQ4XCJcbiAqIH1cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB3ZWIgdmlldyBkZXRhaWxzIHByZXZpb3VzbHkgY2FjaGVkIGJ5IGBnZXRXZWJ2aWV3c2AgY2FsbFxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyBUaGUgbmFtZSBvZiB0aGUgd2ViIHZpZXdcbiAqIEByZXR1cm5zIHs/V2ViVmlld0RldGFpbHN9IEVpdGhlciBgdW5kZWZpbmVkYCBvciB0aGUgcmVjZW50IHdlYiB2aWV3IGRldGFpbHNcbiAqL1xuaGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyA9IGZ1bmN0aW9uIGdldFdlYnZpZXdEZXRhaWxzIChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3ZWJ2aWV3KTtcbiAgcmV0dXJuIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZ2V0KGtleSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBDaHJvbWUgZHJpdmVyIGNhcGFiaWxpdGllcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIEFwcGl1bSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBVc2VyLXByb3ZpZGVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZpY2VJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgQW5kcm9pZCBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHBhcmFtIHs/V2ViVmlld0RldGFpbHN9IHdlYlZpZXdEZXRhaWxzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgY2FwYWJpbGl0aWVzIG9iamVjdC5cbiAqIFNlZSBodHRwczovL2Nocm9tZWRyaXZlci5jaHJvbWl1bS5vcmcvY2FwYWJpbGl0aWVzIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmhlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyA9IGZ1bmN0aW9uIGNyZWF0ZUNocm9tZWRyaXZlckNhcHMgKG9wdHMsIGRldmljZUlkLCB3ZWJWaWV3RGV0YWlscykge1xuICBjb25zdCBjYXBzID0geyBjaHJvbWVPcHRpb25zOiB7fSB9O1xuXG4gIGNvbnN0IGFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVPcHRpb25zPy5hbmRyb2lkUGFja2FnZVxuICAgIHx8IG9wdHMuYXBwUGFja2FnZVxuICAgIHx8IHdlYlZpZXdEZXRhaWxzPy5pbmZvPy5bJ0FuZHJvaWQtUGFja2FnZSddO1xuICBpZiAoYW5kcm9pZFBhY2thZ2UpIHtcbiAgICAvLyBjaHJvbWVkcml2ZXIgcmFpc2VzIGFuIGludmFsaWQgYXJndW1lbnQgZXJyb3Igd2hlbiBhbmRyb2lkUGFja2FnZSBpcyAnbnVsbCdcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwKSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkVXNlUnVubmluZ0FwcCA9IG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcDtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5KSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gb3B0cy5jaHJvbWVBbmRyb2lkUHJvY2VzcztcbiAgfSBlbHNlIGlmICh3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8ubmFtZSAmJiB3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8uaWQpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSB3ZWJWaWV3RGV0YWlscy5wcm9jZXNzLm5hbWU7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihvcHRzLmJyb3dzZXJOYW1lKSA9PT0gJ2Nocm9taXVtLXdlYnZpZXcnKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMucGFnZUxvYWRTdHJhdGVneSkge1xuICAgIGNhcHMucGFnZUxvYWRTdHJhdGVneSA9IG9wdHMucGFnZUxvYWRTdHJhdGVneTtcbiAgfVxuICBjb25zdCBpc0Nocm9tZSA9IF8udG9Mb3dlcihjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpID09PSAnY2hyb21lJztcbiAgaWYgKF8uaW5jbHVkZXMoS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMsIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgfHwgaXNDaHJvbWUpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGV4dHJhY3RlZCBwYWNrYWdlIGZyb20gY29udGV4dCBuYW1lLCBpdCBjb3VsZCBjb21lIGluIGFzIGJhcmVcbiAgICAvLyBcImNocm9tZVwiLCBhbmQgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgZGV0YWlscyBhcmUgY29ycmVjdCwgaW5jbHVkaW5nXG4gICAgLy8gbm90IHVzaW5nIGFuIGFjdGl2aXR5IG9yIHByb2Nlc3MgaWRcbiAgICBpZiAoaXNDaHJvbWUpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IENIUk9NRV9QQUNLQUdFX05BTUU7XG4gICAgfVxuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5O1xuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3M7XG4gIH1cbiAgLy8gYWRkIGRldmljZSBpZCBmcm9tIGFkYlxuICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZERldmljZVNlcmlhbCA9IGRldmljZUlkO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3Qob3B0cy5sb2dnaW5nUHJlZnMpIHx8IF8uaXNQbGFpbk9iamVjdChvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcykpIHtcbiAgICBpZiAob3B0cy5sb2dnaW5nUHJlZnMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBUaGUgJ2xvZ2dpbmdQcmVmcycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgJ2Nocm9tZUxvZ2dpbmdQcmVmcycgY2FwIGluc3RlYWRgKTtcbiAgICB9XG4gICAgY2Fwcy5sb2dnaW5nUHJlZnMgPSBvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcyB8fCBvcHRzLmxvZ2dpbmdQcmVmcztcbiAgfVxuICBpZiAob3B0cy5lbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcpIHtcbiAgICBsb2dnZXIud2FybihgVGhlICdlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcnIGNhcCBpcyBkZXByZWNhdGVkOyBzaW1wbHkgdXNlIGAgK1xuICAgICAgYHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZCwgd2l0aCBhICdwZXJmb3JtYW5jZScga2V5IHNldCB0byAnQUxMJ2ApO1xuICAgIGNvbnN0IG5ld1ByZWYgPSB7cGVyZm9ybWFuY2U6ICdBTEwnfTtcbiAgICAvLyBkb24ndCBvdmVyd3JpdGUgb3RoZXIgbG9nZ2luZyBwcmVmcyB0aGF0IGhhdmUgYmVlbiBzZW50IGluIGlmIHRoZXkgZXhpc3RcbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IGNhcHMubG9nZ2luZ1ByZWZzXG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGNhcHMubG9nZ2luZ1ByZWZzLCBuZXdQcmVmKVxuICAgICAgOiBuZXdQcmVmO1xuICB9XG5cbiAgaWYgKG9wdHMuY2hyb21lT3B0aW9ucz8uQXJndW1lbnRzKSB7XG4gICAgLy8gbWVyZ2UgYEFyZ3VtZW50c2AgYW5kIGBhcmdzYFxuICAgIG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzID0gWy4uLihvcHRzLmNocm9tZU9wdGlvbnMuYXJncyB8fCBbXSksIC4uLm9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHNdO1xuICAgIGRlbGV0ZSBvcHRzLmNocm9tZU9wdGlvbnMuQXJndW1lbnRzO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQcmVjYWxjdWxhdGVkIENocm9tZWRyaXZlciBjYXBhYmlsaXRpZXM6ICcgK1xuICAgIEpTT04uc3RyaW5naWZ5KGNhcHMuY2hyb21lT3B0aW9ucywgbnVsbCwgMikpO1xuXG4gIGNvbnN0IHByb3RlY3RlZENhcE5hbWVzID0gW107XG4gIGZvciAoY29uc3QgW29wdCwgdmFsXSBvZiBfLnRvUGFpcnMob3B0cy5jaHJvbWVPcHRpb25zKSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKGNhcHMuY2hyb21lT3B0aW9uc1tvcHRdKSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3RlY3RlZENhcE5hbWVzLnB1c2gob3B0KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkocHJvdGVjdGVkQ2FwTmFtZXMpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1RoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiAnICtcbiAgICAgICdieSB0aGUgcHJvdmlkZWQgY2hyb21lT3B0aW9uczonKTtcbiAgICBmb3IgKGNvbnN0IG9wdE5hbWUgb2YgcHJvdGVjdGVkQ2FwTmFtZXMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAgICR7b3B0TmFtZX0gKCR7SlNPTi5zdHJpbmdpZnkob3B0cy5jaHJvbWVPcHRpb25zW29wdE5hbWVdKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBoZWxwZXJzO1xuZXhwb3J0IHsgaGVscGVycywgTkFUSVZFX1dJTiwgV0VCVklFV19XSU4sIFdFQlZJRVdfQkFTRSwgQ0hST01JVU1fV0lOLCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLEtBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLEdBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLE1BQU1TLFVBQVUsR0FBRyxZQUFZO0FBQUNDLE9BQUEsQ0FBQUQsVUFBQSxHQUFBQSxVQUFBO0FBQ2hDLE1BQU1FLFdBQVcsR0FBRyxTQUFTO0FBQUNELE9BQUEsQ0FBQUMsV0FBQSxHQUFBQSxXQUFBO0FBQzlCLE1BQU1DLFlBQVksR0FBRyxVQUFVO0FBQUNGLE9BQUEsQ0FBQUUsWUFBQSxHQUFBQSxZQUFBO0FBQ2hDLE1BQU1DLFlBQVksR0FBSSxHQUFFRixXQUFZLEdBQUU7QUFBQ0QsT0FBQSxDQUFBRyxZQUFBLEdBQUFBLFlBQUE7QUFDdkMsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSUMsTUFBTSxDQUFFLElBQUdGLFlBQWEsUUFBTyxDQUFDO0FBQ2hFLE1BQU1HLG1CQUFtQixHQUFHLElBQUlELE1BQU0sQ0FBRSxJQUFHRixZQUFhLG9CQUFtQixDQUFDO0FBQzVFLE1BQU1JLHVCQUF1QixHQUFHLG1DQUFtQztBQUNuRSxNQUFN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
352
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2F4aW9zIiwiX3N1cHBvcnQiLCJfcG9ydHNjYW5uZXIiLCJfbHJ1Q2FjaGUiLCJfYmx1ZWJpcmQiLCJfcGF0aCIsIl9vcyIsIk5BVElWRV9XSU4iLCJleHBvcnRzIiwiV0VCVklFV19XSU4iLCJDSFJPTUlVTV9XSU4iLCJXRUJWSUVXX0JBU0UiLCJXRUJWSUVXX1BJRF9QQVRURVJOIiwiUmVnRXhwIiwiV0VCVklFV19QS0dfUEFUVEVSTiIsIkRFVlRPT0xTX1NPQ0tFVF9QQVRURVJOIiwiQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOIiwiQ0hST01JVU1fREVWVE9PTFNfU09DS0VUIiwiQ0hST01FX1BBQ0tBR0VfTkFNRSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiREVWVE9PTFNfUE9SVFNfUkFOR0UiLCJXRUJWSUVXU19ERVRBSUxTX0NBQ0hFIiwiTFJVIiwibWF4IiwidXBkYXRlQWdlT25HZXQiLCJDRFBfUkVRX1RJTUVPVVQiLCJERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQiLCJ1dGlsIiwiZ2V0TG9ja0ZpbGVHdWFyZCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJoZWxwZXJzIiwidG9EZXRhaWxzQ2FjaGVLZXkiLCJhZGIiLCJ3ZWJ2aWV3IiwiY3VyRGV2aWNlSWQiLCJnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MiLCJvdXQiLCJzaGVsbCIsIm5hbWVzIiwiYWxsTWF0Y2hlcyIsImxpbmUiLCJzcGxpdCIsImZsYWdzIiwic3QiLCJzb2NrUGF0aCIsInRyaW0iLCJzdGFydHNXaXRoIiwicHVzaCIsInRlc3QiLCJfIiwiaXNFbXB0eSIsImxvZ2dlciIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsInBsdXJhbGl6ZSIsInVuaXEiLCJ3ZWJ2aWV3c0Zyb21Qcm9jcyIsImRldmljZVNvY2tldCIsInNvY2tldE5hbWVzIiwid2Vidmlld3MiLCJzb2NrZXROYW1lIiwicHJvYyIsInNvY2tldE5hbWVNYXRjaCIsImV4ZWMiLCJjcm9zc3dhbGtNYXRjaCIsImFsbG9jYXRlRGV2dG9vbHNQb3J0Iiwid2Vidmlld0RldnRvb2xzUG9ydCIsInJlbW90ZVBvcnQiLCJyZXBsYWNlIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImxvY2FsUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwiZSIsIkVycm9yIiwiYWRiRXhlYyIsImNvbGxlY3RXZWJ2aWV3c0RldGFpbHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJvcHRzIiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJpbmZvIiwiZGV0YWlsQ29sbGVjdG9ycyIsIml0ZW0iLCJjZHBJbmZvIiwicGFnZXMiLCJjZHBMaXN0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJCIiwiYWxsIiwiYXhpb3MiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWxldGUiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiX29wdHMkY2hyb21lT3B0aW9ucyIsIl93ZWJWaWV3RGV0YWlscyRpbmZvIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlMiIsIl9vcHRzJGNocm9tZU9wdGlvbnMyIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYnZpZXctaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3QgTkFUSVZFX1dJTiA9ICdOQVRJVkVfQVBQJztcbmNvbnN0IFdFQlZJRVdfV0lOID0gJ1dFQlZJRVcnO1xuY29uc3QgQ0hST01JVU1fV0lOID0gJ0NIUk9NSVVNJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuY29uc3QgV0VCVklFV19QSURfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oXFxcXGQrKWApO1xuY29uc3QgV0VCVklFV19QS0dfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oW15cXFxcZFxcXFxzXVtcXFxcdy5dKilgKTtcbmNvbnN0IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOID0gL0BbXFx3Ll0rX2RldnRvb2xzX3JlbW90ZV8/KFxcZCspP1xcYi87XG5jb25zdCBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4gPSAvQChbXFx3Ll0rKV9kZXZ0b29sc19yZW1vdGVcXGIvO1xuY29uc3QgQ0hST01JVU1fREVWVE9PTFNfU09DS0VUID0gJ2Nocm9tZV9kZXZ0b29sc19yZW1vdGUnO1xuY29uc3QgQ0hST01FX1BBQ0tBR0VfTkFNRSA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgPSBbXG4gIENIUk9NRV9QQUNLQUdFX05BTUUsXG4gICdjb20uY2hyb21lLmJldGEnLFxuICAnY29tLmNocm9tZS5kZXYnLFxuICAnY29tLmNocm9tZS5jYW5hcnknLFxuXTtcbmNvbnN0IERFVlRPT0xTX1BPUlRTX1JBTkdFID0gWzEwOTAwLCAxMTAwMF07XG5jb25zdCBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAwLFxuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbn0pO1xuY29uc3QgQ0RQX1JFUV9USU1FT1VUID0gMjAwMDsgLy8gbXNcbmNvbnN0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAnYW5kcm9pZF9kZXZ0b29sc19wb3J0X2d1YXJkJyksXG4gIHt0aW1lb3V0OiA3LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuZnVuY3Rpb24gdG9EZXRhaWxzQ2FjaGVLZXkgKGFkYiwgd2Vidmlldykge1xuICByZXR1cm4gYCR7YWRiPy5jdXJEZXZpY2VJZH06JHt3ZWJ2aWV3fWA7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgbGlzdCBvZiBhbmRyb2lkIHN5c3RlbSBwcm9jZXNzZXMgYW5kIHJldHVybnMgb25lc1xuICogdGhhdCBsb29rIGxpa2Ugd2Vidmlld3NcbiAqIFNlZSBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIG1hdGNoaW5nIHdlYnZpZXcgc29ja2V0IG5hbWVzIChpbmNsdWRpbmcgdGhlIGxlYWRpbmcgJ0AnKVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MgKGFkYikge1xuICBjb25zdCBvdXQgPSBhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCAnL3Byb2MvbmV0L3VuaXgnXSk7XG4gIGNvbnN0IG5hbWVzID0gW107XG4gIGNvbnN0IGFsbE1hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICAvLyBOdW0gUmVmQ291bnQgUHJvdG9jb2wgRmxhZ3MgVHlwZSBTdCBJbm9kZSBQYXRoXG4gICAgY29uc3QgWywsLCBmbGFncywsIHN0LCwgc29ja1BhdGhdID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAoIXNvY2tQYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNvY2tQYXRoLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgYWxsTWF0Y2hlcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICB9XG4gICAgaWYgKGZsYWdzICE9PSAnMDAwMTAwMDAnIHx8IHN0ICE9PSAnMDEnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFERVZUT09MU19TT0NLRVRfUEFUVEVSTi50ZXN0KHNvY2tQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmFtZXMucHVzaChzb2NrUGF0aCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG5vIGFjdGl2ZSBkZXZ0b29scyBzb2NrZXRzJyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoYWxsTWF0Y2hlcykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgT3RoZXIgc29ja2V0cyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkoYWxsTWF0Y2hlcywgbnVsbCwgMil9YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkICR7bmFtZXMubGVuZ3RofSBhY3RpdmUgZGV2dG9vbHMgJHt1dGlsLnBsdXJhbGl6ZSgnc29ja2V0JywgbmFtZXMubGVuZ3RoLCBmYWxzZSl9OiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWVzKSk7XG4gIH1cbiAgLy8gc29tZXRpbWVzIHRoZSB3ZWJ2aWV3IHByb2Nlc3Mgc2hvd3MgdXAgbXVsdGlwbGUgdGltZXMgcGVyIGFwcFxuICByZXR1cm4gXy51bmlxKG5hbWVzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvY1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgLSBUaGUgd2VidmlldyBwcm9jZXNzIG5hbWUgKGFzIHJldHVybmVkIGJ5XG4gKiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IC0gVGhlIGFjdHVhbCB3ZWJ2aWV3IGNvbnRleHQgbmFtZVxuICovXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgbGlzdCBvZiBzeXN0ZW0gcHJvY2Vzc2VzIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzLFxuICogYW5kIHJldHVybnMgdGhlbSBhbG9uZyB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRleHQgbmFtZSBhcHByb3ByaWF0ZSBmb3IgaXQuXG4gKiBJZiB3ZSBwYXNzIGluIGEgZGV2aWNlU29ja2V0LCB3ZSBvbmx5IGF0dGVtcHQgdG8gZmluZCB3ZWJ2aWV3cyB3aGljaCBtYXRjaFxuICogdGhhdCBzb2NrZXQgbmFtZSAodGhpcyBpcyBmb3IgYXBwcyB3aGljaCBlbWJlZCBDaHJvbWl1bSwgd2hpY2ggaXNuJ3QgdGhlXG4gKiBzYW1lIGFzIGNocm9tZS1iYWNrZWQgd2Vidmlld3MpLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7P3N0cmluZ30gZGV2aWNlU29ja2V0IC0gdGhlIGV4cGxpY3RseS1uYW1lZCBkZXZpY2Ugc29ja2V0IHRvIHVzZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxXZWJ2aWV3UHJvYz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdlYnZpZXdzRnJvbVByb2NzIChhZGIsIGRldmljZVNvY2tldCA9IG51bGwpIHtcbiAgY29uc3Qgc29ja2V0TmFtZXMgPSBhd2FpdCBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MoYWRiKTtcbiAgY29uc3Qgd2Vidmlld3MgPSBbXTtcbiAgZm9yIChjb25zdCBzb2NrZXROYW1lIG9mIHNvY2tldE5hbWVzKSB7XG4gICAgaWYgKGRldmljZVNvY2tldCA9PT0gQ0hST01JVU1fREVWVE9PTFNfU09DS0VUICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IENIUk9NSVVNX1dJTixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0TmFtZU1hdGNoID0gREVWVE9PTFNfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNyb3Nzd2Fsa01hdGNoID0gQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2hbMV0gJiYgIWNyb3Nzd2Fsa01hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlU29ja2V0ICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCB8fCAhZGV2aWNlU29ja2V0KSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2Vidmlldzogc29ja2V0TmFtZU1hdGNoWzFdXG4gICAgICAgICAgPyBgJHtXRUJWSUVXX0JBU0V9JHtzb2NrZXROYW1lTWF0Y2hbMV19YFxuICAgICAgICAgIDogYCR7V0VCVklFV19CQVNFfSR7Y3Jvc3N3YWxrTWF0Y2hbMV19YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3M7XG59XG5cbi8qKlxuICogQWxsb2NhdGVzIGEgbG9jYWwgcG9ydCBmb3IgZGV2dG9vbHMgY29tbXVuaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ja2V0TmFtZSBUaGUgcmVtb3RlIFVuaXggc29ja2V0IG5hbWVcbiAqIEBwYXJhbSB7P251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgbG9jYWwgcG9ydCBudW1iZXIgb3IgbnVsbCB0byBhcHBseVxuICogYXV0b2RldGVjdGlvblxuICogQHJldHVybnMge251bWJlcn0gVGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlmIHRoZSByZW1vdGUgc29ja2V0IGhhcyBiZWVuIGZvcndhcmRlZFxuICogc3VjY2Vzc2Z1bGx5IG9yIGBudWxsYCBvdGhlcndpc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWxsb2NhdGluZyB0aGUgbG9jYWwgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBhbGxvY2F0ZURldnRvb2xzUG9ydCAoYWRiLCBzb2NrZXROYW1lLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCkge1xuICAvLyBzb2NrZXQgbmFtZXMgY29tZSB3aXRoICdAJywgYnV0IHRoaXMgc2hvdWxkIG5vdCBiZSBhIHBhcnQgb2YgdGhlIGFic3RyYWN0XG4gIC8vIHJlbW90ZSBwb3J0LCBzbyByZW1vdmUgaXRcbiAgY29uc3QgcmVtb3RlUG9ydCA9IHNvY2tldE5hbWUucmVwbGFjZSgvXkAvLCAnJyk7XG4gIGxldCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVlRPT0xTX1BPUlRTX1JBTkdFO1xuICBpZiAod2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGVuZFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0ICsgKGVuZFBvcnQgLSBzdGFydFBvcnQpO1xuICAgIHN0YXJ0UG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3J3YXJkaW5nIHJlbW90ZSBwb3J0ICR7cmVtb3RlUG9ydH0gdG8gYSBsb2NhbCBgICtcbiAgICBgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH1gKTtcbiAgaWYgKCF3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBZb3UgY291bGQgdXNlIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eSB0byBjdXN0b21pemUgYCArXG4gICAgICBgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgbGV0IGxvY2FsUG9ydDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgdG8gZm9yd2FyZCB0aGUgRGV2dG9vbHMgc29ja2V0IGAgK1xuICAgICAgICBgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9LiBZb3UgY291bGQgc2V0IHRoZSBzdGFydGluZyBwb3J0IG51bWJlciBgICtcbiAgICAgICAgYG1hbnVhbGx5IGJ5IHByb3ZpZGluZyB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHlgKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke2xvY2FsUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke3JlbW90ZVBvcnR9YF0pO1xuICAgIHJldHVybiBsb2NhbFBvcnQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldGFpbENvbGxlY3Rpb25PcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBzdGFydGluZyBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjayAoaWYgbm90IHRoZSBkZWZhdWx0IG9mIDkyMjIpLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgV2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZXMgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgQ2hyb21lIERlYnVnZ2VyIFByb3RvY29sIGRhdGEgY29sbGVjdGlvbi5cbiAqIE5vIGVycm9yIGlzIHRocm93biBpZiBDRFAgcmVxdWVzdCBmYWlscyAtIGluIHN1Y2ggY2FzZSBubyBkYXRhIHdpbGwgYmVcbiAqIHJlY29yZGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYHdlYnZpZXdzTWFwcGluZ2AgaXRlbS5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIFRoZSBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld1Byb3BzPn0gd2Vidmlld3NNYXBwaW5nIFRoZSBjdXJyZW50IHdlYnZpZXdzIG1hcHBpbmdcbiAqICEhISBFYWNoIGl0ZW0gb2YgdGhpcyBhcnJheSBnZXRzIG11dGF0ZWQgKGBpbmZvYC9gcGFnZXNgIHByb3BlcnRpZXMgZ2V0IGFkZGVkXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYG9wdHNgKSBpZiB0aGUgcmVxdWVzdGVkIGRldGFpbHMgaGF2ZSBiZWVuXG4gKiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGZvciBpdCAhISFcbiAqIEBwYXJhbSB7RGV0YWlsQ29sbGVjdGlvbk9wdGlvbnN9IG9wdHMgSWYgYm90aCBgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXNgIGFuZFxuICogYGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbmAgcHJvcGVydGllcyBhcmUgZmFsc3kgdGhlbiBubyBkZXRhaWxzIGNvbGxlY3Rpb25cbiAqIGlzIHBlcmZvcm1lZFxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0V2Vidmlld3NEZXRhaWxzIChhZGIsIHdlYnZpZXdzTWFwcGluZywgb3B0cyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkod2Vidmlld3NNYXBwaW5nKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IG51bGwsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gbnVsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY2hlY2tpbmcgd2hldGhlciB3ZWJ2aWV3cyBoYXZlIGFjdGl2ZSBwYWdlczsgdXNlIHRoZSBgICtcbiAgICAgIGAnZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMnIGNhcCB0byB0dXJuIHRoaXMgY2hlY2sgb25gKTtcbiAgfVxuXG4gIGlmICghZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjb2xsZWN0aW5nIHdlYiB2aWV3IGRldGFpbHMuIERldGFpbHMgY29sbGVjdGlvbiBtaWdodCBoZWxwIGAgK1xuICAgICAgYHRvIG1ha2UgQ2hyb21lZHJpdmVyIGluaXRpYWxpemF0aW9uIG1vcmUgcHJlY2lzZS4gVXNlIHRoZSAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJyBgICtcbiAgICAgIGBjYXAgdG8gdHVybiBpdCBvbmApO1xuICB9XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiAhZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ29ubmVjdCB0byBlYWNoIGRldnRvb2xzIHNvY2tldCBhbmQgcmV0cmlldmUgd2ViIHZpZXcgZGV0YWlsc1xuICBsb2dnZXIuZGVidWcoYENvbGxlY3RpbmcgQ0RQIGRhdGEgb2YgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHdlYnZpZXdzTWFwcGluZy5sZW5ndGgsIHRydWUpfWApO1xuICBjb25zdCBkZXRhaWxDb2xsZWN0b3JzID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBkZXRhaWxDb2xsZWN0b3JzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFBvcnQgPSBhd2FpdCBhbGxvY2F0ZURldnRvb2xzUG9ydChhZGIsIGl0ZW0ucHJvYywgd2Vidmlld0RldnRvb2xzUG9ydCk7XG4gICAgICAgIGlmIChlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICBpdGVtLmluZm8gPSBhd2FpdCBjZHBJbmZvKGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgICAgICAgaXRlbS5wYWdlcyA9IGF3YWl0IGNkcExpc3QobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobG9jYWxQb3J0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFkYi5yZW1vdmVQb3J0Rm9yd2FyZChsb2NhbFBvcnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChkZXRhaWxDb2xsZWN0b3JzKTtcbiAgbG9nZ2VyLmRlYnVnKGBDRFAgZGF0YSBjb2xsZWN0aW9uIGNvbXBsZXRlZGApO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcExpc3QgKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL2xpc3RgLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwSW5mbyAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vdmVyc2lvbmAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgd2VidmlldyBuYW1lIGxpa2UgV0VCVklFV180Mjk2IGFuZCB1c2UgJ2FkYiBzaGVsbCBwcycgdG8gZmlndXJlIG91dFxuICogd2hpY2ggYXBwIHBhY2thZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgd2Vidmlldy4gT25lIG9mIHRoZSByZWFzb25zIHdlXG4gKiB3YW50IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlJ3JlIGxpc3Rpbmcgd2Vidmlld3MgZm9yIHRoZSBhY3R1YWwgQVVULFxuICogbm90IHNvbWUgb3RoZXIgcnVubmluZyBhcHBcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyAtIGEgd2VidmlldyBwcm9jZXNzIG5hbWVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcCBydW5uaW5nIHRoZSB3ZWJ2aWV3XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIG5hbWVcbiAqL1xuaGVscGVycy5wcm9jRnJvbVdlYnZpZXcgPSBhc3luYyBmdW5jdGlvbiBwcm9jRnJvbVdlYnZpZXcgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgaWYgKCFwaWRNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgUElEIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICB9XG5cbiAgY29uc3QgcGlkID0gcGlkTWF0Y2hbMV07XG4gIGxvZ2dlci5kZWJ1ZyhgJHt3ZWJ2aWV3fSBtYXBwZWQgdG8gcGlkICR7cGlkfWApO1xuICBsb2dnZXIuZGVidWcoYEdldHRpbmcgcHJvY2VzcyBuYW1lIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICBjb25zdCBwa2cgPSBhd2FpdCBhZGIuZ2V0TmFtZUJ5UGlkKHBpZCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR290IHByb2Nlc3MgbmFtZTogJyR7cGtnfSdgKTtcbiAgcmV0dXJuIHBrZztcbn07XG5cbi8qKlxuICogUGFyc2Ugd2VidmlldyBuYW1lcyBmb3IgZ2V0Q29udGV4dHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIHdlYnZpZXcgbmFtZXNcbiAqL1xuaGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyA9IGZ1bmN0aW9uIHBhcnNlV2Vidmlld05hbWVzICh3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICBpc0Nocm9tZVNlc3Npb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIGlmIChpc0Nocm9tZVNlc3Npb24pIHtcbiAgICByZXR1cm4gW0NIUk9NSVVNX1dJTl07XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCB7d2VidmlldywgcGFnZXMsIHByb2MsIHdlYnZpZXdOYW1lfSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgcGFnZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFNraXBwaW5nIHRoZSB3ZWJ2aWV3ICcke3dlYnZpZXd9JyBhdCAnJHtwcm9jfScgYCArXG4gICAgICAgIGBzaW5jZSBpdCBoYXMgcmVwb3J0ZWQgaGF2aW5nIHplcm8gcGFnZXNgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAod2Vidmlld05hbWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHdlYnZpZXdOYW1lKTtcbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3JywgcmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFdlYnZpZXdzT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFuZHJvaWREZXZpY2VTb2NrZXQgW251bGxdIC0gZGV2aWNlIHNvY2tldCBuYW1lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFt0cnVlXSAtIHdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2UgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFs5MjIyXSAtIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gW3RydWVdIC0gd2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3Blcnkgez9zdHJpbmd9IHdlYnZpZXdOYW1lIEFuIGFjdHVhbCB3ZWJ2aWV3IG5hbWUgZm9yIHN3aXRjaGluZyBjb250ZXh0XG4gKi9cblxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cyBtYXBwaW5nIGJ5IGludHJvc3BlY3RpbmcgcHJvY2Vzc2VzIHdpdGggYWRiLFxuICogd2hlcmUgd2Vidmlld3MgYXJlIGxpc3RlZC4gSXQncyBwb3NzaWJsZSB0byBwYXNzIGluIGEgJ2RldmljZVNvY2tldCcgYXJnLCB3aGljaFxuICogbGltaXRzIHRoZSB3ZWJ2aWV3IHBvc3NpYmlsaXRpZXMgdG8gdGhlIG9uZSBydW5uaW5nIG9uIHRoZSBDaHJvbWl1bSBkZXZ0b29sc1xuICogc29ja2V0IHdlJ3JlIGludGVyZXN0ZWQgaW4gKHNlZSBub3RlIG9uIHdlYnZpZXdzRnJvbVByb2NzKS4gV2UgY2FuIGFsc29cbiAqIGRpcmVjdCB0aGlzIG1ldGhvZCB0byB2ZXJpZnkgd2hldGhlciBhIHBhcnRpY3VsYXIgd2VidmlldyBwcm9jZXNzIGFjdHVhbGx5XG4gKiBoYXMgYW55IHBhZ2VzIChpZiBhIHByb2Nlc3MgZXhpc3RzIGJ1dCBubyBwYWdlcyBhcmUgZm91bmQsIENocm9tZWRyaXZlciB3aWxsXG4gKiBub3QgYWN0dWFsbHkgYmUgYWJsZSB0byBjb25uZWN0IHRvIGl0LCBzbyB0aGlzIHNlcnZlcyBhcyBhIGd1YXJkIGZvciB0aGF0XG4gKiBzdHJhbmdlIGZhaWx1cmUgbW9kZSkuIFRoZSBzdHJhdGVneSBmb3IgY2hlY2tpbmcgd2hldGhlciBhbnkgcGFnZXMgYXJlXG4gKiBhY3RpdmUgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBkZWJ1ZyBzZXJ2ZXIgb24gdGhlIGRldmljZSxcbiAqIGhlbmNlIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lIHdoaWNoXG4gKiBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmhlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2ViVmlld3NNYXBwaW5nIChhZGIsIHtcbiAgYW5kcm9pZERldmljZVNvY2tldCA9IG51bGwsXG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IHRydWVcbn0gPSB7fSkge1xuICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cycpO1xuICBjb25zdCB3ZWJ2aWV3c01hcHBpbmcgPSBhd2FpdCB3ZWJ2aWV3c0Zyb21Qcm9jcyhhZGIsIGFuZHJvaWREZXZpY2VTb2NrZXQpO1xuXG4gIGF3YWl0IGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24sXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB3ZWJ2aWV3TWFwcGluZyBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBjb25zdCB7d2VidmlldywgaW5mb30gPSB3ZWJ2aWV3TWFwcGluZztcbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IG51bGw7XG5cbiAgICBsZXQgd3ZOYW1lID0gd2VidmlldztcbiAgICBsZXQgcHJvY2VzcyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFuZHJvaWREZXZpY2VTb2NrZXQpIHtcbiAgICAgIGNvbnN0IHBrZ01hdGNoID0gV0VCVklFV19QS0dfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViIHZpZXcgbmFtZSBjb3VsZCBlaXRoZXIgYmUgc3VmZml4ZWQgd2l0aCBQSUQgb3IgdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAvLyBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgICAgICAgY29uc3QgcGtnID0gcGtnTWF0Y2ggPyBwa2dNYXRjaFsxXSA6IGF3YWl0IGhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3KGFkYiwgd2Vidmlldyk7XG4gICAgICAgIHd2TmFtZSA9IGAke1dFQlZJRVdfQkFTRX0ke3BrZ31gO1xuICAgICAgICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgICAgcHJvY2VzcyA9IHtcbiAgICAgICAgICBuYW1lOiBwa2csXG4gICAgICAgICAgaWQ6IHBpZE1hdGNoID8gcGlkTWF0Y2hbMV0gOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IHd2TmFtZTtcbiAgICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHd2TmFtZSk7XG4gICAgaWYgKGluZm8gfHwgcHJvY2Vzcykge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5zZXQoa2V5LCB7IGluZm8sIHByb2Nlc3MgfSk7XG4gICAgfSBlbHNlIGlmIChXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmhhcyhrZXkpKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3NNYXBwaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9jZXNzSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgVGhlIHByb2Nlc3MgbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZCBUaGUgcHJvY2VzcyBpZCAoaWYgY291bGQgYmUgcmV0cmlldmVkKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2ViVmlld0RldGFpbHNcbiAqIEBwcm9wZXJ0eSB7P1Byb2Nlc3NJbmZvfSBwcm9jZXNzIC0gV2ViIHZpZXcgcHJvY2VzcyBkZXRhaWxzXG4gKiBAcHJvcGVydHkge09iamVjdH0gaW5mbyAtIFdlYiB2aWV3IGRldGFpbHMgYXMgcmV0dXJuZWQgYnkgL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnQsIGZvciBleGFtcGxlOlxuICoge1xuICogIFwiQnJvd3NlclwiOiBcIkNocm9tZS83Mi4wLjM2MDEuMFwiLFxuICogIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuM1wiLFxuICogIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzEzXzYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83Mi4wLjM2MDEuMCBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgXCJWOC1WZXJzaW9uXCI6IFwiNy4yLjIzM1wiLFxuICogIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEBjZmVkZTlkYjFkMTU0ZGUwNDY4Y2IwNTM4NDc5ZjM0YzA3NTVhMGY0KVwiLFxuICogIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovL2xvY2FsaG9zdDo5MjIyL2RldnRvb2xzL2Jyb3dzZXIvYjBiOGE0ZmItYmIxNy00MzU5LTk1MzMtYThkOWYzOTA4YmQ4XCJcbiAqIH1cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB3ZWIgdmlldyBkZXRhaWxzIHByZXZpb3VzbHkgY2FjaGVkIGJ5IGBnZXRXZWJ2aWV3c2AgY2FsbFxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyBUaGUgbmFtZSBvZiB0aGUgd2ViIHZpZXdcbiAqIEByZXR1cm5zIHs/V2ViVmlld0RldGFpbHN9IEVpdGhlciBgdW5kZWZpbmVkYCBvciB0aGUgcmVjZW50IHdlYiB2aWV3IGRldGFpbHNcbiAqL1xuaGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyA9IGZ1bmN0aW9uIGdldFdlYnZpZXdEZXRhaWxzIChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3ZWJ2aWV3KTtcbiAgcmV0dXJuIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZ2V0KGtleSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBDaHJvbWUgZHJpdmVyIGNhcGFiaWxpdGllcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIEFwcGl1bSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBVc2VyLXByb3ZpZGVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZpY2VJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgQW5kcm9pZCBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHBhcmFtIHs/V2ViVmlld0RldGFpbHN9IHdlYlZpZXdEZXRhaWxzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgY2FwYWJpbGl0aWVzIG9iamVjdC5cbiAqIFNlZSBodHRwczovL2Nocm9tZWRyaXZlci5jaHJvbWl1bS5vcmcvY2FwYWJpbGl0aWVzIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmhlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyA9IGZ1bmN0aW9uIGNyZWF0ZUNocm9tZWRyaXZlckNhcHMgKG9wdHMsIGRldmljZUlkLCB3ZWJWaWV3RGV0YWlscykge1xuICBjb25zdCBjYXBzID0geyBjaHJvbWVPcHRpb25zOiB7fSB9O1xuXG4gIGNvbnN0IGFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVPcHRpb25zPy5hbmRyb2lkUGFja2FnZVxuICAgIHx8IG9wdHMuYXBwUGFja2FnZVxuICAgIHx8IHdlYlZpZXdEZXRhaWxzPy5pbmZvPy5bJ0FuZHJvaWQtUGFja2FnZSddO1xuICBpZiAoYW5kcm9pZFBhY2thZ2UpIHtcbiAgICAvLyBjaHJvbWVkcml2ZXIgcmFpc2VzIGFuIGludmFsaWQgYXJndW1lbnQgZXJyb3Igd2hlbiBhbmRyb2lkUGFja2FnZSBpcyAnbnVsbCdcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwKSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkVXNlUnVubmluZ0FwcCA9IG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcDtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5KSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gb3B0cy5jaHJvbWVBbmRyb2lkUHJvY2VzcztcbiAgfSBlbHNlIGlmICh3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8ubmFtZSAmJiB3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8uaWQpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSB3ZWJWaWV3RGV0YWlscy5wcm9jZXNzLm5hbWU7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihvcHRzLmJyb3dzZXJOYW1lKSA9PT0gJ2Nocm9taXVtLXdlYnZpZXcnKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMucGFnZUxvYWRTdHJhdGVneSkge1xuICAgIGNhcHMucGFnZUxvYWRTdHJhdGVneSA9IG9wdHMucGFnZUxvYWRTdHJhdGVneTtcbiAgfVxuICBjb25zdCBpc0Nocm9tZSA9IF8udG9Mb3dlcihjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpID09PSAnY2hyb21lJztcbiAgaWYgKF8uaW5jbHVkZXMoS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMsIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgfHwgaXNDaHJvbWUpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGV4dHJhY3RlZCBwYWNrYWdlIGZyb20gY29udGV4dCBuYW1lLCBpdCBjb3VsZCBjb21lIGluIGFzIGJhcmVcbiAgICAvLyBcImNocm9tZVwiLCBhbmQgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgZGV0YWlscyBhcmUgY29ycmVjdCwgaW5jbHVkaW5nXG4gICAgLy8gbm90IHVzaW5nIGFuIGFjdGl2aXR5IG9yIHByb2Nlc3MgaWRcbiAgICBpZiAoaXNDaHJvbWUpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IENIUk9NRV9QQUNLQUdFX05BTUU7XG4gICAgfVxuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5O1xuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3M7XG4gIH1cbiAgLy8gYWRkIGRldmljZSBpZCBmcm9tIGFkYlxuICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZERldmljZVNlcmlhbCA9IGRldmljZUlkO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3Qob3B0cy5sb2dnaW5nUHJlZnMpIHx8IF8uaXNQbGFpbk9iamVjdChvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcykpIHtcbiAgICBpZiAob3B0cy5sb2dnaW5nUHJlZnMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBUaGUgJ2xvZ2dpbmdQcmVmcycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgJ2Nocm9tZUxvZ2dpbmdQcmVmcycgY2FwIGluc3RlYWRgKTtcbiAgICB9XG4gICAgY2Fwcy5sb2dnaW5nUHJlZnMgPSBvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcyB8fCBvcHRzLmxvZ2dpbmdQcmVmcztcbiAgfVxuICBpZiAob3B0cy5lbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcpIHtcbiAgICBsb2dnZXIud2FybihgVGhlICdlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcnIGNhcCBpcyBkZXByZWNhdGVkOyBzaW1wbHkgdXNlIGAgK1xuICAgICAgYHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZCwgd2l0aCBhICdwZXJmb3JtYW5jZScga2V5IHNldCB0byAnQUxMJ2ApO1xuICAgIGNvbnN0IG5ld1ByZWYgPSB7cGVyZm9ybWFuY2U6ICdBTEwnfTtcbiAgICAvLyBkb24ndCBvdmVyd3JpdGUgb3RoZXIgbG9nZ2luZyBwcmVmcyB0aGF0IGhhdmUgYmVlbiBzZW50IGluIGlmIHRoZXkgZXhpc3RcbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IGNhcHMubG9nZ2luZ1ByZWZzXG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGNhcHMubG9nZ2luZ1ByZWZzLCBuZXdQcmVmKVxuICAgICAgOiBuZXdQcmVmO1xuICB9XG5cbiAgaWYgKG9wdHMuY2hyb21lT3B0aW9ucz8uQXJndW1lbnRzKSB7XG4gICAgLy8gbWVyZ2UgYEFyZ3VtZW50c2AgYW5kIGBhcmdzYFxuICAgIG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzID0gWy4uLihvcHRzLmNocm9tZU9wdGlvbnMuYXJncyB8fCBbXSksIC4uLm9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHNdO1xuICAgIGRlbGV0ZSBvcHRzLmNocm9tZU9wdGlvbnMuQXJndW1lbnRzO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQcmVjYWxjdWxhdGVkIENocm9tZWRyaXZlciBjYXBhYmlsaXRpZXM6ICcgK1xuICAgIEpTT04uc3RyaW5naWZ5KGNhcHMuY2hyb21lT3B0aW9ucywgbnVsbCwgMikpO1xuXG4gIGNvbnN0IHByb3RlY3RlZENhcE5hbWVzID0gW107XG4gIGZvciAoY29uc3QgW29wdCwgdmFsXSBvZiBfLnRvUGFpcnMob3B0cy5jaHJvbWVPcHRpb25zKSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKGNhcHMuY2hyb21lT3B0aW9uc1tvcHRdKSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3RlY3RlZENhcE5hbWVzLnB1c2gob3B0KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkocHJvdGVjdGVkQ2FwTmFtZXMpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1RoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiAnICtcbiAgICAgICdieSB0aGUgcHJvdmlkZWQgY2hyb21lT3B0aW9uczonKTtcbiAgICBmb3IgKGNvbnN0IG9wdE5hbWUgb2YgcHJvdGVjdGVkQ2FwTmFtZXMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAgICR7b3B0TmFtZX0gKCR7SlNPTi5zdHJpbmdpZnkob3B0cy5jaHJvbWVPcHRpb25zW29wdE5hbWVdKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBoZWxwZXJzO1xuZXhwb3J0IHsgaGVscGVycywgTkFUSVZFX1dJTiwgV0VCVklFV19XSU4sIFdFQlZJRVdfQkFTRSwgQ0hST01JVU1fV0lOLCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLEtBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLEdBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLE1BQU1TLFVBQVUsR0FBRyxZQUFZO0FBQUNDLE9BQUEsQ0FBQUQsVUFBQSxHQUFBQSxVQUFBO0FBQ2hDLE1BQU1FLFdBQVcsR0FBRyxTQUFTO0FBQUNELE9BQUEsQ0FBQUMsV0FBQSxHQUFBQSxXQUFBO0FBQzlCLE1BQU1DLFlBQVksR0FBRyxVQUFVO0FBQUNGLE9BQUEsQ0FBQUUsWUFBQSxHQUFBQSxZQUFBO0FBQ2hDLE1BQU1DLFlBQVksR0FBSSxHQUFFRixXQUFZLEdBQUU7QUFBQ0QsT0FBQSxDQUFBRyxZQUFBLEdBQUFBLFlBQUE7QUFDdkMsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSUMsTUFBTSxDQUFFLElBQUdGLFlBQWEsUUFBTyxDQUFDO0FBQ2hFLE1BQU1HLG1CQUFtQixHQUFHLElBQUlELE1BQU0sQ0FBRSxJQUFHRixZQUFhLG9CQUFtQixDQUFDO0FBQzVFLE1BQU1JLHVCQUF1QixHQUFHLG1DQUFtQztBQUNuRSxNQUFN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