appium-xcuitest-driver 4.16.11 → 4.16.12

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [4.16.12](https://github.com/appium/appium-xcuitest-driver/compare/v4.16.11...v4.16.12) (2023-02-06)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Update NOTCHED_DEVICE_SIZES for nativeWebTapStrict (part of [#1490](https://github.com/appium/appium-xcuitest-driver/issues/1490)) ([#1497](https://github.com/appium/appium-xcuitest-driver/issues/1497)) ([e2bbd94](https://github.com/appium/appium-xcuitest-driver/commit/e2bbd94e27d402776de235ff53abd714b7ae6ef0))
7
+
1
8
  ## [4.16.11](https://github.com/appium/appium-xcuitest-driver/compare/v4.16.10...v4.16.11) (2023-02-05)
2
9
 
3
10
 
package/README.md CHANGED
@@ -49,3 +49,5 @@ the tests locally. These include:
49
49
  the root directory of the repo with the extension "xcconfig")
50
50
  * `UICATALOG_REAL_DEVICE` - path to the real device build of UICatalog, in case
51
51
  the npm installed one is not built for real device
52
+
53
+
@@ -32,6 +32,21 @@ const NOTCHED_DEVICE_SIZES = [{
32
32
  }, {
33
33
  w: 1242,
34
34
  h: 2688
35
+ }, {
36
+ w: 1080,
37
+ h: 2340
38
+ }, {
39
+ w: 1170,
40
+ h: 2532
41
+ }, {
42
+ w: 1284,
43
+ h: 2778
44
+ }, {
45
+ w: 1179,
46
+ h: 2556
47
+ }, {
48
+ w: 1290,
49
+ h: 2796
35
50
  }];
36
51
  const {
37
52
  W3C_WEB_ELEMENT_IDENTIFIER
@@ -594,4 +609,4 @@ commands.mobileUpdateSafariPreferences = async function mobileUpdateSafariPrefer
594
609
  Object.assign(commands, extensions, helpers);
595
610
  var _default = commands;
596
611
  exports.default = _default;
597
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJUEhPTkVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQiLCJJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TIiwiSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xMyIsIklQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQiLCJUQUJfQkFSX09GRlNFVCIsIklQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQiLCJJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCIsIk5PVENIRURfREVWSUNFX1NJWkVTIiwidyIsImgiLCJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsInV0aWwiLCJBVE9NX1dBSVRfVElNRU9VVF9NUyIsIkFUT01fSU5JVElBTF9XQUlUX01TIiwiT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQiLCJWSVNJQkxFIiwiSU5WSVNJQkxFIiwiREVURUNUIiwiVklTSUJJTElUSUVTIiwiVEFCX0JBUl9QT1NJVElPTl9UT1AiLCJUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSIsIlRBQl9CQVJfUE9TU0lUSU9OUyIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIiLCJpZCIsIl8iLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNFbXB0eSIsImlzTmFOIiwic2V0RnJhbWUiLCJmcmFtZSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJpc051bGwiLCJjdXJXZWJGcmFtZXMiLCJsb2ciLCJkZWJ1ZyIsImhhc0VsZW1lbnRJZCIsImF0b21zRWxlbWVudCIsImdldEF0b21zRWxlbWVudCIsInZhbHVlIiwiZXhlY3V0ZUF0b20iLCJXSU5ET1ciLCJ1bnNoaWZ0IiwiYXRvbSIsImlzVW5kZWZpbmVkIiwiTm9TdWNoRnJhbWVFcnJvciIsImdldENzc1Byb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiZWwiLCJzdWJtaXQiLCJyZWZyZXNoIiwiZ2V0VXJsIiwicmVtb3RlIiwiZXhlY3V0ZSIsInRpdGxlIiwiZ2V0Q29va2llcyIsInNjcmlwdCIsImpzQ29va2llcyIsImNvb2tpZXMiLCJuYW1lIiwidG9QYWlycyIsImNvb2tpZVV0aWxzIiwiY3JlYXRlSldQQ29va2llIiwidW5kZWZpbmVkIiwicHVzaCIsImVyciIsImVycm9yIiwiVW5rbm93bkVycm9yIiwic2V0Q29va2llIiwiY29va2llIiwiY2xvbmUiLCJwYXRoIiwianNDb29raWUiLCJjcmVhdGVKU0Nvb2tpZSIsImV4cGlyZXMiLCJleHBpcnkiLCJEYXRlIiwidG9VVENTdHJpbmciLCJkb21haW4iLCJodHRwT25seSIsInNlY3VyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkZWxldGVDb29raWUiLCJjb29raWVOYW1lIiwiaW5kZXhPZiIsIm1hcCIsIl9kZWxldGVDb29raWUiLCJkZWxldGVDb29raWVzIiwibGVuZ3RoIiwid2ViQ29va2llIiwiZXhwaXJlQ29va2llIiwiY2FjaGVXZWJFbGVtZW50IiwiaXNQbGFpbk9iamVjdCIsImVsSWQiLCJ1bndyYXBFbGVtZW50IiwiY2FjaGVJZCIsImluY2x1ZGVzIiwidXVpZFY0Iiwid2ViRWxlbWVudHNDYWNoZSIsInNldCIsIndyYXBFbGVtZW50IiwiY2FjaGVXZWJFbGVtZW50cyIsInJlc3BvbnNlIiwidG9DYWNoZWQiLCJ2IiwiaXNBcnJheSIsInJlc3VsdCIsInJlZHVjZSIsImFjYyIsImtleSIsImZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYW55IiwiY3R4IiwiY29udGV4dEVsZW1lbnQiLCJpc05pbCIsImVsZW1lbnQiLCJkb0ZpbmQiLCJpbXBsaWNpdFdhaXRGb3JDb25kaXRpb24iLCJtZXNzYWdlIiwiaXNGdW5jdGlvbiIsIm1hdGNoIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiY2xpY2tXZWJDb29yZHMiLCJjb29yZHMiLCJ0cmFuc2xhdGVXZWJDb29yZHMiLCJjdXJXZWJDb29yZHMiLCJjbGlja0Nvb3JkcyIsImFyZ3MiLCJhbHdheXNEZWZhdWx0RnJhbWUiLCJmcmFtZXMiLCJwcm9taXNlIiwid2FpdEZvckF0b20iLCJleGVjdXRlQXRvbUFzeW5jIiwicmVzcG9uc2VVcmwiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsImFzeW5jUHJvbWlzZSIsImVsT3JJZCIsImhhcyIsIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yIiwiRUxFTUVOVCIsImdldCIsImNvbnZlcnRFbGVtZW50c0ZvckF0b21zIiwiYXJnIiwiaXNFcnJvclR5cGUiLCJnZXRFbGVtZW50SWQiLCJoYXNWYWx1ZSIsImdldFNhZmFyaUlzSXBob25lIiwiaXNCb29sZWFuIiwiX2lzU2FmYXJpSXBob25lIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJ3YXJuIiwiZ2V0U2FmYXJpRGV2aWNlU2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwibm9ybUhlaWdodCIsIm5vcm1XaWR0aCIsImdldFNhZmFyaUlzTm90Y2hlZCIsIl9pc1NhZmFyaU5vdGNoZWQiLCJkZXZpY2UiLCJnZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCIsInd2UG9zIiwicmVhbERpbXMiLCJ0b3BPZmZzZXQiLCJib3R0b21PZmZzZXQiLCJpc0lwaG9uZSIsIm5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkiLCJuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHkiLCJzYWZhcmlUYWJCYXJQb3NpdGlvbiIsImNvbXBhcmVWZXJzaW9ucyIsIm9wdHMiLCJwbGF0Zm9ybVZlcnNpb24iLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwidGFiQmFyVmlzaWJpbGl0eSIsImxvd2VyQ2FzZSIsImJhbm5lclZpc2liaWxpdHkiLCJ0YWJCYXJQb3NpdGlvbiIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiaXNOb3RjaGVkIiwib3JpZW50YXRpb24iLCJub3RjaE9mZnNldCIsImlzU2Nyb2xsZWQiLCJjb250ZXh0c0FuZFZpZXdzIiwiZ2V0Q29udGV4dHNBbmRWaWV3cyIsInRhYnMiLCJmaWx0ZXIiLCJzdGFydHNXaXRoIiwiZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQiLCJ5Iiwib2Zmc2V0IiwiYmFubmVycyIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsInRhcFdlYkVsZW1lbnROYXRpdmVseSIsImRyaXZlciIsInRleHQiLCJlbHMiLCJyZWN0IiwicHJveHlDb21tYW5kIiwiZWwyIiwicmVjdDIiLCJ4IiwiTWF0aCIsInJvdW5kIiwibmF0aXZlV2ViVGFwIiwibmF0aXZlV2ViVGFwU3RyaWN0IiwiUHJvbWlzZSIsImFsbCIsInNpemUiLCJjb29yZGluYXRlcyIsInBlcmZvcm1Ub3VjaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJ3ZWJ2aWV3IiwicmV0cnlJbnRlcnZhbCIsImlnbiIsIkVycm9yIiwiY21kIiwid3ZEaW1zIiwiaW1wbGljaXRXYWl0TXMiLCJzZXRJbXBsaWNpdFdhaXQiLCJ4UmF0aW8iLCJ5UmF0aW8iLCJuZXdDb29yZHMiLCJjaGVja0ZvckFsZXJ0IiwiZ2V0QWxlcnRUZXh0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwidGltZWRBdG9tUHJvbWlzZSIsInRpbWVvdXQiLCJoYW5kbGVQcm9taXNlRXJyb3IiLCJwIiwib3JpZ2luYWxFcnJvciIsIkFnZ3JlZ2F0ZUVycm9yIiwiVGltZW91dEVycm9yIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJhbnkiLCJkZWxheSIsImlzRnVsZmlsbGVkIiwiX3dhaXRpbmdBdG9tcyIsImNvdW50IiwiYWxlcnROb3RpZmllciIsIkV2ZW50RW1pdHRlciIsImFsZXJ0TW9uaXRvciIsIm9uQWxlcnRDYWxsYmFjayIsImlzUmVzb2x2ZWQiLCJlbWl0IiwiVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIiwib25jZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZUxpc3RlbmVyIiwibW9iaWxlV2ViTmF2IiwibmF2VHlwZSIsImFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQiLCJtb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcyIsImlzU2ltdWxhdG9yIiwicHJlZmVyZW5jZXMiLCJ1cGRhdGVTYWZhcmlTZXR0aW5ncyIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy93ZWIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwsIHRpbWluZyB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvcnMsIGlzRXJyb3JUeXBlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgY29va2llVXRpbHMgZnJvbSAnLi4vY29va2llcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuXG5jb25zdCBJUEhPTkVfVE9QX0JBUl9IRUlHSFQgPSA3MTtcbmNvbnN0IElQSE9ORV9TQ1JPTExFRF9UT1BfQkFSX0hFSUdIVCA9IDQxO1xuY29uc3QgSVBIT05FX1hfU0NST0xMRURfT0ZGU0VUID0gNTU7XG5jb25zdCBJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TID0gMjQ7XG5jb25zdCBJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TXzEzID0gMjA7XG5cbmNvbnN0IElQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQgPSA1MTtcbmNvbnN0IElQSE9ORV9CT1RUT01fQkFSX09GRlNFVCA9IDQ5O1xuY29uc3QgVEFCX0JBUl9PRkZTRVQgPSAzMztcbmNvbnN0IElQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQgPSA4NDtcbmNvbnN0IElQQURfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUID0gOTU7XG5cbmNvbnN0IE5PVENIRURfREVWSUNFX1NJWkVTID0gW1xuICB7dzogMTEyNSwgaDogMjQzNn0sIC8vIDExIFBybywgWCwgWHNcbiAge3c6IDgyOCwgaDogMTc5Mn0sIC8vIDExLCBYclxuICB7dzogMTI0MiwgaDogMjY4OH0sIC8vIDExIFBybyBNYXgsIFhzIE1heFxuXTtcblxuY29uc3QgeyBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiB9ID0gdXRpbDtcblxuY29uc3QgQVRPTV9XQUlUX1RJTUVPVVRfTVMgPSAyICogNjAwMDA7XG5jb25zdCBBVE9NX0lOSVRJQUxfV0FJVF9NUyA9IDEwMDA7XG5cbmNvbnN0IE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5UID0gJ2FsZXJ0JztcblxuY29uc3QgVklTSUJMRSA9ICd2aXNpYmxlJztcbmNvbnN0IElOVklTSUJMRSA9ICdpbnZpc2libGUnO1xuY29uc3QgREVURUNUID0gJ2RldGVjdCc7XG5jb25zdCBWSVNJQklMSVRJRVMgPSBbVklTSUJMRSwgSU5WSVNJQkxFLCBERVRFQ1RdO1xuXG4vLyBUaGUgcG9zaXRpb24gb2YgU2FmYXJpJ3MgdGFiIChzZWFyY2ggYmFyKS5cbi8vIFNpbmNlIGlPUyAxNSwgdGhlIGJhciBpcyB0aGUgYm90dG9tIGJ5IGRlZmF1bHQuXG5jb25zdCBUQUJfQkFSX1BPU0lUSU9OX1RPUCA9ICd0b3AnO1xuY29uc3QgVEFCX0JBUl9QT1NJVElPTl9CT1RUT00gPSAnYm90dG9tJztcbmNvbnN0IFRBQl9CQVJfUE9TU0lUSU9OUyA9IFtUQUJfQkFSX1BPU0lUSU9OX1RPUCwgVEFCX0JBUl9QT1NJVElPTl9CT1RUT01dO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRJZGVudGlmaWVyIChpZCkge1xuICBpZiAoIV8uaXNTdHJpbmcoaWQpICYmICFfLmlzTnVtYmVyKGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXy5pc1N0cmluZyhpZCkgJiYgXy5pc0VtcHR5KGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXy5pc051bWJlcihpZCkgJiYgaXNOYU4oaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb21tYW5kcy5zZXRGcmFtZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEZyYW1lIChmcmFtZSkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGlmIChfLmlzTnVsbChmcmFtZSkpIHtcbiAgICB0aGlzLmN1cldlYkZyYW1lcyA9IFtdO1xuICAgIHRoaXMubG9nLmRlYnVnKCdMZWF2aW5nIHdlYiBmcmFtZSBhbmQgZ29pbmcgYmFjayB0byBkZWZhdWx0IGNvbnRlbnQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGVscGVycy5oYXNFbGVtZW50SWQoZnJhbWUpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZnJhbWUpO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X2ZyYW1lX3dpbmRvdycsIFthdG9tc0VsZW1lbnRdKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRW50ZXJpbmcgbmV3IHdlYiBmcmFtZTogJyR7dmFsdWUuV0lORE9XfSdgKTtcbiAgICB0aGlzLmN1cldlYkZyYW1lcy51bnNoaWZ0KHZhbHVlLldJTkRPVyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXRvbSA9IF8uaXNOdW1iZXIoZnJhbWUpID8gJ2ZyYW1lX2J5X2luZGV4JyA6ICdmcmFtZV9ieV9pZF9vcl9uYW1lJztcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oYXRvbSwgW2ZyYW1lXSk7XG4gICAgaWYgKF8uaXNOdWxsKHZhbHVlKSB8fCBfLmlzVW5kZWZpbmVkKHZhbHVlLldJTkRPVykpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRnJhbWVFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRW50ZXJpbmcgbmV3IHdlYiBmcmFtZTogJyR7dmFsdWUuV0lORE9XfSdgKTtcbiAgICB0aGlzLmN1cldlYkZyYW1lcy51bnNoaWZ0KHZhbHVlLldJTkRPVyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldENzc1Byb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3NzUHJvcGVydHkgKHByb3BlcnR5TmFtZSwgZWwpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdmFsdWVfb2ZfY3NzX3Byb3BlcnR5JywgW2F0b21zRWxlbWVudCwgcHJvcGVydHlOYW1lXSk7XG59O1xuXG5jb21tYW5kcy5zdWJtaXQgPSBhc3luYyBmdW5jdGlvbiBzdWJtaXQgKGVsKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdzdWJtaXQnLCBbYXRvbXNFbGVtZW50XSk7XG59O1xuXG5jb21tYW5kcy5yZWZyZXNoID0gYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgncmVmcmVzaCcsIFtdKTtcbn07XG5cbmNvbW1hbmRzLmdldFVybCA9IGFzeW5jIGZ1bmN0aW9uIGdldFVybCAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMucmVtb3RlLmV4ZWN1dGUoJ3dpbmRvdy5sb2NhdGlvbi5ocmVmJyk7XG59O1xuXG5jb21tYW5kcy50aXRsZSA9IGFzeW5jIGZ1bmN0aW9uIHRpdGxlICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgndGl0bGUnLCBbXSwgdHJ1ZSk7XG59O1xuXG5jb21tYW5kcy5nZXRDb29raWVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q29va2llcyAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgdGhpcy5sb2cuZGVidWcoJ1JldHJpZXZpbmcgYWxsIGNvb2tpZXMnKTtcblxuICBsZXQgc2NyaXB0ID0gJ3JldHVybiBkb2N1bWVudC5jb29raWUnO1xuICBsZXQganNDb29raWVzID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbXV0pO1xuXG4gIGxldCBjb29raWVzID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY29va2llVXRpbHMuY3JlYXRlSldQQ29va2llKHVuZGVmaW5lZCwganNDb29raWVzKSkpIHtcbiAgICAgIGNvb2tpZXMucHVzaCh7bmFtZSwgdmFsdWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvb2tpZXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMubG9nLmVycm9yKGVycik7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIHBhcnNpbmcgY29va2llcyBmcm9tIHJlc3VsdDogJyR7anNDb29raWVzfSdgKTtcbiAgfVxufTtcblxuY29tbWFuZHMuc2V0Q29va2llID0gYXN5bmMgZnVuY3Rpb24gc2V0Q29va2llIChjb29raWUpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBjb29raWUgPSBfLmNsb25lKGNvb2tpZSk7XG5cbiAgLy8gaWYgYHBhdGhgIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQsIFNhZmFyaSB3aWxsIG5vdCB1cGRhdGUgY29va2llcyBhcyBleHBlY3RlZDsgZWcgaXNzdWUgIzE3MDhcbiAgaWYgKCFjb29raWUucGF0aCkge1xuICAgIGNvb2tpZS5wYXRoID0gJy8nO1xuICB9XG5cbiAgY29uc3QganNDb29raWUgPSBjb29raWVVdGlscy5jcmVhdGVKU0Nvb2tpZShjb29raWUubmFtZSwgY29va2llLnZhbHVlLCB7XG4gICAgZXhwaXJlczogXy5pc051bWJlcihjb29raWUuZXhwaXJ5KSA/IChuZXcgRGF0ZShjb29raWUuZXhwaXJ5ICogMTAwMCkpLnRvVVRDU3RyaW5nKCkgOlxuICAgICAgY29va2llLmV4cGlyeSxcbiAgICBwYXRoOiBjb29raWUucGF0aCxcbiAgICBkb21haW46IGNvb2tpZS5kb21haW4sXG4gICAgaHR0cE9ubHk6IGNvb2tpZS5odHRwT25seSxcbiAgICBzZWN1cmU6IGNvb2tpZS5zZWN1cmVcbiAgfSk7XG4gIGxldCBzY3JpcHQgPSBgZG9jdW1lbnQuY29va2llID0gJHtKU09OLnN0cmluZ2lmeShqc0Nvb2tpZSl9YDtcbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbXV0pO1xufTtcblxuY29tbWFuZHMuZGVsZXRlQ29va2llID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ29va2llIChjb29raWVOYW1lKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgLy8gY2hlY2sgY29va2llIGV4aXN0ZW5jZVxuICBsZXQgY29va2llcyA9IGF3YWl0IHRoaXMuZ2V0Q29va2llcygpO1xuICBpZiAoXy5pbmRleE9mKF8ubWFwKGNvb2tpZXMsICduYW1lJyksIGNvb2tpZU5hbWUpID09PSAtMSkge1xuICAgIHRoaXMubG9nLmRlYnVnKGBDb29raWUgJyR7Y29va2llTmFtZX0nIG5vdCBmb3VuZC4gSWdub3JpbmcuYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5fZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpO1xufTtcblxuY29tbWFuZHMuZGVsZXRlQ29va2llcyA9IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUNvb2tpZXMgKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGxldCBjb29raWVzID0gYXdhaXQgdGhpcy5nZXRDb29raWVzKCk7XG4gIGlmIChjb29raWVzLmxlbmd0aCkge1xuICAgIGZvciAobGV0IGNvb2tpZSBvZiBjb29raWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9kZWxldGVDb29raWUoY29va2llLm5hbWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmhlbHBlcnMuX2RlbGV0ZUNvb2tpZSA9IGFzeW5jIGZ1bmN0aW9uIF9kZWxldGVDb29raWUgKGNvb2tpZU5hbWUpIHtcbiAgdGhpcy5sb2cuZGVidWcoYERlbGV0aW5nIGNvb2tpZSAnJHtjb29raWVOYW1lfSdgKTtcbiAgbGV0IHdlYkNvb2tpZSA9IGNvb2tpZVV0aWxzLmV4cGlyZUNvb2tpZShjb29raWVOYW1lLCB7cGF0aDogJy8nfSk7XG4gIGxldCBzY3JpcHQgPSBgZG9jdW1lbnQuY29va2llID0gJHtKU09OLnN0cmluZ2lmeSh3ZWJDb29raWUpfWA7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW3NjcmlwdCwgW11dKTtcbn07XG5cbmhlbHBlcnMuY2FjaGVXZWJFbGVtZW50ID0gZnVuY3Rpb24gY2FjaGVXZWJFbGVtZW50IChlbCkge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChlbCkpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cbiAgY29uc3QgZWxJZCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghaXNWYWxpZEVsZW1lbnRJZGVudGlmaWVyKGVsSWQpKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG4gIC8vIEluIG5ld2VyIGRlYnVnZ2VyIHJlbGVhc2VzIGVsZW1lbnQgaWRlbnRpZmllcnMgbG9vayBsaWtlIGA6d2RjOjE2MjgxNTE2NDkzMjVgXG4gIC8vIFdlIGFzc3VtZSBpdCBpcyBzYWZlIHRvIHVzZSB0aGVzZSB0byBpZGVudGlmeSBjYWNoZWQgZWxlbWVudHNcbiAgY29uc3QgY2FjaGVJZCA9IF8uaW5jbHVkZXMoZWxJZCwgJzonKSA/IGVsSWQgOiB1dGlsLnV1aWRWNCgpO1xuICB0aGlzLndlYkVsZW1lbnRzQ2FjaGUuc2V0KGNhY2hlSWQsIGVsSWQpO1xuICByZXR1cm4gdXRpbC53cmFwRWxlbWVudChjYWNoZUlkKTtcbn07XG5cbmhlbHBlcnMuY2FjaGVXZWJFbGVtZW50cyA9IGZ1bmN0aW9uIGNhY2hlV2ViRWxlbWVudHMgKHJlc3BvbnNlKSB7XG4gIGNvbnN0IHRvQ2FjaGVkID0gKHYpID0+IF8uaXNBcnJheSh2KSB8fCBfLmlzUGxhaW5PYmplY3QodilcbiAgICA/IHRoaXMuY2FjaGVXZWJFbGVtZW50cyh2KVxuICAgIDogdjtcblxuICBpZiAoXy5pc0FycmF5KHJlc3BvbnNlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5tYXAodG9DYWNoZWQpO1xuICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChyZXNwb25zZSkpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7Li4ucmVzcG9uc2UsIC4uLih0aGlzLmNhY2hlV2ViRWxlbWVudChyZXNwb25zZSkpfTtcbiAgICByZXR1cm4gXy50b1BhaXJzKHJlc3VsdCkucmVkdWNlKFxuICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdG9DYWNoZWQodmFsdWUpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5cbmV4dGVuc2lvbnMuZmluZFdlYkVsZW1lbnRPckVsZW1lbnRzID0gYXN5bmMgZnVuY3Rpb24gZmluZFdlYkVsZW1lbnRPckVsZW1lbnRzIChzdHJhdGVneSwgc2VsZWN0b3IsIG1hbnksIGN0eCkge1xuICBjb25zdCBjb250ZXh0RWxlbWVudCA9IF8uaXNOaWwoY3R4KSA/IG51bGwgOiB0aGlzLmdldEF0b21zRWxlbWVudChjdHgpO1xuICBsZXQgZWxlbWVudDtcbiAgbGV0IGRvRmluZCA9IGFzeW5jICgpID0+IHtcbiAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbShgZmluZF9lbGVtZW50JHttYW55ID8gJ3MnIDogJyd9YCwgW3N0cmF0ZWd5LCBzZWxlY3RvciwgY29udGV4dEVsZW1lbnRdKTtcbiAgICByZXR1cm4gIV8uaXNOdWxsKGVsZW1lbnQpO1xuICB9O1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW1wbGljaXRXYWl0Rm9yQ29uZGl0aW9uKGRvRmluZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZSAmJiBfLmlzRnVuY3Rpb24oZXJyLm1lc3NhZ2UubWF0Y2gpICYmIGVyci5tZXNzYWdlLm1hdGNoKC9Db25kaXRpb24gdW5tZXQvKSkge1xuICAgICAgLy8gY29uZGl0aW9uIHdhcyBub3QgbWV0IHNldHRpbmcgcmVzIHRvIGVtcHR5IGFycmF5XG4gICAgICBlbGVtZW50ID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBpZiAobWFueSkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlV2ViRWxlbWVudHMoZWxlbWVudCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShlbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhlbGVtZW50KTtcbn07XG5cbmV4dGVuc2lvbnMuY2xpY2tXZWJDb29yZHMgPSBhc3luYyBmdW5jdGlvbiBjbGlja1dlYkNvb3JkcyAoKSB7XG4gIGxldCBjb29yZHMgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVdlYkNvb3Jkcyh0aGlzLmN1cldlYkNvb3Jkcyk7XG4gIGF3YWl0IHRoaXMuY2xpY2tDb29yZHMoY29vcmRzKTtcbn07XG5cbmhlbHBlcnMuZXhlY3V0ZUF0b20gPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXRvbSAoYXRvbSwgYXJncywgYWx3YXlzRGVmYXVsdEZyYW1lID0gZmFsc2UpIHtcbiAgbGV0IGZyYW1lcyA9IGFsd2F5c0RlZmF1bHRGcmFtZSA9PT0gdHJ1ZSA/IFtdIDogdGhpcy5jdXJXZWJGcmFtZXM7XG4gIGxldCBwcm9taXNlID0gdGhpcy5yZW1vdGUuZXhlY3V0ZUF0b20oYXRvbSwgYXJncywgZnJhbWVzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMud2FpdEZvckF0b20ocHJvbWlzZSk7XG59O1xuXG5oZWxwZXJzLmV4ZWN1dGVBdG9tQXN5bmMgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXRvbUFzeW5jIChhdG9tLCBhcmdzLCByZXNwb25zZVVybCkge1xuICAvLyBzYXZlIHRoZSByZXNvbHZlIGFuZCByZWplY3QgbWV0aG9kcyBvZiB0aGUgcHJvbWlzZSB0byBiZSB3YWl0ZWQgZm9yXG4gIGxldCBwcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuYXN5bmNQcm9taXNlID0ge3Jlc29sdmUsIHJlamVjdH07XG4gIH0pO1xuICBhd2FpdCB0aGlzLnJlbW90ZS5leGVjdXRlQXRvbUFzeW5jKGF0b20sIGFyZ3MsIHRoaXMuY3VyV2ViRnJhbWVzLCByZXNwb25zZVVybCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JBdG9tKHByb21pc2UpO1xufTtcblxuaGVscGVycy5nZXRBdG9tc0VsZW1lbnQgPSBmdW5jdGlvbiBnZXRBdG9tc0VsZW1lbnQgKGVsT3JJZCkge1xuICBjb25zdCBlbElkID0gdXRpbC51bndyYXBFbGVtZW50KGVsT3JJZCk7XG4gIGlmICghdGhpcy53ZWJFbGVtZW50c0NhY2hlLmhhcyhlbElkKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IoKTtcbiAgfVxuICByZXR1cm4ge0VMRU1FTlQ6IHRoaXMud2ViRWxlbWVudHNDYWNoZS5nZXQoZWxJZCl9O1xufTtcblxuaGVscGVycy5jb252ZXJ0RWxlbWVudHNGb3JBdG9tcyA9IGZ1bmN0aW9uIGNvbnZlcnRFbGVtZW50c0ZvckF0b21zIChhcmdzID0gW10pIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICBpZiAoaGVscGVycy5oYXNFbGVtZW50SWQoYXJnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXRvbXNFbGVtZW50KGFyZyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcikpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIHJldHVybiBfLmlzQXJyYXkoYXJnKSA/IHRoaXMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMoYXJnKSA6IGFyZztcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEVsZW1lbnRJZCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRJZCAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudC5FTEVNRU5UIHx8IGVsZW1lbnRbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdO1xufTtcblxuaGVscGVycy5oYXNFbGVtZW50SWQgPSBmdW5jdGlvbiBoYXNFbGVtZW50SWQgKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHV0aWwuaGFzVmFsdWUoZWxlbWVudCkgJiYgKHV0aWwuaGFzVmFsdWUoZWxlbWVudC5FTEVNRU5UKSB8fCB1dGlsLmhhc1ZhbHVlKGVsZW1lbnRbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdKSk7XG59O1xuXG5leHRlbnNpb25zLmdldFNhZmFyaUlzSXBob25lID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2FmYXJpSXNJcGhvbmUgKCkge1xuICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5faXNTYWZhcmlJcGhvbmUpKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2FmYXJpSXBob25lO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlckFnZW50ID0gYXdhaXQgdGhpcy5leGVjdXRlKCdyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudCcpO1xuICAgIHRoaXMuX2lzU2FmYXJpSXBob25lID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2lwaG9uZScpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLmxvZy53YXJuKGBVbmFibGUgdG8gZmluZCBkZXZpY2UgdHlwZSBmcm9tIHVzZXJhZ2VudC4gQXNzdW1pbmcgaVBob25lYCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiB0aGlzLl9pc1NhZmFyaUlwaG9uZSA/PyB0cnVlO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRTYWZhcmlEZXZpY2VTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2FmYXJpRGV2aWNlU2l6ZSAoKSB7XG4gIGNvbnN0IHNjcmlwdCA9ICdyZXR1cm4ge2hlaWdodDogd2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCB3aWR0aDogd2luZG93LnNjcmVlbi5hdmFpbFdpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW99Oyc7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZXhlY3V0ZShzY3JpcHQpO1xuICBjb25zdCBbbm9ybUhlaWdodCwgbm9ybVdpZHRoXSA9IGhlaWdodCA+IHdpZHRoID8gW2hlaWdodCwgd2lkdGhdIDogW3dpZHRoLCBoZWlnaHRdO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBub3JtV2lkdGgsXG4gICAgaGVpZ2h0OiBub3JtSGVpZ2h0LFxuICB9O1xufTtcblxuZXh0ZW5zaW9ucy5nZXRTYWZhcmlJc05vdGNoZWQgPSBhc3luYyBmdW5jdGlvbiBnZXRTYWZhcmlJc05vdGNoZWQgKCkge1xuICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5faXNTYWZhcmlOb3RjaGVkKSkge1xuICAgIHJldHVybiB0aGlzLl9pc1NhZmFyaU5vdGNoZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0U2FmYXJpRGV2aWNlU2l6ZSgpO1xuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIE5PVENIRURfREVWSUNFX1NJWkVTKSB7XG4gICAgICBpZiAoZGV2aWNlLncgPT09IHdpZHRoICYmIGRldmljZS5oID09PSBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5faXNTYWZhcmlOb3RjaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBmaW5kIGRldmljZSB0eXBlIGZyb20gZGltZW5zaW9ucy4gQXNzdW1pbmcgdGhlIGRldmljZSBpcyBub3Qgbm90Y2hlZGApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBFcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gdGhpcy5faXNTYWZhcmlOb3RjaGVkID8/IGZhbHNlO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCA9IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0ICh3dlBvcywgcmVhbERpbXMpIHtcbiAgbGV0IHRvcE9mZnNldCA9IDA7XG4gIGxldCBib3R0b21PZmZzZXQgPSAwO1xuXG4gIGNvbnN0IGlzSXBob25lID0gYXdhaXQgdGhpcy5nZXRTYWZhcmlJc0lwaG9uZSgpO1xuXG4gIC8vIE5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgU21hcnQgQXBwIEJhbm5lciBvciBUYWIgQmFyIGlzIHZpc2libGUgb3Igbm90XG4gIC8vIGlmIGFscmVhZHkgZGVmaW5lZCBieSBuYXRpdmVXZWJUYXBUYWJCYXJWaXNpYmlsaXR5IG9yIG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSBpbiBzZXR0aW5ncy5cbiAgY29uc3Qge1xuICAgIG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHksXG4gICAgbmF0aXZlV2ViVGFwU21hcnRBcHBCYW5uZXJWaXNpYmlsaXR5LFxuICAgIHNhZmFyaVRhYkJhclBvc2l0aW9uID0gdXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz49JywgJzE1LjAnKSAmJiBpc0lwaG9uZVxuICAgICAgPyBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSA6IFRBQl9CQVJfUE9TSVRJT05fVE9QLFxuICB9ID0gYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpO1xuICBsZXQgdGFiQmFyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkpO1xuICBsZXQgYmFubmVyVmlzaWJpbGl0eSA9IF8ubG93ZXJDYXNlKG5hdGl2ZVdlYlRhcFNtYXJ0QXBwQmFubmVyVmlzaWJpbGl0eSk7XG4gIGNvbnN0IHRhYkJhclBvc2l0aW9uID0gXy5sb3dlckNhc2Uoc2FmYXJpVGFiQmFyUG9zaXRpb24pO1xuXG4gIGlmICghVklTSUJJTElUSUVTLmluY2x1ZGVzKHRhYkJhclZpc2liaWxpdHkpKSB7XG4gICAgdGFiQmFyVmlzaWJpbGl0eSA9IERFVEVDVDtcbiAgfVxuICBpZiAoIVZJU0lCSUxJVElFUy5pbmNsdWRlcyhiYW5uZXJWaXNpYmlsaXR5KSkge1xuICAgIGJhbm5lclZpc2liaWxpdHkgPSBERVRFQ1Q7XG4gIH1cblxuICBpZiAoIVRBQl9CQVJfUE9TU0lUSU9OUy5pbmNsdWRlcyh0YWJCYXJQb3NpdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYCR7c2FmYXJpVGFiQmFyUG9zaXRpb259IGlzIGludmFsaWQgYXMgU2FmYXJpIHRhYiBiYXIgcG9zaXRpb24uIEF2YWlsYWJsZSBwb3NpdGlvbnMgYXJlICR7VEFCX0JBUl9QT1NTSVRJT05TfS5gKTtcbiAgfVxuXG4gIGNvbnN0IGlzTm90Y2hlZCA9IGlzSXBob25lICYmIGF3YWl0IHRoaXMuZ2V0U2FmYXJpSXNOb3RjaGVkKCk7XG5cbiAgY29uc3Qgb3JpZW50YXRpb24gPSByZWFsRGltcy5oID4gcmVhbERpbXMudyA/ICdQT1JUUkFJVCcgOiAnTEFORFNDQVBFJztcblxuICBjb25zdCBub3RjaE9mZnNldCA9IGlzTm90Y2hlZFxuICAgID8gdXRpbC5jb21wYXJlVmVyc2lvbnModGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbiwgJz0nLCAnMTMuMCcpXG4gICAgICA/IElQSE9ORV9YX05PVENIX09GRlNFVF9JT1NfMTNcbiAgICAgIDogSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU1xuICAgIDogMDtcblxuICBjb25zdCBpc1Njcm9sbGVkID0gYXdhaXQgdGhpcy5leGVjdXRlKCdyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDAnKTtcbiAgaWYgKGlzU2Nyb2xsZWQpIHtcbiAgICB0b3BPZmZzZXQgPSBJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQgKyBub3RjaE9mZnNldDtcblxuICAgIGlmIChpc05vdGNoZWQpIHtcbiAgICAgIHRvcE9mZnNldCAtPSBJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGlQaG9uZSBpcyBsYW5kc2NhcGUgdGhlbiB0aGVyZSBpcyBubyB0b3AgYmFyXG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAnTEFORFNDQVBFJyAmJiBpc0lwaG9uZSkge1xuICAgICAgdG9wT2Zmc2V0ID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9wT2Zmc2V0ID0gdGFiQmFyUG9zaXRpb24gPT09IFRBQl9CQVJfUE9TSVRJT05fQk9UVE9NID8gMCA6IElQSE9ORV9UT1BfQkFSX0hFSUdIVDtcbiAgICB0b3BPZmZzZXQgKz0gbm90Y2hPZmZzZXQ7XG4gICAgdGhpcy5sb2cuZGVidWcoYHRhYkJhclBvc2l0aW9uIGFuZCB0b3BPZmZzZXQ6ICR7dGFiQmFyUG9zaXRpb259LCAke3RvcE9mZnNldH1gKTtcblxuICAgIGlmIChpc0lwaG9uZSkge1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnUE9SVFJBSVQnKSB7XG4gICAgICAgIC8vIFRoZSBib3R0b20gYmFyIGlzIG9ubHkgdmlzaWJsZSB3aGVuIHBvcnRyYWl0XG4gICAgICAgIGJvdHRvbU9mZnNldCA9IElQSE9ORV9CT1RUT01fQkFSX09GRlNFVDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcE9mZnNldCA9IElQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAnTEFORFNDQVBFJyB8fCAhaXNJcGhvbmUpIHtcbiAgICAgIGlmICh0YWJCYXJWaXNpYmlsaXR5ID09PSBWSVNJQkxFKSB7XG4gICAgICAgIHRvcE9mZnNldCArPSBUQUJfQkFSX09GRlNFVDtcbiAgICAgIH0gZWxzZSBpZiAodGFiQmFyVmlzaWJpbGl0eSA9PT0gREVURUNUKSB7XG4gICAgICAgIC8vIFRhYnMgb25seSBhcHBlYXIgaWYgdGhlIGRldmljZSBpcyBsYW5kc2NhcGUgb3IgaWYgaXQncyBhbiBpUGFkIHNvIHdlIG9ubHkgY2hlY2sgdmlzaWJpbGl0eSBpbiB0aGlzIGNhc2VcbiAgICAgICAgLy8gQXNzdW1lIHRoYXQgZWFjaCB0YWIgYmFyIGlzIGEgV2ViVmlld1xuICAgICAgICBjb25zdCBjb250ZXh0c0FuZFZpZXdzID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0c0FuZFZpZXdzKCk7XG4gICAgICAgIGNvbnN0IHRhYnMgPSBjb250ZXh0c0FuZFZpZXdzLmZpbHRlcigoY3R4KSA9PiBjdHguaWQuc3RhcnRzV2l0aCgnV0VCVklFV18nKSk7XG5cbiAgICAgICAgaWYgKHRhYnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCAke3RhYnMubGVuZ3RofSB0YWJzLiBBc3N1bWluZyB0aGUgdGFiIGJhciBpcyB2aXNpYmxlYCk7XG4gICAgICAgICAgdG9wT2Zmc2V0ICs9IFRBQl9CQVJfT0ZGU0VUO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9wT2Zmc2V0ICs9IGF3YWl0IHRoaXMuZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQoaXNJcGhvbmUsIGJhbm5lclZpc2liaWxpdHkpO1xuXG4gIHd2UG9zLnkgKz0gdG9wT2Zmc2V0O1xuICByZWFsRGltcy5oIC09ICh0b3BPZmZzZXQgKyBib3R0b21PZmZzZXQpO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRFeHRyYU5hdGl2ZVdlYlRhcE9mZnNldCA9IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhTmF0aXZlV2ViVGFwT2Zmc2V0IChpc0lwaG9uZSwgYmFubmVyVmlzaWJpbGl0eSkge1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICBpZiAoYmFubmVyVmlzaWJpbGl0eSA9PT0gVklTSUJMRSkge1xuICAgIG9mZnNldCArPSBpc0lwaG9uZSA/XG4gICAgICBJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUIDpcbiAgICAgIElQQURfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUO1xuICB9IGVsc2UgaWYgKGJhbm5lclZpc2liaWxpdHkgPT09IERFVEVDVCkge1xuICAgIC8vIHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYW4gU21hcnQgQXBwIEJhbm5lclxuICAgIGNvbnN0IGJhbm5lcnMgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnYWNjZXNzaWJpbGl0eSBpZCcsICdDbG9zZSBhcHAgZG93bmxvYWQgb2ZmZXInLCB0cnVlKTtcbiAgICBpZiAoYmFubmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBvZmZzZXQgKz0gaXNJcGhvbmUgP1xuICAgICAgICBJUEhPTkVfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUIDpcbiAgICAgICAgSVBBRF9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQ7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5sb2cuZGVidWcoYEFkZGl0aW9uYWwgbmF0aXZlIHdlYiB0YXAgb2Zmc2V0IGNvbXB1dGVkOiAke29mZnNldH1gKTtcbiAgcmV0dXJuIG9mZnNldDtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHRhcFdlYkVsZW1lbnROYXRpdmVseSAoZHJpdmVyLCBhdG9tc0VsZW1lbnQpIHtcbiAgLy8gdHJ5IHRvIGdldCB0aGUgdGV4dCBvZiB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBhY2Nlc3NpYmxlIGluIHRoZVxuICAvLyBuYXRpdmUgY29udGV4dFxuICB0cnkge1xuICAgIGxldCB0ZXh0ID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVBdG9tKCdnZXRfdGV4dCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHRleHQgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUF0b20oJ2dldF9hdHRyaWJ1dGVfdmFsdWUnLCBbYXRvbXNFbGVtZW50LCAndmFsdWUnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IGVscyA9IGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCB0ZXh0LCB0cnVlKTtcbiAgICAgIGlmIChlbHMubGVuZ3RoID09PSAxIHx8IGVscy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgZWwgPSBlbHNbMF07XG4gICAgICAgIC8vIHVzZSB0YXAgYmVjYXVzZSBvbiBpT1MgMTEuMiBhbmQgYmVsb3cgYG5hdGl2ZUNsaWNrYCBjcmFzaGVzIFdEQVxuICAgICAgICBjb25zdCByZWN0ID0gYXdhaXQgZHJpdmVyLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWwpfS9yZWN0YCwgJ0dFVCcpO1xuICAgICAgICBpZiAoZWxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGVsMiA9IGVsc1sxXTtcbiAgICAgICAgICBjb25zdCByZWN0MiA9IGF3YWl0IGRyaXZlci5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7dXRpbC51bndyYXBFbGVtZW50KGVsMil9L3JlY3RgLCAnR0VUJyk7XG5cbiAgICAgICAgICBpZiAoKHJlY3QueCAhPT0gcmVjdDIueCB8fCByZWN0LnkgIT09IHJlY3QyLnkpIHx8XG4gICAgICAgICAgKHJlY3Qud2lkdGggIT09IHJlY3QyLndpZHRoIHx8IHJlY3QuaGVpZ2h0ICE9PSByZWN0Mi5oZWlnaHQpKSB7XG4gICAgICAgICAgICAvLyBUaGVzZSAyIG5hdGl2ZSBlbGVtZW50cyBhcmUgbm90IHJlZmVycmluZyB0byB0aGUgc2FtZSB3ZWIgZWxlbWVudFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZChyZWN0LnggKyByZWN0LndpZHRoIC8gMiksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChyZWN0LnkgKyByZWN0LmhlaWdodCAvIDIpLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBkcml2ZXIuY2xpY2tDb29yZHMoY29vcmRzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBhbnkgZmFpbHVyZSBzaG91bGQgZmFsbCB0aHJvdWdoIGFuZCB0cmlnZ2VyIHRoZSBtb3JlIGVsYWJvcmF0ZVxuICAgIC8vIG1ldGhvZCBvZiBjbGlja2luZ1xuICAgIGRyaXZlci5sb2cud2FybihgRXJyb3IgYXR0ZW1wdGluZyB0byBjbGljazogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4dGVuc2lvbnMubmF0aXZlV2ViVGFwID0gYXN5bmMgZnVuY3Rpb24gbmF0aXZlV2ViVGFwIChlbCkge1xuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG5cbiAgLy8gaWYgc3RyaWN0IG5hdGl2ZSB0YXAsIGRvIG5vdCB0cnkgdG8gZG8gaXQgd2l0aCBXREEgZGlyZWN0bHlcbiAgaWYgKCEoYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpKS5uYXRpdmVXZWJUYXBTdHJpY3QgJiYgYXdhaXQgdGFwV2ViRWxlbWVudE5hdGl2ZWx5KHRoaXMsIGF0b21zRWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sb2cud2FybignVW5hYmxlIHRvIGRvIHNpbXBsZSBuYXRpdmUgd2ViIHRhcC4gQXR0ZW1wdGluZyB0byBjb252ZXJ0IGNvb3JkaW5hdGVzJyk7XG5cbiAgLy8gYGdldF90b3BfbGVmdF9jb29yZGluYXRlc2AgcmV0dXJucyB0aGUgd3JvbmcgdmFsdWUgc29tZXRpbWVzLFxuICAvLyB1bmxlc3Mgd2UgcHJlLWNhbGwgYm90aCBvZiB0aGVzZSBmdW5jdGlvbnMgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbHNcbiAgYXdhaXQgQi5Qcm9taXNlLmFsbChbXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3NpemUnLCBbYXRvbXNFbGVtZW50XSksXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzJywgW2F0b21zRWxlbWVudF0pLFxuICBdKTtcblxuICBjb25zdCBbc2l6ZSwgY29vcmRpbmF0ZXNdID0gYXdhaXQgQi5Qcm9taXNlLmFsbChbXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3NpemUnLCBbYXRvbXNFbGVtZW50XSksXG4gICAgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzJywgW2F0b21zRWxlbWVudF0pLFxuICBdKTtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gc2l6ZTtcbiAgbGV0IHt4LCB5fSA9IGNvb3JkaW5hdGVzO1xuICB4ICs9IHdpZHRoIC8gMjtcbiAgeSArPSBoZWlnaHQgLyAyO1xuXG4gIHRoaXMuY3VyV2ViQ29vcmRzID0ge3gsIHl9O1xuICBhd2FpdCB0aGlzLmNsaWNrV2ViQ29vcmRzKCk7XG59O1xuXG5leHRlbnNpb25zLmNsaWNrQ29vcmRzID0gYXN5bmMgZnVuY3Rpb24gY2xpY2tDb29yZHMgKGNvb3Jkcykge1xuICBhd2FpdCB0aGlzLnBlcmZvcm1Ub3VjaChbXG4gICAge1xuICAgICAgYWN0aW9uOiAndGFwJyxcbiAgICAgIG9wdGlvbnM6IGNvb3JkcyxcbiAgICB9LFxuICBdKTtcbn07XG5cbmV4dGVuc2lvbnMudHJhbnNsYXRlV2ViQ29vcmRzID0gYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlV2ViQ29vcmRzIChjb29yZHMpIHtcbiAgdGhpcy5sb2cuZGVidWcoYFRyYW5zbGF0aW5nIGNvb3JkaW5hdGVzICgke0pTT04uc3RyaW5naWZ5KGNvb3Jkcyl9KSB0byB3ZWIgY29vcmRpbmF0ZXNgKTtcblxuICAvLyBhYnNvbHV0aXplIHdlYiBjb29yZHNcbiAgbGV0IHdlYnZpZXc7XG4gIHRyeSB7XG4gICAgd2VidmlldyA9IGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgMTAwLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnY2xhc3MgbmFtZScsICdYQ1VJRWxlbWVudFR5cGVXZWJWaWV3JywgZmFsc2UpKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxuXG4gIGlmICghd2Vidmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gV2ViVmlldyBmb3VuZC4gVW5hYmxlIHRvIHRyYW5zbGF0ZSB3ZWIgY29vcmRpbmF0ZXMgZm9yIG5hdGl2ZSB3ZWIgdGFwLmApO1xuICB9XG5cbiAgd2VidmlldyA9IHV0aWwudW53cmFwRWxlbWVudCh3ZWJ2aWV3KTtcblxuICBjb25zdCByZWN0ID0gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7d2Vidmlld30vcmVjdGAsICdHRVQnKTtcbiAgY29uc3Qgd3ZQb3MgPSB7eDogcmVjdC54LCB5OiByZWN0Lnl9O1xuICBjb25zdCByZWFsRGltcyA9IHt3OiByZWN0LndpZHRoLCBoOiByZWN0LmhlaWdodH07XG5cbiAgY29uc3QgY21kID0gJyhmdW5jdGlvbiAoKSB7IHJldHVybiB7dzogd2luZG93LmlubmVyV2lkdGgsIGg6IHdpbmRvdy5pbm5lckhlaWdodH07IH0pKCknO1xuICBjb25zdCB3dkRpbXMgPSBhd2FpdCB0aGlzLnJlbW90ZS5leGVjdXRlKGNtZCk7XG5cbiAgLy8ga2VlcCB0cmFjayBvZiBpbXBsaWNpdCB3YWl0LCBhbmQgc2V0IGxvY2FsbHkgdG8gMFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTQ5ODhcbiAgY29uc3QgaW1wbGljaXRXYWl0TXMgPSB0aGlzLmltcGxpY2l0V2FpdE1zO1xuICBhd2FpdCB0aGlzLnNldEltcGxpY2l0V2FpdCgwKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0KHd2UG9zLCByZWFsRGltcyk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdGhpcy5zZXRJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMpO1xuICB9XG5cbiAgaWYgKHd2RGltcyAmJiByZWFsRGltcyAmJiB3dlBvcykge1xuICAgIGxldCB4UmF0aW8gPSByZWFsRGltcy53IC8gd3ZEaW1zLnc7XG4gICAgbGV0IHlSYXRpbyA9IHJlYWxEaW1zLmggLyB3dkRpbXMuaDtcbiAgICBsZXQgbmV3Q29vcmRzID0ge1xuICAgICAgeDogd3ZQb3MueCArIE1hdGgucm91bmQoeFJhdGlvICogY29vcmRzLngpLFxuICAgICAgeTogd3ZQb3MueSArIE1hdGgucm91bmQoeVJhdGlvICogY29vcmRzLnkpLFxuICAgIH07XG5cbiAgICAvLyBhZGRpdGlvbmFsIGxvZ2dpbmcgZm9yIGNvb3JkaW5hdGVzLCBzaW5jZSBpdCBpcyBzb21ldGltZXMgYnJva2VuXG4gICAgLy8gICBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzkxNTlcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQ29udmVydGVkIGNvb3JkaW5hdGVzOiAke0pTT04uc3RyaW5naWZ5KG5ld0Nvb3Jkcyl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICByZWN0OiAke0pTT04uc3RyaW5naWZ5KHJlY3QpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgd3ZQb3M6ICR7SlNPTi5zdHJpbmdpZnkod3ZQb3MpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgcmVhbERpbXM6ICR7SlNPTi5zdHJpbmdpZnkocmVhbERpbXMpfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgd3ZEaW1zOiAke0pTT04uc3RyaW5naWZ5KHd2RGltcyl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICB4UmF0aW86ICR7SlNPTi5zdHJpbmdpZnkoeFJhdGlvKX1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgIHlSYXRpbzogJHtKU09OLnN0cmluZ2lmeSh5UmF0aW8pfWApO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoYENvbnZlcnRlZCB3ZWIgY29vcmRzICR7SlNPTi5zdHJpbmdpZnkoY29vcmRzKX0gYCArXG4gICAgICBgaW50byByZWFsIGNvb3JkcyAke0pTT04uc3RyaW5naWZ5KG5ld0Nvb3Jkcyl9YCk7XG4gICAgcmV0dXJuIG5ld0Nvb3JkcztcbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5jaGVja0ZvckFsZXJ0ID0gYXN5bmMgZnVuY3Rpb24gY2hlY2tGb3JBbGVydCAoKSB7XG4gIHJldHVybiBfLmlzU3RyaW5nKGF3YWl0IHRoaXMuZ2V0QWxlcnRUZXh0KCkpO1xufTtcblxuZXh0ZW5zaW9ucy53YWl0Rm9yQXRvbSA9IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBdG9tIChwcm9taXNlKSB7XG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG5cbiAgLy8gbmVlZCB0byBjaGVjayBmb3IgYWxlcnQgd2hpbGUgdGhlIGF0b20gaXMgYmVpbmcgZXhlY3V0ZWQuXG4gIC8vIHNvIG5vdGlmeSBvdXJzZWx2ZXMgd2hlbiBpdCBoYXBwZW5zXG4gIGNvbnN0IHRpbWVkQXRvbVByb21pc2UgPSBCLnJlc29sdmUocHJvbWlzZSkudGltZW91dChBVE9NX1dBSVRfVElNRU9VVF9NUyk7XG4gIGNvbnN0IGhhbmRsZVByb21pc2VFcnJvciA9IGFzeW5jIChwKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxFcnJvciA9IChlcnIgaW5zdGFuY2VvZiBCLkFnZ3JlZ2F0ZUVycm9yKSA/IGVyclswXSA6IGVycjtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBFcnJvciByZWNlaXZlZCB3aGlsZSBleGVjdXRpbmcgYXRvbTogJHtvcmlnaW5hbEVycm9yLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAob3JpZ2luYWxFcnJvciBpbnN0YW5jZW9mIEIuVGltZW91dEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBnZXQgYW55IHJlc3BvbnNlIGZvciBhdG9tIGV4ZWN1dGlvbiBhZnRlciBgICtcbiAgICAgICAgICBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xuICAvLyBpZiB0aGUgYXRvbSBwcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoaW4gQVRPTV9JTklUSUFMX1dBSVRfTVNcbiAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBhbiBhbGVydCBwcmVzZW5jZVxuICBhd2FpdCBoYW5kbGVQcm9taXNlRXJyb3IoQi5hbnkoW0IuZGVsYXkoQVRPTV9JTklUSUFMX1dBSVRfTVMpLCB0aW1lZEF0b21Qcm9taXNlXSkpO1xuICBpZiAodGltZWRBdG9tUHJvbWlzZS5pc0Z1bGZpbGxlZCgpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRpbWVkQXRvbVByb21pc2U7XG4gIH1cblxuICAvLyAuLi5vdGhlcndpc2UgbWFrZSBzdXJlIHRoZXJlIGlzIG5vIHVuZXhwZWN0ZWQgYWxlcnQgY292ZXJpbmcgdGhlIGVsZW1lbnRcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QodGhpcy5fd2FpdGluZ0F0b21zKSkge1xuICAgIHRoaXMuX3dhaXRpbmdBdG9tcyA9IHtcbiAgICAgIGNvdW50OiAwLFxuICAgICAgYWxlcnROb3RpZmllcjogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgICAgYWxlcnRNb25pdG9yOiBCLnJlc29sdmUoKSxcbiAgICB9O1xuICB9XG4gIHRoaXMuX3dhaXRpbmdBdG9tcy5jb3VudCsrO1xuXG4gIGxldCBvbkFsZXJ0Q2FsbGJhY2s7XG4gIHRyeSB7XG4gICAgLy8gb25seSByZXN0YXJ0IHRoZSBtb25pdG9yIGlmIGl0IGlzIG5vdCBydW5uaW5nIGFscmVhZHlcbiAgICBpZiAodGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0TW9uaXRvci5pc1Jlc29sdmVkKCkpIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE1vbml0b3IgPSBCLnJlc29sdmUoKGFzeW5jICgpID0+IHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX3dhaXRpbmdBdG9tcy5jb3VudCA+IDApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tGb3JBbGVydCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLmVtaXQoT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgICAgICBhd2FpdCBCLmRlbGF5KEFUT01fSU5JVElBTF9XQUlUX01TIC8gMik7XG4gICAgICAgIH1cbiAgICAgIH0pKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBvbkFsZXJ0Q2FsbGJhY2sgPSAoKSA9PiByZWplY3QobmV3IGVycm9ycy5VbmV4cGVjdGVkQWxlcnRPcGVuRXJyb3IoKSk7XG4gICAgICB0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnROb3RpZmllci5vbmNlKE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5ULCBvbkFsZXJ0Q2FsbGJhY2spO1xuICAgICAgaGFuZGxlUHJvbWlzZUVycm9yKHRpbWVkQXRvbVByb21pc2UpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG4gICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvbkFsZXJ0Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKE9OX09CU1RSVUNUSU5HX0FMRVJUX0VWRU5ULCBvbkFsZXJ0Q2FsbGJhY2spO1xuICAgIH1cbiAgICB0aGlzLl93YWl0aW5nQXRvbXMuY291bnQtLTtcbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5tb2JpbGVXZWJOYXYgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVXZWJOYXYgKG5hdlR5cGUpIHtcbiAgdGhpcy5yZW1vdGUuYWxsb3dOYXZpZ2F0aW9uV2l0aG91dFJlbG9hZCA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbYGhpc3RvcnkuJHtuYXZUeXBlfSgpO2AsIG51bGxdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLnJlbW90ZS5hbGxvd05hdmlnYXRpb25XaXRob3V0UmVsb2FkID0gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2FmYXJpT3B0c1xuICogQHByb3BlcnR5IHtvYmplY3R9IHByZWZlcmVuY2VzIEFuIG9iamVjdCBjb250YWluaW5nIFNhZmFyaSBzZXR0aW5ncyB0byBiZSB1cGRhdGVkLlxuICogVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHNldHRpbmcgbmFtZXMgYW5kIHRoZWlyIHZhbHVlcyBjb3VsZCBiZSByZXRyaWV2ZWQgYnlcbiAqIGNoYW5naW5nIHRoZSBjb3JyZXNwb25kaW5nIFNhZmFyaSBzZXR0aW5ncyBpbiB0aGUgVUkgYW5kIHRoZW4gaW5zcGVjdGluZ1xuICogJ0xpYnJhcnkvUHJlZmVyZW5jZXMvY29tLmFwcGxlLm1vYmlsZXNhZmFyaS5wbGlzdCcgZmlsZSBpbnNpZGUgb2ZcbiAqIGNvbS5hcHBsZS5tb2JpbGVzYWZhcmkgYXBwIGNvbnRhaW5lci5cbiAqIFRoZSBmdWxsIHBhdGggdG8gdGhlIE1vYmlsZSBTYWZhcmkncyBjb250YWluZXIgY291bGQgYmUgcmV0cmlldmVkIGZyb21cbiAqIGB4Y3J1biBzaW1jdGwgZ2V0X2FwcF9jb250YWluZXIgPHNpbV91ZGlkPiBjb20uYXBwbGUubW9iaWxlc2FmYXJpIGRhdGFgXG4gKiBjb21tYW5kIG91dHB1dC5cbiAqIFVzZSB0aGUgYHhjcnVuIHNpbWN0bCBzcGF3biA8c2ltX3VkaWQ+IGRlZmF1bHRzIHJlYWQgPHBhdGhfdG9fcGxpc3Q+YCBjb21tYW5kXG4gKiB0byBwcmludCB0aGUgcGxpc3QgY29udGVudCB0byB0aGUgVGVybWluYWwuXG4gKi9cblxuLyoqXG4gKiBVcGRhdGVzIHByZWZlcmVuY2VzIG9mIE1vYmlsZSBTYWZhcmkgb24gU2ltdWxhdG9yXG4gKlxuICogQHBhcmFtIHtTYWZhcmlPcHRzfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVVwZGF0ZVNhZmFyaVByZWZlcmVuY2VzID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVXBkYXRlU2FmYXJpUHJlZmVyZW5jZXMgKG9wdHMgPSB7fSkge1xuICBpZiAoIXRoaXMuaXNTaW11bGF0b3IoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBleHRlbnNpb24gaXMgb25seSBhdmFpbGFibGUgZm9yIFNpbXVsYXRvcicpO1xuICB9XG4gIGNvbnN0IHsgcHJlZmVyZW5jZXMgfSA9IG9wdHM7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KHByZWZlcmVuY2VzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1wicHJlZmVyZW5jZXNcIiBhcmd1bWVudCBtdXN0IGJlIGEgdmFsaWQgb2JqZWN0Jyk7XG4gIH1cblxuICB0aGlzLmxvZy5kZWJ1ZyhgQWJvdXQgdG8gdXBkYXRlIFNhZmFyaSBwcmVmZXJlbmNlczogJHtKU09OLnN0cmluZ2lmeShwcmVmZXJlbmNlcyl9YCk7XG4gIGF3YWl0IHRoaXMub3B0cy5kZXZpY2UudXBkYXRlU2FmYXJpU2V0dGluZ3MocHJlZmVyZW5jZXMpO1xufTtcblxuT2JqZWN0LmFzc2lnbihjb21tYW5kcywgZXh0ZW5zaW9ucywgaGVscGVycyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEscUJBQXFCLEdBQUcsRUFBRTtBQUNoQyxNQUFNQyw4QkFBOEIsR0FBRyxFQUFFO0FBQ3pDLE1BQU1DLHdCQUF3QixHQUFHLEVBQUU7QUFDbkMsTUFBTUMseUJBQXlCLEdBQUcsRUFBRTtBQUNwQyxNQUFNQyw0QkFBNEIsR0FBRyxFQUFFO0FBRXZDLE1BQU1DLCtCQUErQixHQUFHLEVBQUU7QUFDMUMsTUFBTUMsd0JBQXdCLEdBQUcsRUFBRTtBQUNuQyxNQUFNQyxjQUFjLEdBQUcsRUFBRTtBQUN6QixNQUFNQyx3Q0FBd0MsR0FBRyxFQUFFO0FBQ25ELE1BQU1DLHNDQUFzQyxHQUFHLEVBQUU7QUFFakQsTUFBTUMsb0JBQW9CLEdBQUcsQ0FDM0I7RUFBQ0MsQ0FBQyxFQUFFLElBQUk7RUFBRUMsQ0FBQyxFQUFFO0FBQUksQ0FBQyxFQUNsQjtFQUFDRCxDQUFDLEVBQUUsR0FBRztFQUFFQyxDQUFDLEVBQUU7QUFBSSxDQUFDLEVBQ2pCO0VBQUNELENBQUMsRUFBRSxJQUFJO0VBQUVDLENBQUMsRUFBRTtBQUFJLENBQUMsQ0FDbkI7QUFFRCxNQUFNO0VBQUVDO0FBQTJCLENBQUMsR0FBR0MsYUFBSTtBQUUzQyxNQUFNQyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsS0FBSztBQUN0QyxNQUFNQyxvQkFBb0IsR0FBRyxJQUFJO0FBRWpDLE1BQU1DLDBCQUEwQixHQUFHLE9BQU87QUFFMUMsTUFBTUMsT0FBTyxH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
612
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJUEhPTkVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfU0NST0xMRURfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfWF9TQ1JPTExFRF9PRkZTRVQiLCJJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TIiwiSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xMyIsIklQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQiLCJJUEhPTkVfQk9UVE9NX0JBUl9PRkZTRVQiLCJUQUJfQkFSX09GRlNFVCIsIklQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQiLCJJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVCIsIk5PVENIRURfREVWSUNFX1NJWkVTIiwidyIsImgiLCJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsInV0aWwiLCJBVE9NX1dBSVRfVElNRU9VVF9NUyIsIkFUT01fSU5JVElBTF9XQUlUX01TIiwiT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQiLCJWSVNJQkxFIiwiSU5WSVNJQkxFIiwiREVURUNUIiwiVklTSUJJTElUSUVTIiwiVEFCX0JBUl9QT1NJVElPTl9UT1AiLCJUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSIsIlRBQl9CQVJfUE9TU0lUSU9OUyIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIiLCJpZCIsIl8iLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNFbXB0eSIsImlzTmFOIiwic2V0RnJhbWUiLCJmcmFtZSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJpc051bGwiLCJjdXJXZWJGcmFtZXMiLCJsb2ciLCJkZWJ1ZyIsImhhc0VsZW1lbnRJZCIsImF0b21zRWxlbWVudCIsImdldEF0b21zRWxlbWVudCIsInZhbHVlIiwiZXhlY3V0ZUF0b20iLCJXSU5ET1ciLCJ1bnNoaWZ0IiwiYXRvbSIsImlzVW5kZWZpbmVkIiwiTm9TdWNoRnJhbWVFcnJvciIsImdldENzc1Byb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiZWwiLCJzdWJtaXQiLCJyZWZyZXNoIiwiZ2V0VXJsIiwicmVtb3RlIiwiZXhlY3V0ZSIsInRpdGxlIiwiZ2V0Q29va2llcyIsInNjcmlwdCIsImpzQ29va2llcyIsImNvb2tpZXMiLCJuYW1lIiwidG9QYWlycyIsImNvb2tpZVV0aWxzIiwiY3JlYXRlSldQQ29va2llIiwidW5kZWZpbmVkIiwicHVzaCIsImVyciIsImVycm9yIiwiVW5rbm93bkVycm9yIiwic2V0Q29va2llIiwiY29va2llIiwiY2xvbmUiLCJwYXRoIiwianNDb29raWUiLCJjcmVhdGVKU0Nvb2tpZSIsImV4cGlyZXMiLCJleHBpcnkiLCJEYXRlIiwidG9VVENTdHJpbmciLCJkb21haW4iLCJodHRwT25seSIsInNlY3VyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkZWxldGVDb29raWUiLCJjb29raWVOYW1lIiwiaW5kZXhPZiIsIm1hcCIsIl9kZWxldGVDb29raWUiLCJkZWxldGVDb29raWVzIiwibGVuZ3RoIiwid2ViQ29va2llIiwiZXhwaXJlQ29va2llIiwiY2FjaGVXZWJFbGVtZW50IiwiaXNQbGFpbk9iamVjdCIsImVsSWQiLCJ1bndyYXBFbGVtZW50IiwiY2FjaGVJZCIsImluY2x1ZGVzIiwidXVpZFY0Iiwid2ViRWxlbWVudHNDYWNoZSIsInNldCIsIndyYXBFbGVtZW50IiwiY2FjaGVXZWJFbGVtZW50cyIsInJlc3BvbnNlIiwidG9DYWNoZWQiLCJ2IiwiaXNBcnJheSIsInJlc3VsdCIsInJlZHVjZSIsImFjYyIsImtleSIsImZpbmRXZWJFbGVtZW50T3JFbGVtZW50cyIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYW55IiwiY3R4IiwiY29udGV4dEVsZW1lbnQiLCJpc05pbCIsImVsZW1lbnQiLCJkb0ZpbmQiLCJpbXBsaWNpdFdhaXRGb3JDb25kaXRpb24iLCJtZXNzYWdlIiwiaXNGdW5jdGlvbiIsIm1hdGNoIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiY2xpY2tXZWJDb29yZHMiLCJjb29yZHMiLCJ0cmFuc2xhdGVXZWJDb29yZHMiLCJjdXJXZWJDb29yZHMiLCJjbGlja0Nvb3JkcyIsImFyZ3MiLCJhbHdheXNEZWZhdWx0RnJhbWUiLCJmcmFtZXMiLCJwcm9taXNlIiwid2FpdEZvckF0b20iLCJleGVjdXRlQXRvbUFzeW5jIiwicmVzcG9uc2VVcmwiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsImFzeW5jUHJvbWlzZSIsImVsT3JJZCIsImhhcyIsIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yIiwiRUxFTUVOVCIsImdldCIsImNvbnZlcnRFbGVtZW50c0ZvckF0b21zIiwiYXJnIiwiaXNFcnJvclR5cGUiLCJnZXRFbGVtZW50SWQiLCJoYXNWYWx1ZSIsImdldFNhZmFyaUlzSXBob25lIiwiaXNCb29sZWFuIiwiX2lzU2FmYXJpSXBob25lIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJ3YXJuIiwiZ2V0U2FmYXJpRGV2aWNlU2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwibm9ybUhlaWdodCIsIm5vcm1XaWR0aCIsImdldFNhZmFyaUlzTm90Y2hlZCIsIl9pc1NhZmFyaU5vdGNoZWQiLCJkZXZpY2UiLCJnZXRFeHRyYVRyYW5zbGF0ZVdlYkNvb3Jkc09mZnNldCIsInd2UG9zIiwicmVhbERpbXMiLCJ0b3BPZmZzZXQiLCJib3R0b21PZmZzZXQiLCJpc0lwaG9uZSIsIm5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkiLCJuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHkiLCJzYWZhcmlUYWJCYXJQb3NpdGlvbiIsImNvbXBhcmVWZXJzaW9ucyIsIm9wdHMiLCJwbGF0Zm9ybVZlcnNpb24iLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwidGFiQmFyVmlzaWJpbGl0eSIsImxvd2VyQ2FzZSIsImJhbm5lclZpc2liaWxpdHkiLCJ0YWJCYXJQb3NpdGlvbiIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiaXNOb3RjaGVkIiwib3JpZW50YXRpb24iLCJub3RjaE9mZnNldCIsImlzU2Nyb2xsZWQiLCJjb250ZXh0c0FuZFZpZXdzIiwiZ2V0Q29udGV4dHNBbmRWaWV3cyIsInRhYnMiLCJmaWx0ZXIiLCJzdGFydHNXaXRoIiwiZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQiLCJ5Iiwib2Zmc2V0IiwiYmFubmVycyIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsInRhcFdlYkVsZW1lbnROYXRpdmVseSIsImRyaXZlciIsInRleHQiLCJlbHMiLCJyZWN0IiwicHJveHlDb21tYW5kIiwiZWwyIiwicmVjdDIiLCJ4IiwiTWF0aCIsInJvdW5kIiwibmF0aXZlV2ViVGFwIiwibmF0aXZlV2ViVGFwU3RyaWN0IiwiUHJvbWlzZSIsImFsbCIsInNpemUiLCJjb29yZGluYXRlcyIsInBlcmZvcm1Ub3VjaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJ3ZWJ2aWV3IiwicmV0cnlJbnRlcnZhbCIsImlnbiIsIkVycm9yIiwiY21kIiwid3ZEaW1zIiwiaW1wbGljaXRXYWl0TXMiLCJzZXRJbXBsaWNpdFdhaXQiLCJ4UmF0aW8iLCJ5UmF0aW8iLCJuZXdDb29yZHMiLCJjaGVja0ZvckFsZXJ0IiwiZ2V0QWxlcnRUZXh0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwidGltZWRBdG9tUHJvbWlzZSIsInRpbWVvdXQiLCJoYW5kbGVQcm9taXNlRXJyb3IiLCJwIiwib3JpZ2luYWxFcnJvciIsIkFnZ3JlZ2F0ZUVycm9yIiwiVGltZW91dEVycm9yIiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJhbnkiLCJkZWxheSIsImlzRnVsZmlsbGVkIiwiX3dhaXRpbmdBdG9tcyIsImNvdW50IiwiYWxlcnROb3RpZmllciIsIkV2ZW50RW1pdHRlciIsImFsZXJ0TW9uaXRvciIsIm9uQWxlcnRDYWxsYmFjayIsImlzUmVzb2x2ZWQiLCJlbWl0IiwiVW5leHBlY3RlZEFsZXJ0T3BlbkVycm9yIiwib25jZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZUxpc3RlbmVyIiwibW9iaWxlV2ViTmF2IiwibmF2VHlwZSIsImFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQiLCJtb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcyIsImlzU2ltdWxhdG9yIiwicHJlZmVyZW5jZXMiLCJ1cGRhdGVTYWZhcmlTZXR0aW5ncyIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy93ZWIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwsIHRpbWluZyB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBlcnJvcnMsIGlzRXJyb3JUeXBlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgY29va2llVXRpbHMgZnJvbSAnLi4vY29va2llcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuXG5jb25zdCBJUEhPTkVfVE9QX0JBUl9IRUlHSFQgPSA3MTtcbmNvbnN0IElQSE9ORV9TQ1JPTExFRF9UT1BfQkFSX0hFSUdIVCA9IDQxO1xuY29uc3QgSVBIT05FX1hfU0NST0xMRURfT0ZGU0VUID0gNTU7XG5jb25zdCBJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TID0gMjQ7XG5jb25zdCBJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TXzEzID0gMjA7XG5cbmNvbnN0IElQSE9ORV9MQU5EU0NBUEVfVE9QX0JBUl9IRUlHSFQgPSA1MTtcbmNvbnN0IElQSE9ORV9CT1RUT01fQkFSX09GRlNFVCA9IDQ5O1xuY29uc3QgVEFCX0JBUl9PRkZTRVQgPSAzMztcbmNvbnN0IElQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQgPSA4NDtcbmNvbnN0IElQQURfV0VCX0NPT1JEX1NNQVJUX0FQUF9CQU5ORVJfT0ZGU0VUID0gOTU7XG5cbmNvbnN0IE5PVENIRURfREVWSUNFX1NJWkVTID0gW1xuICB7dzogMTEyNSwgaDogMjQzNn0sIC8vIDExIFBybywgWCwgWHNcbiAge3c6IDgyOCwgaDogMTc5Mn0sIC8vIDExLCBYclxuICB7dzogMTI0MiwgaDogMjY4OH0sIC8vIDExIFBybyBNYXgsIFhzIE1heFxuICB7dzogMTA4MCwgaDogMjM0MH0sIC8vIDEzIG1pbmksIDEyIG1pbmlcbiAge3c6IDExNzAsIGg6IDI1MzJ9LCAvLyAxNCwgMTMsIDEzIFBybywgMTIsIDEyIFByb1xuICB7dzogMTI4NCwgaDogMjc3OH0sIC8vIDE0IFBsdXMsIDEzIFBybyBNYXgsIDEyIFBybyBNYXhcbiAge3c6IDExNzksIGg6IDI1NTZ9LCAvLyAxNCBQcm9cbiAge3c6IDEyOTAsIGg6IDI3OTZ9LCAvLyAxNCBQcm8gTWF4XG5dO1xuXG5jb25zdCB7IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIH0gPSB1dGlsO1xuXG5jb25zdCBBVE9NX1dBSVRfVElNRU9VVF9NUyA9IDIgKiA2MDAwMDtcbmNvbnN0IEFUT01fSU5JVElBTF9XQUlUX01TID0gMTAwMDtcblxuY29uc3QgT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQgPSAnYWxlcnQnO1xuXG5jb25zdCBWSVNJQkxFID0gJ3Zpc2libGUnO1xuY29uc3QgSU5WSVNJQkxFID0gJ2ludmlzaWJsZSc7XG5jb25zdCBERVRFQ1QgPSAnZGV0ZWN0JztcbmNvbnN0IFZJU0lCSUxJVElFUyA9IFtWSVNJQkxFLCBJTlZJU0lCTEUsIERFVEVDVF07XG5cbi8vIFRoZSBwb3NpdGlvbiBvZiBTYWZhcmkncyB0YWIgKHNlYXJjaCBiYXIpLlxuLy8gU2luY2UgaU9TIDE1LCB0aGUgYmFyIGlzIHRoZSBib3R0b20gYnkgZGVmYXVsdC5cbmNvbnN0IFRBQl9CQVJfUE9TSVRJT05fVE9QID0gJ3RvcCc7XG5jb25zdCBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTSA9ICdib3R0b20nO1xuY29uc3QgVEFCX0JBUl9QT1NTSVRJT05TID0gW1RBQl9CQVJfUE9TSVRJT05fVE9QLCBUQUJfQkFSX1BPU0lUSU9OX0JPVFRPTV07XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIgKGlkKSB7XG4gIGlmICghXy5pc1N0cmluZyhpZCkgJiYgIV8uaXNOdW1iZXIoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChfLmlzU3RyaW5nKGlkKSAmJiBfLmlzRW1wdHkoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChfLmlzTnVtYmVyKGlkKSAmJiBpc05hTihpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbW1hbmRzLnNldEZyYW1lID0gYXN5bmMgZnVuY3Rpb24gc2V0RnJhbWUgKGZyYW1lKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgaWYgKF8uaXNOdWxsKGZyYW1lKSkge1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzID0gW107XG4gICAgdGhpcy5sb2cuZGVidWcoJ0xlYXZpbmcgd2ViIGZyYW1lIGFuZCBnb2luZyBiYWNrIHRvIGRlZmF1bHQgY29udGVudCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoZWxwZXJzLmhhc0VsZW1lbnRJZChmcmFtZSkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChmcmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfZnJhbWVfd2luZG93JywgW2F0b21zRWxlbWVudF0pO1xuICAgIHRoaXMubG9nLmRlYnVnKGBFbnRlcmluZyBuZXcgd2ViIGZyYW1lOiAnJHt2YWx1ZS5XSU5ET1d9J2ApO1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzLnVuc2hpZnQodmFsdWUuV0lORE9XKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhdG9tID0gXy5pc051bWJlcihmcmFtZSkgPyAnZnJhbWVfYnlfaW5kZXgnIDogJ2ZyYW1lX2J5X2lkX29yX25hbWUnO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbShhdG9tLCBbZnJhbWVdKTtcbiAgICBpZiAoXy5pc051bGwodmFsdWUpIHx8IF8uaXNVbmRlZmluZWQodmFsdWUuV0lORE9XKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hGcmFtZUVycm9yKCk7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBFbnRlcmluZyBuZXcgd2ViIGZyYW1lOiAnJHt2YWx1ZS5XSU5ET1d9J2ApO1xuICAgIHRoaXMuY3VyV2ViRnJhbWVzLnVuc2hpZnQodmFsdWUuV0lORE9XKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0Q3NzUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBnZXRDc3NQcm9wZXJ0eSAocHJvcGVydHlOYW1lLCBlbCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF92YWx1ZV9vZl9jc3NfcHJvcGVydHknLCBbYXRvbXNFbGVtZW50LCBwcm9wZXJ0eU5hbWVdKTtcbn07XG5cbmNvbW1hbmRzLnN1Ym1pdCA9IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdCAoZWwpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ3N1Ym1pdCcsIFthdG9tc0VsZW1lbnRdKTtcbn07XG5cbmNvbW1hbmRzLnJlZnJlc2ggPSBhc3luYyBmdW5jdGlvbiByZWZyZXNoICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdyZWZyZXNoJywgW10pO1xufTtcblxuY29tbWFuZHMuZ2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gZ2V0VXJsICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5yZW1vdGUuZXhlY3V0ZSgnd2luZG93LmxvY2F0aW9uLmhyZWYnKTtcbn07XG5cbmNvbW1hbmRzLnRpdGxlID0gYXN5bmMgZnVuY3Rpb24gdGl0bGUgKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCd0aXRsZScsIFtdLCB0cnVlKTtcbn07XG5cbmNvbW1hbmRzLmdldENvb2tpZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb29raWVzICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICB0aGlzLmxvZy5kZWJ1ZygnUmV0cmlldmluZyBhbGwgY29va2llcycpO1xuXG4gIGxldCBzY3JpcHQgPSAncmV0dXJuIGRvY3VtZW50LmNvb2tpZSc7XG4gIGxldCBqc0Nvb2tpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtzY3JpcHQsIFtdXSk7XG5cbiAgbGV0IGNvb2tpZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjb29raWVVdGlscy5jcmVhdGVKV1BDb29raWUodW5kZWZpbmVkLCBqc0Nvb2tpZXMpKSkge1xuICAgICAgY29va2llcy5wdXNoKHtuYW1lLCB2YWx1ZX0pO1xuICAgIH1cbiAgICByZXR1cm4gY29va2llcztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5sb2cuZXJyb3IoZXJyKTtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25FcnJvcihgRXJyb3IgcGFyc2luZyBjb29raWVzIGZyb20gcmVzdWx0OiAnJHtqc0Nvb2tpZXN9J2ApO1xuICB9XG59O1xuXG5jb21tYW5kcy5zZXRDb29raWUgPSBhc3luYyBmdW5jdGlvbiBzZXRDb29raWUgKGNvb2tpZSkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGNvb2tpZSA9IF8uY2xvbmUoY29va2llKTtcblxuICAvLyBpZiBgcGF0aGAgZmllbGQgaXMgbm90IHNwZWNpZmllZCwgU2FmYXJpIHdpbGwgbm90IHVwZGF0ZSBjb29raWVzIGFzIGV4cGVjdGVkOyBlZyBpc3N1ZSAjMTcwOFxuICBpZiAoIWNvb2tpZS5wYXRoKSB7XG4gICAgY29va2llLnBhdGggPSAnLyc7XG4gIH1cblxuICBjb25zdCBqc0Nvb2tpZSA9IGNvb2tpZVV0aWxzLmNyZWF0ZUpTQ29va2llKGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUsIHtcbiAgICBleHBpcmVzOiBfLmlzTnVtYmVyKGNvb2tpZS5leHBpcnkpID8gKG5ldyBEYXRlKGNvb2tpZS5leHBpcnkgKiAxMDAwKSkudG9VVENTdHJpbmcoKSA6XG4gICAgICBjb29raWUuZXhwaXJ5LFxuICAgIHBhdGg6IGNvb2tpZS5wYXRoLFxuICAgIGRvbWFpbjogY29va2llLmRvbWFpbixcbiAgICBodHRwT25seTogY29va2llLmh0dHBPbmx5LFxuICAgIHNlY3VyZTogY29va2llLnNlY3VyZVxuICB9KTtcbiAgbGV0IHNjcmlwdCA9IGBkb2N1bWVudC5jb29raWUgPSAke0pTT04uc3RyaW5naWZ5KGpzQ29va2llKX1gO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtzY3JpcHQsIFtdXSk7XG59O1xuXG5jb21tYW5kcy5kZWxldGVDb29raWUgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVDb29raWUgKGNvb2tpZU5hbWUpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICAvLyBjaGVjayBjb29raWUgZXhpc3RlbmNlXG4gIGxldCBjb29raWVzID0gYXdhaXQgdGhpcy5nZXRDb29raWVzKCk7XG4gIGlmIChfLmluZGV4T2YoXy5tYXAoY29va2llcywgJ25hbWUnKSwgY29va2llTmFtZSkgPT09IC0xKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYENvb2tpZSAnJHtjb29raWVOYW1lfScgbm90IGZvdW5kLiBJZ25vcmluZy5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLl9kZWxldGVDb29raWUoY29va2llTmFtZSk7XG59O1xuXG5jb21tYW5kcy5kZWxldGVDb29raWVzID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ29va2llcyAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgbGV0IGNvb2tpZXMgPSBhd2FpdCB0aGlzLmdldENvb2tpZXMoKTtcbiAgaWYgKGNvb2tpZXMubGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgY29va2llIG9mIGNvb2tpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2RlbGV0ZUNvb2tpZShjb29raWUubmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuaGVscGVycy5fZGVsZXRlQ29va2llID0gYXN5bmMgZnVuY3Rpb24gX2RlbGV0ZUNvb2tpZSAoY29va2llTmFtZSkge1xuICB0aGlzLmxvZy5kZWJ1ZyhgRGVsZXRpbmcgY29va2llICcke2Nvb2tpZU5hbWV9J2ApO1xuICBsZXQgd2ViQ29va2llID0gY29va2llVXRpbHMuZXhwaXJlQ29va2llKGNvb2tpZU5hbWUsIHtwYXRoOiAnLyd9KTtcbiAgbGV0IHNjcmlwdCA9IGBkb2N1bWVudC5jb29raWUgPSAke0pTT04uc3RyaW5naWZ5KHdlYkNvb2tpZSl9YDtcbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbXV0pO1xufTtcblxuaGVscGVycy5jYWNoZVdlYkVsZW1lbnQgPSBmdW5jdGlvbiBjYWNoZVdlYkVsZW1lbnQgKGVsKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGVsKSkge1xuICAgIHJldHVybiBlbDtcbiAgfVxuICBjb25zdCBlbElkID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKCFpc1ZhbGlkRWxlbWVudElkZW50aWZpZXIoZWxJZCkpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cbiAgLy8gSW4gbmV3ZXIgZGVidWdnZXIgcmVsZWFzZXMgZWxlbWVudCBpZGVudGlmaWVycyBsb29rIGxpa2UgYDp3ZGM6MTYyODE1MTY0OTMyNWBcbiAgLy8gV2UgYXNzdW1lIGl0IGlzIHNhZmUgdG8gdXNlIHRoZXNlIHRvIGlkZW50aWZ5IGNhY2hlZCBlbGVtZW50c1xuICBjb25zdCBjYWNoZUlkID0gXy5pbmNsdWRlcyhlbElkLCAnOicpID8gZWxJZCA6IHV0aWwudXVpZFY0KCk7XG4gIHRoaXMud2ViRWxlbWVudHNDYWNoZS5zZXQoY2FjaGVJZCwgZWxJZCk7XG4gIHJldHVybiB1dGlsLndyYXBFbGVtZW50KGNhY2hlSWQpO1xufTtcblxuaGVscGVycy5jYWNoZVdlYkVsZW1lbnRzID0gZnVuY3Rpb24gY2FjaGVXZWJFbGVtZW50cyAocmVzcG9uc2UpIHtcbiAgY29uc3QgdG9DYWNoZWQgPSAodikgPT4gXy5pc0FycmF5KHYpIHx8IF8uaXNQbGFpbk9iamVjdCh2KVxuICAgID8gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKHYpXG4gICAgOiB2O1xuXG4gIGlmIChfLmlzQXJyYXkocmVzcG9uc2UpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLm1hcCh0b0NhY2hlZCk7XG4gIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KHJlc3BvbnNlKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHsuLi5yZXNwb25zZSwgLi4uKHRoaXMuY2FjaGVXZWJFbGVtZW50KHJlc3BvbnNlKSl9O1xuICAgIHJldHVybiBfLnRvUGFpcnMocmVzdWx0KS5yZWR1Y2UoXG4gICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSB0b0NhY2hlZCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcblxuZXh0ZW5zaW9ucy5maW5kV2ViRWxlbWVudE9yRWxlbWVudHMgPSBhc3luYyBmdW5jdGlvbiBmaW5kV2ViRWxlbWVudE9yRWxlbWVudHMgKHN0cmF0ZWd5LCBzZWxlY3RvciwgbWFueSwgY3R4KSB7XG4gIGNvbnN0IGNvbnRleHRFbGVtZW50ID0gXy5pc05pbChjdHgpID8gbnVsbCA6IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGN0eCk7XG4gIGxldCBlbGVtZW50O1xuICBsZXQgZG9GaW5kID0gYXN5bmMgKCkgPT4ge1xuICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKGBmaW5kX2VsZW1lbnQke21hbnkgPyAncycgOiAnJ31gLCBbc3RyYXRlZ3ksIHNlbGVjdG9yLCBjb250ZXh0RWxlbWVudF0pO1xuICAgIHJldHVybiAhXy5pc051bGwoZWxlbWVudCk7XG4gIH07XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5pbXBsaWNpdFdhaXRGb3JDb25kaXRpb24oZG9GaW5kKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5tZXNzYWdlICYmIF8uaXNGdW5jdGlvbihlcnIubWVzc2FnZS5tYXRjaCkgJiYgZXJyLm1lc3NhZ2UubWF0Y2goL0NvbmRpdGlvbiB1bm1ldC8pKSB7XG4gICAgICAvLyBjb25kaXRpb24gd2FzIG5vdCBtZXQgc2V0dGluZyByZXMgdG8gZW1wdHkgYXJyYXlcbiAgICAgIGVsZW1lbnQgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhlbGVtZW50KTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KGVsZW1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hFbGVtZW50RXJyb3IoKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKGVsZW1lbnQpO1xufTtcblxuZXh0ZW5zaW9ucy5jbGlja1dlYkNvb3JkcyA9IGFzeW5jIGZ1bmN0aW9uIGNsaWNrV2ViQ29vcmRzICgpIHtcbiAgbGV0IGNvb3JkcyA9IGF3YWl0IHRoaXMudHJhbnNsYXRlV2ViQ29vcmRzKHRoaXMuY3VyV2ViQ29vcmRzKTtcbiAgYXdhaXQgdGhpcy5jbGlja0Nvb3Jkcyhjb29yZHMpO1xufTtcblxuaGVscGVycy5leGVjdXRlQXRvbSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBdG9tIChhdG9tLCBhcmdzLCBhbHdheXNEZWZhdWx0RnJhbWUgPSBmYWxzZSkge1xuICBsZXQgZnJhbWVzID0gYWx3YXlzRGVmYXVsdEZyYW1lID09PSB0cnVlID8gW10gOiB0aGlzLmN1cldlYkZyYW1lcztcbiAgbGV0IHByb21pc2UgPSB0aGlzLnJlbW90ZS5leGVjdXRlQXRvbShhdG9tLCBhcmdzLCBmcmFtZXMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy53YWl0Rm9yQXRvbShwcm9taXNlKTtcbn07XG5cbmhlbHBlcnMuZXhlY3V0ZUF0b21Bc3luYyA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBdG9tQXN5bmMgKGF0b20sIGFyZ3MsIHJlc3BvbnNlVXJsKSB7XG4gIC8vIHNhdmUgdGhlIHJlc29sdmUgYW5kIHJlamVjdCBtZXRob2RzIG9mIHRoZSBwcm9taXNlIHRvIGJlIHdhaXRlZCBmb3JcbiAgbGV0IHByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5hc3luY1Byb21pc2UgPSB7cmVzb2x2ZSwgcmVqZWN0fTtcbiAgfSk7XG4gIGF3YWl0IHRoaXMucmVtb3RlLmV4ZWN1dGVBdG9tQXN5bmMoYXRvbSwgYXJncywgdGhpcy5jdXJXZWJGcmFtZXMsIHJlc3BvbnNlVXJsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMud2FpdEZvckF0b20ocHJvbWlzZSk7XG59O1xuXG5oZWxwZXJzLmdldEF0b21zRWxlbWVudCA9IGZ1bmN0aW9uIGdldEF0b21zRWxlbWVudCAoZWxPcklkKSB7XG4gIGNvbnN0IGVsSWQgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWxPcklkKTtcbiAgaWYgKCF0aGlzLndlYkVsZW1lbnRzQ2FjaGUuaGFzKGVsSWQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcigpO1xuICB9XG4gIHJldHVybiB7RUxFTUVOVDogdGhpcy53ZWJFbGVtZW50c0NhY2hlLmdldChlbElkKX07XG59O1xuXG5oZWxwZXJzLmNvbnZlcnRFbGVtZW50c0ZvckF0b21zID0gZnVuY3Rpb24gY29udmVydEVsZW1lbnRzRm9yQXRvbXMgKGFyZ3MgPSBbXSkge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4ge1xuICAgIGlmIChoZWxwZXJzLmhhc0VsZW1lbnRJZChhcmcpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBdG9tc0VsZW1lbnQoYXJnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIWlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKSkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgcmV0dXJuIF8uaXNBcnJheShhcmcpID8gdGhpcy5jb252ZXJ0RWxlbWVudHNGb3JBdG9tcyhhcmcpIDogYXJnO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0RWxlbWVudElkID0gZnVuY3Rpb24gZ2V0RWxlbWVudElkIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50LkVMRU1FTlQgfHwgZWxlbWVudFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl07XG59O1xuXG5oZWxwZXJzLmhhc0VsZW1lbnRJZCA9IGZ1bmN0aW9uIGhhc0VsZW1lbnRJZCAoZWxlbWVudCkge1xuICByZXR1cm4gdXRpbC5oYXNWYWx1ZShlbGVtZW50KSAmJiAodXRpbC5oYXNWYWx1ZShlbGVtZW50LkVMRU1FTlQpIHx8IHV0aWwuaGFzVmFsdWUoZWxlbWVudFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl0pKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0U2FmYXJpSXNJcGhvbmUgPSBhc3luYyBmdW5jdGlvbiBnZXRTYWZhcmlJc0lwaG9uZSAoKSB7XG4gIGlmIChfLmlzQm9vbGVhbih0aGlzLl9pc1NhZmFyaUlwaG9uZSkpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTYWZhcmlJcGhvbmU7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoJ3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Jyk7XG4gICAgdGhpcy5faXNTYWZhcmlJcGhvbmUgPSB1c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnaXBob25lJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMubG9nLndhcm4oYFVuYWJsZSB0byBmaW5kIGRldmljZSB0eXBlIGZyb20gdXNlcmFnZW50LiBBc3N1bWluZyBpUGhvbmVgKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2lzU2FmYXJpSXBob25lID8/IHRydWU7XG59O1xuXG5leHRlbnNpb25zLmdldFNhZmFyaURldmljZVNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRTYWZhcmlEZXZpY2VTaXplICgpIHtcbiAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiB7aGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmF2YWlsSGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8sIHdpZHRoOiB3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb307JztcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5leGVjdXRlKHNjcmlwdCk7XG4gIGNvbnN0IFtub3JtSGVpZ2h0LCBub3JtV2lkdGhdID0gaGVpZ2h0ID4gd2lkdGggPyBbaGVpZ2h0LCB3aWR0aF0gOiBbd2lkdGgsIGhlaWdodF07XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5vcm1XaWR0aCxcbiAgICBoZWlnaHQ6IG5vcm1IZWlnaHQsXG4gIH07XG59O1xuXG5leHRlbnNpb25zLmdldFNhZmFyaUlzTm90Y2hlZCA9IGFzeW5jIGZ1bmN0aW9uIGdldFNhZmFyaUlzTm90Y2hlZCAoKSB7XG4gIGlmIChfLmlzQm9vbGVhbih0aGlzLl9pc1NhZmFyaU5vdGNoZWQpKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2FmYXJpTm90Y2hlZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRTYWZhcmlEZXZpY2VTaXplKCk7XG4gICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgTk9UQ0hFRF9ERVZJQ0VfU0laRVMpIHtcbiAgICAgIGlmIChkZXZpY2UudyA9PT0gd2lkdGggJiYgZGV2aWNlLmggPT09IGhlaWdodCkge1xuICAgICAgICB0aGlzLl9pc1NhZmFyaU5vdGNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5sb2cud2FybihgVW5hYmxlIHRvIGZpbmQgZGV2aWNlIHR5cGUgZnJvbSBkaW1lbnNpb25zLiBBc3N1bWluZyB0aGUgZGV2aWNlIGlzIG5vdCBub3RjaGVkYCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiB0aGlzLl9pc1NhZmFyaU5vdGNoZWQgPz8gZmFsc2U7XG59O1xuXG5leHRlbnNpb25zLmdldEV4dHJhVHJhbnNsYXRlV2ViQ29vcmRzT2Zmc2V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFUcmFuc2xhdGVXZWJDb29yZHNPZmZzZXQgKHd2UG9zLCByZWFsRGltcykge1xuICBsZXQgdG9wT2Zmc2V0ID0gMDtcbiAgbGV0IGJvdHRvbU9mZnNldCA9IDA7XG5cbiAgY29uc3QgaXNJcGhvbmUgPSBhd2FpdCB0aGlzLmdldFNhZmFyaUlzSXBob25lKCk7XG5cbiAgLy8gTm8gbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBTbWFydCBBcHAgQmFubmVyIG9yIFRhYiBCYXIgaXMgdmlzaWJsZSBvciBub3RcbiAgLy8gaWYgYWxyZWFkeSBkZWZpbmVkIGJ5IG5hdGl2ZVdlYlRhcFRhYkJhclZpc2liaWxpdHkgb3IgbmF0aXZlV2ViVGFwU21hcnRBcHBCYW5uZXJWaXNpYmlsaXR5IGluIHNldHRpbmdzLlxuICBjb25zdCB7XG4gICAgbmF0aXZlV2ViVGFwVGFiQmFyVmlzaWJpbGl0eSxcbiAgICBuYXRpdmVXZWJUYXBTbWFydEFwcEJhbm5lclZpc2liaWxpdHksXG4gICAgc2FmYXJpVGFiQmFyUG9zaXRpb24gPSB1dGlsLmNvbXBhcmVWZXJzaW9ucyh0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLCAnPj0nLCAnMTUuMCcpICYmIGlzSXBob25lXG4gICAgICA/IFRBQl9CQVJfUE9TSVRJT05fQk9UVE9NIDogVEFCX0JBUl9QT1NJVElPTl9UT1AsXG4gIH0gPSBhd2FpdCB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCk7XG4gIGxldCB0YWJCYXJWaXNpYmlsaXR5ID0gXy5sb3dlckNhc2UobmF0aXZlV2ViVGFwVGFiQmFyVmlzaWJpbGl0eSk7XG4gIGxldCBiYW5uZXJWaXNpYmlsaXR5ID0gXy5sb3dlckNhc2UobmF0aXZlV2ViVGFwU21hcnRBcHBCYW5uZXJWaXNpYmlsaXR5KTtcbiAgY29uc3QgdGFiQmFyUG9zaXRpb24gPSBfLmxvd2VyQ2FzZShzYWZhcmlUYWJCYXJQb3NpdGlvbik7XG5cbiAgaWYgKCFWSVNJQklMSVRJRVMuaW5jbHVkZXModGFiQmFyVmlzaWJpbGl0eSkpIHtcbiAgICB0YWJCYXJWaXNpYmlsaXR5ID0gREVURUNUO1xuICB9XG4gIGlmICghVklTSUJJTElUSUVTLmluY2x1ZGVzKGJhbm5lclZpc2liaWxpdHkpKSB7XG4gICAgYmFubmVyVmlzaWJpbGl0eSA9IERFVEVDVDtcbiAgfVxuXG4gIGlmICghVEFCX0JBUl9QT1NTSVRJT05TLmluY2x1ZGVzKHRhYkJhclBvc2l0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgJHtzYWZhcmlUYWJCYXJQb3NpdGlvbn0gaXMgaW52YWxpZCBhcyBTYWZhcmkgdGFiIGJhciBwb3NpdGlvbi4gQXZhaWxhYmxlIHBvc2l0aW9ucyBhcmUgJHtUQUJfQkFSX1BPU1NJVElPTlN9LmApO1xuICB9XG5cbiAgY29uc3QgaXNOb3RjaGVkID0gaXNJcGhvbmUgJiYgYXdhaXQgdGhpcy5nZXRTYWZhcmlJc05vdGNoZWQoKTtcblxuICBjb25zdCBvcmllbnRhdGlvbiA9IHJlYWxEaW1zLmggPiByZWFsRGltcy53ID8gJ1BPUlRSQUlUJyA6ICdMQU5EU0NBUEUnO1xuXG4gIGNvbnN0IG5vdGNoT2Zmc2V0ID0gaXNOb3RjaGVkXG4gICAgPyB1dGlsLmNvbXBhcmVWZXJzaW9ucyh0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLCAnPScsICcxMy4wJylcbiAgICAgID8gSVBIT05FX1hfTk9UQ0hfT0ZGU0VUX0lPU18xM1xuICAgICAgOiBJUEhPTkVfWF9OT1RDSF9PRkZTRVRfSU9TXG4gICAgOiAwO1xuXG4gIGNvbnN0IGlzU2Nyb2xsZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoJ3JldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID4gMCcpO1xuICBpZiAoaXNTY3JvbGxlZCkge1xuICAgIHRvcE9mZnNldCA9IElQSE9ORV9TQ1JPTExFRF9UT1BfQkFSX0hFSUdIVCArIG5vdGNoT2Zmc2V0O1xuXG4gICAgaWYgKGlzTm90Y2hlZCkge1xuICAgICAgdG9wT2Zmc2V0IC09IElQSE9ORV9YX1NDUk9MTEVEX09GRlNFVDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgaVBob25lIGlzIGxhbmRzY2FwZSB0aGVuIHRoZXJlIGlzIG5vIHRvcCBiYXJcbiAgICBpZiAob3JpZW50YXRpb24gPT09ICdMQU5EU0NBUEUnICYmIGlzSXBob25lKSB7XG4gICAgICB0b3BPZmZzZXQgPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b3BPZmZzZXQgPSB0YWJCYXJQb3NpdGlvbiA9PT0gVEFCX0JBUl9QT1NJVElPTl9CT1RUT00gPyAwIDogSVBIT05FX1RPUF9CQVJfSEVJR0hUO1xuICAgIHRvcE9mZnNldCArPSBub3RjaE9mZnNldDtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgdGFiQmFyUG9zaXRpb24gYW5kIHRvcE9mZnNldDogJHt0YWJCYXJQb3NpdGlvbn0sICR7dG9wT2Zmc2V0fWApO1xuXG4gICAgaWYgKGlzSXBob25lKSB7XG4gICAgICBpZiAob3JpZW50YXRpb24gPT09ICdQT1JUUkFJVCcpIHtcbiAgICAgICAgLy8gVGhlIGJvdHRvbSBiYXIgaXMgb25seSB2aXNpYmxlIHdoZW4gcG9ydHJhaXRcbiAgICAgICAgYm90dG9tT2Zmc2V0ID0gSVBIT05FX0JPVFRPTV9CQVJfT0ZGU0VUO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9wT2Zmc2V0ID0gSVBIT05FX0xBTkRTQ0FQRV9UT1BfQkFSX0hFSUdIVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3JpZW50YXRpb24gPT09ICdMQU5EU0NBUEUnIHx8ICFpc0lwaG9uZSkge1xuICAgICAgaWYgKHRhYkJhclZpc2liaWxpdHkgPT09IFZJU0lCTEUpIHtcbiAgICAgICAgdG9wT2Zmc2V0ICs9IFRBQl9CQVJfT0ZGU0VUO1xuICAgICAgfSBlbHNlIGlmICh0YWJCYXJWaXNpYmlsaXR5ID09PSBERVRFQ1QpIHtcbiAgICAgICAgLy8gVGFicyBvbmx5IGFwcGVhciBpZiB0aGUgZGV2aWNlIGlzIGxhbmRzY2FwZSBvciBpZiBpdCdzIGFuIGlQYWQgc28gd2Ugb25seSBjaGVjayB2aXNpYmlsaXR5IGluIHRoaXMgY2FzZVxuICAgICAgICAvLyBBc3N1bWUgdGhhdCBlYWNoIHRhYiBiYXIgaXMgYSBXZWJWaWV3XG4gICAgICAgIGNvbnN0IGNvbnRleHRzQW5kVmlld3MgPSBhd2FpdCB0aGlzLmdldENvbnRleHRzQW5kVmlld3MoKTtcbiAgICAgICAgY29uc3QgdGFicyA9IGNvbnRleHRzQW5kVmlld3MuZmlsdGVyKChjdHgpID0+IGN0eC5pZC5zdGFydHNXaXRoKCdXRUJWSUVXXycpKTtcblxuICAgICAgICBpZiAodGFicy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kICR7dGFicy5sZW5ndGh9IHRhYnMuIEFzc3VtaW5nIHRoZSB0YWIgYmFyIGlzIHZpc2libGVgKTtcbiAgICAgICAgICB0b3BPZmZzZXQgKz0gVEFCX0JBUl9PRkZTRVQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b3BPZmZzZXQgKz0gYXdhaXQgdGhpcy5nZXRFeHRyYU5hdGl2ZVdlYlRhcE9mZnNldChpc0lwaG9uZSwgYmFubmVyVmlzaWJpbGl0eSk7XG5cbiAgd3ZQb3MueSArPSB0b3BPZmZzZXQ7XG4gIHJlYWxEaW1zLmggLT0gKHRvcE9mZnNldCArIGJvdHRvbU9mZnNldCk7XG59O1xuXG5leHRlbnNpb25zLmdldEV4dHJhTmF0aXZlV2ViVGFwT2Zmc2V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFOYXRpdmVXZWJUYXBPZmZzZXQgKGlzSXBob25lLCBiYW5uZXJWaXNpYmlsaXR5KSB7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIGlmIChiYW5uZXJWaXNpYmlsaXR5ID09PSBWSVNJQkxFKSB7XG4gICAgb2Zmc2V0ICs9IGlzSXBob25lID9cbiAgICAgIElQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQgOlxuICAgICAgSVBBRF9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQ7XG4gIH0gZWxzZSBpZiAoYmFubmVyVmlzaWJpbGl0eSA9PT0gREVURUNUKSB7XG4gICAgLy8gdHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBTbWFydCBBcHAgQmFubmVyXG4gICAgY29uc3QgYmFubmVycyA9IGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdhY2Nlc3NpYmlsaXR5IGlkJywgJ0Nsb3NlIGFwcCBkb3dubG9hZCBvZmZlcicsIHRydWUpO1xuICAgIGlmIChiYW5uZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9mZnNldCArPSBpc0lwaG9uZSA/XG4gICAgICAgIElQSE9ORV9XRUJfQ09PUkRfU01BUlRfQVBQX0JBTk5FUl9PRkZTRVQgOlxuICAgICAgICBJUEFEX1dFQl9DT09SRF9TTUFSVF9BUFBfQkFOTkVSX09GRlNFVDtcbiAgICB9XG4gIH1cblxuICB0aGlzLmxvZy5kZWJ1ZyhgQWRkaXRpb25hbCBuYXRpdmUgd2ViIHRhcCBvZmZzZXQgY29tcHV0ZWQ6ICR7b2Zmc2V0fWApO1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuYXN5bmMgZnVuY3Rpb24gdGFwV2ViRWxlbWVudE5hdGl2ZWx5IChkcml2ZXIsIGF0b21zRWxlbWVudCkge1xuICAvLyB0cnkgdG8gZ2V0IHRoZSB0ZXh0IG9mIHRoZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGFjY2Vzc2libGUgaW4gdGhlXG4gIC8vIG5hdGl2ZSBjb250ZXh0XG4gIHRyeSB7XG4gICAgbGV0IHRleHQgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUF0b20oJ2dldF90ZXh0JywgW2F0b21zRWxlbWVudF0pO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGV4dCA9IGF3YWl0IGRyaXZlci5leGVjdXRlQXRvbSgnZ2V0X2F0dHJpYnV0ZV92YWx1ZScsIFthdG9tc0VsZW1lbnQsICd2YWx1ZSddKTtcbiAgICB9XG5cbiAgICBpZiAodGV4dCkge1xuICAgICAgY29uc3QgZWxzID0gYXdhaXQgZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnYWNjZXNzaWJpbGl0eSBpZCcsIHRleHQsIHRydWUpO1xuICAgICAgaWYgKGVscy5sZW5ndGggPT09IDEgfHwgZWxzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBlbCA9IGVsc1swXTtcbiAgICAgICAgLy8gdXNlIHRhcCBiZWNhdXNlIG9uIGlPUyAxMS4yIGFuZCBiZWxvdyBgbmF0aXZlQ2xpY2tgIGNyYXNoZXMgV0RBXG4gICAgICAgIGNvbnN0IHJlY3QgPSBhd2FpdCBkcml2ZXIucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke3V0aWwudW53cmFwRWxlbWVudChlbCl9L3JlY3RgLCAnR0VUJyk7XG4gICAgICAgIGlmIChlbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgZWwyID0gZWxzWzFdO1xuICAgICAgICAgIGNvbnN0IHJlY3QyID0gYXdhaXQgZHJpdmVyLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWwyKX0vcmVjdGAsICdHRVQnKTtcblxuICAgICAgICAgIGlmICgocmVjdC54ICE9PSByZWN0Mi54IHx8IHJlY3QueSAhPT0gcmVjdDIueSkgfHxcbiAgICAgICAgICAocmVjdC53aWR0aCAhPT0gcmVjdDIud2lkdGggfHwgcmVjdC5oZWlnaHQgIT09IHJlY3QyLmhlaWdodCkpIHtcbiAgICAgICAgICAgIC8vIFRoZXNlIDIgbmF0aXZlIGVsZW1lbnRzIGFyZSBub3QgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHdlYiBlbGVtZW50XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKHJlY3QueCArIHJlY3Qud2lkdGggLyAyKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHJlY3QueSArIHJlY3QuaGVpZ2h0IC8gMiksXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IGRyaXZlci5jbGlja0Nvb3Jkcyhjb29yZHMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGFueSBmYWlsdXJlIHNob3VsZCBmYWxsIHRocm91Z2ggYW5kIHRyaWdnZXIgdGhlIG1vcmUgZWxhYm9yYXRlXG4gICAgLy8gbWV0aG9kIG9mIGNsaWNraW5nXG4gICAgZHJpdmVyLmxvZy53YXJuKGBFcnJvciBhdHRlbXB0aW5nIHRvIGNsaWNrOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXh0ZW5zaW9ucy5uYXRpdmVXZWJUYXAgPSBhc3luYyBmdW5jdGlvbiBuYXRpdmVXZWJUYXAgKGVsKSB7XG4gIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMuZ2V0QXRvbXNFbGVtZW50KGVsKTtcblxuICAvLyBpZiBzdHJpY3QgbmF0aXZlIHRhcCwgZG8gbm90IHRyeSB0byBkbyBpdCB3aXRoIFdEQSBkaXJlY3RseVxuICBpZiAoIShhd2FpdCB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCkpLm5hdGl2ZVdlYlRhcFN0cmljdCAmJiBhd2FpdCB0YXBXZWJFbGVtZW50TmF0aXZlbHkodGhpcywgYXRvbXNFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxvZy53YXJuKCdVbmFibGUgdG8gZG8gc2ltcGxlIG5hdGl2ZSB3ZWIgdGFwLiBBdHRlbXB0aW5nIHRvIGNvbnZlcnQgY29vcmRpbmF0ZXMnKTtcblxuICAvLyBgZ2V0X3RvcF9sZWZ0X2Nvb3JkaW5hdGVzYCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBzb21ldGltZXMsXG4gIC8vIHVubGVzcyB3ZSBwcmUtY2FsbCBib3RoIG9mIHRoZXNlIGZ1bmN0aW9ucyBiZWZvcmUgdGhlIGFjdHVhbCBjYWxsc1xuICBhd2FpdCBCLlByb21pc2UuYWxsKFtcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfc2l6ZScsIFthdG9tc0VsZW1lbnRdKSxcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdG9wX2xlZnRfY29vcmRpbmF0ZXMnLCBbYXRvbXNFbGVtZW50XSksXG4gIF0pO1xuXG4gIGNvbnN0IFtzaXplLCBjb29yZGluYXRlc10gPSBhd2FpdCBCLlByb21pc2UuYWxsKFtcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfc2l6ZScsIFthdG9tc0VsZW1lbnRdKSxcbiAgICB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdG9wX2xlZnRfY29vcmRpbmF0ZXMnLCBbYXRvbXNFbGVtZW50XSksXG4gIF0pO1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBzaXplO1xuICBsZXQge3gsIHl9ID0gY29vcmRpbmF0ZXM7XG4gIHggKz0gd2lkdGggLyAyO1xuICB5ICs9IGhlaWdodCAvIDI7XG5cbiAgdGhpcy5jdXJXZWJDb29yZHMgPSB7eCwgeX07XG4gIGF3YWl0IHRoaXMuY2xpY2tXZWJDb29yZHMoKTtcbn07XG5cbmV4dGVuc2lvbnMuY2xpY2tDb29yZHMgPSBhc3luYyBmdW5jdGlvbiBjbGlja0Nvb3JkcyAoY29vcmRzKSB7XG4gIGF3YWl0IHRoaXMucGVyZm9ybVRvdWNoKFtcbiAgICB7XG4gICAgICBhY3Rpb246ICd0YXAnLFxuICAgICAgb3B0aW9uczogY29vcmRzLFxuICAgIH0sXG4gIF0pO1xufTtcblxuZXh0ZW5zaW9ucy50cmFuc2xhdGVXZWJDb29yZHMgPSBhc3luYyBmdW5jdGlvbiB0cmFuc2xhdGVXZWJDb29yZHMgKGNvb3Jkcykge1xuICB0aGlzLmxvZy5kZWJ1ZyhgVHJhbnNsYXRpbmcgY29vcmRpbmF0ZXMgKCR7SlNPTi5zdHJpbmdpZnkoY29vcmRzKX0pIHRvIHdlYiBjb29yZGluYXRlc2ApO1xuXG4gIC8vIGFic29sdXRpemUgd2ViIGNvb3Jkc1xuICBsZXQgd2VidmlldztcbiAgdHJ5IHtcbiAgICB3ZWJ2aWV3ID0gYXdhaXQgcmV0cnlJbnRlcnZhbCg1LCAxMDAsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVdlYlZpZXcnLCBmYWxzZSkpO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgaWYgKCF3ZWJ2aWV3KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBXZWJWaWV3IGZvdW5kLiBVbmFibGUgdG8gdHJhbnNsYXRlIHdlYiBjb29yZGluYXRlcyBmb3IgbmF0aXZlIHdlYiB0YXAuYCk7XG4gIH1cblxuICB3ZWJ2aWV3ID0gdXRpbC51bndyYXBFbGVtZW50KHdlYnZpZXcpO1xuXG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHt3ZWJ2aWV3fS9yZWN0YCwgJ0dFVCcpO1xuICBjb25zdCB3dlBvcyA9IHt4OiByZWN0LngsIHk6IHJlY3QueX07XG4gIGNvbnN0IHJlYWxEaW1zID0ge3c6IHJlY3Qud2lkdGgsIGg6IHJlY3QuaGVpZ2h0fTtcblxuICBjb25zdCBjbWQgPSAnKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHt3OiB3aW5kb3cuaW5uZXJXaWR0aCwgaDogd2luZG93LmlubmVySGVpZ2h0fTsgfSkoKSc7XG4gIGNvbnN0IHd2RGltcyA9IGF3YWl0IHRoaXMucmVtb3RlLmV4ZWN1dGUoY21kKTtcblxuICAvLyBrZWVwIHRyYWNrIG9mIGltcGxpY2l0IHdhaXQsIGFuZCBzZXQgbG9jYWxseSB0byAwXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNDk4OFxuICBjb25zdCBpbXBsaWNpdFdhaXRNcyA9IHRoaXMuaW1wbGljaXRXYWl0TXM7XG4gIGF3YWl0IHRoaXMuc2V0SW1wbGljaXRXYWl0KDApO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RXh0cmFUcmFuc2xhdGVXZWJDb29yZHNPZmZzZXQod3ZQb3MsIHJlYWxEaW1zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCB0aGlzLnNldEltcGxpY2l0V2FpdChpbXBsaWNpdFdhaXRNcyk7XG4gIH1cblxuICBpZiAod3ZEaW1zICYmIHJlYWxEaW1zICYmIHd2UG9zKSB7XG4gICAgbGV0IHhSYXRpbyA9IHJlYWxEaW1zLncgLyB3dkRpbXMudztcbiAgICBsZXQgeVJhdGlvID0gcmVhbERpbXMuaCAvIHd2RGltcy5oO1xuICAgIGxldCBuZXdDb29yZHMgPSB7XG4gICAgICB4OiB3dlBvcy54ICsgTWF0aC5yb3VuZCh4UmF0aW8gKiBjb29yZHMueCksXG4gICAgICB5OiB3dlBvcy55ICsgTWF0aC5yb3VuZCh5UmF0aW8gKiBjb29yZHMueSksXG4gICAgfTtcblxuICAgIC8vIGFkZGl0aW9uYWwgbG9nZ2luZyBmb3IgY29vcmRpbmF0ZXMsIHNpbmNlIGl0IGlzIHNvbWV0aW1lcyBicm9rZW5cbiAgICAvLyAgIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvOTE1OVxuICAgIHRoaXMubG9nLmRlYnVnKGBDb252ZXJ0ZWQgY29vcmRpbmF0ZXM6ICR7SlNPTi5zdHJpbmdpZnkobmV3Q29vcmRzKX1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgIHJlY3Q6ICR7SlNPTi5zdHJpbmdpZnkocmVjdCl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICB3dlBvczogJHtKU09OLnN0cmluZ2lmeSh3dlBvcyl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICByZWFsRGltczogJHtKU09OLnN0cmluZ2lmeShyZWFsRGltcyl9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgICB3dkRpbXM6ICR7SlNPTi5zdHJpbmdpZnkod3ZEaW1zKX1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICAgIHhSYXRpbzogJHtKU09OLnN0cmluZ2lmeSh4UmF0aW8pfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgICAgeVJhdGlvOiAke0pTT04uc3RyaW5naWZ5KHlSYXRpbyl9YCk7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQ29udmVydGVkIHdlYiBjb29yZHMgJHtKU09OLnN0cmluZ2lmeShjb29yZHMpfSBgICtcbiAgICAgIGBpbnRvIHJlYWwgY29vcmRzICR7SlNPTi5zdHJpbmdpZnkobmV3Q29vcmRzKX1gKTtcbiAgICByZXR1cm4gbmV3Q29vcmRzO1xuICB9XG59O1xuXG5leHRlbnNpb25zLmNoZWNrRm9yQWxlcnQgPSBhc3luYyBmdW5jdGlvbiBjaGVja0ZvckFsZXJ0ICgpIHtcbiAgcmV0dXJuIF8uaXNTdHJpbmcoYXdhaXQgdGhpcy5nZXRBbGVydFRleHQoKSk7XG59O1xuXG5leHRlbnNpb25zLndhaXRGb3JBdG9tID0gYXN5bmMgZnVuY3Rpb24gd2FpdEZvckF0b20gKHByb21pc2UpIHtcbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcblxuICAvLyBuZWVkIHRvIGNoZWNrIGZvciBhbGVydCB3aGlsZSB0aGUgYXRvbSBpcyBiZWluZyBleGVjdXRlZC5cbiAgLy8gc28gbm90aWZ5IG91cnNlbHZlcyB3aGVuIGl0IGhhcHBlbnNcbiAgY29uc3QgdGltZWRBdG9tUHJvbWlzZSA9IEIucmVzb2x2ZShwcm9taXNlKS50aW1lb3V0KEFUT01fV0FJVF9USU1FT1VUX01TKTtcbiAgY29uc3QgaGFuZGxlUHJvbWlzZUVycm9yID0gYXN5bmMgKHApID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEVycm9yID0gKGVyciBpbnN0YW5jZW9mIEIuQWdncmVnYXRlRXJyb3IpID8gZXJyWzBdIDogZXJyO1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEVycm9yIHJlY2VpdmVkIHdoaWxlIGV4ZWN1dGluZyBhdG9tOiAke29yaWdpbmFsRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIGlmIChvcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgQi5UaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGdldCBhbnkgcmVzcG9uc2UgZm9yIGF0b20gZXhlY3V0aW9uIGFmdGVyIGAgK1xuICAgICAgICAgIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgICAgfVxuICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICB9XG4gIH07XG4gIC8vIGlmIHRoZSBhdG9tIHByb21pc2UgaXMgZnVsZmlsbGVkIHdpdGhpbiBBVE9NX0lOSVRJQUxfV0FJVF9NU1xuICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGFuIGFsZXJ0IHByZXNlbmNlXG4gIGF3YWl0IGhhbmRsZVByb21pc2VFcnJvcihCLmFueShbQi5kZWxheShBVE9NX0lOSVRJQUxfV0FJVF9NUyksIHRpbWVkQXRvbVByb21pc2VdKSk7XG4gIGlmICh0aW1lZEF0b21Qcm9taXNlLmlzRnVsZmlsbGVkKCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGltZWRBdG9tUHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLm90aGVyd2lzZSBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gdW5leHBlY3RlZCBhbGVydCBjb3ZlcmluZyB0aGUgZWxlbWVudFxuICBpZiAoIV8uaXNQbGFpbk9iamVjdCh0aGlzLl93YWl0aW5nQXRvbXMpKSB7XG4gICAgdGhpcy5fd2FpdGluZ0F0b21zID0ge1xuICAgICAgY291bnQ6IDAsXG4gICAgICBhbGVydE5vdGlmaWVyOiBuZXcgRXZlbnRFbWl0dGVyKCksXG4gICAgICBhbGVydE1vbml0b3I6IEIucmVzb2x2ZSgpLFxuICAgIH07XG4gIH1cbiAgdGhpcy5fd2FpdGluZ0F0b21zLmNvdW50Kys7XG5cbiAgbGV0IG9uQWxlcnRDYWxsYmFjaztcbiAgdHJ5IHtcbiAgICAvLyBvbmx5IHJlc3RhcnQgdGhlIG1vbml0b3IgaWYgaXQgaXMgbm90IHJ1bm5pbmcgYWxyZWFkeVxuICAgIGlmICh0aGlzLl93YWl0aW5nQXRvbXMuYWxlcnRNb25pdG9yLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0TW9uaXRvciA9IEIucmVzb2x2ZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB3aGlsZSAodGhpcy5fd2FpdGluZ0F0b21zLmNvdW50ID4gMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja0ZvckFsZXJ0KCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0Tm90aWZpZXIuZW1pdChPTl9PQlNUUlVDVElOR19BTEVSVF9FVkVOVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICAgIGF3YWl0IEIuZGVsYXkoQVRPTV9JTklUSUFMX1dBSVRfTVMgLyAyKTtcbiAgICAgICAgfVxuICAgICAgfSkoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG9uQWxlcnRDYWxsYmFjayA9ICgpID0+IHJlamVjdChuZXcgZXJyb3JzLlVuZXhwZWN0ZWRBbGVydE9wZW5FcnJvcigpKTtcbiAgICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5hbGVydE5vdGlmaWVyLm9uY2UoT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQsIG9uQWxlcnRDYWxsYmFjayk7XG4gICAgICBoYW5kbGVQcm9taXNlRXJyb3IodGltZWRBdG9tUHJvbWlzZSlcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG9uQWxlcnRDYWxsYmFjaykge1xuICAgICAgdGhpcy5fd2FpdGluZ0F0b21zLmFsZXJ0Tm90aWZpZXIucmVtb3ZlTGlzdGVuZXIoT05fT0JTVFJVQ1RJTkdfQUxFUlRfRVZFTlQsIG9uQWxlcnRDYWxsYmFjayk7XG4gICAgfVxuICAgIHRoaXMuX3dhaXRpbmdBdG9tcy5jb3VudC0tO1xuICB9XG59O1xuXG5leHRlbnNpb25zLm1vYmlsZVdlYk5hdiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVdlYk5hdiAobmF2VHlwZSkge1xuICB0aGlzLnJlbW90ZS5hbGxvd05hdmlnYXRpb25XaXRob3V0UmVsb2FkID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtgaGlzdG9yeS4ke25hdlR5cGV9KCk7YCwgbnVsbF0pO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMucmVtb3RlLmFsbG93TmF2aWdhdGlvbldpdGhvdXRSZWxvYWQgPSBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTYWZhcmlPcHRzXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHJlZmVyZW5jZXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgU2FmYXJpIHNldHRpbmdzIHRvIGJlIHVwZGF0ZWQuXG4gKiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgc2V0dGluZyBuYW1lcyBhbmQgdGhlaXIgdmFsdWVzIGNvdWxkIGJlIHJldHJpZXZlZCBieVxuICogY2hhbmdpbmcgdGhlIGNvcnJlc3BvbmRpbmcgU2FmYXJpIHNldHRpbmdzIGluIHRoZSBVSSBhbmQgdGhlbiBpbnNwZWN0aW5nXG4gKiAnTGlicmFyeS9QcmVmZXJlbmNlcy9jb20uYXBwbGUubW9iaWxlc2FmYXJpLnBsaXN0JyBmaWxlIGluc2lkZSBvZlxuICogY29tLmFwcGxlLm1vYmlsZXNhZmFyaSBhcHAgY29udGFpbmVyLlxuICogVGhlIGZ1bGwgcGF0aCB0byB0aGUgTW9iaWxlIFNhZmFyaSdzIGNvbnRhaW5lciBjb3VsZCBiZSByZXRyaWV2ZWQgZnJvbVxuICogYHhjcnVuIHNpbWN0bCBnZXRfYXBwX2NvbnRhaW5lciA8c2ltX3VkaWQ+IGNvbS5hcHBsZS5tb2JpbGVzYWZhcmkgZGF0YWBcbiAqIGNvbW1hbmQgb3V0cHV0LlxuICogVXNlIHRoZSBgeGNydW4gc2ltY3RsIHNwYXduIDxzaW1fdWRpZD4gZGVmYXVsdHMgcmVhZCA8cGF0aF90b19wbGlzdD5gIGNvbW1hbmRcbiAqIHRvIHByaW50IHRoZSBwbGlzdCBjb250ZW50IHRvIHRoZSBUZXJtaW5hbC5cbiAqL1xuXG4vKipcbiAqIFVwZGF0ZXMgcHJlZmVyZW5jZXMgb2YgTW9iaWxlIFNhZmFyaSBvbiBTaW11bGF0b3JcbiAqXG4gKiBAcGFyYW0ge1NhZmFyaU9wdHN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlVXBkYXRlU2FmYXJpUHJlZmVyZW5jZXMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcyAob3B0cyA9IHt9KSB7XG4gIGlmICghdGhpcy5pc1NpbXVsYXRvcigpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGV4dGVuc2lvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgU2ltdWxhdG9yJyk7XG4gIH1cbiAgY29uc3QgeyBwcmVmZXJlbmNlcyB9ID0gb3B0cztcbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QocHJlZmVyZW5jZXMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignXCJwcmVmZXJlbmNlc1wiIGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgfVxuXG4gIHRoaXMubG9nLmRlYnVnKGBBYm91dCB0byB1cGRhdGUgU2FmYXJpIHByZWZlcmVuY2VzOiAke0pTT04uc3RyaW5naWZ5KHByZWZlcmVuY2VzKX1gKTtcbiAgYXdhaXQgdGhpcy5vcHRzLmRldmljZS51cGRhdGVTYWZhcmlTZXR0aW5ncyhwcmVmZXJlbmNlcyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGNvbW1hbmRzLCBleHRlbnNpb25zLCBoZWxwZXJzKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRyxFQUFFO0FBQ2hDLE1BQU1DLDhCQUE4QixHQUFHLEVBQUU7QUFDekMsTUFBTUMsd0JBQXdCLEdBQUcsRUFBRTtBQUNuQyxNQUFNQyx5QkFBeUIsR0FBRyxFQUFFO0FBQ3BDLE1BQU1DLDRCQUE0QixHQUFHLEVBQUU7QUFFdkMsTUFBTUMsK0JBQStCLEdBQUcsRUFBRTtBQUMxQyxNQUFNQyx3QkFBd0IsR0FBRyxFQUFFO0FBQ25DLE1BQU1DLGNBQWMsR0FBRyxFQUFFO0FBQ3pCLE1BQU1DLHdDQUF3QyxHQUFHLEVBQUU7QUFDbkQsTUFBTUMsc0NBQXNDLEdBQUcsRUFBRTtBQUVqRCxNQUFNQyxvQkFBb0IsR0FBRyxDQUMzQjtFQUFDQyxDQUFDLEVBQUUsSUFBSTtFQUFFQyxDQUFDLEVBQUU7QUFBSSxDQUFDLEVBQ2xCO0VBQUNELENBQUMsRUFBRSxHQUFHO0VBQUVDLENBQUMsRUFB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
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","names":["IPHONE_TOP_BAR_HEIGHT","IPHONE_SCROLLED_TOP_BAR_HEIGHT","IPHONE_X_SCROLLED_OFFSET","IPHONE_X_NOTCH_OFFSET_IOS","IPHONE_X_NOTCH_OFFSET_IOS_13","IPHONE_LANDSCAPE_TOP_BAR_HEIGHT","IPHONE_BOTTOM_BAR_OFFSET","TAB_BAR_OFFSET","IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET","IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET","NOTCHED_DEVICE_SIZES","w","h","W3C_WEB_ELEMENT_IDENTIFIER","util","ATOM_WAIT_TIMEOUT_MS","ATOM_INITIAL_WAIT_MS","ON_OBSTRUCTING_ALERT_EVENT","VISIBLE","INVISIBLE","DETECT","VISIBILITIES","TAB_BAR_POSITION_TOP","TAB_BAR_POSITION_BOTTOM","TAB_BAR_POSSITIONS","commands","helpers","extensions","isValidElementIdentifier","id","_","isString","isNumber","isEmpty","isNaN","setFrame","frame","isWebContext","errors","NotImplementedError","isNull","curWebFrames","log","debug","hasElementId","atomsElement","getAtomsElement","value","executeAtom","WINDOW","unshift","atom","isUndefined","NoSuchFrameError","getCssProperty","propertyName","el","submit","refresh","getUrl","remote","execute","title","getCookies","script","jsCookies","cookies","name","toPairs","cookieUtils","createJWPCookie","undefined","push","err","error","UnknownError","setCookie","cookie","clone","path","jsCookie","createJSCookie","expires","expiry","Date","toUTCString","domain","httpOnly","secure","JSON","stringify","deleteCookie","cookieName","indexOf","map","_deleteCookie","deleteCookies","length","webCookie","expireCookie","cacheWebElement","isPlainObject","elId","unwrapElement","cacheId","includes","uuidV4","webElementsCache","set","wrapElement","cacheWebElements","response","toCached","v","isArray","result","reduce","acc","key","findWebElementOrElements","strategy","selector","many","ctx","contextElement","isNil","element","doFind","implicitWaitForCondition","message","isFunction","match","NoSuchElementError","clickWebCoords","coords","translateWebCoords","curWebCoords","clickCoords","args","alwaysDefaultFrame","frames","promise","waitForAtom","executeAtomAsync","responseUrl","B","resolve","reject","asyncPromise","elOrId","has","StaleElementReferenceError","ELEMENT","get","convertElementsForAtoms","arg","isErrorType","getElementId","hasValue","getSafariIsIphone","isBoolean","_isSafariIphone","userAgent","toLowerCase","warn","getSafariDeviceSize","width","height","normHeight","normWidth","getSafariIsNotched","_isSafariNotched","device","getExtraTranslateWebCoordsOffset","wvPos","realDims","topOffset","bottomOffset","isIphone","nativeWebTapTabBarVisibility","nativeWebTapSmartAppBannerVisibility","safariTabBarPosition","compareVersions","opts","platformVersion","settings","getSettings","tabBarVisibility","lowerCase","bannerVisibility","tabBarPosition","InvalidArgumentError","isNotched","orientation","notchOffset","isScrolled","contextsAndViews","getContextsAndViews","tabs","filter","startsWith","getExtraNativeWebTapOffset","y","offset","banners","findNativeElementOrElements","tapWebElementNatively","driver","text","els","rect","proxyCommand","el2","rect2","x","Math","round","nativeWebTap","nativeWebTapStrict","Promise","all","size","coordinates","performTouch","action","options","webview","retryInterval","ign","Error","cmd","wvDims","implicitWaitMs","setImplicitWait","xRatio","yRatio","newCoords","checkForAlert","getAlertText","timer","timing","Timer","start","timedAtomPromise","timeout","handlePromiseError","p","originalError","AggregateError","TimeoutError","getDuration","asMilliSeconds","toFixed","any","delay","isFulfilled","_waitingAtoms","count","alertNotifier","EventEmitter","alertMonitor","onAlertCallback","isResolved","emit","UnexpectedAlertOpenError","once","then","catch","removeListener","mobileWebNav","navType","allowNavigationWithoutReload","mobileUpdateSafariPreferences","isSimulator","preferences","updateSafariSettings","Object","assign"],"sources":["../../../lib/commands/web.js"],"sourcesContent":["import { retryInterval } from 'asyncbox';\nimport { util, timing } from 'appium/support';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport cookieUtils from '../cookies';\nimport { EventEmitter } from 'events';\n\nconst IPHONE_TOP_BAR_HEIGHT = 71;\nconst IPHONE_SCROLLED_TOP_BAR_HEIGHT = 41;\nconst IPHONE_X_SCROLLED_OFFSET = 55;\nconst IPHONE_X_NOTCH_OFFSET_IOS = 24;\nconst IPHONE_X_NOTCH_OFFSET_IOS_13 = 20;\n\nconst IPHONE_LANDSCAPE_TOP_BAR_HEIGHT = 51;\nconst IPHONE_BOTTOM_BAR_OFFSET = 49;\nconst TAB_BAR_OFFSET = 33;\nconst IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET = 84;\nconst IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET = 95;\n\nconst NOTCHED_DEVICE_SIZES = [\n {w: 1125, h: 2436}, // 11 Pro, X, Xs\n {w: 828, h: 1792}, // 11, Xr\n {w: 1242, h: 2688}, // 11 Pro Max, Xs Max\n];\n\nconst { W3C_WEB_ELEMENT_IDENTIFIER } = util;\n\nconst ATOM_WAIT_TIMEOUT_MS = 2 * 60000;\nconst ATOM_INITIAL_WAIT_MS = 1000;\n\nconst ON_OBSTRUCTING_ALERT_EVENT = 'alert';\n\nconst VISIBLE = 'visible';\nconst INVISIBLE = 'invisible';\nconst DETECT = 'detect';\nconst VISIBILITIES = [VISIBLE, INVISIBLE, DETECT];\n\n// The position of Safari's tab (search bar).\n// Since iOS 15, the bar is the bottom by default.\nconst TAB_BAR_POSITION_TOP = 'top';\nconst TAB_BAR_POSITION_BOTTOM = 'bottom';\nconst TAB_BAR_POSSITIONS = [TAB_BAR_POSITION_TOP, TAB_BAR_POSITION_BOTTOM];\n\nconst commands = {}, helpers = {}, extensions = {};\n\nfunction isValidElementIdentifier (id) {\n if (!_.isString(id) && !_.isNumber(id)) {\n return false;\n }\n if (_.isString(id) && _.isEmpty(id)) {\n return false;\n }\n if (_.isNumber(id) && isNaN(id)) {\n return false;\n }\n return true;\n}\n\ncommands.setFrame = async function setFrame (frame) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n if (_.isNull(frame)) {\n this.curWebFrames = [];\n this.log.debug('Leaving web frame and going back to default content');\n return;\n }\n\n if (helpers.hasElementId(frame)) {\n const atomsElement = this.getAtomsElement(frame);\n const value = await this.executeAtom('get_frame_window', [atomsElement]);\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n } else {\n const atom = _.isNumber(frame) ? 'frame_by_index' : 'frame_by_id_or_name';\n const value = await this.executeAtom(atom, [frame]);\n if (_.isNull(value) || _.isUndefined(value.WINDOW)) {\n throw new errors.NoSuchFrameError();\n }\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n }\n};\n\ncommands.getCssProperty = async function getCssProperty (propertyName, el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n return await this.executeAtom('get_value_of_css_property', [atomsElement, propertyName]);\n};\n\ncommands.submit = async function submit (el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n await this.executeAtom('submit', [atomsElement]);\n};\n\ncommands.refresh = async function refresh () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n await this.executeAtom('refresh', []);\n};\n\ncommands.getUrl = async function getUrl () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.remote.execute('window.location.href');\n};\n\ncommands.title = async function title () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.executeAtom('title', [], true);\n};\n\ncommands.getCookies = async function getCookies () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n this.log.debug('Retrieving all cookies');\n\n let script = 'return document.cookie';\n let jsCookies = await this.executeAtom('execute_script', [script, []]);\n\n let cookies = [];\n try {\n for (let [name, value] of _.toPairs(cookieUtils.createJWPCookie(undefined, jsCookies))) {\n cookies.push({name, value});\n }\n return cookies;\n } catch (err) {\n this.log.error(err);\n throw new errors.UnknownError(`Error parsing cookies from result: '${jsCookies}'`);\n }\n};\n\ncommands.setCookie = async function setCookie (cookie) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n cookie = _.clone(cookie);\n\n // if `path` field is not specified, Safari will not update cookies as expected; eg issue #1708\n if (!cookie.path) {\n cookie.path = '/';\n }\n\n const jsCookie = cookieUtils.createJSCookie(cookie.name, cookie.value, {\n expires: _.isNumber(cookie.expiry) ? (new Date(cookie.expiry * 1000)).toUTCString() :\n cookie.expiry,\n path: cookie.path,\n domain: cookie.domain,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure\n });\n let script = `document.cookie = ${JSON.stringify(jsCookie)}`;\n await this.executeAtom('execute_script', [script, []]);\n};\n\ncommands.deleteCookie = async function deleteCookie (cookieName) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n // check cookie existence\n let cookies = await this.getCookies();\n if (_.indexOf(_.map(cookies, 'name'), cookieName) === -1) {\n this.log.debug(`Cookie '${cookieName}' not found. Ignoring.`);\n return true;\n }\n\n return await this._deleteCookie(cookieName);\n};\n\ncommands.deleteCookies = async function deleteCookies () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n let cookies = await this.getCookies();\n if (cookies.length) {\n for (let cookie of cookies) {\n await this._deleteCookie(cookie.name);\n }\n }\n return true;\n};\n\nhelpers._deleteCookie = async function _deleteCookie (cookieName) {\n this.log.debug(`Deleting cookie '${cookieName}'`);\n let webCookie = cookieUtils.expireCookie(cookieName, {path: '/'});\n let script = `document.cookie = ${JSON.stringify(webCookie)}`;\n await this.executeAtom('execute_script', [script, []]);\n};\n\nhelpers.cacheWebElement = function cacheWebElement (el) {\n if (!_.isPlainObject(el)) {\n return el;\n }\n const elId = util.unwrapElement(el);\n if (!isValidElementIdentifier(elId)) {\n return el;\n }\n // In newer debugger releases element identifiers look like `:wdc:1628151649325`\n // We assume it is safe to use these to identify cached elements\n const cacheId = _.includes(elId, ':') ? elId : util.uuidV4();\n this.webElementsCache.set(cacheId, elId);\n return util.wrapElement(cacheId);\n};\n\nhelpers.cacheWebElements = function cacheWebElements (response) {\n const toCached = (v) => _.isArray(v) || _.isPlainObject(v)\n ? this.cacheWebElements(v)\n : v;\n\n if (_.isArray(response)) {\n return response.map(toCached);\n } else if (_.isPlainObject(response)) {\n const result = {...response, ...(this.cacheWebElement(response))};\n return _.toPairs(result).reduce(\n (acc, [key, value]) => {\n acc[key] = toCached(value);\n return acc;\n }, {}\n );\n }\n return response;\n};\n\nextensions.findWebElementOrElements = async function findWebElementOrElements (strategy, selector, many, ctx) {\n const contextElement = _.isNil(ctx) ? null : this.getAtomsElement(ctx);\n let element;\n let doFind = async () => {\n element = await this.executeAtom(`find_element${many ? 's' : ''}`, [strategy, selector, contextElement]);\n return !_.isNull(element);\n };\n try {\n await this.implicitWaitForCondition(doFind);\n } catch (err) {\n if (err.message && _.isFunction(err.message.match) && err.message.match(/Condition unmet/)) {\n // condition was not met setting res to empty array\n element = [];\n } else {\n throw err;\n }\n }\n\n if (many) {\n return this.cacheWebElements(element);\n }\n if (_.isEmpty(element)) {\n throw new errors.NoSuchElementError();\n }\n return this.cacheWebElements(element);\n};\n\nextensions.clickWebCoords = async function clickWebCoords () {\n let coords = await this.translateWebCoords(this.curWebCoords);\n await this.clickCoords(coords);\n};\n\nhelpers.executeAtom = async function executeAtom (atom, args, alwaysDefaultFrame = false) {\n let frames = alwaysDefaultFrame === true ? [] : this.curWebFrames;\n let promise = this.remote.executeAtom(atom, args, frames);\n return await this.waitForAtom(promise);\n};\n\nhelpers.executeAtomAsync = async function executeAtomAsync (atom, args, responseUrl) {\n // save the resolve and reject methods of the promise to be waited for\n let promise = new B((resolve, reject) => {\n this.asyncPromise = {resolve, reject};\n });\n await this.remote.executeAtomAsync(atom, args, this.curWebFrames, responseUrl);\n return await this.waitForAtom(promise);\n};\n\nhelpers.getAtomsElement = function getAtomsElement (elOrId) {\n const elId = util.unwrapElement(elOrId);\n if (!this.webElementsCache.has(elId)) {\n throw new errors.StaleElementReferenceError();\n }\n return {ELEMENT: this.webElementsCache.get(elId)};\n};\n\nhelpers.convertElementsForAtoms = function convertElementsForAtoms (args = []) {\n return args.map((arg) => {\n if (helpers.hasElementId(arg)) {\n try {\n return this.getAtomsElement(arg);\n } catch (err) {\n if (!isErrorType(err, errors.StaleElementReferenceError)) {\n throw err;\n }\n }\n return arg;\n }\n return _.isArray(arg) ? this.convertElementsForAtoms(arg) : arg;\n });\n};\n\nhelpers.getElementId = function getElementId (element) {\n return element.ELEMENT || element[W3C_WEB_ELEMENT_IDENTIFIER];\n};\n\nhelpers.hasElementId = function hasElementId (element) {\n return util.hasValue(element) && (util.hasValue(element.ELEMENT) || util.hasValue(element[W3C_WEB_ELEMENT_IDENTIFIER]));\n};\n\nextensions.getSafariIsIphone = async function getSafariIsIphone () {\n if (_.isBoolean(this._isSafariIphone)) {\n return this._isSafariIphone;\n }\n try {\n const userAgent = await this.execute('return navigator.userAgent');\n this._isSafariIphone = userAgent.toLowerCase().includes('iphone');\n } catch (err) {\n this.log.warn(`Unable to find device type from useragent. Assuming iPhone`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariIphone ?? true;\n};\n\nextensions.getSafariDeviceSize = async function getSafariDeviceSize () {\n const script = 'return {height: window.screen.availHeight * window.devicePixelRatio, width: window.screen.availWidth * window.devicePixelRatio};';\n const {width, height} = await this.execute(script);\n const [normHeight, normWidth] = height > width ? [height, width] : [width, height];\n return {\n width: normWidth,\n height: normHeight,\n };\n};\n\nextensions.getSafariIsNotched = async function getSafariIsNotched () {\n if (_.isBoolean(this._isSafariNotched)) {\n return this._isSafariNotched;\n }\n\n try {\n const {width, height} = await this.getSafariDeviceSize();\n for (const device of NOTCHED_DEVICE_SIZES) {\n if (device.w === width && device.h === height) {\n this._isSafariNotched = true;\n }\n }\n } catch (err) {\n this.log.warn(`Unable to find device type from dimensions. Assuming the device is not notched`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariNotched ?? false;\n};\n\nextensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWebCoordsOffset (wvPos, realDims) {\n let topOffset = 0;\n let bottomOffset = 0;\n\n const isIphone = await this.getSafariIsIphone();\n\n // No need to check whether the Smart App Banner or Tab Bar is visible or not\n // if already defined by nativeWebTapTabBarVisibility or nativeWebTapSmartAppBannerVisibility in settings.\n const {\n nativeWebTapTabBarVisibility,\n nativeWebTapSmartAppBannerVisibility,\n safariTabBarPosition = util.compareVersions(this.opts.platformVersion, '>=', '15.0') && isIphone\n ? TAB_BAR_POSITION_BOTTOM : TAB_BAR_POSITION_TOP,\n } = await this.settings.getSettings();\n let tabBarVisibility = _.lowerCase(nativeWebTapTabBarVisibility);\n let bannerVisibility = _.lowerCase(nativeWebTapSmartAppBannerVisibility);\n const tabBarPosition = _.lowerCase(safariTabBarPosition);\n\n if (!VISIBILITIES.includes(tabBarVisibility)) {\n tabBarVisibility = DETECT;\n }\n if (!VISIBILITIES.includes(bannerVisibility)) {\n bannerVisibility = DETECT;\n }\n\n if (!TAB_BAR_POSSITIONS.includes(tabBarPosition)) {\n throw new errors.InvalidArgumentError(\n `${safariTabBarPosition} is invalid as Safari tab bar position. Available positions are ${TAB_BAR_POSSITIONS}.`);\n }\n\n const isNotched = isIphone && await this.getSafariIsNotched();\n\n const orientation = realDims.h > realDims.w ? 'PORTRAIT' : 'LANDSCAPE';\n\n const notchOffset = isNotched\n ? util.compareVersions(this.opts.platformVersion, '=', '13.0')\n ? IPHONE_X_NOTCH_OFFSET_IOS_13\n : IPHONE_X_NOTCH_OFFSET_IOS\n : 0;\n\n const isScrolled = await this.execute('return document.documentElement.scrollTop > 0');\n if (isScrolled) {\n topOffset = IPHONE_SCROLLED_TOP_BAR_HEIGHT + notchOffset;\n\n if (isNotched) {\n topOffset -= IPHONE_X_SCROLLED_OFFSET;\n }\n\n // If the iPhone is landscape then there is no top bar\n if (orientation === 'LANDSCAPE' && isIphone) {\n topOffset = 0;\n }\n } else {\n topOffset = tabBarPosition === TAB_BAR_POSITION_BOTTOM ? 0 : IPHONE_TOP_BAR_HEIGHT;\n topOffset += notchOffset;\n this.log.debug(`tabBarPosition and topOffset: ${tabBarPosition}, ${topOffset}`);\n\n if (isIphone) {\n if (orientation === 'PORTRAIT') {\n // The bottom bar is only visible when portrait\n bottomOffset = IPHONE_BOTTOM_BAR_OFFSET;\n } else {\n topOffset = IPHONE_LANDSCAPE_TOP_BAR_HEIGHT;\n }\n }\n\n if (orientation === 'LANDSCAPE' || !isIphone) {\n if (tabBarVisibility === VISIBLE) {\n topOffset += TAB_BAR_OFFSET;\n } else if (tabBarVisibility === DETECT) {\n // Tabs only appear if the device is landscape or if it's an iPad so we only check visibility in this case\n // Assume that each tab bar is a WebView\n const contextsAndViews = await this.getContextsAndViews();\n const tabs = contextsAndViews.filter((ctx) => ctx.id.startsWith('WEBVIEW_'));\n\n if (tabs.length > 1) {\n this.log.debug(`Found ${tabs.length} tabs. Assuming the tab bar is visible`);\n topOffset += TAB_BAR_OFFSET;\n }\n }\n }\n }\n\n topOffset += await this.getExtraNativeWebTapOffset(isIphone, bannerVisibility);\n\n wvPos.y += topOffset;\n realDims.h -= (topOffset + bottomOffset);\n};\n\nextensions.getExtraNativeWebTapOffset = async function getExtraNativeWebTapOffset (isIphone, bannerVisibility) {\n let offset = 0;\n\n if (bannerVisibility === VISIBLE) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n } else if (bannerVisibility === DETECT) {\n // try to see if there is an Smart App Banner\n const banners = await this.findNativeElementOrElements('accessibility id', 'Close app download offer', true);\n if (banners.length > 0) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n }\n }\n\n this.log.debug(`Additional native web tap offset computed: ${offset}`);\n return offset;\n};\n\nasync function tapWebElementNatively (driver, atomsElement) {\n // try to get the text of the element, which will be accessible in the\n // native context\n try {\n let text = await driver.executeAtom('get_text', [atomsElement]);\n if (!text) {\n text = await driver.executeAtom('get_attribute_value', [atomsElement, 'value']);\n }\n\n if (text) {\n const els = await driver.findNativeElementOrElements('accessibility id', text, true);\n if (els.length === 1 || els.length === 2) {\n const el = els[0];\n // use tap because on iOS 11.2 and below `nativeClick` crashes WDA\n const rect = await driver.proxyCommand(`/element/${util.unwrapElement(el)}/rect`, 'GET');\n if (els.length === 2) {\n const el2 = els[1];\n const rect2 = await driver.proxyCommand(`/element/${util.unwrapElement(el2)}/rect`, 'GET');\n\n if ((rect.x !== rect2.x || rect.y !== rect2.y) ||\n (rect.width !== rect2.width || rect.height !== rect2.height)) {\n // These 2 native elements are not referring to the same web element\n return false;\n }\n }\n const coords = {\n x: Math.round(rect.x + rect.width / 2),\n y: Math.round(rect.y + rect.height / 2),\n };\n await driver.clickCoords(coords);\n return true;\n }\n }\n } catch (err) {\n // any failure should fall through and trigger the more elaborate\n // method of clicking\n driver.log.warn(`Error attempting to click: ${err.message}`);\n }\n return false;\n}\n\nextensions.nativeWebTap = async function nativeWebTap (el) {\n const atomsElement = this.getAtomsElement(el);\n\n // if strict native tap, do not try to do it with WDA directly\n if (!(await this.settings.getSettings()).nativeWebTapStrict && await tapWebElementNatively(this, atomsElement)) {\n return;\n }\n this.log.warn('Unable to do simple native web tap. Attempting to convert coordinates');\n\n // `get_top_left_coordinates` returns the wrong value sometimes,\n // unless we pre-call both of these functions before the actual calls\n await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n\n const [size, coordinates] = await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n const {width, height} = size;\n let {x, y} = coordinates;\n x += width / 2;\n y += height / 2;\n\n this.curWebCoords = {x, y};\n await this.clickWebCoords();\n};\n\nextensions.clickCoords = async function clickCoords (coords) {\n await this.performTouch([\n {\n action: 'tap',\n options: coords,\n },\n ]);\n};\n\nextensions.translateWebCoords = async function translateWebCoords (coords) {\n this.log.debug(`Translating coordinates (${JSON.stringify(coords)}) to web coordinates`);\n\n // absolutize web coords\n let webview;\n try {\n webview = await retryInterval(5, 100, async () => await this.findNativeElementOrElements('class name', 'XCUIElementTypeWebView', false));\n } catch (ign) {}\n\n if (!webview) {\n throw new Error(`No WebView found. Unable to translate web coordinates for native web tap.`);\n }\n\n webview = util.unwrapElement(webview);\n\n const rect = await this.proxyCommand(`/element/${webview}/rect`, 'GET');\n const wvPos = {x: rect.x, y: rect.y};\n const realDims = {w: rect.width, h: rect.height};\n\n const cmd = '(function () { return {w: window.innerWidth, h: window.innerHeight}; })()';\n const wvDims = await this.remote.execute(cmd);\n\n // keep track of implicit wait, and set locally to 0\n // https://github.com/appium/appium/issues/14988\n const implicitWaitMs = this.implicitWaitMs;\n await this.setImplicitWait(0);\n try {\n await this.getExtraTranslateWebCoordsOffset(wvPos, realDims);\n } finally {\n await this.setImplicitWait(implicitWaitMs);\n }\n\n if (wvDims && realDims && wvPos) {\n let xRatio = realDims.w / wvDims.w;\n let yRatio = realDims.h / wvDims.h;\n let newCoords = {\n x: wvPos.x + Math.round(xRatio * coords.x),\n y: wvPos.y + Math.round(yRatio * coords.y),\n };\n\n // additional logging for coordinates, since it is sometimes broken\n // see https://github.com/appium/appium/issues/9159\n this.log.debug(`Converted coordinates: ${JSON.stringify(newCoords)}`);\n this.log.debug(` rect: ${JSON.stringify(rect)}`);\n this.log.debug(` wvPos: ${JSON.stringify(wvPos)}`);\n this.log.debug(` realDims: ${JSON.stringify(realDims)}`);\n this.log.debug(` wvDims: ${JSON.stringify(wvDims)}`);\n this.log.debug(` xRatio: ${JSON.stringify(xRatio)}`);\n this.log.debug(` yRatio: ${JSON.stringify(yRatio)}`);\n\n this.log.debug(`Converted web coords ${JSON.stringify(coords)} ` +\n `into real coords ${JSON.stringify(newCoords)}`);\n return newCoords;\n }\n};\n\nextensions.checkForAlert = async function checkForAlert () {\n return _.isString(await this.getAlertText());\n};\n\nextensions.waitForAtom = async function waitForAtom (promise) {\n const timer = new timing.Timer().start();\n\n // need to check for alert while the atom is being executed.\n // so notify ourselves when it happens\n const timedAtomPromise = B.resolve(promise).timeout(ATOM_WAIT_TIMEOUT_MS);\n const handlePromiseError = async (p) => {\n try {\n return await p;\n } catch (err) {\n const originalError = (err instanceof B.AggregateError) ? err[0] : err;\n this.log.debug(`Error received while executing atom: ${originalError.message}`);\n if (originalError instanceof B.TimeoutError) {\n throw new Error(`Did not get any response for atom execution after ` +\n `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n }\n throw originalError;\n }\n };\n // if the atom promise is fulfilled within ATOM_INITIAL_WAIT_MS\n // then we don't need to check for an alert presence\n await handlePromiseError(B.any([B.delay(ATOM_INITIAL_WAIT_MS), timedAtomPromise]));\n if (timedAtomPromise.isFulfilled()) {\n return await timedAtomPromise;\n }\n\n // ...otherwise make sure there is no unexpected alert covering the element\n if (!_.isPlainObject(this._waitingAtoms)) {\n this._waitingAtoms = {\n count: 0,\n alertNotifier: new EventEmitter(),\n alertMonitor: B.resolve(),\n };\n }\n this._waitingAtoms.count++;\n\n let onAlertCallback;\n try {\n // only restart the monitor if it is not running already\n if (this._waitingAtoms.alertMonitor.isResolved()) {\n this._waitingAtoms.alertMonitor = B.resolve((async () => {\n while (this._waitingAtoms.count > 0) {\n try {\n if (await this.checkForAlert()) {\n this._waitingAtoms.alertNotifier.emit(ON_OBSTRUCTING_ALERT_EVENT);\n }\n } catch (ign) {}\n await B.delay(ATOM_INITIAL_WAIT_MS / 2);\n }\n })());\n }\n\n return await new B((resolve, reject) => {\n onAlertCallback = () => reject(new errors.UnexpectedAlertOpenError());\n this._waitingAtoms.alertNotifier.once(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n handlePromiseError(timedAtomPromise)\n // eslint-disable-next-line promise/prefer-await-to-then\n .then(resolve)\n .catch(reject);\n });\n } finally {\n if (onAlertCallback) {\n this._waitingAtoms.alertNotifier.removeListener(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n }\n this._waitingAtoms.count--;\n }\n};\n\nextensions.mobileWebNav = async function mobileWebNav (navType) {\n this.remote.allowNavigationWithoutReload = true;\n try {\n await this.executeAtom('execute_script', [`history.${navType}();`, null]);\n } finally {\n this.remote.allowNavigationWithoutReload = false;\n }\n};\n\n/**\n * @typedef {Object} SafariOpts\n * @property {object} preferences An object containing Safari settings to be updated.\n * The list of available setting names and their values could be retrieved by\n * changing the corresponding Safari settings in the UI and then inspecting\n * 'Library/Preferences/com.apple.mobilesafari.plist' file inside of\n * com.apple.mobilesafari app container.\n * The full path to the Mobile Safari's container could be retrieved from\n * `xcrun simctl get_app_container <sim_udid> com.apple.mobilesafari data`\n * command output.\n * Use the `xcrun simctl spawn <sim_udid> defaults read <path_to_plist>` command\n * to print the plist content to the Terminal.\n */\n\n/**\n * Updates preferences of Mobile Safari on Simulator\n *\n * @param {SafariOpts} opts\n */\ncommands.mobileUpdateSafariPreferences = async function mobileUpdateSafariPreferences (opts = {}) {\n if (!this.isSimulator()) {\n throw new Error('This extension is only available for Simulator');\n }\n const { preferences } = opts;\n if (!_.isPlainObject(preferences)) {\n throw new errors.InvalidArgumentError('\"preferences\" argument must be a valid object');\n }\n\n this.log.debug(`About to update Safari preferences: ${JSON.stringify(preferences)}`);\n await this.opts.device.updateSafariSettings(preferences);\n};\n\nObject.assign(commands, extensions, helpers);\n\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"web.js","names":["IPHONE_TOP_BAR_HEIGHT","IPHONE_SCROLLED_TOP_BAR_HEIGHT","IPHONE_X_SCROLLED_OFFSET","IPHONE_X_NOTCH_OFFSET_IOS","IPHONE_X_NOTCH_OFFSET_IOS_13","IPHONE_LANDSCAPE_TOP_BAR_HEIGHT","IPHONE_BOTTOM_BAR_OFFSET","TAB_BAR_OFFSET","IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET","IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET","NOTCHED_DEVICE_SIZES","w","h","W3C_WEB_ELEMENT_IDENTIFIER","util","ATOM_WAIT_TIMEOUT_MS","ATOM_INITIAL_WAIT_MS","ON_OBSTRUCTING_ALERT_EVENT","VISIBLE","INVISIBLE","DETECT","VISIBILITIES","TAB_BAR_POSITION_TOP","TAB_BAR_POSITION_BOTTOM","TAB_BAR_POSSITIONS","commands","helpers","extensions","isValidElementIdentifier","id","_","isString","isNumber","isEmpty","isNaN","setFrame","frame","isWebContext","errors","NotImplementedError","isNull","curWebFrames","log","debug","hasElementId","atomsElement","getAtomsElement","value","executeAtom","WINDOW","unshift","atom","isUndefined","NoSuchFrameError","getCssProperty","propertyName","el","submit","refresh","getUrl","remote","execute","title","getCookies","script","jsCookies","cookies","name","toPairs","cookieUtils","createJWPCookie","undefined","push","err","error","UnknownError","setCookie","cookie","clone","path","jsCookie","createJSCookie","expires","expiry","Date","toUTCString","domain","httpOnly","secure","JSON","stringify","deleteCookie","cookieName","indexOf","map","_deleteCookie","deleteCookies","length","webCookie","expireCookie","cacheWebElement","isPlainObject","elId","unwrapElement","cacheId","includes","uuidV4","webElementsCache","set","wrapElement","cacheWebElements","response","toCached","v","isArray","result","reduce","acc","key","findWebElementOrElements","strategy","selector","many","ctx","contextElement","isNil","element","doFind","implicitWaitForCondition","message","isFunction","match","NoSuchElementError","clickWebCoords","coords","translateWebCoords","curWebCoords","clickCoords","args","alwaysDefaultFrame","frames","promise","waitForAtom","executeAtomAsync","responseUrl","B","resolve","reject","asyncPromise","elOrId","has","StaleElementReferenceError","ELEMENT","get","convertElementsForAtoms","arg","isErrorType","getElementId","hasValue","getSafariIsIphone","isBoolean","_isSafariIphone","userAgent","toLowerCase","warn","getSafariDeviceSize","width","height","normHeight","normWidth","getSafariIsNotched","_isSafariNotched","device","getExtraTranslateWebCoordsOffset","wvPos","realDims","topOffset","bottomOffset","isIphone","nativeWebTapTabBarVisibility","nativeWebTapSmartAppBannerVisibility","safariTabBarPosition","compareVersions","opts","platformVersion","settings","getSettings","tabBarVisibility","lowerCase","bannerVisibility","tabBarPosition","InvalidArgumentError","isNotched","orientation","notchOffset","isScrolled","contextsAndViews","getContextsAndViews","tabs","filter","startsWith","getExtraNativeWebTapOffset","y","offset","banners","findNativeElementOrElements","tapWebElementNatively","driver","text","els","rect","proxyCommand","el2","rect2","x","Math","round","nativeWebTap","nativeWebTapStrict","Promise","all","size","coordinates","performTouch","action","options","webview","retryInterval","ign","Error","cmd","wvDims","implicitWaitMs","setImplicitWait","xRatio","yRatio","newCoords","checkForAlert","getAlertText","timer","timing","Timer","start","timedAtomPromise","timeout","handlePromiseError","p","originalError","AggregateError","TimeoutError","getDuration","asMilliSeconds","toFixed","any","delay","isFulfilled","_waitingAtoms","count","alertNotifier","EventEmitter","alertMonitor","onAlertCallback","isResolved","emit","UnexpectedAlertOpenError","once","then","catch","removeListener","mobileWebNav","navType","allowNavigationWithoutReload","mobileUpdateSafariPreferences","isSimulator","preferences","updateSafariSettings","Object","assign"],"sources":["../../../lib/commands/web.js"],"sourcesContent":["import { retryInterval } from 'asyncbox';\nimport { util, timing } from 'appium/support';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport { errors, isErrorType } from 'appium/driver';\nimport cookieUtils from '../cookies';\nimport { EventEmitter } from 'events';\n\nconst IPHONE_TOP_BAR_HEIGHT = 71;\nconst IPHONE_SCROLLED_TOP_BAR_HEIGHT = 41;\nconst IPHONE_X_SCROLLED_OFFSET = 55;\nconst IPHONE_X_NOTCH_OFFSET_IOS = 24;\nconst IPHONE_X_NOTCH_OFFSET_IOS_13 = 20;\n\nconst IPHONE_LANDSCAPE_TOP_BAR_HEIGHT = 51;\nconst IPHONE_BOTTOM_BAR_OFFSET = 49;\nconst TAB_BAR_OFFSET = 33;\nconst IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET = 84;\nconst IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET = 95;\n\nconst NOTCHED_DEVICE_SIZES = [\n {w: 1125, h: 2436}, // 11 Pro, X, Xs\n {w: 828, h: 1792}, // 11, Xr\n {w: 1242, h: 2688}, // 11 Pro Max, Xs Max\n {w: 1080, h: 2340}, // 13 mini, 12 mini\n {w: 1170, h: 2532}, // 14, 13, 13 Pro, 12, 12 Pro\n {w: 1284, h: 2778}, // 14 Plus, 13 Pro Max, 12 Pro Max\n {w: 1179, h: 2556}, // 14 Pro\n {w: 1290, h: 2796}, // 14 Pro Max\n];\n\nconst { W3C_WEB_ELEMENT_IDENTIFIER } = util;\n\nconst ATOM_WAIT_TIMEOUT_MS = 2 * 60000;\nconst ATOM_INITIAL_WAIT_MS = 1000;\n\nconst ON_OBSTRUCTING_ALERT_EVENT = 'alert';\n\nconst VISIBLE = 'visible';\nconst INVISIBLE = 'invisible';\nconst DETECT = 'detect';\nconst VISIBILITIES = [VISIBLE, INVISIBLE, DETECT];\n\n// The position of Safari's tab (search bar).\n// Since iOS 15, the bar is the bottom by default.\nconst TAB_BAR_POSITION_TOP = 'top';\nconst TAB_BAR_POSITION_BOTTOM = 'bottom';\nconst TAB_BAR_POSSITIONS = [TAB_BAR_POSITION_TOP, TAB_BAR_POSITION_BOTTOM];\n\nconst commands = {}, helpers = {}, extensions = {};\n\nfunction isValidElementIdentifier (id) {\n if (!_.isString(id) && !_.isNumber(id)) {\n return false;\n }\n if (_.isString(id) && _.isEmpty(id)) {\n return false;\n }\n if (_.isNumber(id) && isNaN(id)) {\n return false;\n }\n return true;\n}\n\ncommands.setFrame = async function setFrame (frame) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n if (_.isNull(frame)) {\n this.curWebFrames = [];\n this.log.debug('Leaving web frame and going back to default content');\n return;\n }\n\n if (helpers.hasElementId(frame)) {\n const atomsElement = this.getAtomsElement(frame);\n const value = await this.executeAtom('get_frame_window', [atomsElement]);\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n } else {\n const atom = _.isNumber(frame) ? 'frame_by_index' : 'frame_by_id_or_name';\n const value = await this.executeAtom(atom, [frame]);\n if (_.isNull(value) || _.isUndefined(value.WINDOW)) {\n throw new errors.NoSuchFrameError();\n }\n this.log.debug(`Entering new web frame: '${value.WINDOW}'`);\n this.curWebFrames.unshift(value.WINDOW);\n }\n};\n\ncommands.getCssProperty = async function getCssProperty (propertyName, el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n return await this.executeAtom('get_value_of_css_property', [atomsElement, propertyName]);\n};\n\ncommands.submit = async function submit (el) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n const atomsElement = this.getAtomsElement(el);\n await this.executeAtom('submit', [atomsElement]);\n};\n\ncommands.refresh = async function refresh () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n await this.executeAtom('refresh', []);\n};\n\ncommands.getUrl = async function getUrl () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.remote.execute('window.location.href');\n};\n\ncommands.title = async function title () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n return await this.executeAtom('title', [], true);\n};\n\ncommands.getCookies = async function getCookies () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n this.log.debug('Retrieving all cookies');\n\n let script = 'return document.cookie';\n let jsCookies = await this.executeAtom('execute_script', [script, []]);\n\n let cookies = [];\n try {\n for (let [name, value] of _.toPairs(cookieUtils.createJWPCookie(undefined, jsCookies))) {\n cookies.push({name, value});\n }\n return cookies;\n } catch (err) {\n this.log.error(err);\n throw new errors.UnknownError(`Error parsing cookies from result: '${jsCookies}'`);\n }\n};\n\ncommands.setCookie = async function setCookie (cookie) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n cookie = _.clone(cookie);\n\n // if `path` field is not specified, Safari will not update cookies as expected; eg issue #1708\n if (!cookie.path) {\n cookie.path = '/';\n }\n\n const jsCookie = cookieUtils.createJSCookie(cookie.name, cookie.value, {\n expires: _.isNumber(cookie.expiry) ? (new Date(cookie.expiry * 1000)).toUTCString() :\n cookie.expiry,\n path: cookie.path,\n domain: cookie.domain,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure\n });\n let script = `document.cookie = ${JSON.stringify(jsCookie)}`;\n await this.executeAtom('execute_script', [script, []]);\n};\n\ncommands.deleteCookie = async function deleteCookie (cookieName) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n // check cookie existence\n let cookies = await this.getCookies();\n if (_.indexOf(_.map(cookies, 'name'), cookieName) === -1) {\n this.log.debug(`Cookie '${cookieName}' not found. Ignoring.`);\n return true;\n }\n\n return await this._deleteCookie(cookieName);\n};\n\ncommands.deleteCookies = async function deleteCookies () {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n let cookies = await this.getCookies();\n if (cookies.length) {\n for (let cookie of cookies) {\n await this._deleteCookie(cookie.name);\n }\n }\n return true;\n};\n\nhelpers._deleteCookie = async function _deleteCookie (cookieName) {\n this.log.debug(`Deleting cookie '${cookieName}'`);\n let webCookie = cookieUtils.expireCookie(cookieName, {path: '/'});\n let script = `document.cookie = ${JSON.stringify(webCookie)}`;\n await this.executeAtom('execute_script', [script, []]);\n};\n\nhelpers.cacheWebElement = function cacheWebElement (el) {\n if (!_.isPlainObject(el)) {\n return el;\n }\n const elId = util.unwrapElement(el);\n if (!isValidElementIdentifier(elId)) {\n return el;\n }\n // In newer debugger releases element identifiers look like `:wdc:1628151649325`\n // We assume it is safe to use these to identify cached elements\n const cacheId = _.includes(elId, ':') ? elId : util.uuidV4();\n this.webElementsCache.set(cacheId, elId);\n return util.wrapElement(cacheId);\n};\n\nhelpers.cacheWebElements = function cacheWebElements (response) {\n const toCached = (v) => _.isArray(v) || _.isPlainObject(v)\n ? this.cacheWebElements(v)\n : v;\n\n if (_.isArray(response)) {\n return response.map(toCached);\n } else if (_.isPlainObject(response)) {\n const result = {...response, ...(this.cacheWebElement(response))};\n return _.toPairs(result).reduce(\n (acc, [key, value]) => {\n acc[key] = toCached(value);\n return acc;\n }, {}\n );\n }\n return response;\n};\n\nextensions.findWebElementOrElements = async function findWebElementOrElements (strategy, selector, many, ctx) {\n const contextElement = _.isNil(ctx) ? null : this.getAtomsElement(ctx);\n let element;\n let doFind = async () => {\n element = await this.executeAtom(`find_element${many ? 's' : ''}`, [strategy, selector, contextElement]);\n return !_.isNull(element);\n };\n try {\n await this.implicitWaitForCondition(doFind);\n } catch (err) {\n if (err.message && _.isFunction(err.message.match) && err.message.match(/Condition unmet/)) {\n // condition was not met setting res to empty array\n element = [];\n } else {\n throw err;\n }\n }\n\n if (many) {\n return this.cacheWebElements(element);\n }\n if (_.isEmpty(element)) {\n throw new errors.NoSuchElementError();\n }\n return this.cacheWebElements(element);\n};\n\nextensions.clickWebCoords = async function clickWebCoords () {\n let coords = await this.translateWebCoords(this.curWebCoords);\n await this.clickCoords(coords);\n};\n\nhelpers.executeAtom = async function executeAtom (atom, args, alwaysDefaultFrame = false) {\n let frames = alwaysDefaultFrame === true ? [] : this.curWebFrames;\n let promise = this.remote.executeAtom(atom, args, frames);\n return await this.waitForAtom(promise);\n};\n\nhelpers.executeAtomAsync = async function executeAtomAsync (atom, args, responseUrl) {\n // save the resolve and reject methods of the promise to be waited for\n let promise = new B((resolve, reject) => {\n this.asyncPromise = {resolve, reject};\n });\n await this.remote.executeAtomAsync(atom, args, this.curWebFrames, responseUrl);\n return await this.waitForAtom(promise);\n};\n\nhelpers.getAtomsElement = function getAtomsElement (elOrId) {\n const elId = util.unwrapElement(elOrId);\n if (!this.webElementsCache.has(elId)) {\n throw new errors.StaleElementReferenceError();\n }\n return {ELEMENT: this.webElementsCache.get(elId)};\n};\n\nhelpers.convertElementsForAtoms = function convertElementsForAtoms (args = []) {\n return args.map((arg) => {\n if (helpers.hasElementId(arg)) {\n try {\n return this.getAtomsElement(arg);\n } catch (err) {\n if (!isErrorType(err, errors.StaleElementReferenceError)) {\n throw err;\n }\n }\n return arg;\n }\n return _.isArray(arg) ? this.convertElementsForAtoms(arg) : arg;\n });\n};\n\nhelpers.getElementId = function getElementId (element) {\n return element.ELEMENT || element[W3C_WEB_ELEMENT_IDENTIFIER];\n};\n\nhelpers.hasElementId = function hasElementId (element) {\n return util.hasValue(element) && (util.hasValue(element.ELEMENT) || util.hasValue(element[W3C_WEB_ELEMENT_IDENTIFIER]));\n};\n\nextensions.getSafariIsIphone = async function getSafariIsIphone () {\n if (_.isBoolean(this._isSafariIphone)) {\n return this._isSafariIphone;\n }\n try {\n const userAgent = await this.execute('return navigator.userAgent');\n this._isSafariIphone = userAgent.toLowerCase().includes('iphone');\n } catch (err) {\n this.log.warn(`Unable to find device type from useragent. Assuming iPhone`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariIphone ?? true;\n};\n\nextensions.getSafariDeviceSize = async function getSafariDeviceSize () {\n const script = 'return {height: window.screen.availHeight * window.devicePixelRatio, width: window.screen.availWidth * window.devicePixelRatio};';\n const {width, height} = await this.execute(script);\n const [normHeight, normWidth] = height > width ? [height, width] : [width, height];\n return {\n width: normWidth,\n height: normHeight,\n };\n};\n\nextensions.getSafariIsNotched = async function getSafariIsNotched () {\n if (_.isBoolean(this._isSafariNotched)) {\n return this._isSafariNotched;\n }\n\n try {\n const {width, height} = await this.getSafariDeviceSize();\n for (const device of NOTCHED_DEVICE_SIZES) {\n if (device.w === width && device.h === height) {\n this._isSafariNotched = true;\n }\n }\n } catch (err) {\n this.log.warn(`Unable to find device type from dimensions. Assuming the device is not notched`);\n this.log.debug(`Error: ${err.message}`);\n }\n return this._isSafariNotched ?? false;\n};\n\nextensions.getExtraTranslateWebCoordsOffset = async function getExtraTranslateWebCoordsOffset (wvPos, realDims) {\n let topOffset = 0;\n let bottomOffset = 0;\n\n const isIphone = await this.getSafariIsIphone();\n\n // No need to check whether the Smart App Banner or Tab Bar is visible or not\n // if already defined by nativeWebTapTabBarVisibility or nativeWebTapSmartAppBannerVisibility in settings.\n const {\n nativeWebTapTabBarVisibility,\n nativeWebTapSmartAppBannerVisibility,\n safariTabBarPosition = util.compareVersions(this.opts.platformVersion, '>=', '15.0') && isIphone\n ? TAB_BAR_POSITION_BOTTOM : TAB_BAR_POSITION_TOP,\n } = await this.settings.getSettings();\n let tabBarVisibility = _.lowerCase(nativeWebTapTabBarVisibility);\n let bannerVisibility = _.lowerCase(nativeWebTapSmartAppBannerVisibility);\n const tabBarPosition = _.lowerCase(safariTabBarPosition);\n\n if (!VISIBILITIES.includes(tabBarVisibility)) {\n tabBarVisibility = DETECT;\n }\n if (!VISIBILITIES.includes(bannerVisibility)) {\n bannerVisibility = DETECT;\n }\n\n if (!TAB_BAR_POSSITIONS.includes(tabBarPosition)) {\n throw new errors.InvalidArgumentError(\n `${safariTabBarPosition} is invalid as Safari tab bar position. Available positions are ${TAB_BAR_POSSITIONS}.`);\n }\n\n const isNotched = isIphone && await this.getSafariIsNotched();\n\n const orientation = realDims.h > realDims.w ? 'PORTRAIT' : 'LANDSCAPE';\n\n const notchOffset = isNotched\n ? util.compareVersions(this.opts.platformVersion, '=', '13.0')\n ? IPHONE_X_NOTCH_OFFSET_IOS_13\n : IPHONE_X_NOTCH_OFFSET_IOS\n : 0;\n\n const isScrolled = await this.execute('return document.documentElement.scrollTop > 0');\n if (isScrolled) {\n topOffset = IPHONE_SCROLLED_TOP_BAR_HEIGHT + notchOffset;\n\n if (isNotched) {\n topOffset -= IPHONE_X_SCROLLED_OFFSET;\n }\n\n // If the iPhone is landscape then there is no top bar\n if (orientation === 'LANDSCAPE' && isIphone) {\n topOffset = 0;\n }\n } else {\n topOffset = tabBarPosition === TAB_BAR_POSITION_BOTTOM ? 0 : IPHONE_TOP_BAR_HEIGHT;\n topOffset += notchOffset;\n this.log.debug(`tabBarPosition and topOffset: ${tabBarPosition}, ${topOffset}`);\n\n if (isIphone) {\n if (orientation === 'PORTRAIT') {\n // The bottom bar is only visible when portrait\n bottomOffset = IPHONE_BOTTOM_BAR_OFFSET;\n } else {\n topOffset = IPHONE_LANDSCAPE_TOP_BAR_HEIGHT;\n }\n }\n\n if (orientation === 'LANDSCAPE' || !isIphone) {\n if (tabBarVisibility === VISIBLE) {\n topOffset += TAB_BAR_OFFSET;\n } else if (tabBarVisibility === DETECT) {\n // Tabs only appear if the device is landscape or if it's an iPad so we only check visibility in this case\n // Assume that each tab bar is a WebView\n const contextsAndViews = await this.getContextsAndViews();\n const tabs = contextsAndViews.filter((ctx) => ctx.id.startsWith('WEBVIEW_'));\n\n if (tabs.length > 1) {\n this.log.debug(`Found ${tabs.length} tabs. Assuming the tab bar is visible`);\n topOffset += TAB_BAR_OFFSET;\n }\n }\n }\n }\n\n topOffset += await this.getExtraNativeWebTapOffset(isIphone, bannerVisibility);\n\n wvPos.y += topOffset;\n realDims.h -= (topOffset + bottomOffset);\n};\n\nextensions.getExtraNativeWebTapOffset = async function getExtraNativeWebTapOffset (isIphone, bannerVisibility) {\n let offset = 0;\n\n if (bannerVisibility === VISIBLE) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n } else if (bannerVisibility === DETECT) {\n // try to see if there is an Smart App Banner\n const banners = await this.findNativeElementOrElements('accessibility id', 'Close app download offer', true);\n if (banners.length > 0) {\n offset += isIphone ?\n IPHONE_WEB_COORD_SMART_APP_BANNER_OFFSET :\n IPAD_WEB_COORD_SMART_APP_BANNER_OFFSET;\n }\n }\n\n this.log.debug(`Additional native web tap offset computed: ${offset}`);\n return offset;\n};\n\nasync function tapWebElementNatively (driver, atomsElement) {\n // try to get the text of the element, which will be accessible in the\n // native context\n try {\n let text = await driver.executeAtom('get_text', [atomsElement]);\n if (!text) {\n text = await driver.executeAtom('get_attribute_value', [atomsElement, 'value']);\n }\n\n if (text) {\n const els = await driver.findNativeElementOrElements('accessibility id', text, true);\n if (els.length === 1 || els.length === 2) {\n const el = els[0];\n // use tap because on iOS 11.2 and below `nativeClick` crashes WDA\n const rect = await driver.proxyCommand(`/element/${util.unwrapElement(el)}/rect`, 'GET');\n if (els.length === 2) {\n const el2 = els[1];\n const rect2 = await driver.proxyCommand(`/element/${util.unwrapElement(el2)}/rect`, 'GET');\n\n if ((rect.x !== rect2.x || rect.y !== rect2.y) ||\n (rect.width !== rect2.width || rect.height !== rect2.height)) {\n // These 2 native elements are not referring to the same web element\n return false;\n }\n }\n const coords = {\n x: Math.round(rect.x + rect.width / 2),\n y: Math.round(rect.y + rect.height / 2),\n };\n await driver.clickCoords(coords);\n return true;\n }\n }\n } catch (err) {\n // any failure should fall through and trigger the more elaborate\n // method of clicking\n driver.log.warn(`Error attempting to click: ${err.message}`);\n }\n return false;\n}\n\nextensions.nativeWebTap = async function nativeWebTap (el) {\n const atomsElement = this.getAtomsElement(el);\n\n // if strict native tap, do not try to do it with WDA directly\n if (!(await this.settings.getSettings()).nativeWebTapStrict && await tapWebElementNatively(this, atomsElement)) {\n return;\n }\n this.log.warn('Unable to do simple native web tap. Attempting to convert coordinates');\n\n // `get_top_left_coordinates` returns the wrong value sometimes,\n // unless we pre-call both of these functions before the actual calls\n await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n\n const [size, coordinates] = await B.Promise.all([\n this.executeAtom('get_size', [atomsElement]),\n this.executeAtom('get_top_left_coordinates', [atomsElement]),\n ]);\n const {width, height} = size;\n let {x, y} = coordinates;\n x += width / 2;\n y += height / 2;\n\n this.curWebCoords = {x, y};\n await this.clickWebCoords();\n};\n\nextensions.clickCoords = async function clickCoords (coords) {\n await this.performTouch([\n {\n action: 'tap',\n options: coords,\n },\n ]);\n};\n\nextensions.translateWebCoords = async function translateWebCoords (coords) {\n this.log.debug(`Translating coordinates (${JSON.stringify(coords)}) to web coordinates`);\n\n // absolutize web coords\n let webview;\n try {\n webview = await retryInterval(5, 100, async () => await this.findNativeElementOrElements('class name', 'XCUIElementTypeWebView', false));\n } catch (ign) {}\n\n if (!webview) {\n throw new Error(`No WebView found. Unable to translate web coordinates for native web tap.`);\n }\n\n webview = util.unwrapElement(webview);\n\n const rect = await this.proxyCommand(`/element/${webview}/rect`, 'GET');\n const wvPos = {x: rect.x, y: rect.y};\n const realDims = {w: rect.width, h: rect.height};\n\n const cmd = '(function () { return {w: window.innerWidth, h: window.innerHeight}; })()';\n const wvDims = await this.remote.execute(cmd);\n\n // keep track of implicit wait, and set locally to 0\n // https://github.com/appium/appium/issues/14988\n const implicitWaitMs = this.implicitWaitMs;\n await this.setImplicitWait(0);\n try {\n await this.getExtraTranslateWebCoordsOffset(wvPos, realDims);\n } finally {\n await this.setImplicitWait(implicitWaitMs);\n }\n\n if (wvDims && realDims && wvPos) {\n let xRatio = realDims.w / wvDims.w;\n let yRatio = realDims.h / wvDims.h;\n let newCoords = {\n x: wvPos.x + Math.round(xRatio * coords.x),\n y: wvPos.y + Math.round(yRatio * coords.y),\n };\n\n // additional logging for coordinates, since it is sometimes broken\n // see https://github.com/appium/appium/issues/9159\n this.log.debug(`Converted coordinates: ${JSON.stringify(newCoords)}`);\n this.log.debug(` rect: ${JSON.stringify(rect)}`);\n this.log.debug(` wvPos: ${JSON.stringify(wvPos)}`);\n this.log.debug(` realDims: ${JSON.stringify(realDims)}`);\n this.log.debug(` wvDims: ${JSON.stringify(wvDims)}`);\n this.log.debug(` xRatio: ${JSON.stringify(xRatio)}`);\n this.log.debug(` yRatio: ${JSON.stringify(yRatio)}`);\n\n this.log.debug(`Converted web coords ${JSON.stringify(coords)} ` +\n `into real coords ${JSON.stringify(newCoords)}`);\n return newCoords;\n }\n};\n\nextensions.checkForAlert = async function checkForAlert () {\n return _.isString(await this.getAlertText());\n};\n\nextensions.waitForAtom = async function waitForAtom (promise) {\n const timer = new timing.Timer().start();\n\n // need to check for alert while the atom is being executed.\n // so notify ourselves when it happens\n const timedAtomPromise = B.resolve(promise).timeout(ATOM_WAIT_TIMEOUT_MS);\n const handlePromiseError = async (p) => {\n try {\n return await p;\n } catch (err) {\n const originalError = (err instanceof B.AggregateError) ? err[0] : err;\n this.log.debug(`Error received while executing atom: ${originalError.message}`);\n if (originalError instanceof B.TimeoutError) {\n throw new Error(`Did not get any response for atom execution after ` +\n `${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);\n }\n throw originalError;\n }\n };\n // if the atom promise is fulfilled within ATOM_INITIAL_WAIT_MS\n // then we don't need to check for an alert presence\n await handlePromiseError(B.any([B.delay(ATOM_INITIAL_WAIT_MS), timedAtomPromise]));\n if (timedAtomPromise.isFulfilled()) {\n return await timedAtomPromise;\n }\n\n // ...otherwise make sure there is no unexpected alert covering the element\n if (!_.isPlainObject(this._waitingAtoms)) {\n this._waitingAtoms = {\n count: 0,\n alertNotifier: new EventEmitter(),\n alertMonitor: B.resolve(),\n };\n }\n this._waitingAtoms.count++;\n\n let onAlertCallback;\n try {\n // only restart the monitor if it is not running already\n if (this._waitingAtoms.alertMonitor.isResolved()) {\n this._waitingAtoms.alertMonitor = B.resolve((async () => {\n while (this._waitingAtoms.count > 0) {\n try {\n if (await this.checkForAlert()) {\n this._waitingAtoms.alertNotifier.emit(ON_OBSTRUCTING_ALERT_EVENT);\n }\n } catch (ign) {}\n await B.delay(ATOM_INITIAL_WAIT_MS / 2);\n }\n })());\n }\n\n return await new B((resolve, reject) => {\n onAlertCallback = () => reject(new errors.UnexpectedAlertOpenError());\n this._waitingAtoms.alertNotifier.once(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n handlePromiseError(timedAtomPromise)\n // eslint-disable-next-line promise/prefer-await-to-then\n .then(resolve)\n .catch(reject);\n });\n } finally {\n if (onAlertCallback) {\n this._waitingAtoms.alertNotifier.removeListener(ON_OBSTRUCTING_ALERT_EVENT, onAlertCallback);\n }\n this._waitingAtoms.count--;\n }\n};\n\nextensions.mobileWebNav = async function mobileWebNav (navType) {\n this.remote.allowNavigationWithoutReload = true;\n try {\n await this.executeAtom('execute_script', [`history.${navType}();`, null]);\n } finally {\n this.remote.allowNavigationWithoutReload = false;\n }\n};\n\n/**\n * @typedef {Object} SafariOpts\n * @property {object} preferences An object containing Safari settings to be updated.\n * The list of available setting names and their values could be retrieved by\n * changing the corresponding Safari settings in the UI and then inspecting\n * 'Library/Preferences/com.apple.mobilesafari.plist' file inside of\n * com.apple.mobilesafari app container.\n * The full path to the Mobile Safari's container could be retrieved from\n * `xcrun simctl get_app_container <sim_udid> com.apple.mobilesafari data`\n * command output.\n * Use the `xcrun simctl spawn <sim_udid> defaults read <path_to_plist>` command\n * to print the plist content to the Terminal.\n */\n\n/**\n * Updates preferences of Mobile Safari on Simulator\n *\n * @param {SafariOpts} opts\n */\ncommands.mobileUpdateSafariPreferences = async function mobileUpdateSafariPreferences (opts = {}) {\n if (!this.isSimulator()) {\n throw new Error('This extension is only available for Simulator');\n }\n const { preferences } = opts;\n if (!_.isPlainObject(preferences)) {\n throw new errors.InvalidArgumentError('\"preferences\" argument must be a valid object');\n }\n\n this.log.debug(`About to update Safari preferences: ${JSON.stringify(preferences)}`);\n await this.opts.device.updateSafariSettings(preferences);\n};\n\nObject.assign(commands, extensions, helpers);\n\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAMA,qBAAqB,GAAG,EAAE;AAChC,MAAMC,8BAA8B,GAAG,EAAE;AACzC,MAAMC,wBAAwB,GAAG,EAAE;AACnC,MAAMC,yBAAyB,GAAG,EAAE;AACpC,MAAMC,4BAA4B,GAAG,EAAE;AAEvC,MAAMC,+BAA+B,GAAG,EAAE;AAC1C,MAAMC,wBAAwB,GAAG,EAAE;AACnC,MAAMC,cAAc,GAAG,EAAE;AACzB,MAAMC,wCAAwC,GAAG,EAAE;AACnD,MAAMC,sCAAsC,GAAG,EAAE;AAEjD,MAAMC,oBAAoB,GAAG,CAC3B;EAACC,CAAC,EAAE,IAAI;EAAEC,CAAC,EAAE;AAAI,CAAC,EAClB;EAACD,CAAC,EAAE,GAAG;EAAEC,CAAC,EAAE;AAAI,CAAC,EACjB;EAACD,CAAC,EAAE,IAAI;EAAEC,CAAC,EAAE;AAAI,CAAC,EAClB;EAACD,CAAC,EAAE,IAAI;EAAEC,CAAC,EAAE;AAAI,CAAC,EAClB;EAACD,CAAC,EAAE,IAAI;EAAEC,CAAC,EAAE;AAAI,CAAC,EAClB;EAACD,CAAC,EAAE,IAAI;EAAEC,CAAC,EAAE;AAAI,CAAC,EAClB;EAACD,CAAC,EAAE,IAAI;EAAEC,CAAC,EAAE;AAAI,CAAC,EAClB;EAACD,CAAC,EAAE,IAAI;EAAEC,CAAC,EAAE;AAAI,CAAC,CACnB;AAED,MAAM;EAAEC;AAA2B,CAAC,GAAGC,aAAI;AAE3C,MAAMC,oBAAoB,GAAG,CAAC,GAAG,KAAK;AACtC,MAAMC,oBAAoB,GAAG,IAAI;AAEjC,MAAMC,0BAA0B,GAAG,OAAO;AAE1C,MAAMC,OAAO,GAAG,SAAS;AACzB,MAAMC,SAAS,GAAG,WAAW;AAC7B,MAAMC,MAAM,GAAG,QAAQ;AACvB,MAAMC,YAAY,GAAG,CAACH,OAAO,EAAEC,SAAS,EAAEC,MAAM,CAAC;AAIjD,MAAME,oBAAoB,GAAG,KAAK;AAClC,MAAMC,uBAAuB,GAAG,QAAQ;AACxC,MAAMC,kBAAkB,GAAG,CAACF,oBAAoB,EAAEC,uBAAuB,CAAC;AAE1E,MAAME,QAAQ,GAAG,CAAC,CAAC;EAAEC,OAAO,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAElD,SAASC,wBAAwB,CAAEC,EAAE,EAAE;EACrC,IAAI,CAACC,eAAC,CAACC,QAAQ,CAACF,EAAE,CAAC,IAAI,CAACC,eAAC,CAACE,QAAQ,CAACH,EAAE,CAAC,EAAE;IACtC,OAAO,KAAK;EACd;EACA,IAAIC,eAAC,CAACC,QAAQ,CAACF,EAAE,CAAC,IAAIC,eAAC,CAACG,OAAO,CAACJ,EAAE,CAAC,EAAE;IACnC,OAAO,KAAK;EACd;EACA,IAAIC,eAAC,CAACE,QAAQ,CAACH,EAAE,CAAC,IAAIK,KAAK,CAACL,EAAE,CAAC,EAAE;IAC/B,OAAO,KAAK;EACd;EACA,OAAO,IAAI;AACb;AAEAJ,QAAQ,CAACU,QAAQ,GAAG,eAAeA,QAAQ,CAAEC,KAAK,EAAE;EAClD,IAAI,CAAC,IAAI,CAACC,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,IAAIT,eAAC,CAACU,MAAM,CAACJ,KAAK,CAAC,EAAE;IACnB,IAAI,CAACK,YAAY,GAAG,EAAE;IACtB,IAAI,CAACC,GAAG,CAACC,KAAK,CAAC,qDAAqD,CAAC;IACrE;EACF;EAEA,IAAIjB,OAAO,CAACkB,YAAY,CAACR,KAAK,CAAC,EAAE;IAC/B,MAAMS,YAAY,GAAG,IAAI,CAACC,eAAe,CAACV,KAAK,CAAC;IAChD,MAAMW,KAAK,GAAG,MAAM,IAAI,CAACC,WAAW,CAAC,kBAAkB,EAAE,CAACH,YAAY,CAAC,CAAC;IACxE,IAAI,CAACH,GAAG,CAACC,KAAK,CAAE,4BAA2BI,KAAK,CAACE,MAAO,GAAE,CAAC;IAC3D,IAAI,CAACR,YAAY,CAACS,OAAO,CAACH,KAAK,CAACE,MAAM,CAAC;EACzC,CAAC,MAAM;IACL,MAAME,IAAI,GAAGrB,eAAC,CAACE,QAAQ,CAACI,KAAK,CAAC,GAAG,gBAAgB,GAAG,qBAAqB;IACzE,MAAMW,KAAK,GAAG,MAAM,IAAI,CAACC,WAAW,CAACG,IAAI,EAAE,CAACf,KAAK,CAAC,CAAC;IACnD,IAAIN,eAAC,CAACU,MAAM,CAACO,KAAK,CAAC,IAAIjB,eAAC,CAACsB,WAAW,CAACL,KAAK,CAACE,MAAM,CAAC,EAAE;MAClD,MAAM,IAAIX,cAAM,CAACe,gBAAgB,EAAE;IACrC;IACA,IAAI,CAACX,GAAG,CAACC,KAAK,CAAE,4BAA2BI,KAAK,CAACE,MAAO,GAAE,CAAC;IAC3D,IAAI,CAACR,YAAY,CAACS,OAAO,CAACH,KAAK,CAACE,MAAM,CAAC;EACzC;AACF,CAAC;AAEDxB,QAAQ,CAAC6B,cAAc,GAAG,eAAeA,cAAc,CAAEC,YAAY,EAAEC,EAAE,EAAE;EACzE,IAAI,CAAC,IAAI,CAACnB,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,MAAMM,YAAY,GAAG,IAAI,CAACC,eAAe,CAACU,EAAE,CAAC;EAC7C,OAAO,MAAM,IAAI,CAACR,WAAW,CAAC,2BAA2B,EAAE,CAACH,YAAY,EAAEU,YAAY,CAAC,CAAC;AAC1F,CAAC;AAED9B,QAAQ,CAACgC,MAAM,GAAG,eAAeA,MAAM,CAAED,EAAE,EAAE;EAC3C,IAAI,CAAC,IAAI,CAACnB,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,MAAMM,YAAY,GAAG,IAAI,CAACC,eAAe,CAACU,EAAE,CAAC;EAC7C,MAAM,IAAI,CAACR,WAAW,CAAC,QAAQ,EAAE,CAACH,YAAY,CAAC,CAAC;AAClD,CAAC;AAEDpB,QAAQ,CAACiC,OAAO,GAAG,eAAeA,OAAO,GAAI;EAC3C,IAAI,CAAC,IAAI,CAACrB,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,MAAM,IAAI,CAACS,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;AACvC,CAAC;AAEDvB,QAAQ,CAACkC,MAAM,GAAG,eAAeA,MAAM,GAAI;EACzC,IAAI,CAAC,IAAI,CAACtB,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,OAAO,MAAM,IAAI,CAACqB,MAAM,CAACC,OAAO,CAAC,sBAAsB,CAAC;AAC1D,CAAC;AAEDpC,QAAQ,CAACqC,KAAK,GAAG,eAAeA,KAAK,GAAI;EACvC,IAAI,CAAC,IAAI,CAACzB,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,OAAO,MAAM,IAAI,CAACS,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC;AAClD,CAAC;AAEDvB,QAAQ,CAACsC,UAAU,GAAG,eAAeA,UAAU,GAAI;EACjD,IAAI,CAAC,IAAI,CAAC1B,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,IAAI,CAACG,GAAG,CAACC,KAAK,CAAC,wBAAwB,CAAC;EAExC,IAAIqB,MAAM,GAAG,wBAAwB;EACrC,IAAIC,SAAS,GAAG,MAAM,IAAI,CAACjB,WAAW,CAAC,gBAAgB,EAAE,CAACgB,MAAM,EAAE,EAAE,CAAC,CAAC;EAEtE,IAAIE,OAAO,GAAG,EAAE;EAChB,IAAI;IACF,KAAK,IAAI,CAACC,IAAI,EAAEpB,KAAK,CAAC,IAAIjB,eAAC,CAACsC,OAAO,CAACC,gBAAW,CAACC,eAAe,CAACC,SAAS,EAAEN,SAAS,CAAC,CAAC,EAAE;MACtFC,OAAO,CAACM,IAAI,CAAC;QAACL,IAAI;QAAEpB;MAAK,CAAC,CAAC;IAC7B;IACA,OAAOmB,OAAO;EAChB,CAAC,CAAC,OAAOO,GAAG,EAAE;IACZ,IAAI,CAAC/B,GAAG,CAACgC,KAAK,CAACD,GAAG,CAAC;IACnB,MAAM,IAAInC,cAAM,CAACqC,YAAY,CAAE,uCAAsCV,SAAU,GAAE,CAAC;EACpF;AACF,CAAC;AAEDxC,QAAQ,CAACmD,SAAS,GAAG,eAAeA,SAAS,CAAEC,MAAM,EAAE;EACrD,IAAI,CAAC,IAAI,CAACxC,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEAsC,MAAM,GAAG/C,eAAC,CAACgD,KAAK,CAACD,MAAM,CAAC;EAGxB,IAAI,CAACA,MAAM,CAACE,IAAI,EAAE;IAChBF,MAAM,CAACE,IAAI,GAAG,GAAG;EACnB;EAEA,MAAMC,QAAQ,GAAGX,gBAAW,CAACY,cAAc,CAACJ,MAAM,CAACV,IAAI,EAAEU,MAAM,CAAC9B,KAAK,EAAE;IACrEmC,OAAO,EAAEpD,eAAC,CAACE,QAAQ,CAAC6C,MAAM,CAACM,MAAM,CAAC,GAAI,IAAIC,IAAI,CAACP,MAAM,CAACM,MAAM,GAAG,IAAI,CAAC,CAAEE,WAAW,EAAE,GACjFR,MAAM,CAACM,MAAM;IACfJ,IAAI,EAAEF,MAAM,CAACE,IAAI;IACjBO,MAAM,EAAET,MAAM,CAACS,MAAM;IACrBC,QAAQ,EAAEV,MAAM,CAACU,QAAQ;IACzBC,MAAM,EAAEX,MAAM,CAACW;EACjB,CAAC,CAAC;EACF,IAAIxB,MAAM,GAAI,qBAAoByB,IAAI,CAACC,SAAS,CAACV,QAAQ,CAAE,EAAC;EAC5D,MAAM,IAAI,CAAChC,WAAW,CAAC,gBAAgB,EAAE,CAACgB,MAAM,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC;AAEDvC,QAAQ,CAACkE,YAAY,GAAG,eAAeA,YAAY,CAAEC,UAAU,EAAE;EAC/D,IAAI,CAAC,IAAI,CAACvD,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAGA,IAAI2B,OAAO,GAAG,MAAM,IAAI,CAACH,UAAU,EAAE;EACrC,IAAIjC,eAAC,CAAC+D,OAAO,CAAC/D,eAAC,CAACgE,GAAG,CAAC5B,OAAO,EAAE,MAAM,CAAC,EAAE0B,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;IACxD,IAAI,CAAClD,GAAG,CAACC,KAAK,CAAE,WAAUiD,UAAW,wBAAuB,CAAC;IAC7D,OAAO,IAAI;EACb;EAEA,OAAO,MAAM,IAAI,CAACG,aAAa,CAACH,UAAU,CAAC;AAC7C,CAAC;AAEDnE,QAAQ,CAACuE,aAAa,GAAG,eAAeA,aAAa,GAAI;EACvD,IAAI,CAAC,IAAI,CAAC3D,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EAEA,IAAI2B,OAAO,GAAG,MAAM,IAAI,CAACH,UAAU,EAAE;EACrC,IAAIG,OAAO,CAAC+B,MAAM,EAAE;IAClB,KAAK,IAAIpB,MAAM,IAAIX,OAAO,EAAE;MAC1B,MAAM,IAAI,CAAC6B,aAAa,CAAClB,MAAM,CAACV,IAAI,CAAC;IACvC;EACF;EACA,OAAO,IAAI;AACb,CAAC;AAEDzC,OAAO,CAACqE,aAAa,GAAG,eAAeA,aAAa,CAAEH,UAAU,EAAE;EAChE,IAAI,CAAClD,GAAG,CAACC,KAAK,CAAE,oBAAmBiD,UAAW,GAAE,CAAC;EACjD,IAAIM,SAAS,GAAG7B,gBAAW,CAAC8B,YAAY,CAACP,UAAU,EAAE;IAACb,IAAI,EAAE;EAAG,CAAC,CAAC;EACjE,IAAIf,MAAM,GAAI,qBAAoByB,IAAI,CAACC,SAAS,CAACQ,SAAS,CAAE,EAAC;EAC7D,MAAM,IAAI,CAAClD,WAAW,CAAC,gBAAgB,EAAE,CAACgB,MAAM,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC;AAEDtC,OAAO,CAAC0E,eAAe,GAAG,SAASA,eAAe,CAAE5C,EAAE,EAAE;EACtD,IAAI,CAAC1B,eAAC,CAACuE,aAAa,CAAC7C,EAAE,CAAC,EAAE;IACxB,OAAOA,EAAE;EACX;EACA,MAAM8C,IAAI,GAAGxF,aAAI,CAACyF,aAAa,CAAC/C,EAAE,CAAC;EACnC,IAAI,CAAC5B,wBAAwB,CAAC0E,IAAI,CAAC,EAAE;IACnC,OAAO9C,EAAE;EACX;EAGA,MAAMgD,OAAO,GAAG1E,eAAC,CAAC2E,QAAQ,CAACH,IAAI,EAAE,GAAG,CAAC,GAAGA,IAAI,GAAGxF,aAAI,CAAC4F,MAAM,EAAE;EAC5D,IAAI,CAACC,gBAAgB,CAACC,GAAG,CAACJ,OAAO,EAAEF,IAAI,CAAC;EACxC,OAAOxF,aAAI,CAAC+F,WAAW,CAACL,OAAO,CAAC;AAClC,CAAC;AAED9E,OAAO,CAACoF,gBAAgB,GAAG,SAASA,gBAAgB,CAAEC,QAAQ,EAAE;EAC9D,MAAMC,QAAQ,GAAIC,CAAC,IAAKnF,eAAC,CAACoF,OAAO,CAACD,CAAC,CAAC,IAAInF,eAAC,CAACuE,aAAa,CAACY,CAAC,CAAC,GACtD,IAAI,CAACH,gBAAgB,CAACG,CAAC,CAAC,GACxBA,CAAC;EAEL,IAAInF,eAAC,CAACoF,OAAO,CAACH,QAAQ,CAAC,EAAE;IACvB,OAAOA,QAAQ,CAACjB,GAAG,CAACkB,QAAQ,CAAC;EAC/B,CAAC,MAAM,IAAIlF,eAAC,CAACuE,aAAa,CAACU,QAAQ,CAAC,EAAE;IACpC,MAAMI,MAAM,GAAG;MAAC,GAAGJ,QAAQ;MAAE,GAAI,IAAI,CAACX,eAAe,CAACW,QAAQ;IAAE,CAAC;IACjE,OAAOjF,eAAC,CAACsC,OAAO,CAAC+C,MAAM,CAAC,CAACC,MAAM,CAC7B,CAACC,GAAG,EAAE,CAACC,GAAG,EAAEvE,KAAK,CAAC,KAAK;MACrBsE,GAAG,CAACC,GAAG,CAAC,GAAGN,QAAQ,CAACjE,KAAK,CAAC;MAC1B,OAAOsE,GAAG;IACZ,CAAC,EAAE,CAAC,CAAC,CACN;EACH;EACA,OAAON,QAAQ;AACjB,CAAC;AAEDpF,UAAU,CAAC4F,wBAAwB,GAAG,eAAeA,wBAAwB,CAAEC,QAAQ,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,GAAG,EAAE;EAC5G,MAAMC,cAAc,GAAG9F,eAAC,CAAC+F,KAAK,CAACF,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC7E,eAAe,CAAC6E,GAAG,CAAC;EACtE,IAAIG,OAAO;EACX,IAAIC,MAAM,GAAG,YAAY;IACvBD,OAAO,GAAG,MAAM,IAAI,CAAC9E,WAAW,CAAE,eAAc0E,IAAI,GAAG,GAAG,GAAG,EAAG,EAAC,EAAE,CAACF,QAAQ,EAAEC,QAAQ,EAAEG,cAAc,CAAC,CAAC;IACxG,OAAO,CAAC9F,eAAC,CAACU,MAAM,CAACsF,OAAO,CAAC;EAC3B,CAAC;EACD,IAAI;IACF,MAAM,IAAI,CAACE,wBAAwB,CAACD,MAAM,CAAC;EAC7C,CAAC,CAAC,OAAOtD,GAAG,EAAE;IACZ,IAAIA,GAAG,CAACwD,OAAO,IAAInG,eAAC,CAACoG,UAAU,CAACzD,GAAG,CAACwD,OAAO,CAACE,KAAK,CAAC,IAAI1D,GAAG,CAACwD,OAAO,CAACE,KAAK,CAAC,iBAAiB,CAAC,EAAE;MAE1FL,OAAO,GAAG,EAAE;IACd,CAAC,MAAM;MACL,MAAMrD,GAAG;IACX;EACF;EAEA,IAAIiD,IAAI,EAAE;IACR,OAAO,IAAI,CAACZ,gBAAgB,CAACgB,OAAO,CAAC;EACvC;EACA,IAAIhG,eAAC,CAACG,OAAO,CAAC6F,OAAO,CAAC,EAAE;IACtB,MAAM,IAAIxF,cAAM,CAAC8F,kBAAkB,EAAE;EACvC;EACA,OAAO,IAAI,CAACtB,gBAAgB,CAACgB,OAAO,CAAC;AACvC,CAAC;AAEDnG,UAAU,CAAC0G,cAAc,GAAG,eAAeA,cAAc,GAAI;EAC3D,IAAIC,MAAM,GAAG,MAAM,IAAI,CAACC,kBAAkB,CAAC,IAAI,CAACC,YAAY,CAAC;EAC7D,MAAM,IAAI,CAACC,WAAW,CAACH,MAAM,CAAC;AAChC,CAAC;AAED5G,OAAO,CAACsB,WAAW,GAAG,eAAeA,WAAW,CAAEG,IAAI,EAAEuF,IAAI,EAAEC,kBAAkB,GAAG,KAAK,EAAE;EACxF,IAAIC,MAAM,GAAGD,kBAAkB,KAAK,IAAI,GAAG,EAAE,GAAG,IAAI,CAAClG,YAAY;EACjE,IAAIoG,OAAO,GAAG,IAAI,CAACjF,MAAM,CAACZ,WAAW,CAACG,IAAI,EAAEuF,IAAI,EAAEE,MAAM,CAAC;EACzD,OAAO,MAAM,IAAI,CAACE,WAAW,CAACD,OAAO,CAAC;AACxC,CAAC;AAEDnH,OAAO,CAACqH,gBAAgB,GAAG,eAAeA,gBAAgB,CAAE5F,IAAI,EAAEuF,IAAI,EAAEM,WAAW,EAAE;EAEnF,IAAIH,OAAO,GAAG,IAAII,iBAAC,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACvC,IAAI,CAACC,YAAY,GAAG;MAACF,OAAO;MAAEC;IAAM,CAAC;EACvC,CAAC,CAAC;EACF,MAAM,IAAI,CAACvF,MAAM,CAACmF,gBAAgB,CAAC5F,IAAI,EAAEuF,IAAI,EAAE,IAAI,CAACjG,YAAY,EAAEuG,WAAW,CAAC;EAC9E,OAAO,MAAM,IAAI,CAACF,WAAW,CAACD,OAAO,CAAC;AACxC,CAAC;AAEDnH,OAAO,CAACoB,eAAe,GAAG,SAASA,eAAe,CAAEuG,MAAM,EAAE;EAC1D,MAAM/C,IAAI,GAAGxF,aAAI,CAACyF,aAAa,CAAC8C,MAAM,CAAC;EACvC,IAAI,CAAC,IAAI,CAAC1C,gBAAgB,CAAC2C,GAAG,CAAChD,IAAI,CAAC,EAAE;IACpC,MAAM,IAAIhE,cAAM,CAACiH,0BAA0B,EAAE;EAC/C;EACA,OAAO;IAACC,OAAO,EAAE,IAAI,CAAC7C,gBAAgB,CAAC8C,GAAG,CAACnD,IAAI;EAAC,CAAC;AACnD,CAAC;AAED5E,OAAO,CAACgI,uBAAuB,GAAG,SAASA,uBAAuB,CAAEhB,IAAI,GAAG,EAAE,EAAE;EAC7E,OAAOA,IAAI,CAAC5C,GAAG,CAAE6D,GAAG,IAAK;IACvB,IAAIjI,OAAO,CAACkB,YAAY,CAAC+G,GAAG,CAAC,EAAE;MAC7B,IAAI;QACF,OAAO,IAAI,CAAC7G,eAAe,CAAC6G,GAAG,CAAC;MAClC,CAAC,CAAC,OAAOlF,GAAG,EAAE;QACZ,IAAI,CAAC,IAAAmF,mBAAW,EAACnF,GAAG,EAAEnC,cAAM,CAACiH,0BAA0B,CAAC,EAAE;UACxD,MAAM9E,GAAG;QACX;MACF;MACA,OAAOkF,GAAG;IACZ;IACA,OAAO7H,eAAC,CAACoF,OAAO,CAACyC,GAAG,CAAC,GAAG,IAAI,CAACD,uBAAuB,CAACC,GAAG,CAAC,GAAGA,GAAG;EACjE,CAAC,CAAC;AACJ,CAAC;AAEDjI,OAAO,CAACmI,YAAY,GAAG,SAASA,YAAY,CAAE/B,OAAO,EAAE;EACrD,OAAOA,OAAO,CAAC0B,OAAO,IAAI1B,OAAO,CAACjH,0BAA0B,CAAC;AAC/D,CAAC;AAEDa,OAAO,CAACkB,YAAY,GAAG,SAASA,YAAY,CAAEkF,OAAO,EAAE;EACrD,OAAOhH,aAAI,CAACgJ,QAAQ,CAAChC,OAAO,CAAC,KAAKhH,aAAI,CAACgJ,QAAQ,CAAChC,OAAO,CAAC0B,OAAO,CAAC,IAAI1I,aAAI,CAACgJ,QAAQ,CAAChC,OAAO,CAACjH,0BAA0B,CAAC,CAAC,CAAC;AACzH,CAAC;AAEDc,UAAU,CAACoI,iBAAiB,GAAG,eAAeA,iBAAiB,GAAI;EACjE,IAAIjI,eAAC,CAACkI,SAAS,CAAC,IAAI,CAACC,eAAe,CAAC,EAAE;IACrC,OAAO,IAAI,CAACA,eAAe;EAC7B;EACA,IAAI;IACF,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACrG,OAAO,CAAC,4BAA4B,CAAC;IAClE,IAAI,CAACoG,eAAe,GAAGC,SAAS,CAACC,WAAW,EAAE,CAAC1D,QAAQ,CAAC,QAAQ,CAAC;EACnE,CAAC,CAAC,OAAOhC,GAAG,EAAE;IACZ,IAAI,CAAC/B,GAAG,CAAC0H,IAAI,CAAE,4DAA2D,CAAC;IAC3E,IAAI,CAAC1H,GAAG,CAACC,KAAK,CAAE,UAAS8B,GAAG,CAACwD,OAAQ,EAAC,CAAC;EACzC;EACA,OAAO,IAAI,CAACgC,eAAe,IAAI,IAAI;AACrC,CAAC;AAEDtI,UAAU,CAAC0I,mBAAmB,GAAG,eAAeA,mBAAmB,GAAI;EACrE,MAAMrG,MAAM,GAAG,kIAAkI;EACjJ,MAAM;IAACsG,KAAK;IAAEC;EAAM,CAAC,GAAG,MAAM,IAAI,CAAC1G,OAAO,CAACG,MAAM,CAAC;EAClD,MAAM,CAACwG,UAAU,EAAEC,SAAS,CAAC,GAAGF,MAAM,GAAGD,KAAK,GAAG,CAACC,MAAM,EAAED,KAAK,CAAC,GAAG,CAACA,KAAK,EAAEC,MAAM,CAAC;EAClF,OAAO;IACLD,KAAK,EAAEG,SAAS;IAChBF,MAAM,EAAEC;EACV,CAAC;AACH,CAAC;AAED7I,UAAU,CAAC+I,kBAAkB,GAAG,eAAeA,kBAAkB,GAAI;EACnE,IAAI5I,eAAC,CAACkI,SAAS,CAAC,IAAI,CAACW,gBAAgB,CAAC,EAAE;IACtC,OAAO,IAAI,CAACA,gBAAgB;EAC9B;EAEA,IAAI;IACF,MAAM;MAACL,KAAK;MAAEC;IAAM,CAAC,GAAG,MAAM,IAAI,CAACF,mBAAmB,EAAE;IACxD,KAAK,MAAMO,MAAM,IAAIlK,oBAAoB,EAAE;MACzC,IAAIkK,MAAM,CAACjK,CAAC,KAAK2J,KAAK,IAAIM,MAAM,CAAChK,CAAC,KAAK2J,MAAM,EAAE;QAC7C,IAAI,CAACI,gBAAgB,GAAG,IAAI;MAC9B;IACF;EACF,CAAC,CAAC,OAAOlG,GAAG,EAAE;IACZ,IAAI,CAAC/B,GAAG,CAAC0H,IAAI,CAAE,gFAA+E,CAAC;IAC/F,IAAI,CAAC1H,GAAG,CAACC,KAAK,CAAE,UAAS8B,GAAG,CAACwD,OAAQ,EAAC,CAAC;EACzC;EACA,OAAO,IAAI,CAAC0C,gBAAgB,IAAI,KAAK;AACvC,CAAC;AAEDhJ,UAAU,CAACkJ,gCAAgC,GAAG,eAAeA,gCAAgC,CAAEC,KAAK,EAAEC,QAAQ,EAAE;EAC9G,IAAIC,SAAS,GAAG,CAAC;EACjB,IAAIC,YAAY,GAAG,CAAC;EAEpB,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACnB,iBAAiB,EAAE;EAI/C,MAAM;IACJoB,4BAA4B;IAC5BC,oCAAoC;IACpCC,oBAAoB,GAAGvK,aAAI,CAACwK,eAAe,CAAC,IAAI,CAACC,IAAI,CAACC,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAIN,QAAQ,GAC5F3J,uBAAuB,GAAGD;EAChC,CAAC,GAAG,MAAM,IAAI,CAACmK,QAAQ,CAACC,WAAW,EAAE;EACrC,IAAIC,gBAAgB,GAAG7J,eAAC,CAAC8J,SAAS,CAACT,4BAA4B,CAAC;EAChE,IAAIU,gBAAgB,GAAG/J,eAAC,CAAC8J,SAAS,CAACR,oCAAoC,CAAC;EACxE,MAAMU,cAAc,GAAGhK,eAAC,CAAC8J,SAAS,CAACP,oBAAoB,CAAC;EAExD,IAAI,CAAChK,YAAY,CAACoF,QAAQ,CAACkF,gBAAgB,CAAC,EAAE;IAC5CA,gBAAgB,GAAGvK,MAAM;EAC3B;EACA,IAAI,CAACC,YAAY,CAACoF,QAAQ,CAACoF,gBAAgB,CAAC,EAAE;IAC5CA,gBAAgB,GAAGzK,MAAM;EAC3B;EAEA,IAAI,CAACI,kBAAkB,CAACiF,QAAQ,CAACqF,cAAc,CAAC,EAAE;IAChD,MAAM,IAAIxJ,cAAM,CAACyJ,oBAAoB,CAClC,GAAEV,oBAAqB,mEAAkE7J,kBAAmB,GAAE,CAAC;EACpH;EAEA,MAAMwK,SAAS,GAAGd,QAAQ,KAAI,MAAM,IAAI,CAACR,kBAAkB,EAAE;EAE7D,MAAMuB,WAAW,GAAGlB,QAAQ,CAACnK,CAAC,GAAGmK,QAAQ,CAACpK,CAAC,GAAG,UAAU,GAAG,WAAW;EAEtE,MAAMuL,WAAW,GAAGF,SAAS,GACzBlL,aAAI,CAACwK,eAAe,CAAC,IAAI,CAACC,IAAI,CAACC,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC,GAC1DpL,4BAA4B,GAC5BD,yBAAyB,GAC3B,CAAC;EAEL,MAAMgM,UAAU,GAAG,MAAM,IAAI,CAACtI,OAAO,CAAC,+CAA+C,CAAC;EACtF,IAAIsI,UAAU,EAAE;IACdnB,SAAS,GAAG/K,8BAA8B,GAAGiM,WAAW;IAExD,IAAIF,SAAS,EAAE;MACbhB,SAAS,IAAI9K,wBAAwB;IACvC;IAGA,IAAI+L,WAAW,KAAK,WAAW,IAAIf,QAAQ,EAAE;MAC3CF,SAAS,GAAG,CAAC;IACf;EACF,CAAC,MAAM;IACLA,SAAS,GAAGc,cAAc,KAAKvK,uBAAuB,GAAG,CAAC,GAAGvB,qBAAqB;IAClFgL,SAAS,IAAIkB,WAAW;IACxB,IAAI,CAACxJ,GAAG,CAACC,KAAK,CAAE,iCAAgCmJ,cAAe,KAAId,SAAU,EAAC,CAAC;IAE/E,IAAIE,QAAQ,EAAE;MACZ,IAAIe,WAAW,KAAK,UAAU,EAAE;QAE9BhB,YAAY,GAAG3K,wBAAwB;MACzC,CAAC,MAAM;QACL0K,SAAS,GAAG3K,+BAA+B;MAC7C;IACF;IAEA,IAAI4L,WAAW,KAAK,WAAW,IAAI,CAACf,QAAQ,EAAE;MAC5C,IAAIS,gBAAgB,KAAKzK,OAAO,EAAE;QAChC8J,SAAS,IAAIzK,cAAc;MAC7B,CAAC,MAAM,IAAIoL,gBAAgB,KAAKvK,MAAM,EAAE;QAGtC,MAAMgL,gBAAgB,GAAG,MAAM,IAAI,CAACC,mBAAmB,EAAE;QACzD,MAAMC,IAAI,GAAGF,gBAAgB,CAACG,MAAM,CAAE5E,GAAG,IAAKA,GAAG,CAAC9F,EAAE,CAAC2K,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5E,IAAIF,IAAI,CAACrG,MAAM,GAAG,CAAC,EAAE;UACnB,IAAI,CAACvD,GAAG,CAACC,KAAK,CAAE,SAAQ2J,IAAI,CAACrG,MAAO,wCAAuC,CAAC;UAC5E+E,SAAS,IAAIzK,cAAc;QAC7B;MACF;IACF;EACF;EAEAyK,SAAS,IAAI,MAAM,IAAI,CAACyB,0BAA0B,CAACvB,QAAQ,EAAEW,gBAAgB,CAAC;EAE9Ef,KAAK,CAAC4B,CAAC,IAAI1B,SAAS;EACpBD,QAAQ,CAACnK,CAAC,IAAKoK,SAAS,GAAGC,YAAa;AAC1C,CAAC;AAEDtJ,UAAU,CAAC8K,0BAA0B,GAAG,eAAeA,0BAA0B,CAAEvB,QAAQ,EAAEW,gBAAgB,EAAE;EAC7G,IAAIc,MAAM,GAAG,CAAC;EAEd,IAAId,gBAAgB,KAAK3K,OAAO,EAAE;IAChCyL,MAAM,IAAIzB,QAAQ,GAChB1K,wCAAwC,GACxCC,sCAAsC;EAC1C,CAAC,MAAM,IAAIoL,gBAAgB,KAAKzK,MAAM,EAAE;IAEtC,MAAMwL,OAAO,GAAG,MAAM,IAAI,CAACC,2BAA2B,CAAC,kBAAkB,EAAE,0BAA0B,EAAE,IAAI,CAAC;IAC5G,IAAID,OAAO,CAAC3G,MAAM,GAAG,CAAC,EAAE;MACtB0G,MAAM,IAAIzB,QAAQ,GAChB1K,wCAAwC,GACxCC,sCAAsC;IAC1C;EACF;EAEA,IAAI,CAACiC,GAAG,CAACC,KAAK,CAAE,8CAA6CgK,MAAO,EAAC,CAAC;EACtE,OAAOA,MAAM;AACf,CAAC;AAED,eAAeG,qBAAqB,CAAEC,MAAM,EAAElK,YAAY,EAAE;EAG1D,IAAI;IACF,IAAImK,IAAI,GAAG,MAAMD,MAAM,CAAC/J,WAAW,CAAC,UAAU,EAAE,CAACH,YAAY,CAAC,CAAC;IAC/D,IAAI,CAACmK,IAAI,EAAE;MACTA,IAAI,GAAG,MAAMD,MAAM,CAAC/J,WAAW,CAAC,qBAAqB,EAAE,CAACH,YAAY,EAAE,OAAO,CAAC,CAAC;IACjF;IAEA,IAAImK,IAAI,EAAE;MACR,MAAMC,GAAG,GAAG,MAAMF,MAAM,CAACF,2BAA2B,CAAC,kBAAkB,EAAEG,IAAI,EAAE,IAAI,CAAC;MACpF,IAAIC,GAAG,CAAChH,MAAM,KAAK,CAAC,IAAIgH,GAAG,CAAChH,MAAM,KAAK,CAAC,EAAE;QACxC,MAAMzC,EAAE,GAAGyJ,GAAG,CAAC,CAAC,CAAC;QAEjB,MAAMC,IAAI,GAAG,MAAMH,MAAM,CAACI,YAAY,CAAE,YAAWrM,aAAI,CAACyF,aAAa,CAAC/C,EAAE,CAAE,OAAM,EAAE,KAAK,CAAC;QACxF,IAAIyJ,GAAG,CAAChH,MAAM,KAAK,CAAC,EAAE;UACpB,MAAMmH,GAAG,GAAGH,GAAG,CAAC,CAAC,CAAC;UAClB,MAAMI,KAAK,GAAG,MAAMN,MAAM,CAACI,YAAY,CAAE,YAAWrM,aAAI,CAACyF,aAAa,CAAC6G,GAAG,CAAE,OAAM,EAAE,KAAK,CAAC;UAE1F,IAAKF,IAAI,CAACI,CAAC,KAAKD,KAAK,CAACC,CAAC,IAAIJ,IAAI,CAACR,CAAC,KAAKW,KAAK,CAACX,CAAC,IAC5CQ,IAAI,CAAC5C,KAAK,KAAK+C,KAAK,CAAC/C,KAAK,IAAI4C,IAAI,CAAC3C,MAAM,KAAK8C,KAAK,CAAC9C,MAAO,EAAE;YAE5D,OAAO,KAAK;UACd;QACF;QACA,MAAMjC,MAAM,GAAG;UACbgF,CAAC,EAAEC,IAAI,CAACC,KAAK,CAACN,IAAI,CAACI,CAAC,GAAGJ,IAAI,CAAC5C,KAAK,GAAG,CAAC,CAAC;UACtCoC,CAAC,EAAEa,IAAI,CAACC,KAAK,CAACN,IAAI,CAACR,CAAC,GAAGQ,IAAI,CAAC3C,MAAM,GAAG,CAAC;QACxC,CAAC;QACD,MAAMwC,MAAM,CAACtE,WAAW,CAACH,MAAM,CAAC;QAChC,OAAO,IAAI;MACb;IACF;EACF,CAAC,CAAC,OAAO7D,GAAG,EAAE;IAGZsI,MAAM,CAACrK,GAAG,CAAC0H,IAAI,CAAE,8BAA6B3F,GAAG,CAACwD,OAAQ,EAAC,CAAC;EAC9D;EACA,OAAO,KAAK;AACd;AAEAtG,UAAU,CAAC8L,YAAY,GAAG,eAAeA,YAAY,CAAEjK,EAAE,EAAE;EACzD,MAAMX,YAAY,GAAG,IAAI,CAACC,eAAe,CAACU,EAAE,CAAC;EAG7C,IAAI,CAAC,CAAC,MAAM,IAAI,CAACiI,QAAQ,CAACC,WAAW,EAAE,EAAEgC,kBAAkB,KAAI,MAAMZ,qBAAqB,CAAC,IAAI,EAAEjK,YAAY,CAAC,GAAE;IAC9G;EACF;EACA,IAAI,CAACH,GAAG,CAAC0H,IAAI,CAAC,uEAAuE,CAAC;EAItF,MAAMnB,iBAAC,CAAC0E,OAAO,CAACC,GAAG,CAAC,CAClB,IAAI,CAAC5K,WAAW,CAAC,UAAU,EAAE,CAACH,YAAY,CAAC,CAAC,EAC5C,IAAI,CAACG,WAAW,CAAC,0BAA0B,EAAE,CAACH,YAAY,CAAC,CAAC,CAC7D,CAAC;EAEF,MAAM,CAACgL,IAAI,EAAEC,WAAW,CAAC,GAAG,MAAM7E,iBAAC,CAAC0E,OAAO,CAACC,GAAG,CAAC,CAC9C,IAAI,CAAC5K,WAAW,CAAC,UAAU,EAAE,CAACH,YAAY,CAAC,CAAC,EAC5C,IAAI,CAACG,WAAW,CAAC,0BAA0B,EAAE,CAACH,YAAY,CAAC,CAAC,CAC7D,CAAC;EACF,MAAM;IAACyH,KAAK;IAAEC;EAAM,CAAC,GAAGsD,IAAI;EAC5B,IAAI;IAACP,CAAC;IAAEZ;EAAC,CAAC,GAAGoB,WAAW;EACxBR,CAAC,IAAIhD,KAAK,GAAG,CAAC;EACdoC,CAAC,IAAInC,MAAM,GAAG,CAAC;EAEf,IAAI,CAAC/B,YAAY,GAAG;IAAC8E,CAAC;IAAEZ;EAAC,CAAC;EAC1B,MAAM,IAAI,CAACrE,cAAc,EAAE;AAC7B,CAAC;AAED1G,UAAU,CAAC8G,WAAW,GAAG,eAAeA,WAAW,CAAEH,MAAM,EAAE;EAC3D,MAAM,IAAI,CAACyF,YAAY,CAAC,CACtB;IACEC,MAAM,EAAE,KAAK;IACbC,OAAO,EAAE3F;EACX,CAAC,CACF,CAAC;AACJ,CAAC;AAED3G,UAAU,CAAC4G,kBAAkB,GAAG,eAAeA,kBAAkB,CAAED,MAAM,EAAE;EACzE,IAAI,CAAC5F,GAAG,CAACC,KAAK,CAAE,4BAA2B8C,IAAI,CAACC,SAAS,CAAC4C,MAAM,CAAE,sBAAqB,CAAC;EAGxF,IAAI4F,OAAO;EACX,IAAI;IACFA,OAAO,GAAG,MAAM,IAAAC,uBAAa,EAAC,CAAC,EAAE,GAAG,EAAE,YAAY,MAAM,IAAI,CAACtB,2BAA2B,CAAC,YAAY,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;EAC1I,CAAC,CAAC,OAAOuB,GAAG,EAAE,CAAC;EAEf,IAAI,CAACF,OAAO,EAAE;IACZ,MAAM,IAAIG,KAAK,CAAE,2EAA0E,CAAC;EAC9F;EAEAH,OAAO,GAAGpN,aAAI,CAACyF,aAAa,CAAC2H,OAAO,CAAC;EAErC,MAAMhB,IAAI,GAAG,MAAM,IAAI,CAACC,YAAY,CAAE,YAAWe,OAAQ,OAAM,EAAE,KAAK,CAAC;EACvE,MAAMpD,KAAK,GAAG;IAACwC,CAAC,EAAEJ,IAAI,CAACI,CAAC;IAAEZ,CAAC,EAAEQ,IAAI,CAACR;EAAC,CAAC;EACpC,MAAM3B,QAAQ,GAAG;IAACpK,CAAC,EAAEuM,IAAI,CAAC5C,KAAK;IAAE1J,CAAC,EAAEsM,IAAI,CAAC3C;EAAM,CAAC;EAEhD,MAAM+D,GAAG,GAAG,2EAA2E;EACvF,MAAMC,MAAM,GAAG,MAAM,IAAI,CAAC3K,MAAM,CAACC,OAAO,CAACyK,GAAG,CAAC;EAI7C,MAAME,cAAc,GAAG,IAAI,CAACA,cAAc;EAC1C,MAAM,IAAI,CAACC,eAAe,CAAC,CAAC,CAAC;EAC7B,IAAI;IACF,MAAM,IAAI,CAAC5D,gCAAgC,CAACC,KAAK,EAAEC,QAAQ,CAAC;EAC9D,CAAC,SAAS;IACR,MAAM,IAAI,CAAC0D,eAAe,CAACD,cAAc,CAAC;EAC5C;EAEA,IAAID,MAAM,IAAIxD,QAAQ,IAAID,KAAK,EAAE;IAC/B,IAAI4D,MAAM,GAAG3D,QAAQ,CAACpK,CAAC,GAAG4N,MAAM,CAAC5N,CAAC;IAClC,IAAIgO,MAAM,GAAG5D,QAAQ,CAACnK,CAAC,GAAG2N,MAAM,CAAC3N,CAAC;IAClC,IAAIgO,SAAS,GAAG;MACdtB,CAAC,EAAExC,KAAK,CAACwC,CAAC,GAAGC,IAAI,CAACC,KAAK,CAACkB,MAAM,GAAGpG,MAAM,CAACgF,CAAC,CAAC;MAC1CZ,CAAC,EAAE5B,KAAK,CAAC4B,CAAC,GAAGa,IAAI,CAACC,KAAK,CAACmB,MAAM,GAAGrG,MAAM,CAACoE,CAAC;IAC3C,CAAC;IAID,IAAI,CAAChK,GAAG,CAACC,KAAK,CAAE,0BAAyB8C,IAAI,CAACC,SAAS,CAACkJ,SAAS,CAAE,EAAC,CAAC;IACrE,IAAI,CAAClM,GAAG,CAACC,KAAK,CAAE,aAAY8C,IAAI,CAACC,SAAS,CAACwH,IAAI,CAAE,EAAC,CAAC;IACnD,IAAI,CAACxK,GAAG,CAACC,KAAK,CAAE,cAAa8C,IAAI,CAACC,SAAS,CAACoF,KAAK,CAAE,EAAC,CAAC;IACrD,IAAI,CAACpI,GAAG,CAACC,KAAK,CAAE,iBAAgB8C,IAAI,CAACC,SAAS,CAACqF,QAAQ,CAAE,EAAC,CAAC;IAC3D,IAAI,CAACrI,GAAG,CAACC,KAAK,CAAE,eAAc8C,IAAI,CAACC,SAAS,CAAC6I,MAAM,CAAE,EAAC,CAAC;IACvD,IAAI,CAAC7L,GAAG,CAACC,KAAK,CAAE,eAAc8C,IAAI,CAACC,SAAS,CAACgJ,MAAM,CAAE,EAAC,CAAC;IACvD,IAAI,CAAChM,GAAG,CAACC,KAAK,CAAE,eAAc8C,IAAI,CAACC,SAAS,CAACiJ,MAAM,CAAE,EAAC,CAAC;IAEvD,IAAI,CAACjM,GAAG,CAACC,KAAK,CAAE,wBAAuB8C,IAAI,CAACC,SAAS,CAAC4C,MAAM,CAAE,GAAE,GAC7D,oBAAmB7C,IAAI,CAACC,SAAS,CAACkJ,SAAS,CAAE,EAAC,CAAC;IAClD,OAAOA,SAAS;EAClB;AACF,CAAC;AAEDjN,UAAU,CAACkN,aAAa,GAAG,eAAeA,aAAa,GAAI;EACzD,OAAO/M,eAAC,CAACC,QAAQ,CAAC,MAAM,IAAI,CAAC+M,YAAY,EAAE,CAAC;AAC9C,CAAC;AAEDnN,UAAU,CAACmH,WAAW,GAAG,eAAeA,WAAW,CAAED,OAAO,EAAE;EAC5D,MAAMkG,KAAK,GAAG,IAAIC,eAAM,CAACC,KAAK,EAAE,CAACC,KAAK,EAAE;EAIxC,MAAMC,gBAAgB,GAAGlG,iBAAC,CAACC,OAAO,CAACL,OAAO,CAAC,CAACuG,OAAO,CAACrO,oBAAoB,CAAC;EACzE,MAAMsO,kBAAkB,GAAG,MAAOC,CAAC,IAAK;IACtC,IAAI;MACF,OAAO,MAAMA,CAAC;IAChB,CAAC,CAAC,OAAO7K,GAAG,EAAE;MACZ,MAAM8K,aAAa,GAAI9K,GAAG,YAAYwE,iBAAC,CAACuG,cAAc,GAAI/K,GAAG,CAAC,CAAC,CAAC,GAAGA,GAAG;MACtE,IAAI,CAAC/B,GAAG,CAACC,KAAK,CAAE,wCAAuC4M,aAAa,CAACtH,OAAQ,EAAC,CAAC;MAC/E,IAAIsH,aAAa,YAAYtG,iBAAC,CAACwG,YAAY,EAAE;QAC3C,MAAM,IAAIpB,KAAK,CAAE,oDAAmD,GACjE,GAAEU,KAAK,CAACW,WAAW,EAAE,CAACC,cAAc,CAACC,OAAO,CAAC,CAAC,CAAE,IAAG,CAAC;MACzD;MACA,MAAML,aAAa;IACrB;EACF,CAAC;EAGD,MAAMF,kBAAkB,CAACpG,iBAAC,CAAC4G,GAAG,CAAC,CAAC5G,iBAAC,CAAC6G,KAAK,CAAC9O,oBAAoB,CAAC,EAAEmO,gBAAgB,CAAC,CAAC,CAAC;EAClF,IAAIA,gBAAgB,CAACY,WAAW,EAAE,EAAE;IAClC,OAAO,MAAMZ,gBAAgB;EAC/B;EAGA,IAAI,CAACrN,eAAC,CAACuE,aAAa,CAAC,IAAI,CAAC2J,aAAa,CAAC,EAAE;IACxC,IAAI,CAACA,aAAa,GAAG;MACnBC,KAAK,EAAE,CAAC;MACRC,aAAa,EAAE,IAAIC,oBAAY,EAAE;MACjCC,YAAY,EAAEnH,iBAAC,CAACC,OAAO;IACzB,CAAC;EACH;EACA,IAAI,CAAC8G,aAAa,CAACC,KAAK,EAAE;EAE1B,IAAII,eAAe;EACnB,IAAI;IAEF,IAAI,IAAI,CAACL,aAAa,CAACI,YAAY,CAACE,UAAU,EAAE,EAAE;MAChD,IAAI,CAACN,aAAa,CAACI,YAAY,GAAGnH,iBAAC,CAACC,OAAO,CAAC,CAAC,YAAY;QACvD,OAAO,IAAI,CAAC8G,aAAa,CAACC,KAAK,GAAG,CAAC,EAAE;UACnC,IAAI;YACF,IAAI,MAAM,IAAI,CAACpB,aAAa,EAAE,EAAE;cAC9B,IAAI,CAACmB,aAAa,CAACE,aAAa,CAACK,IAAI,CAACtP,0BAA0B,CAAC;YACnE;UACF,CAAC,CAAC,OAAOmN,GAAG,EAAE,CAAC;UACf,MAAMnF,iBAAC,CAAC6G,KAAK,CAAC9O,oBAAoB,GAAG,CAAC,CAAC;QACzC;MACF,CAAC,GAAG,CAAC;IACP;IAEA,OAAO,MAAM,IAAIiI,iBAAC,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtCkH,eAAe,GAAG,MAAMlH,MAAM,CAAC,IAAI7G,cAAM,CAACkO,wBAAwB,EAAE,CAAC;MACrE,IAAI,CAACR,aAAa,CAACE,aAAa,CAACO,IAAI,CAACxP,0BAA0B,EAAEoP,eAAe,CAAC;MAClFhB,kBAAkB,CAACF,gBAAgB,CAAC,CAEjCuB,IAAI,CAACxH,OAAO,CAAC,CACbyH,KAAK,CAACxH,MAAM,CAAC;IAClB,CAAC,CAAC;EACJ,CAAC,SAAS;IACR,IAAIkH,eAAe,EAAE;MACnB,IAAI,CAACL,aAAa,CAACE,aAAa,CAACU,cAAc,CAAC3P,0BAA0B,EAAEoP,eAAe,CAAC;IAC9F;IACA,IAAI,CAACL,aAAa,CAACC,KAAK,EAAE;EAC5B;AACF,CAAC;AAEDtO,UAAU,CAACkP,YAAY,GAAG,eAAeA,YAAY,CAAEC,OAAO,EAAE;EAC9D,IAAI,CAAClN,MAAM,CAACmN,4BAA4B,GAAG,IAAI;EAC/C,IAAI;IACF,MAAM,IAAI,CAAC/N,WAAW,CAAC,gBAAgB,EAAE,CAAE,WAAU8N,OAAQ,KAAI,EAAE,IAAI,CAAC,CAAC;EAC3E,CAAC,SAAS;IACR,IAAI,CAAClN,MAAM,CAACmN,4BAA4B,GAAG,KAAK;EAClD;AACF,CAAC;AAqBDtP,QAAQ,CAACuP,6BAA6B,GAAG,eAAeA,6BAA6B,CAAEzF,IAAI,GAAG,CAAC,CAAC,EAAE;EAChG,IAAI,CAAC,IAAI,CAAC0F,WAAW,EAAE,EAAE;IACvB,MAAM,IAAI5C,KAAK,CAAC,gDAAgD,CAAC;EACnE;EACA,MAAM;IAAE6C;EAAY,CAAC,GAAG3F,IAAI;EAC5B,IAAI,CAACzJ,eAAC,CAACuE,aAAa,CAAC6K,WAAW,CAAC,EAAE;IACjC,MAAM,IAAI5O,cAAM,CAACyJ,oBAAoB,CAAC,+CAA+C,CAAC;EACxF;EAEA,IAAI,CAACrJ,GAAG,CAACC,KAAK,CAAE,uCAAsC8C,IAAI,CAACC,SAAS,CAACwL,WAAW,CAAE,EAAC,CAAC;EACpF,MAAM,IAAI,CAAC3F,IAAI,CAACX,MAAM,CAACuG,oBAAoB,CAACD,WAAW,CAAC;AAC1D,CAAC;AAEDE,MAAM,CAACC,MAAM,CAAC5P,QAAQ,EAAEE,UAAU,EAAED,OAAO,CAAC;AAAC,eAE9BD,QAAQ;AAAA"}
@@ -22,6 +22,11 @@ const NOTCHED_DEVICE_SIZES = [
22
22
  {w: 1125, h: 2436}, // 11 Pro, X, Xs
23
23
  {w: 828, h: 1792}, // 11, Xr
24
24
  {w: 1242, h: 2688}, // 11 Pro Max, Xs Max
25
+ {w: 1080, h: 2340}, // 13 mini, 12 mini
26
+ {w: 1170, h: 2532}, // 14, 13, 13 Pro, 12, 12 Pro
27
+ {w: 1284, h: 2778}, // 14 Plus, 13 Pro Max, 12 Pro Max
28
+ {w: 1179, h: 2556}, // 14 Pro
29
+ {w: 1290, h: 2796}, // 14 Pro Max
25
30
  ];
26
31
 
27
32
  const { W3C_WEB_ELEMENT_IDENTIFIER } = util;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appium-xcuitest-driver",
3
- "version": "4.16.11",
3
+ "version": "4.16.12",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-xcuitest-driver",
9
- "version": "4.16.11",
9
+ "version": "4.16.12",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@babel/runtime": "^7.0.0",
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "4.16.11",
11
+ "version": "4.16.12",
12
12
  "author": "Appium Contributors",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {
@@ -110,7 +110,7 @@
110
110
  "e2e-test:long": "mocha \"./test/functional/long\" --exit --timeout 10m",
111
111
  "e2e-test:parallel": "mocha \"./test/functional/parallel\" --exit --timeout 10m",
112
112
  "e2e-test:web": "mocha \"./test/functional/web\" --exit --timeout 10m",
113
- "e2e-test:native-web-tap": "ALL_DEVICES=1 mocha \"./test/functional/web/safari-nativewebtap-e2e-specs.js\" --exit --timeout 10m"
113
+ "e2e-test:native-web-tap": "mocha \"./test/functional/web/safari-nativewebtap-e2e-specs.js\" --exit --timeout 10m"
114
114
  },
115
115
  "pre-commit": [
116
116
  "precommit-msg",