appium-adb 9.10.4 → 9.10.7

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.
@@ -68,22 +68,21 @@ const MAIN_ACTION = 'android.intent.action.MAIN';
68
68
  const LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';
69
69
 
70
70
  const getModuleRoot = _lodash.default.memoize(function getModuleRoot() {
71
- const pathParts = _path.default.resolve(__dirname).split(_path.default.sep);
71
+ let currentDir = _path.default.dirname(_path.default.resolve(__filename));
72
72
 
73
- for (let pathItemIdx = pathParts.length; pathItemIdx > 0; --pathItemIdx) {
74
- const currentDir = _path.default.join(...pathParts.slice(0, pathItemIdx));
73
+ let isAtFsRoot = false;
75
74
 
75
+ while (!isAtFsRoot) {
76
76
  const manifestPath = _path.default.join(currentDir, 'package.json');
77
77
 
78
78
  try {
79
- if (!_fs2.default.existsSync(manifestPath)) {
80
- continue;
81
- }
82
-
83
- if (JSON.parse(_fs2.default.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
79
+ if (_fs2.default.existsSync(manifestPath) && JSON.parse(_fs2.default.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
84
80
  return currentDir;
85
81
  }
86
82
  } catch (ign) {}
83
+
84
+ currentDir = _path.default.dirname(currentDir);
85
+ isAtFsRoot = currentDir.length <= _path.default.dirname(currentDir).length;
87
86
  }
88
87
 
89
88
  throw new Error('Cannot find the root folder of the appium-adb Node.js module');
@@ -974,4 +973,4 @@ function parseLaunchableActivityNames(dumpsys) {
974
973
  function matchComponentName(classString) {
975
974
  return /^[a-z0-9./_]+$/i.exec(classString);
976
975
  }
977
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUEtTX0VYVEVOU0lPTiIsIkFQS19FWFRFTlNJT04iLCJBUEtfSU5TVEFMTF9USU1FT1VUIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQiLCJNQUlOX0FDVElPTiIsIkxBVU5DSEVSX0NBVEVHT1JZIiwiZ2V0TW9kdWxlUm9vdCIsIl8iLCJtZW1vaXplIiwicGF0aFBhcnRzIiwicGF0aCIsInJlc29sdmUiLCJfX2Rpcm5hbWUiLCJzcGxpdCIsInNlcCIsInBhdGhJdGVtSWR4IiwibGVuZ3RoIiwiY3VycmVudERpciIsImpvaW4iLCJzbGljZSIsIm1hbmlmZXN0UGF0aCIsIl9mcyIsImV4aXN0c1N5bmMiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJuYW1lIiwiaWduIiwiRXJyb3IiLCJnZXRTZGtSb290RnJvbUVudiIsInByb2Nlc3MiLCJlbnYiLCJBTkRST0lEX0hPTUUiLCJBTkRST0lEX1NES19ST09UIiwicmVxdWlyZVNka1Jvb3QiLCJjdXN0b21Sb290Iiwic2RrUm9vdCIsImRvY01zZyIsImlzRW1wdHkiLCJmcyIsImV4aXN0cyIsInN0YXRzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInByb3BzUGF0aHMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJkaXJuYW1lIiwicGxhdGZvcm0iLCJiYXNlbmFtZSIsIm1hdGNoIiwiZXhlYyIsImxvZyIsIndhcm4iLCJwYXJzZUludCIsInJlY2VudFNka1ZlcnNpb24iLCJrZXlzIiwic29ydCIsInJldmVyc2UiLCJyZXN1bHQiLCJkZWJ1ZyIsInN0cmluZ2lmeSIsInVuemlwRmlsZSIsInppcFBhdGgiLCJkc3RSb290IiwiemlwIiwiYXNzZXJ0VmFsaWRaaXAiLCJleHRyYWN0QWxsVG8iLCJ1bnNpZ25BcGsiLCJhcGtQYXRoIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwibWV0YUluZkZvbGRlck5hbWUiLCJoYXNNZXRhSW5mIiwicmVhZEVudHJpZXMiLCJlbnRyeSIsImZpbGVOYW1lIiwic3RhcnRzV2l0aCIsInRtcFppcFJvb3QiLCJyaW1yYWYiLCJ0bXBSZXN1bHRQYXRoIiwidG9BcmNoaXZlIiwidW5saW5rIiwibXYiLCJnZXRJTUVMaXN0RnJvbU91dHB1dCIsInN0ZG91dCIsImVuZ2luZXMiLCJsaW5lIiwicHVzaCIsInRyaW0iLCJyZXBsYWNlIiwiZ2V0SmF2YUhvbWUiLCJKQVZBX0hPTUUiLCJnZXRKYXZhRm9yT3MiLCJqYXZhSG9tZSIsImVyck1zZyIsImVyciIsIm1lc3NhZ2UiLCJleGVjdXRhYmxlTmFtZSIsInN5c3RlbSIsImlzV2luZG93cyIsInJlc3VsdFBhdGgiLCJ3aGljaCIsImdldE9wZW5Tc2xGb3JPcyIsImJpbmFyeU5hbWUiLCJnZXRBcGtzaWduZXJGb3JPcyIsInN5c0hlbHBlcnMiLCJnZXRCaW5hcnlGcm9tU2RrUm9vdCIsImdldEFwa2FuYWx5emVyRm9yT3MiLCJpc1Nob3dpbmdMb2Nrc2NyZWVuIiwiZHVtcHN5cyIsInNvbWUiLCJ4IiwiaW5jbHVkZXMiLCJldmVyeSIsInRlc3QiLCJpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQiLCJtIiwiZ2V0U3VyZmFjZU9yaWVudGF0aW9uIiwiaXNTY3JlZW5PbkZ1bGx5IiwiYnVpbGRTdGFydENtZCIsInN0YXJ0QXBwT3B0aW9ucyIsImFwaUxldmVsIiwidXNlciIsIndhaXRGb3JMYXVuY2giLCJwa2ciLCJhY3Rpdml0eSIsImFjdGlvbiIsImNhdGVnb3J5Iiwic3RvcEFwcCIsImZsYWdzIiwiY21kIiwidXRpbCIsImhhc1ZhbHVlIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJwYXJzZUtleVZhbHVlIiwic3RyIiwic3BhY2UiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwicmUiLCJhcmdzIiwiYXBwbHkiLCJmbGFnIiwiZmxhZ1BvcyIsInByZXZBcmdzIiwiZ2V0U2RrVG9vbHNWZXJzaW9uIiwiYW5kcm9pZEhvbWUiLCJwcm9wZXJ0aWVzUGF0aCIsInByb3BlcnRpZXNDb250ZW50IiwidmVyc2lvbk1hdGNoZXIiLCJSZWdFeHAiLCJtYWpvciIsIm1pbm9yIiwiYnVpbGQiLCJnZXRCdWlsZFRvb2xzRGlycyIsImJ1aWxkVG9vbHNEaXJzIiwibWFwIiwiZGlyIiwiYSIsImIiLCJzZW12ZXIiLCJyY29tcGFyZSIsInBhaXIiLCJwYWlycyIsIkIiLCJtdGltZSIsInZhbHVlT2YiLCJpbmZvIiwiZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMiLCJkdW1wc3lzT3V0cHV0IiwiZ3JvdXBOYW1lcyIsImdyYW50ZWRTdGF0ZSIsImdyb3VwUGF0dGVybkJ5TmFtZSIsImdyb3VwTmFtZSIsImVzY2FwZVJlZ0V4cCIsImluZGVudFBhdHRlcm4iLCJwZXJtaXNzaW9uTmFtZVBhdHRlcm4iLCJncmFudGVkU3RhdGVQYXR0ZXJuIiwiZ3JvdXBNYXRjaCIsImxpbmVzIiwidGl0bGVJbmRlbnQiLCJzZWFyY2giLCJjdXJyZW50SW5kZW50IiwicGVybWlzc2lvbk5hbWVNYXRjaCIsIml0ZW0iLCJwZXJtaXNzaW9uIiwiZ3JhbnRlZFN0YXRlTWF0Y2giLCJncmFudGVkIiwiZmlsdGVyZWRSZXN1bHQiLCJmaWx0ZXIiLCJpc0Jvb2xlYW4iLCJwbHVyYWxpemUiLCJidWlsZEluc3RhbGxBcmdzIiwib3B0aW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwidXNlU2RjYXJkIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBhcnRpYWxJbnN0YWxsIiwicGFyc2VNYW5pZmVzdCIsIm1hbmlmZXN0IiwicGFja2FnZSIsInZlcnNpb25Db2RlIiwidmVyc2lvbk5hbWUiLCJhcHBsaWNhdGlvbiIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUFsaWFzZXMiLCJlbmFibGVkIiwiaW50ZW50RmlsdGVycyIsImFjdGlvbnMiLCJjYXRlZ29yaWVzIiwiaXNNYWluQWN0aW9uIiwiaXNMYXVuY2hlckNhdGVnb3J5IiwicGFyc2VBYXB0U3RyaW5ncyIsInJhd091dHB1dCIsImNvbmZpZ01hcmtlciIsIm5vcm1hbGl6ZVN0cmluZ01hdGNoIiwicyIsImFwa1N0cmluZ3MiLCJpc0luQ29uZmlnIiwiY3VycmVudFJlc291cmNlSWQiLCJpc0luUGx1cmFsR3JvdXAiLCJxdW90ZWRTdHJpbmdQYXR0ZXJuIiwib3MiLCJFT0wiLCJ0cmltbWVkTGluZSIsInBhcnNlQWFwdDJTdHJpbmdzIiwiYWxsTGluZXMiLCJleHRyYWN0Q29udGVudCIsInN0YXJ0SWR4IiwiaWR4Iiwic3RhcnRDaGFyUG9zIiwidGVybWluYXRpb25DaGFyTWF0Y2giLCJ0ZXJtaW5hdGlvbkNoYXJQb3MiLCJpbmRleCIsInRyaW1TdGFydCIsImlzSW5DdXJyZW50Q29uZmlnIiwibGluZUluZGV4IiwiY29udGVudCIsImlzU3RyaW5nIiwiZm9ybWF0Q29uZmlnTWFya2VyIiwiY29uZmlnc0dldHRlciIsImRlc2lyZWRNYXJrZXIiLCJkZWZhdWx0TWFya2VyIiwiY29uZmlncyIsInRvTG93ZXJDYXNlIiwicGFyc2VKc29uRGF0YSIsIm91dHB1dCIsImVudGl0eU5hbWUiLCJqc29uU3RyIiwiZSIsInRvQXZkTG9jYWxlQXJncyIsImxhbmd1YWdlIiwiY291bnRyeSIsInRvVXBwZXJDYXNlIiwibG9jYWxlIiwiZ2V0QW5kcm9pZFByZWZzUm9vdCIsImxvY2F0aW9uIiwiQU5EUk9JRF9FTVVMQVRPUl9IT01FIiwiZGlyRXhpc3RzIiwiaG9tZSIsIkhPTUUiLCJVU0VSUFJPRklMRSIsImVzY2FwZVNoZWxsQXJnIiwiYXJnIiwicGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyIsIm1haW5BY3Rpdml0eU5hbWVSZSIsImNhdGVnb3J5TmFtZVJlIiwiYmxvY2tzIiwiYmxvY2tTdGFydEluZGVudCIsImJsb2NrIiwidHJpbUVuZCIsImlzTmlsIiwiaGFzQ2F0ZWdvcnkiLCJhY3Rpdml0eU5hbWVTdHIiLCJCb29sZWFuIiwiZnFBY3Rpdml0eU5hbWUiLCJtYXRjaENvbXBvbmVudE5hbWUiLCJjbGFzc1N0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgemlwLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcblxuY29uc3QgQVBLU19FWFRFTlNJT04gPSAnLmFwa3MnO1xuY29uc3QgQVBLX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IEFQS19JTlNUQUxMX1RJTUVPVVQgPSA2MDAwMDtcbmNvbnN0IEFQS1NfSU5TVEFMTF9USU1FT1VUID0gQVBLX0lOU1RBTExfVElNRU9VVCAqIDI7XG5jb25zdCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPSAyMDAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBNQUlOX0FDVElPTiA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTic7XG5jb25zdCBMQVVOQ0hFUl9DQVRFR09SWSA9ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUic7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBtb2R1bGUncyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gbW9kdWxlIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY3VycmVudCBtb2R1bGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TW9kdWxlUm9vdCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRNb2R1bGVSb290ICgpIHtcbiAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSkuc3BsaXQocGF0aC5zZXApO1xuICBmb3IgKGxldCBwYXRoSXRlbUlkeCA9IHBhdGhQYXJ0cy5sZW5ndGg7IHBhdGhJdGVtSWR4ID4gMDsgLS1wYXRoSXRlbUlkeCkge1xuICAgIGNvbnN0IGN1cnJlbnREaXIgPSBwYXRoLmpvaW4oLi4uKHBhdGhQYXJ0cy5zbGljZSgwLCBwYXRoSXRlbUlkeCkpKTtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9mcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoSlNPTi5wYXJzZShfZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS1hZGInKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSByb290IGZvbGRlciBvZiB0aGUgYXBwaXVtLWFkYiBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhY3R1YWwgcGF0aCB0byBTREsgcm9vdCBmb2xkZXIgZnJvbSB0aGUgc3lzdGVtIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgU0RLIHJvb3QgZm9sZGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNka1Jvb3RGcm9tRW52ICgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkFORFJPSURfSE9NRSB8fCBwcm9jZXNzLmVudi5BTkRST0lEX1NES19ST09UO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYWN0dWFsIHBhdGggdG8gU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBTREsgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgZW52IHZhcmlhYmxlIGlzIHVuc2V0IG9yIGlzXG4gKiBwb2ludGluZyB0byBhbiBpbnZhbGlkIGZpbGUgc3lzdGVtIGVudHJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVTZGtSb290IChjdXN0b21Sb290ID0gbnVsbCkge1xuICBjb25zdCBzZGtSb290ID0gY3VzdG9tUm9vdCB8fCBnZXRTZGtSb290RnJvbUVudigpO1xuICBjb25zdCBkb2NNc2cgPSAnUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vY29tbWFuZC1saW5lL3ZhcmlhYmxlcyBmb3IgbW9yZSBkZXRhaWxzJztcbiAgaWYgKF8uaXNFbXB0eShzZGtSb290KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIGV4cG9ydGVkLiAke2RvY01zZ31gKTtcbiAgfVxuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHNka1Jvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXIgJyR7c2RrUm9vdH0nIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4gJHtkb2NNc2d9YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNka1Jvb3QpO1xuICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBBbmRyb2lkIFNESyByb290ICcke3Nka1Jvb3R9JyBtdXN0IGJlIGEgZm9sZGVyLiAke2RvY01zZ31gKTtcbiAgfVxuICByZXR1cm4gc2RrUm9vdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQbGF0Zm9ybUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGxhdGZvcm0gLSBUaGUgcGxhdGZvcm0gbmFtZSwgZm9yIGV4YW1wbGUgYGFuZHJvaWQtMjRgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwbGF0Zm9ybVBhdGggLSBGdWxsIHBhdGggdG8gdGhlIHBsYXRmb3JtIFNESyBmb2xkZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBhdGggdG8gdGhlIHJlY2VudCBpbnN0YWxsZWQgQW5kcm9pZCBwbGF0Zm9ybS5cbiAqXG4gKiBAcmV0dXJuIHtQbGF0Zm9ybUluZm99IFRoZSByZXN1bHRpbmcgcGF0aCB0byB0aGUgbmV3ZXN0IGluc3RhbGxlZCBwbGF0Zm9ybS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCAoc2RrUm9vdCkge1xuICBjb25zdCBwcm9wc1BhdGhzID0gYXdhaXQgZnMuZ2xvYignKi9idWlsZC5wcm9wJywge1xuICAgIGN3ZDogcGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHBsYXRmb3Jtc01hcHBpbmcgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wc1BhdGggb2YgcHJvcHNQYXRocykge1xuICAgIGNvbnN0IHByb3BzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGxhdGZvcm1QYXRoID0gcGF0aC5kaXJuYW1lKHByb3BzUGF0aCk7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBwYXRoLmJhc2VuYW1lKHBsYXRmb3JtUGF0aCk7XG4gICAgY29uc3QgbWF0Y2ggPSAvcm9cXC5idWlsZFxcLnZlcnNpb25cXC5zZGs9KFxcZCspLy5leGVjKHByb3BzQ29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBTREsgdmVyc2lvbiBmcm9tICcke3Byb3BzUGF0aH0nLiBTa2lwcGluZyAnJHtwbGF0Zm9ybX0nYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGxhdGZvcm1zTWFwcGluZ1twYXJzZUludChtYXRjaFsxXSwgMTApXSA9IHtcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgcGxhdGZvcm1QYXRoLFxuICAgIH07XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwbGF0Zm9ybXNNYXBwaW5nKSkge1xuICAgIGxvZy53YXJuKGBGb3VuZCB6ZXJvIHBsYXRmb3JtIGZvbGRlcnMgYXQgJyR7cGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKX0nLiBgICtcbiAgICAgIGBEbyB5b3UgaGF2ZSBhbnkgQW5kcm9pZCBTREtzIGluc3RhbGxlZD9gKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxhdGZvcm06IG51bGwsXG4gICAgICBwbGF0Zm9ybVBhdGg6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY2VudFNka1ZlcnNpb24gPSBfLmtleXMocGxhdGZvcm1zTWFwcGluZykuc29ydCgpLnJldmVyc2UoKVswXTtcbiAgY29uc3QgcmVzdWx0ID0gcGxhdGZvcm1zTWFwcGluZ1tyZWNlbnRTZGtWZXJzaW9uXTtcbiAgbG9nLmRlYnVnKGBGb3VuZCB0aGUgbW9zdCByZWNlbnQgQW5kcm9pZCBwbGF0Zm9ybTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bnppcEZpbGUgKHppcFBhdGgsIGRzdFJvb3QgPSBwYXRoLmRpcm5hbWUoemlwUGF0aCkpIHtcbiAgbG9nLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nIHRvICcke2RzdFJvb3R9J2ApO1xuICBhd2FpdCB6aXAuYXNzZXJ0VmFsaWRaaXAoemlwUGF0aCk7XG4gIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oemlwUGF0aCwgZHN0Um9vdCk7XG4gIGxvZy5kZWJ1ZygnVW56aXAgc3VjY2Vzc2Z1bCcpO1xufVxuXG4vKipcbiAqIFVuc2lnbnMgdGhlIGdpdmVuIGFwayBieSByZW1vdmluZyB0aGVcbiAqIE1FVEEtSU5GIGZvbGRlciByZWN1cnNpdmVseSBmcm9tIHRoZSBhcmNoaXZlLlxuICogISEhIFRoZSBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBnaXZlbiBhcGsgYWZ0ZXIgc3VjY2Vzc2Z1bCB1bnNpZ25pbmcgISEhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwa1BhdGggVGhlIHBhdGggdG8gdGhlIGFwa1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYXBrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogdW5zaWduZWQgYW5kIG92ZXJ3cml0dGVuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgdW5zaWduIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiB1bnNpZ25BcGsgKGFwa1BhdGgpIHtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCBtZXRhSW5mRm9sZGVyTmFtZSA9ICdNRVRBLUlORic7XG4gIHRyeSB7XG4gICAgbGV0IGhhc01ldGFJbmYgPSBmYWxzZTtcbiAgICBhd2FpdCB6aXAucmVhZEVudHJpZXMoYXBrUGF0aCwgKHtlbnRyeX0pID0+IHtcbiAgICAgIGhhc01ldGFJbmYgPSBlbnRyeS5maWxlTmFtZS5zdGFydHNXaXRoKGAke21ldGFJbmZGb2xkZXJOYW1lfS9gKTtcbiAgICAgIC8vIGVudHJpZXMgaXRlcmF0aW9uIHN0b3BzIGFmdGVyIGBmYWxzZWAgaXMgcmV0dXJuZWRcbiAgICAgIHJldHVybiAhaGFzTWV0YUluZjtcbiAgICB9KTtcbiAgICBpZiAoIWhhc01ldGFJbmYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdG1wWmlwUm9vdCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCAnYXBrJyk7XG4gICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhhcGtQYXRoLCB0bXBaaXBSb290KTtcbiAgICBhd2FpdCBmcy5yaW1yYWYocGF0aC5yZXNvbHZlKHRtcFppcFJvb3QsIG1ldGFJbmZGb2xkZXJOYW1lKSk7XG4gICAgY29uc3QgdG1wUmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwa1BhdGgpKTtcbiAgICBhd2FpdCB6aXAudG9BcmNoaXZlKHRtcFJlc3VsdFBhdGgsIHtcbiAgICAgIGN3ZDogdG1wWmlwUm9vdCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy51bmxpbmsoYXBrUGF0aCk7XG4gICAgYXdhaXQgZnMubXYodG1wUmVzdWx0UGF0aCwgYXBrUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElNRUxpc3RGcm9tT3V0cHV0IChzdGRvdXQpIHtcbiAgbGV0IGVuZ2luZXMgPSBbXTtcbiAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID4gMCAmJiBsaW5lWzBdICE9PSAnICcpIHtcbiAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIGFuZCB0cmFpbGluZyBjb2xvbiwgYW5kIGFkZCB0byB0aGUgbGlzdFxuICAgICAgZW5naW5lcy5wdXNoKGxpbmUudHJpbSgpLnJlcGxhY2UoLzokLywgJycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVuZ2luZXM7XG59XG5cbmNvbnN0IGdldEphdmFIb21lID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEphdmFIb21lICgpIHtcbiAgY29uc3QgcmVzdWx0ID0gcHJvY2Vzcy5lbnYuSkFWQV9IT01FO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzJyk7XG4gIH1cbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGV4aXN0YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHJlc3VsdCk7XG4gIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGJlIGEgdmFsaWQgZm9sZGVyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5jb25zdCBnZXRKYXZhRm9yT3MgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0SmF2YUZvck9zICgpIHtcbiAgbGV0IGphdmFIb21lO1xuICBsZXQgZXJyTXNnO1xuICB0cnkge1xuICAgIGphdmFIb21lID0gYXdhaXQgZ2V0SmF2YUhvbWUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyTXNnID0gZXJyLm1lc3NhZ2U7XG4gIH1cbiAgY29uc3QgZXhlY3V0YWJsZU5hbWUgPSBgamF2YSR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgaWYgKGphdmFIb21lKSB7XG4gICAgY29uc3QgcmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicsIGV4ZWN1dGFibGVOYW1lKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0UGF0aDtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goZXhlY3V0YWJsZU5hbWUpO1xuICB9IGNhdGNoIChpZ24pIHt9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlICcke2V4ZWN1dGFibGVOYW1lfScgYmluYXJ5IGNvdWxkIG5vdCBiZSBmb3VuZCBgICtcbiAgICBgbmVpdGhlciBpbiBQQVRIIG5vciB1bmRlciBKQVZBX0hPTUUgKCR7ZXJyTXNnIHx8IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicpfSlgKTtcbn0pO1xuXG5jb25zdCBnZXRPcGVuU3NsRm9yT3MgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpbmFyeU5hbWUgPSBgb3BlbnNzbCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZW5zc2wgdG9vbCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgb24gdGhlIHBhdGgnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2xcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3lzSGVscGVycyAtIEFuIGluc3RhbmNlIGNvbnRhaW5pbmcgc3lzdGVtQ2FsbE1ldGhvZHMgaGVscGVyIG1ldGhvZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGtzaWduZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrc2lnbmVyLmphcicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS9hcGthbmFseXplci5odG1sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa2FuYWx5emVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGthbmFseXplckZvck9zIChzeXNIZWxwZXJzKSB7XG4gIHJldHVybiBhd2FpdCBzeXNIZWxwZXJzLmdldEJpbmFyeUZyb21TZGtSb290KCdhcGthbmFseXplcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBtU2hvd2luZ0xvY2tzY3JlZW4gb3IgbURyZWFtaW5nTG9ja3NjcmVlbiBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmVcbiAqIGlmIGxvY2sgc2NyZWVuIGlzIHNob3dpbmdcbiAqXG4gKiBBIG5vdGU6IGBhZGIgc2hlbGwgZHVtcHN5cyB0cnVzdGAgcGVyZm9ybXMgYmV0dGVyIHdoaWxlIGRldGVjdGluZyB0aGUgbG9ja2VkIHNjcmVlbiBzdGF0ZVxuICogaW4gY29tcGFyaXNvbiB0byBgYWRiIGR1bXBzeXMgd2luZG93YCBvdXRwdXQgcGFyc2luZy5cbiAqIEJ1dCB0aGUgdHJ1c3QgY29tbWFuZCBkb2VzIG5vdCB3b3JrIGZvciBgU3dpcGVgIHVubG9jayBwYXR0ZXJuLlxuICpcbiAqIEluIHNvbWUgQW5kcm9pZCBkZXZpY2VzIChQcm9iYWJseSBhcm91bmQgQW5kcm9pZCAxMCspLCBgbVNob3dpbmdMb2Nrc2NyZWVuYCBhbmQgYG1EcmVhbWluZ0xvY2tzY3JlZW5gXG4gKiBkbyBub3Qgd29yayB0byBkZXRlY3QgbG9jayBzdGF0dXMuIEluc3RlYWQsIGtleWd1YXJkIHByZWZlcmVuY2VzIGhlbHBzIHRvIGRldGVjdCB0aGUgbG9jayBjb25kaXRpb24uXG4gKiBTb21lIGRldmljZXMgc3VjaCBhcyBBbmRyb2lkIFRWIGRvIG5vdCBoYXZlIGtleWd1YXJkLCBzbyB3ZSBzaG91bGQga2VlcFxuICogc2NyZWVuIGNvbmRpdGlvbiBhcyB0aGlzIHByaW1hcnkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzIC0gVGhlIG91dHB1dCBvZiBkdW1wc3lzIHdpbmRvdyBjb21tYW5kLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nLlxuICovXG5mdW5jdGlvbiBpc1Nob3dpbmdMb2Nrc2NyZWVuIChkdW1wc3lzKSB7XG4gIHJldHVybiBfLnNvbWUoWydtU2hvd2luZ0xvY2tzY3JlZW49dHJ1ZScsICdtRHJlYW1pbmdMb2Nrc2NyZWVuPXRydWUnXSwgKHgpID0+IGR1bXBzeXMuaW5jbHVkZXMoeCkpXG4gICAgLy8gYG1Jc1Nob3dpbmdgIGFuZCBgbUlucHV0UmVzdHJpY3RlZGAgYXJlIGB0cnVlYCBpbiBsb2NrIGNvbmRpdGlvbi4gYGZhbHNlYCBpcyB1bmxvY2sgY29uZGl0aW9uLlxuICAgIHx8IF8uZXZlcnkoWy9LZXlndWFyZFN0YXRlTW9uaXRvcltcXG5cXHNdK21Jc1Nob3dpbmc9dHJ1ZS8sIC9cXHMrbUlucHV0UmVzdHJpY3RlZD10cnVlL10sICh4KSA9PiB4LnRlc3QoZHVtcHN5cykpO1xufVxuXG4vKlxuICogQ2hlY2tzIG1DdXJyZW50Rm9jdXMgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIEtleWd1YXJkIGlzIGFjdGl2YXRlZFxuICovXG5mdW5jdGlvbiBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbUN1cnJlbnRGb2N1cy4rS2V5Z3VhcmQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIChtICYmIG0ubGVuZ3RoICYmIG1bMF0pID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKlxuICogUmVhZHMgU3VyZmFjZU9yaWVudGF0aW9uIGluIGR1bXBzeXMgb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGdldFN1cmZhY2VPcmllbnRhdGlvbiAoZHVtcHN5cykge1xuICBsZXQgbSA9IC9TdXJmYWNlT3JpZW50YXRpb246IFxcZC9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gbSAmJiBwYXJzZUludChtWzBdLnNwbGl0KCc6JylbMV0sIDEwKTtcbn1cblxuLypcbiAqIENoZWNrcyBtU2NyZWVuT25GdWxseSBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmUgaWYgc2NyZWVuIGlzIHNob3dpbmdcbiAqIERlZmF1bHQgaXMgdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1NjcmVlbk9uRnVsbHkgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbVNjcmVlbk9uRnVsbHk9XFx3Ky9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gIW0gfHwgLy8gaWYgaW5mb3JtYXRpb24gaXMgbWlzc2luZyB3ZSBhc3N1bWUgc2NyZWVuIGlzIGZ1bGx5IG9uXG4gICAgICAgICAobSAmJiBtLmxlbmd0aCA+IDAgJiYgbVswXS5zcGxpdCgnPScpWzFdID09PSAndHJ1ZScpIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlblxuICogYXBwbGljYXRpb24gc3RhcnR1cCBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtTdGFydEFwcE9wdGlvbnN9IHN0YXJ0QXBwT3B0aW9ucyAtIEFwcGxpY2F0aW9uIG9wdGlvbnMgbWFwcGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGFwaUxldmVsIC0gVGhlIGFjdHVhbCBPUyBBUEkgbGV2ZWxcbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYWN0dWFsIGNvbW1hbmQgbGluZSBhcnJheVxuICovXG5mdW5jdGlvbiBidWlsZFN0YXJ0Q21kIChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gICAgcGtnLFxuICAgIGFjdGl2aXR5LFxuICAgIGFjdGlvbixcbiAgICBjYXRlZ29yeSxcbiAgICBzdG9wQXBwLFxuICAgIGZsYWdzLFxuICB9ID0gc3RhcnRBcHBPcHRpb25zO1xuICBjb25zdCBjbWQgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgY21kLnB1c2goJy1XJyk7XG4gIH1cbiAgaWYgKGFjdGl2aXR5ICYmIHBrZykge1xuICAgIGNtZC5wdXNoKCctbicsIGAke3BrZ30vJHthY3Rpdml0eX1gKTtcbiAgfVxuICBpZiAoc3RvcEFwcCAmJiBhcGlMZXZlbCA+PSAxNSkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmIChhY3Rpb24pIHtcbiAgICBjbWQucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmIChjYXRlZ29yeSkge1xuICAgIGNtZC5wdXNoKCctYycsIGNhdGVnb3J5KTtcbiAgfVxuICBpZiAoZmxhZ3MpIHtcbiAgICBjbWQucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgaWYgKHN0YXJ0QXBwT3B0aW9ucy5vcHRpb25hbEludGVudEFyZ3VtZW50cykge1xuICAgIC8vIGV4cGVjdCBvcHRpb25hbEludGVudEFyZ3VtZW50cyB0byBiZSBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm06XG4gICAgLy8gICAgIFwiLWZsYWcga2V5XCJcbiAgICAvLyAgICAgXCItZmxhZyBrZXkgdmFsdWVcIlxuICAgIC8vIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgKGUuZy4sIFwiLWZsYWcxIGtleTEgLWZsYWcyIGtleTIgdmFsdWUyXCIpXG5cbiAgICAvLyB0YWtlIGEgc3RyaW5nIGFuZCBwYXJzZSBvdXQgdGhlIHBhcnQgYmVmb3JlIGFueSBzcGFjZXMsIGFuZCBhbnl0aGluZyBhZnRlclxuICAgIC8vIHRoZSBmaXJzdCBzcGFjZVxuICAgIGxldCBwYXJzZUtleVZhbHVlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgIGxldCBzcGFjZSA9IHN0ci5pbmRleE9mKCcgJyk7XG4gICAgICBpZiAoc3BhY2UgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoID8gW3N0cl0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBzcGFjZSkudHJpbSgpLCBzdHIuc3Vic3RyaW5nKHNwYWNlICsgMSkudHJpbSgpXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gY3ljbGUgdGhyb3VnaCB0aGUgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgYW5kIHB1bGwgb3V0IHRoZSBhcmd1bWVudHNcbiAgICAvLyBhZGQgYSBzcGFjZSBpbml0aWFsbHkgc28gZmxhZ3MgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBhcmd1bWVudHMgdGhhdFxuICAgIC8vIGhhdmUgaW50ZXJuYWwgaHlwaGVuc1xuICAgIGxldCBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGAgJHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHN9YDtcbiAgICBsZXQgcmUgPSAvICgtW15cXHNdKykgKC4rKS87XG4gICAgd2hpbGUgKHRydWUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgIGxldCBhcmdzID0gcmUuZXhlYyhvcHRpb25hbEludGVudEFyZ3VtZW50cyk7XG4gICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgZmxhZ3MsIHNvIHRoZSByZW1haW5kZXIgY2FuIGJlIHRyZWF0ZWQgYXMgJ2tleScgb3IgJ2tleSB2YWx1ZSdcbiAgICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBhcmUgZG9uZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gdGFrZSB0aGUgZmxhZyBhbmQgc2VlIGlmIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgICAgLy8gaWYgaXQgaXMgbm90LCB0aGVuIGl0IG1lYW5zIHdlIGhhdmUgYmVlbiB0aHJvdWdoIGFscmVhZHksIGFuZFxuICAgICAgLy8gd2hhdCBpcyBiZWZvcmUgdGhlIGZsYWcgaXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgcHJldmlvdXMgZmxhZ1xuICAgICAgbGV0IGZsYWcgPSBhcmdzWzFdO1xuICAgICAgbGV0IGZsYWdQb3MgPSBvcHRpb25hbEludGVudEFyZ3VtZW50cy5pbmRleE9mKGZsYWcpO1xuICAgICAgaWYgKGZsYWdQb3MgIT09IDApIHtcbiAgICAgICAgbGV0IHByZXZBcmdzID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuc3Vic3RyaW5nKDAsIGZsYWdQb3MpO1xuICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUocHJldkFyZ3MpKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmbGFnLCBhcyB0aGVyZSBhcmUgbm8gbW9yZSBlYXJsaWVyIGFyZ3VtZW50c1xuICAgICAgY21kLnB1c2goZmxhZyk7XG5cbiAgICAgIC8vIG1ha2Ugb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgaG9sZCB0aGUgcmVtYWluZGVyXG4gICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGFyZ3NbMl07XG4gICAgfVxuICB9XG4gIHJldHVybiBjbWQ7XG59XG5cbmNvbnN0IGdldFNka1Rvb2xzVmVyc2lvbiA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRTZGtUb29sc1ZlcnNpb24gKCkge1xuICBjb25zdCBhbmRyb2lkSG9tZSA9IHByb2Nlc3MuZW52LkFORFJPSURfSE9NRTtcbiAgaWYgKCFhbmRyb2lkSG9tZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EUk9JRF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGV4cGVjdGVkIHRvIGJlIHNldCcpO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKGFuZHJvaWRIb21lLCAndG9vbHMnLCAnc291cmNlLnByb3BlcnRpZXMnKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocHJvcGVydGllc1BhdGgpKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBmaW5kICR7cHJvcGVydGllc1BhdGh9IGZpbGUgdG8gcmVhZCBTREsgdmVyc2lvbiBmcm9tYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcGVydGllc1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHZlcnNpb25NYXRjaGVyID0gbmV3IFJlZ0V4cCgvUGtnXFwuUmV2aXNpb249KFxcZCspXFwuPyhcXGQrKT9cXC4/KFxcZCspPy8pO1xuICBjb25zdCBtYXRjaCA9IHZlcnNpb25NYXRjaGVyLmV4ZWMocHJvcGVydGllc0NvbnRlbnQpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFqb3I6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgICBtaW5vcjogbWF0Y2hbMl0gPyBwYXJzZUludChtYXRjaFsyXSwgMTApIDogMCxcbiAgICAgIGJ1aWxkOiBtYXRjaFszXSA/IHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgOiAwXG4gICAgfTtcbiAgfVxuICBsb2cud2FybihgQ2Fubm90IHBhcnNlIFwiUGtnLlJldmlzaW9uXCIgdmFsdWUgZnJvbSAke3Byb3BlcnRpZXNQYXRofWApO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIGZ1bGwgcGF0aHMgdG8gYWxsICdidWlsZC10b29scycgc3ViZm9sZGVycyB1bmRlciB0aGUgcGFydGljdWxhclxuICogU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNka1Jvb3QgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIFNESyByb290IGZvbGRlclxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBmdWxsIHBhdGhzIHRvIHRoZSByZXN1bHRpbmcgZm9sZGVycyBzb3J0ZWQgYnlcbiAqIG1vZGlmaWNhdGlvbiBkYXRlICh0aGUgbmV3ZXN0IGNvbWVzIGZpcnN0KSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hY3RoZXMgd2VyZSBmb3VuZFxuICovXG5jb25zdCBnZXRCdWlsZFRvb2xzRGlycyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRCdWlsZFRvb2xzRGlycyAoc2RrUm9vdCkge1xuICBsZXQgYnVpbGRUb29sc0RpcnMgPSBhd2FpdCBmcy5nbG9iKCcqLycsIHtcbiAgICBjd2Q6IHBhdGgucmVzb2x2ZShzZGtSb290LCAnYnVpbGQtdG9vbHMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYnVpbGRUb29sc0RpcnMgPSBidWlsZFRvb2xzRGlyc1xuICAgICAgLm1hcCgoZGlyKSA9PiBbcGF0aC5iYXNlbmFtZShkaXIpLCBkaXJdKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHNlbXZlci5yY29tcGFyZShhWzBdLCBiWzBdKSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IHNvcnQgYnVpbGQtdG9vbHMgZm9sZGVycyAke0pTT04uc3RyaW5naWZ5KGJ1aWxkVG9vbHNEaXJzLm1hcCgoZGlyKSA9PiBwYXRoLmJhc2VuYW1lKGRpcikpKX0gYCArXG4gICAgICBgYnkgc2VtYW50aWMgdmVyc2lvbiBuYW1lcy5gKTtcbiAgICBsb2cud2FybihgRmFsbGluZyBiYWNrIHRvIHNvcnRpbmcgYnkgbW9kaWZpY2F0aW9uIGRhdGUuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGNvbnN0IHBhaXJzID0gYXdhaXQgQi5tYXAoYnVpbGRUb29sc0RpcnMsIGFzeW5jIChkaXIpID0+IFsoYXdhaXQgZnMuc3RhdChkaXIpKS5tdGltZS52YWx1ZU9mKCksIGRpcl0pO1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gcGFpcnNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9XG4gIGxvZy5pbmZvKGBGb3VuZCAke2J1aWxkVG9vbHNEaXJzLmxlbmd0aH0gJ2J1aWxkLXRvb2xzJyBmb2xkZXJzIHVuZGVyICcke3Nka1Jvb3R9JyAobmV3ZXN0IGZpcnN0KTpgKTtcbiAgZm9yIChsZXQgZGlyIG9mIGJ1aWxkVG9vbHNEaXJzKSB7XG4gICAgbG9nLmluZm8oYCAgICAke2Rpcn1gKTtcbiAgfVxuICByZXR1cm4gYnVpbGRUb29sc0RpcnM7XG59KTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbiBuYW1lcyBlbmNvZGVkIGluIGBkdW1wc3lzIHBhY2thZ2VgIGNvbW1hbmQgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzT3V0cHV0IC0gVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZ3JvdXBOYW1lcyAtIFRoZSBsaXN0IG9mIGdyb3VwIG5hbWVzIHRvIGxpc3QgcGVybWlzc2lvbnMgZm9yLlxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZ3JhbnRlZFN0YXRlIC0gVGhlIGV4cGVjdGVkIHN0YXRlIG9mIGBncmFudGVkYCBhdHRyaWJ1dGUgdG8gZmlsdGVyIHdpdGguXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBmaWx0ZXJpbmcgaXMgZG9uZSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwZXJtaXNzaW9uIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm8gbWF0Y2hlcyB3ZXJlIGZvdW5kLlxuICovXG5jb25zdCBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uIChkdW1wc3lzT3V0cHV0LCBncm91cE5hbWVzLCBncmFudGVkU3RhdGUgPSBudWxsKSB7XG4gIGNvbnN0IGdyb3VwUGF0dGVybkJ5TmFtZSA9IChncm91cE5hbWUpID0+IG5ldyBSZWdFeHAoYF4oXFxcXHMqJHtfLmVzY2FwZVJlZ0V4cChncm91cE5hbWUpfSBwZXJtaXNzaW9uczpbXFxcXHNcXFxcU10rKWAsICdtJyk7XG4gIGNvbnN0IGluZGVudFBhdHRlcm4gPSAvXFxTfCQvO1xuICBjb25zdCBwZXJtaXNzaW9uTmFtZVBhdHRlcm4gPSAvYW5kcm9pZFxcLlxcdypcXC4/cGVybWlzc2lvblxcLlxcdysvO1xuICBjb25zdCBncmFudGVkU3RhdGVQYXR0ZXJuID0gL1xcYmdyYW50ZWQ9KFxcdyspLztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIGdyb3VwTmFtZXMpIHtcbiAgICBjb25zdCBncm91cE1hdGNoID0gZ3JvdXBQYXR0ZXJuQnlOYW1lKGdyb3VwTmFtZSkuZXhlYyhkdW1wc3lzT3V0cHV0KTtcbiAgICBpZiAoIWdyb3VwTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gZ3JvdXBNYXRjaFsxXS5zcGxpdCgnXFxuJyk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlSW5kZW50ID0gbGluZXNbMF0uc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcy5zbGljZSgxKSkge1xuICAgICAgY29uc3QgY3VycmVudEluZGVudCA9IGxpbmUuc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgICAgaWYgKGN1cnJlbnRJbmRlbnQgPD0gdGl0bGVJbmRlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25OYW1lTWF0Y2ggPSBwZXJtaXNzaW9uTmFtZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghcGVybWlzc2lvbk5hbWVNYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb25OYW1lTWF0Y2hbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JhbnRlZFN0YXRlTWF0Y2ggPSBncmFudGVkU3RhdGVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoZ3JhbnRlZFN0YXRlTWF0Y2gpIHtcbiAgICAgICAgaXRlbS5ncmFudGVkID0gZ3JhbnRlZFN0YXRlTWF0Y2hbMV0gPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkUmVzdWx0ID0gcmVzdWx0XG4gICAgLmZpbHRlcigoaXRlbSkgPT4gIV8uaXNCb29sZWFuKGdyYW50ZWRTdGF0ZSkgfHwgaXRlbS5ncmFudGVkID09PSBncmFudGVkU3RhdGUpXG4gICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5wZXJtaXNzaW9uKTtcbiAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgJHt1dGlsLnBsdXJhbGl6ZSgncGVybWlzc2lvbicsIGZpbHRlcmVkUmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgIGBmcm9tICR7Z3JvdXBOYW1lc30gJHt1dGlsLnBsdXJhbGl6ZSgnZ3JvdXAnLCBncm91cE5hbWVzLmxlbmd0aCwgZmFsc2UpfWApO1xuICByZXR1cm4gZmlsdGVyZWRSZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFydGlhbEluc3RhbGwgW2ZhbHNlXSAtIEluc3RhbGwgYXBrcyBwYXJ0aWFsbHkuIEl0IGlzIHVzZWQgZm9yICdpbnN0YWxsLW11bHRpcGxlJy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9hbmRyb2lkLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMTEwNjQvd2hhdC1pcy1hLXBhcnRpYWwtYXBwbGljYXRpb24taW5zdGFsbC12aWEtYWRiXG4gKi9cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGdpdmVuIG9wdGlvbnMgaW50byB0aGUgbGlzdCBvZiBgYWRiIGluc3RhbGwuaW5zdGFsbC1tdWx0aXBsZWAgY29tbWFuZCBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYXBpTGV2ZWwgLSBUaGUgY3VycmVudCBBUEkgbGV2ZWxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgbWFwcGluZyB0byB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbEFyZ3MgKGFwaUxldmVsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG9wdGlvbnMucmVwbGFjZSkgfHwgb3B0aW9ucy5yZXBsYWNlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1yJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuYWxsb3dUZXN0UGFja2FnZXMpIHtcbiAgICByZXN1bHQucHVzaCgnLXQnKTtcbiAgfVxuICBpZiAob3B0aW9ucy51c2VTZGNhcmQpIHtcbiAgICByZXN1bHQucHVzaCgnLXMnKTtcbiAgfVxuICBpZiAob3B0aW9ucy5ncmFudFBlcm1pc3Npb25zKSB7XG4gICAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2tpcHBpbmcgcGVybWlzc2lvbnMgZ3JhbnQgb3B0aW9uLCBzaW5jZSBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgQVBJIGxldmVsICR7YXBpTGV2ZWx9IGRvZXMgbm90IHN1cHBvcnQgYXBwbGljYXRpb25zIGAgK1xuICAgICAgICAgICAgICAgIGBwZXJtaXNzaW9ucyBjdXN0b21pemF0aW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKCctZycpO1xuICAgIH1cbiAgfVxuICAvLyBGb3IgbXVsdGlwbGUtaW5zdGFsbFxuICBpZiAob3B0aW9ucy5wYXJ0aWFsSW5zdGFsbCkge1xuICAgIHJlc3VsdC5wdXNoKCctcCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYW5pZmVzdEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2cgLSBUaGUgYXBwbGljYXRpb24gaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gcGFja2FnZSBhY3Rpdml0eVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFRoZSB2ZXJzaW9uIGNvZGUgbnVtYmVyIChtaWdodCBiZSBgTmFOYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbk5hbWUgLSBUaGUgdmVyc2lvbiBuYW1lIChtaWdodCBiZSBgbnVsbGApXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtIHBhcnNpbmcgb2YgdGhlIG1hbmlmZXN0IG9iamVjdCBpbiBvcmRlclxuICogdG8gZXh0cmFjdCBzb21lIHZpdGFsIHZhbHVlcyBmcm9tIGl0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1hbmlmZXN0IFRoZSBtYW5pZmVzdCBjb250ZW50IGZvcm1hdHRlZCBhcyBKU09OXG4gKiBTZWUgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYWRia2l0LWFwa3JlYWRlciBmb3IgZGV0YWlsZWQgZm9ybWF0IGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyB7TWFuaWZlc3RJbmZvfVxuICovXG5mdW5jdGlvbiBwYXJzZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgcGtnOiBtYW5pZmVzdC5wYWNrYWdlLFxuICAgIHZlcnNpb25Db2RlOiBwYXJzZUludChtYW5pZmVzdC52ZXJzaW9uQ29kZSwgMTApLFxuICAgIHZlcnNpb25OYW1lOiBtYW5pZmVzdC52ZXJzaW9uTmFtZSB8fCBudWxsLFxuICB9O1xuICBpZiAoIW1hbmlmZXN0LmFwcGxpY2F0aW9uKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIExvb2sgZm9yIGVuYWJsZWQgYWN0aXZpdHkgb3IgYWN0aXZpdHktYWxpYXMgd2l0aFxuICAvLyBhY3Rpb24gPT0gYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gYW5kXG4gIC8vIGNhdGVnb3J5ID09IGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSXG4gIGZvciAoY29uc3QgYWN0aXZpdHkgb2YgW1xuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXRpZXMsXG4gICAgLi4ubWFuaWZlc3QuYXBwbGljYXRpb24uYWN0aXZpdHlBbGlhc2VzLFxuICBdKSB7XG4gICAgaWYgKGFjdGl2aXR5LmVuYWJsZWQgPT09IGZhbHNlIHx8IF8uaXNFbXB0eShhY3Rpdml0eS5pbnRlbnRGaWx0ZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9ucywgY2F0ZWdvcmllc30gb2YgYWN0aXZpdHkuaW50ZW50RmlsdGVycykge1xuICAgICAgaWYgKF8uaXNFbXB0eShhY3Rpb25zKSB8fCBfLmlzRW1wdHkoY2F0ZWdvcmllcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTWFpbkFjdGlvbiA9IGFjdGlvbnMuc29tZSgoe25hbWV9KSA9PiBuYW1lID09PSBNQUlOX0FDVElPTik7XG4gICAgICBjb25zdCBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gTEFVTkNIRVJfQ0FURUdPUlkpO1xuICAgICAgaWYgKGlzTWFpbkFjdGlvbiAmJiBpc0xhdW5jaGVyQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmVzdWx0LmFjdGl2aXR5ID0gYWN0aXZpdHkubmFtZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYXBrIHN0cmluZ3MgZnJvbSBhYXB0IHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBgKGRlZmF1bHQpYFxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHRTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBub3JtYWxpemVTdHJpbmdNYXRjaCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXCIkLywgJycpLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG4gIH07XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgaXNJbkNvbmZpZyA9IGZhbHNlO1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIC8vIFRoZSBwYXR0ZXJuIG1hdGNoZXMgYW55IHF1b3RlZCBjb250ZW50IGluY2x1ZGluZyBlc2NhcGVkIHF1b3Rlc1xuICBjb25zdCBxdW90ZWRTdHJpbmdQYXR0ZXJuID0gL1wiW15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqXCIvO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcmF3T3V0cHV0LnNwbGl0KG9zLkVPTCkpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmIChfLmlzRW1wdHkodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWydjb25maWcnLCAndHlwZScsICdzcGVjJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgaXNJbkNvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYGNvbmZpZyAke2NvbmZpZ01hcmtlcn06YCk7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNJbkNvbmZpZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJzpzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnN0cmluZ1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6cGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC86cGx1cmFsc1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoc3RyaW5nJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcXVvdGVkU3RyaW5nUGF0dGVybi5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IG5vcm1hbGl6ZVN0cmluZ01hdGNoKG1hdGNoWzBdKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiBpc0luUGx1cmFsR3JvdXAgJiYgdHJpbW1lZExpbmUuaW5jbHVkZXMoJzogKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgLi4uKGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdIHx8IFtdKSxcbiAgICAgICAgICBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFwa1N0cmluZ3M7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdDIgdG9vbCBvdXRwdXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3T3V0cHV0IFRoZSBhY3R1YWwgdG9vbCBvdXRwdXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdNYXJrZXIgVGhlIGNvbmZpZyBtYXJrZXIuIFVzdWFsbHlcbiAqIGEgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uIG9yIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgb25lXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJpbmdzIGlkcyB0byB2YWx1ZXMgbWFwcGluZy4gUGx1cmFsXG4gKiB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cy4gSWYgbm8gY29uZmlnIGZvdW5kIGZvciB0aGVcbiAqIGdpdmVuIG1hcmtlciB0aGVuIGFuIGVtcHR5IG1hcHBpbmcgaXMgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWFwdDJTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBhbGxMaW5lcyA9IHJhd091dHB1dC5zcGxpdChvcy5FT0wpO1xuICBmdW5jdGlvbiBleHRyYWN0Q29udGVudCAoc3RhcnRJZHgpIHtcbiAgICBsZXQgaWR4ID0gc3RhcnRJZHg7XG4gICAgY29uc3Qgc3RhcnRDaGFyUG9zID0gYWxsTGluZXNbc3RhcnRJZHhdLmluZGV4T2YoJ1wiJyk7XG4gICAgaWYgKHN0YXJ0Q2hhclBvcyA8IDApIHtcbiAgICAgIHJldHVybiBbbnVsbCwgaWR4XTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlIChpZHggPCBhbGxMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0aW9uQ2hhck1hdGNoID0gL1wiJC8uZXhlYyhhbGxMaW5lc1tpZHhdKTtcbiAgICAgIGlmICh0ZXJtaW5hdGlvbkNoYXJNYXRjaCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJQb3MgPSB0ZXJtaW5hdGlvbkNoYXJNYXRjaC5pbmRleDtcbiAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSBpZHgpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSwgdGVybWluYXRpb25DaGFyUG9zKSxcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHtyZXN1bHR9XFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKDAsIHRlcm1pbmF0aW9uQ2hhclBvcykpfWAsXG4gICAgICAgICAgaWR4LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCA+IHN0YXJ0SWR4KSB7XG4gICAgICAgIHJlc3VsdCArPSBgXFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0pfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSk7XG4gICAgICB9XG4gICAgICArK2lkeDtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXN1bHQsIGlkeF07XG4gIH1cblxuICBjb25zdCBhcGtTdHJpbmdzID0ge307XG4gIGxldCBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gIGxldCBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgbGV0IGlzSW5DdXJyZW50Q29uZmlnID0gZmFsc2U7XG4gIGxldCBsaW5lSW5kZXggPSAwO1xuICB3aGlsZSAobGluZUluZGV4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBhbGxMaW5lc1tsaW5lSW5kZXhdLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWyd0eXBlJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgncmVzb3VyY2UnKSkge1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJ3N0cmluZy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9zdHJpbmdcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdwbHVyYWxzLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL3BsdXJhbHNcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRSZXNvdXJjZUlkKSB7XG4gICAgICBpZiAoaXNJblBsdXJhbEdyb3VwKSB7XG4gICAgICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoJykpIHtcbiAgICAgICAgICBpc0luQ3VycmVudENvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYCgke2NvbmZpZ01hcmtlcn0pYCk7XG4gICAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5DdXJyZW50Q29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgW2NvbnRlbnQsIGlkeF0gPSBleHRyYWN0Q29udGVudChsaW5lSW5kZXgpO1xuICAgICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApKSB7XG4gICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgbGluZUluZGV4ID0gaWR4O1xuICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgICsrbGluZUluZGV4O1xuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGNvbmZpZyBtYXJrZXIsIHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvIHBhcnNlLi4gbWV0aG9kc1xuICogdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggcmVzb3VyY2UgZm9ybWF0cyBnZW5lcmF0ZWQgYnkgYWFwdCgyKSB0b29sXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uZmlnc0dldHRlciBUaGUgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IGlzIGEgbGlzdFxuICogb2YgYXBrIGNvbmZpZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNpcmVkTWFya2VyIFRoZSBkZXNpcmVkIGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0TWFya2VyIFRoZSBkZWZhdWx0IGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBjb25maWcgbWFya2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvbmZpZ01hcmtlciAoY29uZmlnc0dldHRlciwgZGVzaXJlZE1hcmtlciwgZGVmYXVsdE1hcmtlcikge1xuICBsZXQgY29uZmlnTWFya2VyID0gZGVzaXJlZE1hcmtlciB8fCBkZWZhdWx0TWFya2VyO1xuICBpZiAoY29uZmlnTWFya2VyLmluY2x1ZGVzKCctJykgJiYgIWNvbmZpZ01hcmtlci5pbmNsdWRlcygnLXInKSkge1xuICAgIGNvbmZpZ01hcmtlciA9IGNvbmZpZ01hcmtlci5yZXBsYWNlKCctJywgJy1yJyk7XG4gIH1cbiAgY29uc3QgY29uZmlncyA9IGF3YWl0IGNvbmZpZ3NHZXR0ZXIoKTtcbiAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uczogJHtKU09OLnN0cmluZ2lmeShjb25maWdzKX1gKTtcbiAgLy8gQXNzdW1lIHRoZSAnZW4nIGNvbmZpZ3VyYXRpb24gaXMgdGhlIGRlZmF1bHQgb25lXG4gIGlmIChjb25maWdNYXJrZXIudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdlbicpXG4gICAgJiYgIWNvbmZpZ3Muc29tZSgoeCkgPT4geC50cmltKCkgPT09IGNvbmZpZ01hcmtlcikpIHtcbiAgICBsb2cuZGVidWcoYFJlc291cmNlIGNvbmZpZ3VyYXRpb24gbmFtZSAnJHtjb25maWdNYXJrZXJ9JyBpcyB1bmtub3duLiBgICtcbiAgICAgIGBSZXBsYWNpbmcgaXQgd2l0aCAnJHtkZWZhdWx0TWFya2VyfSdgKTtcbiAgICBjb25maWdNYXJrZXIgPSBkZWZhdWx0TWFya2VyO1xuICB9IGVsc2Uge1xuICAgIGxvZy5kZWJ1ZyhgU2VsZWN0ZWQgY29uZmlndXJhdGlvbjogJyR7Y29uZmlnTWFya2VyfSdgKTtcbiAgfVxuICByZXR1cm4gY29uZmlnTWFya2VyO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgb3V0cHV0IGluIEpTT04gZm9ybWF0IHJldHJpZXZlZCBmcm9tXG4gKiB0aGUgY29ycmVzcG9uZGluZyBBcHBpdW0gU2V0dGluZ3MgYnJvYWRjYXN0IGNhbGxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCBUaGUgYWN0dWFsIGNvbW1hbmQgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gZW50aXR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHdoaWNoIGlzXG4gKiBnb2luZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwYXJzZWQgSlNPTiBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgb3V0cHV0IGNhbm5vdCBiZSBwYXJzZWRcbiAqIGFzIGEgdmFsaWQgSlNPTlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25EYXRhIChvdXRwdXQsIGVudGl0eU5hbWUpIHtcbiAgaWYgKCEvXFxicmVzdWx0PS0xXFxiLy50ZXN0KG91dHB1dCkgfHwgIS9cXGJkYXRhPVwiLy50ZXN0KG91dHB1dCkpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gL1xcYmRhdGE9KFwiLispLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbiAgY29uc3QganNvblN0ciA9IF8udHJpbShtYXRjaFsxXSkucmVwbGFjZSgvKF5cIil8KFwiJCkvZywgJycpO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGpzb25TdHIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlICR7ZW50aXR5TmFtZX0gZnJvbSB0aGUgcmVzdWx0aW5nIGRhdGEgc3RyaW5nLiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgY291bnRyeSBhYmJyZXZpYXRpb25zXG4gKiB0byBBVkQgYXJndW1lbnRzIGFycmF5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsYW5ndWFnZSBMYW5ndWFnZSBuYW1lLCBmb3IgZXhhbXBsZSAnZnInXG4gKiBAcGFyYW0gez9zdHJpbmd9IGNvdW50cnkgQ291bnRyeSBuYW1lLCBmb3IgZXhhbXBsZSAnQ0EnXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGdlbmVyYXRlZCBhcmd1bWVudHMuIFRoZVxuICogcmVzdWx0aW5nIGFycmF5IG1pZ2h0IGJlIGVtcHR5IGlmIGJvdGggYXJndW1lbnRzIGFyZSBlbXB0eVxuICovXG5mdW5jdGlvbiB0b0F2ZExvY2FsZUFyZ3MgKGxhbmd1YWdlLCBjb3VudHJ5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAobGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMubGFuZ3VhZ2U9JHtsYW5ndWFnZS50b0xvd2VyQ2FzZSgpfWApO1xuICB9XG4gIGlmIChjb3VudHJ5ICYmIF8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMuY291bnRyeT0ke2NvdW50cnkudG9VcHBlckNhc2UoKX1gKTtcbiAgfVxuICBsZXQgbG9jYWxlO1xuICBpZiAoXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSAmJiBsYW5ndWFnZSAmJiBjb3VudHJ5KSB7XG4gICAgbG9jYWxlID0gbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSArICctJyArIGNvdW50cnkudG9VcHBlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChsYW5ndWFnZSAmJiBfLmlzU3RyaW5nKGxhbmd1YWdlKSkge1xuICAgIGxvY2FsZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAoY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9jYWxlID0gY291bnRyeTtcbiAgfVxuICBpZiAobG9jYWxlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmxvY2FsZT0ke2xvY2FsZX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIHByZWZlcmVuY2VzIHJvb3RcbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgZm9sZGVyIG9yIGBudWxsYCBpZiB0aGUgZm9sZGVyIGNhbm5vdCBiZSBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkUHJlZnNSb290ICgpIHtcbiAgbGV0IGxvY2F0aW9uID0gcHJvY2Vzcy5lbnYuQU5EUk9JRF9FTVVMQVRPUl9IT01FO1xuICBpZiAoYXdhaXQgZGlyRXhpc3RzKGxvY2F0aW9uKSkge1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuXG4gIGlmIChsb2NhdGlvbikge1xuICAgIGxvZy53YXJuKGBUaGUgdmFsdWUgb2YgdGhlIEFORFJPSURfRU1VTEFUT1JfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnJHtsb2NhdGlvbn0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgfVxuXG4gIGNvbnN0IGhvbWUgPSBwcm9jZXNzLmVudi5IT01FIHx8IHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFO1xuICBpZiAoaG9tZSkge1xuICAgIGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGhvbWUsICcuYW5kcm9pZCcpO1xuICB9XG5cbiAgaWYgKCFhd2FpdCBkaXJFeGlzdHMobG9jYXRpb24pKSB7XG4gICAgbG9nLmRlYnVnKGBBbmRyb2lkIGNvbmZpZyByb290ICcke2xvY2F0aW9ufScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGF0aCBleGlzdHMgb24gdGhlIGZpbGVzeXN0ZW0gYW5kIGlzIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsb2NhdGlvbiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBkaXJFeGlzdHMgKGxvY2F0aW9uKSB7XG4gIHJldHVybiBsb2NhdGlvblxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhsb2NhdGlvbilcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChsb2NhdGlvbikpLmlzRGlyZWN0b3J5KCk7XG59XG5cbi8qKlxuICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy5cbiAqIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHBvc3NpYmxlIGlzc3VlcyB3aXRoIGhvdyBzeXN0ZW0gYHNwYXduYFxuICogY2FsbCBoYW5kbGVzIHRoZW0uXG4gKiBTZWUgaHR0cHM6Ly9kaXNjdXNzLmFwcGl1bS5pby90L2hvdy10by1tb2RpZnktd2QtcHJveHktYW5kLXVpYXV0b21hdG9yMi1zb3VyY2UtY29kZS10by1zdXBwb3J0LXVuaWNvZGUvMzM0NjZcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZyBOb24tZXNjYXBlZCBhcmd1bWVudCBzdHJpbmdcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVNoZWxsQXJnIChhcmcpIHtcbiAgYXJnID0gYCR7YXJnfWA7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gL1smfF5cXHNdLy50ZXN0KGFyZykgPyBgXCIke2FyZy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCA6IGFyZztcbiAgfVxuICByZXR1cm4gYXJnLnJlcGxhY2UoLyYvZywgJ1xcXFwmJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBuYW1lIG9mIGxhdW5jaGFibGUgcGFja2FnZSBhY3Rpdml0eVxuICogZnJvbSBkdW1wc3lzIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5cyB0aGUgYWN0dWFsIGR1bXBzeXMgb3V0cHV0XG4gKiBAcmV0dXJucyB7c3RyaW5nW119IEVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkXG4gKiBhY3Rpdml0eSBuYW1lIGFzIGEgc2luZ2xlIGxpc3QgaXRlbSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vdGhpbmcgY291bGQgYmUgcGFyc2VkLlxuICogSW4gQW5kcm9pZCA2IGFuZCBvbGRlciB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lXG4gKiB0aGUgY2F0ZWdvcnkgbmFtZSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LCBzbyB0aGlzIEFQSSBqdXN0XG4gKiByZXR1cm5zIGFsbCBhY3Rpdml0eSBuYW1lcyBiZWxvbmdpbmcgdG8gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJ1xuICogd2l0aCB0aGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgYXBwIG1hbmlmZXN0IGNvdWxkIGJlIHBhcnNlZCBuZXh0XG4gKiBpbiBvcmRlciB0byBkZXRlcm1pbmUgY2F0ZWdvcnkgbmFtZXMgZm9yIHRoZXNlLlxuICovXG5mdW5jdGlvbiBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzIChkdW1wc3lzKSB7XG4gIGNvbnN0IG1haW5BY3Rpdml0eU5hbWVSZSA9IG5ldyBSZWdFeHAoYF5cXFxccyoke18uZXNjYXBlUmVnRXhwKE1BSU5fQUNUSU9OKX06JGApO1xuICBjb25zdCBjYXRlZ29yeU5hbWVSZSA9IC9eXFxzKkNhdGVnb3J5OlxccytcIihbYS16QS1aMC05Ll8vLV0rKVwiJC87XG4gIGNvbnN0IGJsb2NrcyA9IFtdO1xuICBsZXQgYmxvY2tTdGFydEluZGVudDtcbiAgbGV0IGJsb2NrID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBkdW1wc3lzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAobWFpbkFjdGl2aXR5TmFtZVJlLnRlc3QobGluZSkpIHtcbiAgICAgIGJsb2NrU3RhcnRJbmRlbnQgPSBjdXJyZW50SW5kZW50O1xuICAgICAgaWYgKCFfLmlzRW1wdHkoYmxvY2spKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgYmxvY2sgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXy5pc05pbChibG9ja1N0YXJ0SW5kZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRJbmRlbnQgPiBibG9ja1N0YXJ0SW5kZW50KSB7XG4gICAgICBibG9jay5wdXNoKGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eShibG9jaykpIHtcbiAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICBibG9jayA9IFtdO1xuICAgICAgfVxuICAgICAgYmxvY2tTdGFydEluZGVudCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGJsb2NrKSkge1xuICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYmxvY2tzKSB7XG4gICAgbGV0IGhhc0NhdGVnb3J5ID0gZmFsc2U7XG4gICAgbGV0IGlzTGF1bmNoZXJDYXRlZ29yeSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBpdGVtKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGNhdGVnb3J5TmFtZVJlLmV4ZWMobGluZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBoYXNDYXRlZ29yeSA9IHRydWU7XG4gICAgICBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBtYXRjaFsxXSA9PT0gTEFVTkNIRVJfQ0FURUdPUlk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gT24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucyB0aGUgY2F0ZWdvcnkgbmFtZVxuICAgIC8vIG1pZ2h0IG5vdCBiZSBsaXN0ZWQsIHNvIHdlIGp1c3QgdHJ5IHRvIGZldGNoXG4gICAgLy8gYWxsIG1hdGNoZXMgaW5zdGVhZFxuICAgIGlmIChoYXNDYXRlZ29yeSAmJiAhaXNMYXVuY2hlckNhdGVnb3J5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2aXR5TmFtZVN0ciBvZiBpdGVtLm1hcChfLnRyaW0pLmZpbHRlcihCb29sZWFuKSkge1xuICAgICAgY29uc3QgZnFBY3Rpdml0eU5hbWUgPSBhY3Rpdml0eU5hbWVTdHIuc3BsaXQoL1xccysvKVsxXTtcbiAgICAgIGlmICghbWF0Y2hDb21wb25lbnROYW1lKGZxQWN0aXZpdHlOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGF1bmNoZXJDYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gW2ZxQWN0aXZpdHlOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGZxQWN0aXZpdHlOYW1lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgY29tcG9uZW50IG5hbWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgVGhlIHN0cmluZyB0byB2ZXJpZnlcbiAqIEByZXR1cm4gez9BcnJheTxNYXRjaD59IFRoZSByZXN1bHQgb2YgUmVnZXhwLmV4ZWMgb3BlcmF0aW9uXG4gKiBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmRcbiAqL1xuZnVuY3Rpb24gbWF0Y2hDb21wb25lbnROYW1lIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiAvXlthLXowLTkuL19dKyQvaS5leGVjKGNsYXNzU3RyaW5nKTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCwgdW56aXBGaWxlLFxuICBnZXRJTUVMaXN0RnJvbU91dHB1dCwgZ2V0SmF2YUZvck9zLCBpc1Nob3dpbmdMb2Nrc2NyZWVuLCBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQsXG4gIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgaXNTY3JlZW5PbkZ1bGx5LCBidWlsZFN0YXJ0Q21kLCBnZXRKYXZhSG9tZSxcbiAgZ2V0U2RrVG9vbHNWZXJzaW9uLCBnZXRBcGtzaWduZXJGb3JPcywgZ2V0QnVpbGRUb29sc0RpcnMsXG4gIGdldEFwa2FuYWx5emVyRm9yT3MsIGdldE9wZW5Tc2xGb3JPcywgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsIEFQS1NfRVhURU5TSU9OLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBBUEtTX0lOU1RBTExfVElNRU9VVCwgYnVpbGRJbnN0YWxsQXJncywgQVBLX0VYVEVOU0lPTixcbiAgREVGQVVMVF9BREJfRVhFQ19USU1FT1VULCBwYXJzZU1hbmlmZXN0LCBwYXJzZUFhcHRTdHJpbmdzLCBwYXJzZUFhcHQyU3RyaW5ncyxcbiAgZm9ybWF0Q29uZmlnTWFya2VyLCBwYXJzZUpzb25EYXRhLCB1bnNpZ25BcGssIHRvQXZkTG9jYWxlQXJncywgcmVxdWlyZVNka1Jvb3QsXG4gIGdldFNka1Jvb3RGcm9tRW52LCBnZXRBbmRyb2lkUHJlZnNSb290LCBkaXJFeGlzdHMsIGVzY2FwZVNoZWxsQXJnLFxuICBwYXJzZUxhdW5jaGFibGVB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
976
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUEtTX0VYVEVOU0lPTiIsIkFQS19FWFRFTlNJT04iLCJBUEtfSU5TVEFMTF9USU1FT1VUIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQiLCJNQUlOX0FDVElPTiIsIkxBVU5DSEVSX0NBVEVHT1JZIiwiZ2V0TW9kdWxlUm9vdCIsIl8iLCJtZW1vaXplIiwiY3VycmVudERpciIsInBhdGgiLCJkaXJuYW1lIiwicmVzb2x2ZSIsIl9fZmlsZW5hbWUiLCJpc0F0RnNSb290IiwibWFuaWZlc3RQYXRoIiwiam9pbiIsIl9mcyIsImV4aXN0c1N5bmMiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJuYW1lIiwiaWduIiwibGVuZ3RoIiwiRXJyb3IiLCJnZXRTZGtSb290RnJvbUVudiIsInByb2Nlc3MiLCJlbnYiLCJBTkRST0lEX0hPTUUiLCJBTkRST0lEX1NES19ST09UIiwicmVxdWlyZVNka1Jvb3QiLCJjdXN0b21Sb290Iiwic2RrUm9vdCIsImRvY01zZyIsImlzRW1wdHkiLCJmcyIsImV4aXN0cyIsInN0YXRzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInByb3BzUGF0aHMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJwbGF0Zm9ybSIsImJhc2VuYW1lIiwibWF0Y2giLCJleGVjIiwibG9nIiwid2FybiIsInBhcnNlSW50IiwicmVjZW50U2RrVmVyc2lvbiIsImtleXMiLCJzb3J0IiwicmV2ZXJzZSIsInJlc3VsdCIsImRlYnVnIiwic3RyaW5naWZ5IiwidW56aXBGaWxlIiwiemlwUGF0aCIsImRzdFJvb3QiLCJ6aXAiLCJhc3NlcnRWYWxpZFppcCIsImV4dHJhY3RBbGxUbyIsInVuc2lnbkFwayIsImFwa1BhdGgiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJtZXRhSW5mRm9sZGVyTmFtZSIsImhhc01ldGFJbmYiLCJyZWFkRW50cmllcyIsImVudHJ5IiwiZmlsZU5hbWUiLCJzdGFydHNXaXRoIiwidG1wWmlwUm9vdCIsInJpbXJhZiIsInRtcFJlc3VsdFBhdGgiLCJ0b0FyY2hpdmUiLCJ1bmxpbmsiLCJtdiIsImdldElNRUxpc3RGcm9tT3V0cHV0Iiwic3Rkb3V0IiwiZW5naW5lcyIsImxpbmUiLCJzcGxpdCIsInB1c2giLCJ0cmltIiwicmVwbGFjZSIsImdldEphdmFIb21lIiwiSkFWQV9IT01FIiwiZ2V0SmF2YUZvck9zIiwiamF2YUhvbWUiLCJlcnJNc2ciLCJlcnIiLCJtZXNzYWdlIiwiZXhlY3V0YWJsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJyZXN1bHRQYXRoIiwid2hpY2giLCJnZXRPcGVuU3NsRm9yT3MiLCJiaW5hcnlOYW1lIiwiZ2V0QXBrc2lnbmVyRm9yT3MiLCJzeXNIZWxwZXJzIiwiZ2V0QmluYXJ5RnJvbVNka1Jvb3QiLCJnZXRBcGthbmFseXplckZvck9zIiwiaXNTaG93aW5nTG9ja3NjcmVlbiIsImR1bXBzeXMiLCJzb21lIiwieCIsImluY2x1ZGVzIiwiZXZlcnkiLCJ0ZXN0IiwiaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkIiwibSIsImdldFN1cmZhY2VPcmllbnRhdGlvbiIsImlzU2NyZWVuT25GdWxseSIsImJ1aWxkU3RhcnRDbWQiLCJzdGFydEFwcE9wdGlvbnMiLCJhcGlMZXZlbCIsInVzZXIiLCJ3YWl0Rm9yTGF1bmNoIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJmbGFncyIsImNtZCIsInV0aWwiLCJoYXNWYWx1ZSIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwicGFyc2VLZXlWYWx1ZSIsInN0ciIsInNwYWNlIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsInJlIiwiYXJncyIsImFwcGx5IiwiZmxhZyIsImZsYWdQb3MiLCJwcmV2QXJncyIsImdldFNka1Rvb2xzVmVyc2lvbiIsImFuZHJvaWRIb21lIiwicHJvcGVydGllc1BhdGgiLCJwcm9wZXJ0aWVzQ29udGVudCIsInZlcnNpb25NYXRjaGVyIiwiUmVnRXhwIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZ2V0QnVpbGRUb29sc0RpcnMiLCJidWlsZFRvb2xzRGlycyIsIm1hcCIsImRpciIsImEiLCJiIiwic2VtdmVyIiwicmNvbXBhcmUiLCJwYWlyIiwicGFpcnMiLCJCIiwibXRpbWUiLCJ2YWx1ZU9mIiwiaW5mbyIsImV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zIiwiZHVtcHN5c091dHB1dCIsImdyb3VwTmFtZXMiLCJncmFudGVkU3RhdGUiLCJncm91cFBhdHRlcm5CeU5hbWUiLCJncm91cE5hbWUiLCJlc2NhcGVSZWdFeHAiLCJpbmRlbnRQYXR0ZXJuIiwicGVybWlzc2lvbk5hbWVQYXR0ZXJuIiwiZ3JhbnRlZFN0YXRlUGF0dGVybiIsImdyb3VwTWF0Y2giLCJsaW5lcyIsInRpdGxlSW5kZW50Iiwic2VhcmNoIiwic2xpY2UiLCJjdXJyZW50SW5kZW50IiwicGVybWlzc2lvbk5hbWVNYXRjaCIsIml0ZW0iLCJwZXJtaXNzaW9uIiwiZ3JhbnRlZFN0YXRlTWF0Y2giLCJncmFudGVkIiwiZmlsdGVyZWRSZXN1bHQiLCJmaWx0ZXIiLCJpc0Jvb2xlYW4iLCJwbHVyYWxpemUiLCJidWlsZEluc3RhbGxBcmdzIiwib3B0aW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwidXNlU2RjYXJkIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBhcnRpYWxJbnN0YWxsIiwicGFyc2VNYW5pZmVzdCIsIm1hbmlmZXN0IiwicGFja2FnZSIsInZlcnNpb25Db2RlIiwidmVyc2lvbk5hbWUiLCJhcHBsaWNhdGlvbiIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUFsaWFzZXMiLCJlbmFibGVkIiwiaW50ZW50RmlsdGVycyIsImFjdGlvbnMiLCJjYXRlZ29yaWVzIiwiaXNNYWluQWN0aW9uIiwiaXNMYXVuY2hlckNhdGVnb3J5IiwicGFyc2VBYXB0U3RyaW5ncyIsInJhd091dHB1dCIsImNvbmZpZ01hcmtlciIsIm5vcm1hbGl6ZVN0cmluZ01hdGNoIiwicyIsImFwa1N0cmluZ3MiLCJpc0luQ29uZmlnIiwiY3VycmVudFJlc291cmNlSWQiLCJpc0luUGx1cmFsR3JvdXAiLCJxdW90ZWRTdHJpbmdQYXR0ZXJuIiwib3MiLCJFT0wiLCJ0cmltbWVkTGluZSIsInBhcnNlQWFwdDJTdHJpbmdzIiwiYWxsTGluZXMiLCJleHRyYWN0Q29udGVudCIsInN0YXJ0SWR4IiwiaWR4Iiwic3RhcnRDaGFyUG9zIiwidGVybWluYXRpb25DaGFyTWF0Y2giLCJ0ZXJtaW5hdGlvbkNoYXJQb3MiLCJpbmRleCIsInRyaW1TdGFydCIsImlzSW5DdXJyZW50Q29uZmlnIiwibGluZUluZGV4IiwiY29udGVudCIsImlzU3RyaW5nIiwiZm9ybWF0Q29uZmlnTWFya2VyIiwiY29uZmlnc0dldHRlciIsImRlc2lyZWRNYXJrZXIiLCJkZWZhdWx0TWFya2VyIiwiY29uZmlncyIsInRvTG93ZXJDYXNlIiwicGFyc2VKc29uRGF0YSIsIm91dHB1dCIsImVudGl0eU5hbWUiLCJqc29uU3RyIiwiZSIsInRvQXZkTG9jYWxlQXJncyIsImxhbmd1YWdlIiwiY291bnRyeSIsInRvVXBwZXJDYXNlIiwibG9jYWxlIiwiZ2V0QW5kcm9pZFByZWZzUm9vdCIsImxvY2F0aW9uIiwiQU5EUk9JRF9FTVVMQVRPUl9IT01FIiwiZGlyRXhpc3RzIiwiaG9tZSIsIkhPTUUiLCJVU0VSUFJPRklMRSIsImVzY2FwZVNoZWxsQXJnIiwiYXJnIiwicGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyIsIm1haW5BY3Rpdml0eU5hbWVSZSIsImNhdGVnb3J5TmFtZVJlIiwiYmxvY2tzIiwiYmxvY2tTdGFydEluZGVudCIsImJsb2NrIiwidHJpbUVuZCIsImlzTmlsIiwiaGFzQ2F0ZWdvcnkiLCJhY3Rpdml0eU5hbWVTdHIiLCJCb29sZWFuIiwiZnFBY3Rpdml0eU5hbWUiLCJtYXRjaENvbXBvbmVudE5hbWUiLCJjbGFzc1N0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgemlwLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcblxuY29uc3QgQVBLU19FWFRFTlNJT04gPSAnLmFwa3MnO1xuY29uc3QgQVBLX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IEFQS19JTlNUQUxMX1RJTUVPVVQgPSA2MDAwMDtcbmNvbnN0IEFQS1NfSU5TVEFMTF9USU1FT1VUID0gQVBLX0lOU1RBTExfVElNRU9VVCAqIDI7XG5jb25zdCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPSAyMDAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBNQUlOX0FDVElPTiA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTic7XG5jb25zdCBMQVVOQ0hFUl9DQVRFR09SWSA9ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUic7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBtb2R1bGUncyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gbW9kdWxlIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY3VycmVudCBtb2R1bGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TW9kdWxlUm9vdCA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRNb2R1bGVSb290ICgpIHtcbiAgbGV0IGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKF9fZmlsZW5hbWUpKTtcbiAgbGV0IGlzQXRGc1Jvb3QgPSBmYWxzZTtcbiAgd2hpbGUgKCFpc0F0RnNSb290KSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgaWYgKF9mcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkgJiZcbiAgICAgICAgICBKU09OLnBhcnNlKF9mcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKS5uYW1lID09PSAnYXBwaXVtLWFkYicpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS1hZGIgTm9kZS5qcyBtb2R1bGUnKTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYWN0dWFsIHBhdGggdG8gU0RLIHJvb3QgZm9sZGVyIGZyb20gdGhlIHN5c3RlbSBlbnZpcm9ubWVudFxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIFNESyByb290IGZvbGRlclxuICovXG5mdW5jdGlvbiBnZXRTZGtSb290RnJvbUVudiAoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5BTkRST0lEX0hPTUUgfHwgcHJvY2Vzcy5lbnYuQU5EUk9JRF9TREtfUk9PVDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGFjdHVhbCBwYXRoIHRvIFNESyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgU0RLIHJvb3QgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGVudiB2YXJpYWJsZSBpcyB1bnNldCBvciBpc1xuICogcG9pbnRpbmcgdG8gYW4gaW52YWxpZCBmaWxlIHN5c3RlbSBlbnRyeVxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1aXJlU2RrUm9vdCAoY3VzdG9tUm9vdCA9IG51bGwpIHtcbiAgY29uc3Qgc2RrUm9vdCA9IGN1c3RvbVJvb3QgfHwgZ2V0U2RrUm9vdEZyb21FbnYoKTtcbiAgY29uc3QgZG9jTXNnID0gJ1JlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS92YXJpYWJsZXMgZm9yIG1vcmUgZGV0YWlscyc7XG4gIGlmIChfLmlzRW1wdHkoc2RrUm9vdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5laXRoZXIgQU5EUk9JRF9IT01FIG5vciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIHdhcyBleHBvcnRlZC4gJHtkb2NNc2d9YCk7XG4gIH1cblxuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhzZGtSb290KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFuZHJvaWQgU0RLIHJvb3QgZm9sZGVyICcke3Nka1Jvb3R9JyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uICR7ZG9jTXNnfWApO1xuICB9XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChzZGtSb290KTtcbiAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5kcm9pZCBTREsgcm9vdCAnJHtzZGtSb290fScgbXVzdCBiZSBhIGZvbGRlci4gJHtkb2NNc2d9YCk7XG4gIH1cbiAgcmV0dXJuIHNka1Jvb3Q7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGxhdGZvcm1JbmZvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBsYXRmb3JtIC0gVGhlIHBsYXRmb3JtIG5hbWUsIGZvciBleGFtcGxlIGBhbmRyb2lkLTI0YFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGxhdGZvcm1QYXRoIC0gRnVsbCBwYXRoIHRvIHRoZSBwbGF0Zm9ybSBTREsgZm9sZGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBwYXRoIHRvIHRoZSByZWNlbnQgaW5zdGFsbGVkIEFuZHJvaWQgcGxhdGZvcm0uXG4gKlxuICogQHJldHVybiB7UGxhdGZvcm1JbmZvfSBUaGUgcmVzdWx0aW5nIHBhdGggdG8gdGhlIG5ld2VzdCBpbnN0YWxsZWQgcGxhdGZvcm0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGggKHNka1Jvb3QpIHtcbiAgY29uc3QgcHJvcHNQYXRocyA9IGF3YWl0IGZzLmdsb2IoJyovYnVpbGQucHJvcCcsIHtcbiAgICBjd2Q6IHBhdGgucmVzb2x2ZShzZGtSb290LCAncGxhdGZvcm1zJyksXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gIH0pO1xuICBjb25zdCBwbGF0Zm9ybXNNYXBwaW5nID0ge307XG4gIGZvciAoY29uc3QgcHJvcHNQYXRoIG9mIHByb3BzUGF0aHMpIHtcbiAgICBjb25zdCBwcm9wc0NvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wc1BhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBsYXRmb3JtUGF0aCA9IHBhdGguZGlybmFtZShwcm9wc1BhdGgpO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gcGF0aC5iYXNlbmFtZShwbGF0Zm9ybVBhdGgpO1xuICAgIGNvbnN0IG1hdGNoID0gL3JvXFwuYnVpbGRcXC52ZXJzaW9uXFwuc2RrPShcXGQrKS8uZXhlYyhwcm9wc0NvbnRlbnQpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGxvZy53YXJuKGBDYW5ub3QgcmVhZCB0aGUgU0RLIHZlcnNpb24gZnJvbSAnJHtwcm9wc1BhdGh9Jy4gU2tpcHBpbmcgJyR7cGxhdGZvcm19J2ApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHBsYXRmb3Jtc01hcHBpbmdbcGFyc2VJbnQobWF0Y2hbMV0sIDEwKV0gPSB7XG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIHBsYXRmb3JtUGF0aCxcbiAgICB9O1xuICB9XG4gIGlmIChfLmlzRW1wdHkocGxhdGZvcm1zTWFwcGluZykpIHtcbiAgICBsb2cud2FybihgRm91bmQgemVybyBwbGF0Zm9ybSBmb2xkZXJzIGF0ICcke3BhdGgucmVzb2x2ZShzZGtSb290LCAncGxhdGZvcm1zJyl9Jy4gYCArXG4gICAgICBgRG8geW91IGhhdmUgYW55IEFuZHJvaWQgU0RLcyBpbnN0YWxsZWQ/YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYXRmb3JtOiBudWxsLFxuICAgICAgcGxhdGZvcm1QYXRoOiBudWxsLFxuICAgIH07XG4gIH1cblxuICBjb25zdCByZWNlbnRTZGtWZXJzaW9uID0gXy5rZXlzKHBsYXRmb3Jtc01hcHBpbmcpLnNvcnQoKS5yZXZlcnNlKClbMF07XG4gIGNvbnN0IHJlc3VsdCA9IHBsYXRmb3Jtc01hcHBpbmdbcmVjZW50U2RrVmVyc2lvbl07XG4gIGxvZy5kZWJ1ZyhgRm91bmQgdGhlIG1vc3QgcmVjZW50IEFuZHJvaWQgcGxhdGZvcm06ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdW56aXBGaWxlICh6aXBQYXRoLCBkc3RSb290ID0gcGF0aC5kaXJuYW1lKHppcFBhdGgpKSB7XG4gIGxvZy5kZWJ1ZyhgVW56aXBwaW5nICcke3ppcFBhdGh9JyB0byAnJHtkc3RSb290fSdgKTtcbiAgYXdhaXQgemlwLmFzc2VydFZhbGlkWmlwKHppcFBhdGgpO1xuICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHppcFBhdGgsIGRzdFJvb3QpO1xuICBsb2cuZGVidWcoJ1VuemlwIHN1Y2Nlc3NmdWwnKTtcbn1cblxuLyoqXG4gKiBVbnNpZ25zIHRoZSBnaXZlbiBhcGsgYnkgcmVtb3ZpbmcgdGhlXG4gKiBNRVRBLUlORiBmb2xkZXIgcmVjdXJzaXZlbHkgZnJvbSB0aGUgYXJjaGl2ZS5cbiAqICEhISBUaGUgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgZ2l2ZW4gYXBrIGFmdGVyIHN1Y2Nlc3NmdWwgdW5zaWduaW5nICEhIVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGtQYXRoIFRoZSBwYXRoIHRvIHRoZSBhcGtcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGFwayBoYXMgYmVlbiBzdWNjZXNzZnVsbHlcbiAqIHVuc2lnbmVkIGFuZCBvdmVyd3JpdHRlblxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgdGhlIHVuc2lnbiBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdW5zaWduQXBrIChhcGtQYXRoKSB7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgbWV0YUluZkZvbGRlck5hbWUgPSAnTUVUQS1JTkYnO1xuICB0cnkge1xuICAgIGxldCBoYXNNZXRhSW5mID0gZmFsc2U7XG4gICAgYXdhaXQgemlwLnJlYWRFbnRyaWVzKGFwa1BhdGgsICh7ZW50cnl9KSA9PiB7XG4gICAgICBoYXNNZXRhSW5mID0gZW50cnkuZmlsZU5hbWUuc3RhcnRzV2l0aChgJHttZXRhSW5mRm9sZGVyTmFtZX0vYCk7XG4gICAgICAvLyBlbnRyaWVzIGl0ZXJhdGlvbiBzdG9wcyBhZnRlciBgZmFsc2VgIGlzIHJldHVybmVkXG4gICAgICByZXR1cm4gIWhhc01ldGFJbmY7XG4gICAgfSk7XG4gICAgaWYgKCFoYXNNZXRhSW5mKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHRtcFppcFJvb3QgPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgJ2FwaycpO1xuICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oYXBrUGF0aCwgdG1wWmlwUm9vdCk7XG4gICAgYXdhaXQgZnMucmltcmFmKHBhdGgucmVzb2x2ZSh0bXBaaXBSb290LCBtZXRhSW5mRm9sZGVyTmFtZSkpO1xuICAgIGNvbnN0IHRtcFJlc3VsdFBhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgcGF0aC5iYXNlbmFtZShhcGtQYXRoKSk7XG4gICAgYXdhaXQgemlwLnRvQXJjaGl2ZSh0bXBSZXN1bHRQYXRoLCB7XG4gICAgICBjd2Q6IHRtcFppcFJvb3QsXG4gICAgfSk7XG4gICAgYXdhaXQgZnMudW5saW5rKGFwa1BhdGgpO1xuICAgIGF3YWl0IGZzLm12KHRtcFJlc3VsdFBhdGgsIGFwa1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJTUVMaXN0RnJvbU91dHB1dCAoc3Rkb3V0KSB7XG4gIGxldCBlbmdpbmVzID0gW107XG4gIGZvciAobGV0IGxpbmUgb2Ygc3Rkb3V0LnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChsaW5lLmxlbmd0aCA+IDAgJiYgbGluZVswXSAhPT0gJyAnKSB7XG4gICAgICAvLyByZW1vdmUgbmV3bGluZSBhbmQgdHJhaWxpbmcgY29sb24sIGFuZCBhZGQgdG8gdGhlIGxpc3RcbiAgICAgIGVuZ2luZXMucHVzaChsaW5lLnRyaW0oKS5yZXBsYWNlKC86JC8sICcnKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbmdpbmVzO1xufVxuXG5jb25zdCBnZXRKYXZhSG9tZSA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRKYXZhSG9tZSAoKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3MuZW52LkpBVkFfSE9NRTtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcycpO1xuICB9XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBKQVZBX0hPTUUgbG9jYXRpb24gJyR7cmVzdWx0fScgbXVzdCBleGlzdGApO1xuICB9XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChyZXN1bHQpO1xuICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBKQVZBX0hPTUUgbG9jYXRpb24gJyR7cmVzdWx0fScgbXVzdCBiZSBhIHZhbGlkIGZvbGRlcmApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuY29uc3QgZ2V0SmF2YUZvck9zID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEphdmFGb3JPcyAoKSB7XG4gIGxldCBqYXZhSG9tZTtcbiAgbGV0IGVyck1zZztcbiAgdHJ5IHtcbiAgICBqYXZhSG9tZSA9IGF3YWl0IGdldEphdmFIb21lKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyck1zZyA9IGVyci5tZXNzYWdlO1xuICB9XG4gIGNvbnN0IGV4ZWN1dGFibGVOYW1lID0gYGphdmEke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG4gIGlmIChqYXZhSG9tZSkge1xuICAgIGNvbnN0IHJlc3VsdFBhdGggPSBwYXRoLnJlc29sdmUoamF2YUhvbWUsICdiaW4nLCBleGVjdXRhYmxlTmFtZSk7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhyZXN1bHRQYXRoKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLndoaWNoKGV4ZWN1dGFibGVOYW1lKTtcbiAgfSBjYXRjaCAoaWduKSB7fVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnJHtleGVjdXRhYmxlTmFtZX0nIGJpbmFyeSBjb3VsZCBub3QgYmUgZm91bmQgYCArXG4gICAgYG5laXRoZXIgaW4gUEFUSCBub3IgdW5kZXIgSkFWQV9IT01FICgke2Vyck1zZyB8fCBwYXRoLnJlc29sdmUoamF2YUhvbWUsICdiaW4nKX0pYCk7XG59KTtcblxuY29uc3QgZ2V0T3BlblNzbEZvck9zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaW5hcnlOYW1lID0gYG9wZW5zc2wke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLndoaWNoKGJpbmFyeU5hbWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBvcGVuc3NsIHRvb2wgbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBhbmQgYXZhaWxhYmxlIG9uIHRoZSBwYXRoJyk7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGFwa3NpZ25lciB0b29sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa3NpZ25lciB0b29sLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0b29sIGlzIG5vdCBwcmVzZW50IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXBrc2lnbmVyRm9yT3MgKHN5c0hlbHBlcnMpIHtcbiAgcmV0dXJuIGF3YWl0IHN5c0hlbHBlcnMuZ2V0QmluYXJ5RnJvbVNka1Jvb3QoJ2Fwa3NpZ25lci5qYXInKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrYW5hbHl6ZXIgdG9vbC5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYXBrYW5hbHl6ZXIuaHRtbFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeXNIZWxwZXJzIC0gQW4gaW5zdGFuY2UgY29udGFpbmluZyBzeXN0ZW1DYWxsTWV0aG9kcyBoZWxwZXIgbWV0aG9kc1xuICogQHJldHVybnMge3N0cmluZ30gQW4gYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB0b29sIGlzIG5vdCBwcmVzZW50IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXBrYW5hbHl6ZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrYW5hbHl6ZXInKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgbVNob3dpbmdMb2Nrc2NyZWVuIG9yIG1EcmVhbWluZ0xvY2tzY3JlZW4gaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lXG4gKiBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nXG4gKlxuICogQSBub3RlOiBgYWRiIHNoZWxsIGR1bXBzeXMgdHJ1c3RgIHBlcmZvcm1zIGJldHRlciB3aGlsZSBkZXRlY3RpbmcgdGhlIGxvY2tlZCBzY3JlZW4gc3RhdGVcbiAqIGluIGNvbXBhcmlzb24gdG8gYGFkYiBkdW1wc3lzIHdpbmRvd2Agb3V0cHV0IHBhcnNpbmcuXG4gKiBCdXQgdGhlIHRydXN0IGNvbW1hbmQgZG9lcyBub3Qgd29yayBmb3IgYFN3aXBlYCB1bmxvY2sgcGF0dGVybi5cbiAqXG4gKiBJbiBzb21lIEFuZHJvaWQgZGV2aWNlcyAoUHJvYmFibHkgYXJvdW5kIEFuZHJvaWQgMTArKSwgYG1TaG93aW5nTG9ja3NjcmVlbmAgYW5kIGBtRHJlYW1pbmdMb2Nrc2NyZWVuYFxuICogZG8gbm90IHdvcmsgdG8gZGV0ZWN0IGxvY2sgc3RhdHVzLiBJbnN0ZWFkLCBrZXlndWFyZCBwcmVmZXJlbmNlcyBoZWxwcyB0byBkZXRlY3QgdGhlIGxvY2sgY29uZGl0aW9uLlxuICogU29tZSBkZXZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBUViBkbyBub3QgaGF2ZSBrZXlndWFyZCwgc28gd2Ugc2hvdWxkIGtlZXBcbiAqIHNjcmVlbiBjb25kaXRpb24gYXMgdGhpcyBwcmltYXJ5IG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5cyAtIFRoZSBvdXRwdXQgb2YgZHVtcHN5cyB3aW5kb3cgY29tbWFuZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbG9jayBzY3JlZW4gaXMgc2hvd2luZy5cbiAqL1xuZnVuY3Rpb24gaXNTaG93aW5nTG9ja3NjcmVlbiAoZHVtcHN5cykge1xuICByZXR1cm4gXy5zb21lKFsnbVNob3dpbmdMb2Nrc2NyZWVuPXRydWUnLCAnbURyZWFtaW5nTG9ja3NjcmVlbj10cnVlJ10sICh4KSA9PiBkdW1wc3lzLmluY2x1ZGVzKHgpKVxuICAgIC8vIGBtSXNTaG93aW5nYCBhbmQgYG1JbnB1dFJlc3RyaWN0ZWRgIGFyZSBgdHJ1ZWAgaW4gbG9jayBjb25kaXRpb24uIGBmYWxzZWAgaXMgdW5sb2NrIGNvbmRpdGlvbi5cbiAgICB8fCBfLmV2ZXJ5KFsvS2V5Z3VhcmRTdGF0ZU1vbml0b3JbXFxuXFxzXSttSXNTaG93aW5nPXRydWUvLCAvXFxzK21JbnB1dFJlc3RyaWN0ZWQ9dHJ1ZS9dLCAoeCkgPT4geC50ZXN0KGR1bXBzeXMpKTtcbn1cblxuLypcbiAqIENoZWNrcyBtQ3VycmVudEZvY3VzIGluIGR1bXBzeXMgb3V0cHV0IHRvIGRldGVybWluZSBpZiBLZXlndWFyZCBpcyBhY3RpdmF0ZWRcbiAqL1xuZnVuY3Rpb24gaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkIChkdW1wc3lzKSB7XG4gIGxldCBtID0gL21DdXJyZW50Rm9jdXMuK0tleWd1YXJkL2dpLmV4ZWMoZHVtcHN5cyk7XG4gIHJldHVybiAobSAmJiBtLmxlbmd0aCAmJiBtWzBdKSA/IHRydWUgOiBmYWxzZTtcbn1cblxuLypcbiAqIFJlYWRzIFN1cmZhY2VPcmllbnRhdGlvbiBpbiBkdW1wc3lzIG91dHB1dFxuICovXG5mdW5jdGlvbiBnZXRTdXJmYWNlT3JpZW50YXRpb24gKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvU3VyZmFjZU9yaWVudGF0aW9uOiBcXGQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIG0gJiYgcGFyc2VJbnQobVswXS5zcGxpdCgnOicpWzFdLCAxMCk7XG59XG5cbi8qXG4gKiBDaGVja3MgbVNjcmVlbk9uRnVsbHkgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIHNjcmVlbiBpcyBzaG93aW5nXG4gKiBEZWZhdWx0IGlzIHRydWVcbiAqL1xuZnVuY3Rpb24gaXNTY3JlZW5PbkZ1bGx5IChkdW1wc3lzKSB7XG4gIGxldCBtID0gL21TY3JlZW5PbkZ1bGx5PVxcdysvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuICFtIHx8IC8vIGlmIGluZm9ybWF0aW9uIGlzIG1pc3Npbmcgd2UgYXNzdW1lIHNjcmVlbiBpcyBmdWxseSBvblxuICAgICAgICAgKG0gJiYgbS5sZW5ndGggPiAwICYmIG1bMF0uc3BsaXQoJz0nKVsxXSA9PT0gJ3RydWUnKSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgY29tbWFuZCBsaW5lIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW5cbiAqIGFwcGxpY2F0aW9uIHN0YXJ0dXAgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSB7U3RhcnRBcHBPcHRpb25zfSBzdGFydEFwcE9wdGlvbnMgLSBBcHBsaWNhdGlvbiBvcHRpb25zIG1hcHBpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcGlMZXZlbCAtIFRoZSBhY3R1YWwgT1MgQVBJIGxldmVsXG4gKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gYnVpbGRTdGFydENtZCAoc3RhcnRBcHBPcHRpb25zLCBhcGlMZXZlbCkge1xuICBjb25zdCB7XG4gICAgdXNlcixcbiAgICB3YWl0Rm9yTGF1bmNoLFxuICAgIHBrZyxcbiAgICBhY3Rpdml0eSxcbiAgICBhY3Rpb24sXG4gICAgY2F0ZWdvcnksXG4gICAgc3RvcEFwcCxcbiAgICBmbGFncyxcbiAgfSA9IHN0YXJ0QXBwT3B0aW9ucztcbiAgY29uc3QgY21kID0gWydhbScsICdzdGFydCddO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh1c2VyKSkge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBpZiAod2FpdEZvckxhdW5jaCkge1xuICAgIGNtZC5wdXNoKCctVycpO1xuICB9XG4gIGlmIChhY3Rpdml0eSAmJiBwa2cpIHtcbiAgICBjbWQucHVzaCgnLW4nLCBgJHtwa2d9LyR7YWN0aXZpdHl9YCk7XG4gIH1cbiAgaWYgKHN0b3BBcHAgJiYgYXBpTGV2ZWwgPj0gMTUpIHtcbiAgICBjbWQucHVzaCgnLVMnKTtcbiAgfVxuICBpZiAoYWN0aW9uKSB7XG4gICAgY21kLnB1c2goJy1hJywgYWN0aW9uKTtcbiAgfVxuICBpZiAoY2F0ZWdvcnkpIHtcbiAgICBjbWQucHVzaCgnLWMnLCBjYXRlZ29yeSk7XG4gIH1cbiAgaWYgKGZsYWdzKSB7XG4gICAgY21kLnB1c2goJy1mJywgZmxhZ3MpO1xuICB9XG4gIGlmIChzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpIHtcbiAgICAvLyBleHBlY3Qgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgdG8gYmUgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBmb3JtOlxuICAgIC8vICAgICBcIi1mbGFnIGtleVwiXG4gICAgLy8gICAgIFwiLWZsYWcga2V5IHZhbHVlXCJcbiAgICAvLyBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZXNlIChlLmcuLCBcIi1mbGFnMSBrZXkxIC1mbGFnMiBrZXkyIHZhbHVlMlwiKVxuXG4gICAgLy8gdGFrZSBhIHN0cmluZyBhbmQgcGFyc2Ugb3V0IHRoZSBwYXJ0IGJlZm9yZSBhbnkgc3BhY2VzLCBhbmQgYW55dGhpbmcgYWZ0ZXJcbiAgICAvLyB0aGUgZmlyc3Qgc3BhY2VcbiAgICBsZXQgcGFyc2VLZXlWYWx1ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICBsZXQgc3BhY2UgPSBzdHIuaW5kZXhPZignICcpO1xuICAgICAgaWYgKHNwYWNlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyLmxlbmd0aCA/IFtzdHJdIDogW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3N0ci5zdWJzdHJpbmcoMCwgc3BhY2UpLnRyaW0oKSwgc3RyLnN1YnN0cmluZyhzcGFjZSArIDEpLnRyaW0oKV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGN5Y2xlIHRocm91Z2ggdGhlIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzIGFuZCBwdWxsIG91dCB0aGUgYXJndW1lbnRzXG4gICAgLy8gYWRkIGEgc3BhY2UgaW5pdGlhbGx5IHNvIGZsYWdzIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYXJndW1lbnRzIHRoYXRcbiAgICAvLyBoYXZlIGludGVybmFsIGh5cGhlbnNcbiAgICBsZXQgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPSBgICR7c3RhcnRBcHBPcHRpb25zLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzfWA7XG4gICAgbGV0IHJlID0gLyAoLVteXFxzXSspICguKykvO1xuICAgIHdoaWxlICh0cnVlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICBsZXQgYXJncyA9IHJlLmV4ZWMob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpO1xuICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgIGlmIChvcHRpb25hbEludGVudEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBubyBtb3JlIGZsYWdzLCBzbyB0aGUgcmVtYWluZGVyIGNhbiBiZSB0cmVhdGVkIGFzICdrZXknIG9yICdrZXkgdmFsdWUnXG4gICAgICAgICAgY21kLnB1c2guYXBwbHkoY21kLCBwYXJzZUtleVZhbHVlKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UgYXJlIGRvbmVcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIHRha2UgdGhlIGZsYWcgYW5kIHNlZSBpZiBpdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmdcbiAgICAgIC8vIGlmIGl0IGlzIG5vdCwgdGhlbiBpdCBtZWFucyB3ZSBoYXZlIGJlZW4gdGhyb3VnaCBhbHJlYWR5LCBhbmRcbiAgICAgIC8vIHdoYXQgaXMgYmVmb3JlIHRoZSBmbGFnIGlzIHRoZSBhcmd1bWVudCBmb3IgdGhlIHByZXZpb3VzIGZsYWdcbiAgICAgIGxldCBmbGFnID0gYXJnc1sxXTtcbiAgICAgIGxldCBmbGFnUG9zID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuaW5kZXhPZihmbGFnKTtcbiAgICAgIGlmIChmbGFnUG9zICE9PSAwKSB7XG4gICAgICAgIGxldCBwcmV2QXJncyA9IG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLnN1YnN0cmluZygwLCBmbGFnUG9zKTtcbiAgICAgICAgY21kLnB1c2guYXBwbHkoY21kLCBwYXJzZUtleVZhbHVlKHByZXZBcmdzKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCB0aGUgZmxhZywgYXMgdGhlcmUgYXJlIG5vIG1vcmUgZWFybGllciBhcmd1bWVudHNcbiAgICAgIGNtZC5wdXNoKGZsYWcpO1xuXG4gICAgICAvLyBtYWtlIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzIGhvbGQgdGhlIHJlbWFpbmRlclxuICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPSBhcmdzWzJdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY21kO1xufVxuXG5jb25zdCBnZXRTZGtUb29sc1ZlcnNpb24gPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0U2RrVG9vbHNWZXJzaW9uICgpIHtcbiAgY29uc3QgYW5kcm9pZEhvbWUgPSBwcm9jZXNzLmVudi5BTkRST0lEX0hPTUU7XG4gIGlmICghYW5kcm9pZEhvbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FORFJPSURfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBleHBlY3RlZCB0byBiZSBzZXQnKTtcbiAgfVxuICBjb25zdCBwcm9wZXJ0aWVzUGF0aCA9IHBhdGgucmVzb2x2ZShhbmRyb2lkSG9tZSwgJ3Rvb2xzJywgJ3NvdXJjZS5wcm9wZXJ0aWVzJyk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHByb3BlcnRpZXNQYXRoKSkge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgZmluZCAke3Byb3BlcnRpZXNQYXRofSBmaWxlIHRvIHJlYWQgU0RLIHZlcnNpb24gZnJvbWApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwcm9wZXJ0aWVzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BlcnRpZXNQYXRoLCAndXRmOCcpO1xuICBjb25zdCB2ZXJzaW9uTWF0Y2hlciA9IG5ldyBSZWdFeHAoL1BrZ1xcLlJldmlzaW9uPShcXGQrKVxcLj8oXFxkKyk/XFwuPyhcXGQrKT8vKTtcbiAgY29uc3QgbWF0Y2ggPSB2ZXJzaW9uTWF0Y2hlci5leGVjKHByb3BlcnRpZXNDb250ZW50KTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ham9yOiBwYXJzZUludChtYXRjaFsxXSwgMTApLFxuICAgICAgbWlub3I6IG1hdGNoWzJdID8gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKSA6IDAsXG4gICAgICBidWlsZDogbWF0Y2hbM10gPyBwYXJzZUludChtYXRjaFszXSwgMTApIDogMFxuICAgIH07XG4gIH1cbiAgbG9nLndhcm4oYENhbm5vdCBwYXJzZSBcIlBrZy5SZXZpc2lvblwiIHZhbHVlIGZyb20gJHtwcm9wZXJ0aWVzUGF0aH1gKTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBmdWxsIHBhdGhzIHRvIGFsbCAnYnVpbGQtdG9vbHMnIHN1YmZvbGRlcnMgdW5kZXIgdGhlIHBhcnRpY3VsYXJcbiAqIFNESyByb290IGZvbGRlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtSb290IC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXJcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgZnVsbCBwYXRocyB0byB0aGUgcmVzdWx0aW5nIGZvbGRlcnMgc29ydGVkIGJ5XG4gKiBtb2RpZmljYXRpb24gZGF0ZSAodGhlIG5ld2VzdCBjb21lcyBmaXJzdCkgb3IgYW4gZW1wdHkgbGlzdCBpZiBubyBtYWN0aGVzIHdlcmUgZm91bmRcbiAqL1xuY29uc3QgZ2V0QnVpbGRUb29sc0RpcnMgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0QnVpbGRUb29sc0RpcnMgKHNka1Jvb3QpIHtcbiAgbGV0IGJ1aWxkVG9vbHNEaXJzID0gYXdhaXQgZnMuZ2xvYignKi8nLCB7XG4gICAgY3dkOiBwYXRoLnJlc29sdmUoc2RrUm9vdCwgJ2J1aWxkLXRvb2xzJyksXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gIH0pO1xuICB0cnkge1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gYnVpbGRUb29sc0RpcnNcbiAgICAgIC5tYXAoKGRpcikgPT4gW3BhdGguYmFzZW5hbWUoZGlyKSwgZGlyXSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBzZW12ZXIucmNvbXBhcmUoYVswXSwgYlswXSkpXG4gICAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBzb3J0IGJ1aWxkLXRvb2xzIGZvbGRlcnMgJHtKU09OLnN0cmluZ2lmeShidWlsZFRvb2xzRGlycy5tYXAoKGRpcikgPT4gcGF0aC5iYXNlbmFtZShkaXIpKSl9IGAgK1xuICAgICAgYGJ5IHNlbWFudGljIHZlcnNpb24gbmFtZXMuYCk7XG4gICAgbG9nLndhcm4oYEZhbGxpbmcgYmFjayB0byBzb3J0aW5nIGJ5IG1vZGlmaWNhdGlvbiBkYXRlLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBjb25zdCBwYWlycyA9IGF3YWl0IEIubWFwKGJ1aWxkVG9vbHNEaXJzLCBhc3luYyAoZGlyKSA9PiBbKGF3YWl0IGZzLnN0YXQoZGlyKSkubXRpbWUudmFsdWVPZigpLCBkaXJdKTtcbiAgICBidWlsZFRvb2xzRGlycyA9IHBhaXJzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYVswXSA8IGJbMF0pXG4gICAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgfVxuICBsb2cuaW5mbyhgRm91bmQgJHtidWlsZFRvb2xzRGlycy5sZW5ndGh9ICdidWlsZC10b29scycgZm9sZGVycyB1bmRlciAnJHtzZGtSb290fScgKG5ld2VzdCBmaXJzdCk6YCk7XG4gIGZvciAobGV0IGRpciBvZiBidWlsZFRvb2xzRGlycykge1xuICAgIGxvZy5pbmZvKGAgICAgJHtkaXJ9YCk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkVG9vbHNEaXJzO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBlcm1pc3Npb24gbmFtZXMgZW5jb2RlZCBpbiBgZHVtcHN5cyBwYWNrYWdlYCBjb21tYW5kIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5c091dHB1dCAtIFRoZSBhY3R1YWwgY29tbWFuZCBvdXRwdXQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGdyb3VwTmFtZXMgLSBUaGUgbGlzdCBvZiBncm91cCBuYW1lcyB0byBsaXN0IHBlcm1pc3Npb25zIGZvci5cbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGdyYW50ZWRTdGF0ZSAtIFRoZSBleHBlY3RlZCBzdGF0ZSBvZiBgZ3JhbnRlZGAgYXR0cmlidXRlIHRvIGZpbHRlciB3aXRoLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gZmlsdGVyaW5nIGlzIGRvbmUgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2V0LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcGVybWlzc2lvbiBuYW1lcyBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hdGNoZXMgd2VyZSBmb3VuZC5cbiAqL1xuY29uc3QgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoZHVtcHN5c091dHB1dCwgZ3JvdXBOYW1lcywgZ3JhbnRlZFN0YXRlID0gbnVsbCkge1xuICBjb25zdCBncm91cFBhdHRlcm5CeU5hbWUgPSAoZ3JvdXBOYW1lKSA9PiBuZXcgUmVnRXhwKGBeKFxcXFxzKiR7Xy5lc2NhcGVSZWdFeHAoZ3JvdXBOYW1lKX0gcGVybWlzc2lvbnM6W1xcXFxzXFxcXFNdKylgLCAnbScpO1xuICBjb25zdCBpbmRlbnRQYXR0ZXJuID0gL1xcU3wkLztcbiAgY29uc3QgcGVybWlzc2lvbk5hbWVQYXR0ZXJuID0gL2FuZHJvaWRcXC5cXHcqXFwuP3Blcm1pc3Npb25cXC5cXHcrLztcbiAgY29uc3QgZ3JhbnRlZFN0YXRlUGF0dGVybiA9IC9cXGJncmFudGVkPShcXHcrKS87XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiBncm91cE5hbWVzKSB7XG4gICAgY29uc3QgZ3JvdXBNYXRjaCA9IGdyb3VwUGF0dGVybkJ5TmFtZShncm91cE5hbWUpLmV4ZWMoZHVtcHN5c091dHB1dCk7XG4gICAgaWYgKCFncm91cE1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IGdyb3VwTWF0Y2hbMV0uc3BsaXQoJ1xcbicpO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPCAyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZUluZGVudCA9IGxpbmVzWzBdLnNlYXJjaChpbmRlbnRQYXR0ZXJuKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc2xpY2UoMSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLnNlYXJjaChpbmRlbnRQYXR0ZXJuKTtcbiAgICAgIGlmIChjdXJyZW50SW5kZW50IDw9IHRpdGxlSW5kZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwZXJtaXNzaW9uTmFtZU1hdGNoID0gcGVybWlzc2lvbk5hbWVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoIXBlcm1pc3Npb25OYW1lTWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uTmFtZU1hdGNoWzBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyYW50ZWRTdGF0ZU1hdGNoID0gZ3JhbnRlZFN0YXRlUGF0dGVybi5leGVjKGxpbmUpO1xuICAgICAgaWYgKGdyYW50ZWRTdGF0ZU1hdGNoKSB7XG4gICAgICAgIGl0ZW0uZ3JhbnRlZCA9IGdyYW50ZWRTdGF0ZU1hdGNoWzFdID09PSAndHJ1ZSc7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZFJlc3VsdCA9IHJlc3VsdFxuICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFfLmlzQm9vbGVhbihncmFudGVkU3RhdGUpIHx8IGl0ZW0uZ3JhbnRlZCA9PT0gZ3JhbnRlZFN0YXRlKVxuICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0ucGVybWlzc2lvbik7XG4gIGxvZy5kZWJ1ZyhgUmV0cmlldmVkICR7dXRpbC5wbHVyYWxpemUoJ3Blcm1pc3Npb24nLCBmaWx0ZXJlZFJlc3VsdC5sZW5ndGgsIHRydWUpfSBgICtcbiAgICBgZnJvbSAke2dyb3VwTmFtZXN9ICR7dXRpbC5wbHVyYWxpemUoJ2dyb3VwJywgZ3JvdXBOYW1lcy5sZW5ndGgsIGZhbHNlKX1gKTtcbiAgcmV0dXJuIGZpbHRlcmVkUmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYW5kcm9pZC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTExMDY0L3doYXQtaXMtYS1wYXJ0aWFsLWFwcGxpY2F0aW9uLWluc3RhbGwtdmlhLWFkYlxuICovXG5cbi8qKlxuICogVHJhbnNmb3JtcyBnaXZlbiBvcHRpb25zIGludG8gdGhlIGxpc3Qgb2YgYGFkYiBpbnN0YWxsLmluc3RhbGwtbXVsdGlwbGVgIGNvbW1hbmQgYXJndW1lbnRzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGFwaUxldmVsIC0gVGhlIGN1cnJlbnQgQVBJIGxldmVsXG4gKiBAcGFyYW0gez9JbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG1hcHBpbmcgdG8gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGFycmF5IG9mIGFyZ3VtZW50c1xuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxBcmdzIChhcGlMZXZlbCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGlmICghdXRpbC5oYXNWYWx1ZShvcHRpb25zLnJlcGxhY2UpIHx8IG9wdGlvbnMucmVwbGFjZSkge1xuICAgIHJlc3VsdC5wdXNoKCctcicpO1xuICB9XG4gIGlmIChvcHRpb25zLmFsbG93VGVzdFBhY2thZ2VzKSB7XG4gICAgcmVzdWx0LnB1c2goJy10Jyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudXNlU2RjYXJkKSB7XG4gICAgcmVzdWx0LnB1c2goJy1zJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZ3JhbnRQZXJtaXNzaW9ucykge1xuICAgIGlmIChhcGlMZXZlbCA8IDIzKSB7XG4gICAgICBsb2cuZGVidWcoYFNraXBwaW5nIHBlcm1pc3Npb25zIGdyYW50IG9wdGlvbiwgc2luY2UgYCArXG4gICAgICAgICAgICAgICAgYHRoZSBjdXJyZW50IEFQSSBsZXZlbCAke2FwaUxldmVsfSBkb2VzIG5vdCBzdXBwb3J0IGFwcGxpY2F0aW9ucyBgICtcbiAgICAgICAgICAgICAgICBgcGVybWlzc2lvbnMgY3VzdG9taXphdGlvbmApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCgnLWcnKTtcbiAgICB9XG4gIH1cbiAgLy8gRm9yIG11bHRpcGxlLWluc3RhbGxcbiAgaWYgKG9wdGlvbnMucGFydGlhbEluc3RhbGwpIHtcbiAgICByZXN1bHQucHVzaCgnLXAnKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFuaWZlc3RJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnIC0gVGhlIGFwcGxpY2F0aW9uIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIHBhY2thZ2UgYWN0aXZpdHlcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdmVyc2lvbkNvZGUgLSBUaGUgdmVyc2lvbiBjb2RlIG51bWJlciAobWlnaHQgYmUgYE5hTmApXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZlcnNpb25OYW1lIC0gVGhlIHZlcnNpb24gbmFtZSAobWlnaHQgYmUgYG51bGxgKVxuICovXG5cbi8qKlxuICogUGVyZm9ybSBwYXJzaW5nIG9mIHRoZSBtYW5pZmVzdCBvYmplY3QgaW4gb3JkZXJcbiAqIHRvIGV4dHJhY3Qgc29tZSB2aXRhbCB2YWx1ZXMgZnJvbSBpdFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtYW5pZmVzdCBUaGUgbWFuaWZlc3QgY29udGVudCBmb3JtYXR0ZWQgYXMgSlNPTlxuICogU2VlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2FkYmtpdC1hcGtyZWFkZXIgZm9yIGRldGFpbGVkIGZvcm1hdCBkZXNjcmlwdGlvblxuICogQHJldHVybnMge01hbmlmZXN0SW5mb31cbiAqL1xuZnVuY3Rpb24gcGFyc2VNYW5pZmVzdCAobWFuaWZlc3QpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHBrZzogbWFuaWZlc3QucGFja2FnZSxcbiAgICB2ZXJzaW9uQ29kZTogcGFyc2VJbnQobWFuaWZlc3QudmVyc2lvbkNvZGUsIDEwKSxcbiAgICB2ZXJzaW9uTmFtZTogbWFuaWZlc3QudmVyc2lvbk5hbWUgfHwgbnVsbCxcbiAgfTtcbiAgaWYgKCFtYW5pZmVzdC5hcHBsaWNhdGlvbikge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBMb29rIGZvciBlbmFibGVkIGFjdGl2aXR5IG9yIGFjdGl2aXR5LWFsaWFzIHdpdGhcbiAgLy8gYWN0aW9uID09IGFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIGFuZFxuICAvLyBjYXRlZ29yeSA9PSBhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUlxuICBmb3IgKGNvbnN0IGFjdGl2aXR5IG9mIFtcbiAgICAuLi5tYW5pZmVzdC5hcHBsaWNhdGlvbi5hY3Rpdml0aWVzLFxuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXR5QWxpYXNlcyxcbiAgXSkge1xuICAgIGlmIChhY3Rpdml0eS5lbmFibGVkID09PSBmYWxzZSB8fCBfLmlzRW1wdHkoYWN0aXZpdHkuaW50ZW50RmlsdGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qge2FjdGlvbnMsIGNhdGVnb3JpZXN9IG9mIGFjdGl2aXR5LmludGVudEZpbHRlcnMpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkoYWN0aW9ucykgfHwgXy5pc0VtcHR5KGNhdGVnb3JpZXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc01haW5BY3Rpb24gPSBhY3Rpb25zLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gTUFJTl9BQ1RJT04pO1xuICAgICAgY29uc3QgaXNMYXVuY2hlckNhdGVnb3J5ID0gY2F0ZWdvcmllcy5zb21lKCh7bmFtZX0pID0+IG5hbWUgPT09IExBVU5DSEVSX0NBVEVHT1JZKTtcbiAgICAgIGlmIChpc01haW5BY3Rpb24gJiYgaXNMYXVuY2hlckNhdGVnb3J5KSB7XG4gICAgICAgIHJlc3VsdC5hY3Rpdml0eSA9IGFjdGl2aXR5Lm5hbWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdCB0b29sIG91dHB1dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdPdXRwdXQgVGhlIGFjdHVhbCB0b29sIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ01hcmtlciBUaGUgY29uZmlnIG1hcmtlci4gVXN1YWxseVxuICogYSBsYW5ndWFnZSBhYmJyZXZpYXRpb24gb3IgYChkZWZhdWx0KWBcbiAqIEByZXR1cm5zIHtPYmplY3R9IFN0cmluZ3MgaWRzIHRvIHZhbHVlcyBtYXBwaW5nLiBQbHVyYWxcbiAqIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYXJyYXlzLiBJZiBubyBjb25maWcgZm91bmQgZm9yIHRoZVxuICogZ2l2ZW4gbWFya2VyIHRoZW4gYW4gZW1wdHkgbWFwcGluZyBpcyByZXR1cm5lZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBYXB0U3RyaW5ncyAocmF3T3V0cHV0LCBjb25maWdNYXJrZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplU3RyaW5nTWF0Y2ggPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1wiJC8sICcnKS5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXFxcXFwiL2csICdcIicpO1xuICB9O1xuXG4gIGNvbnN0IGFwa1N0cmluZ3MgPSB7fTtcbiAgbGV0IGlzSW5Db25maWcgPSBmYWxzZTtcbiAgbGV0IGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgbGV0IGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAvLyBUaGUgcGF0dGVybiBtYXRjaGVzIGFueSBxdW90ZWQgY29udGVudCBpbmNsdWRpbmcgZXNjYXBlZCBxdW90ZXNcbiAgY29uc3QgcXVvdGVkU3RyaW5nUGF0dGVybiA9IC9cIlteXCJcXFxcXSooPzpcXFxcLlteXCJcXFxcXSopKlwiLztcbiAgZm9yIChjb25zdCBsaW5lIG9mIHJhd091dHB1dC5zcGxpdChvcy5FT0wpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFsnY29uZmlnJywgJ3R5cGUnLCAnc3BlYycsICdQYWNrYWdlJ10uc29tZSgoeCkgPT4gdHJpbW1lZExpbmUuc3RhcnRzV2l0aCh4KSkpIHtcbiAgICAgIGlzSW5Db25maWcgPSB0cmltbWVkTGluZS5zdGFydHNXaXRoKGBjb25maWcgJHtjb25maWdNYXJrZXJ9OmApO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSW5Db25maWcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCdyZXNvdXJjZScpKSB7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcblxuICAgICAgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6c3RyaW5nLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gLzpzdHJpbmdcXC8oXFxTKyk6Ly5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygnOnBsdXJhbHMvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnBsdXJhbHNcXC8oXFxTKyk6Ly5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICBpc0luUGx1cmFsR3JvdXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFJlc291cmNlSWQgJiYgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSk7XG4gICAgICB9XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFJlc291cmNlSWQgJiYgaXNJblBsdXJhbEdyb3VwICYmIHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6IChzdHJpbmcnKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBxdW90ZWRTdHJpbmdQYXR0ZXJuLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gW1xuICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgbm9ybWFsaXplU3RyaW5nTWF0Y2gobWF0Y2hbMF0pLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhcGsgc3RyaW5ncyBmcm9tIGFhcHQyIHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIHRoZSBkZWZhdWx0IG9uZVxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHQyU3RyaW5ncyAocmF3T3V0cHV0LCBjb25maWdNYXJrZXIpIHtcbiAgY29uc3QgYWxsTGluZXMgPSByYXdPdXRwdXQuc3BsaXQob3MuRU9MKTtcbiAgZnVuY3Rpb24gZXh0cmFjdENvbnRlbnQgKHN0YXJ0SWR4KSB7XG4gICAgbGV0IGlkeCA9IHN0YXJ0SWR4O1xuICAgIGNvbnN0IHN0YXJ0Q2hhclBvcyA9IGFsbExpbmVzW3N0YXJ0SWR4XS5pbmRleE9mKCdcIicpO1xuICAgIGlmIChzdGFydENoYXJQb3MgPCAwKSB7XG4gICAgICByZXR1cm4gW251bGwsIGlkeF07XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICB3aGlsZSAoaWR4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJNYXRjaCA9IC9cIiQvLmV4ZWMoYWxsTGluZXNbaWR4XSk7XG4gICAgICBpZiAodGVybWluYXRpb25DaGFyTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGVybWluYXRpb25DaGFyUG9zID0gdGVybWluYXRpb25DaGFyTWF0Y2guaW5kZXg7XG4gICAgICAgIGlmIChzdGFydElkeCA9PT0gaWR4KSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKHN0YXJ0Q2hhclBvcyArIDEsIHRlcm1pbmF0aW9uQ2hhclBvcyksXG4gICAgICAgICAgICBpZHhcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYCR7cmVzdWx0fVxcXFxuJHtfLnRyaW1TdGFydChhbGxMaW5lc1tpZHhdLnN1YnN0cmluZygwLCB0ZXJtaW5hdGlvbkNoYXJQb3MpKX1gLFxuICAgICAgICAgIGlkeCxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGlmIChpZHggPiBzdGFydElkeCkge1xuICAgICAgICByZXN1bHQgKz0gYFxcXFxuJHtfLnRyaW1TdGFydChhbGxMaW5lc1tpZHhdKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKHN0YXJ0Q2hhclBvcyArIDEpO1xuICAgICAgfVxuICAgICAgKytpZHg7XG4gICAgfVxuICAgIHJldHVybiBbcmVzdWx0LCBpZHhdO1xuICB9XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIGxldCBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICBsZXQgbGluZUluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVJbmRleCA8IGFsbExpbmVzLmxlbmd0aCkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gYWxsTGluZXNbbGluZUluZGV4XS50cmltKCk7XG4gICAgaWYgKF8uaXNFbXB0eSh0cmltbWVkTGluZSkpIHtcbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFsndHlwZScsICdQYWNrYWdlJ10uc29tZSgoeCkgPT4gdHJpbW1lZExpbmUuc3RhcnRzV2l0aCh4KSkpIHtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSBmYWxzZTtcbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSBmYWxzZTtcblxuICAgICAgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvc3RyaW5nXFwvKFxcUyspLy5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygncGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9wbHVyYWxzXFwvKFxcUyspLy5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICBpc0luUGx1cmFsR3JvdXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICArK2xpbmVJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCkge1xuICAgICAgaWYgKGlzSW5QbHVyYWxHcm91cCkge1xuICAgICAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnKCcpKSB7XG4gICAgICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSB0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApO1xuICAgICAgICAgICsrbGluZUluZGV4O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luQ3VycmVudENvbmZpZykge1xuICAgICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgICBsaW5lSW5kZXggPSBpZHg7XG4gICAgICAgICAgaWYgKF8uaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gW1xuICAgICAgICAgICAgICAuLi4oYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gfHwgW10pLFxuICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aChgKCR7Y29uZmlnTWFya2VyfSlgKSkge1xuICAgICAgICBjb25zdCBbY29udGVudCwgaWR4XSA9IGV4dHJhY3RDb250ZW50KGxpbmVJbmRleCk7XG4gICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgaWYgKF8uaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICArK2xpbmVJbmRleDtcbiAgfVxuICByZXR1cm4gYXBrU3RyaW5ncztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBjb25maWcgbWFya2VyLCB3aGljaCBpcyB0aGVuIHBhc3NlZCB0byBwYXJzZS4uIG1ldGhvZHNcbiAqIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIHJlc291cmNlIGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IGFhcHQoMikgdG9vbFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmZpZ3NHZXR0ZXIgVGhlIGZ1bmN0aW9uIHdob3NlIHJlc3VsdCBpcyBhIGxpc3RcbiAqIG9mIGFwayBjb25maWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzaXJlZE1hcmtlciBUaGUgZGVzaXJlZCBjb25maWcgbWFya2VyIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdE1hcmtlciBUaGUgZGVmYXVsdCBjb25maWcgbWFya2VyIHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZmlnIG1hcmtlclxuICovXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDb25maWdNYXJrZXIgKGNvbmZpZ3NHZXR0ZXIsIGRlc2lyZWRNYXJrZXIsIGRlZmF1bHRNYXJrZXIpIHtcbiAgbGV0IGNvbmZpZ01hcmtlciA9IGRlc2lyZWRNYXJrZXIgfHwgZGVmYXVsdE1hcmtlcjtcbiAgaWYgKGNvbmZpZ01hcmtlci5pbmNsdWRlcygnLScpICYmICFjb25maWdNYXJrZXIuaW5jbHVkZXMoJy1yJykpIHtcbiAgICBjb25maWdNYXJrZXIgPSBjb25maWdNYXJrZXIucmVwbGFjZSgnLScsICctcicpO1xuICB9XG4gIGNvbnN0IGNvbmZpZ3MgPSBhd2FpdCBjb25maWdzR2V0dGVyKCk7XG4gIGxvZy5kZWJ1ZyhgUmVzb3VyY2UgY29uZmlndXJhdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlncyl9YCk7XG4gIC8vIEFzc3VtZSB0aGUgJ2VuJyBjb25maWd1cmF0aW9uIGlzIHRoZSBkZWZhdWx0IG9uZVxuICBpZiAoY29uZmlnTWFya2VyLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnZW4nKVxuICAgICYmICFjb25maWdzLnNvbWUoKHgpID0+IHgudHJpbSgpID09PSBjb25maWdNYXJrZXIpKSB7XG4gICAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uIG5hbWUgJyR7Y29uZmlnTWFya2VyfScgaXMgdW5rbm93bi4gYCArXG4gICAgICBgUmVwbGFjaW5nIGl0IHdpdGggJyR7ZGVmYXVsdE1hcmtlcn0nYCk7XG4gICAgY29uZmlnTWFya2VyID0gZGVmYXVsdE1hcmtlcjtcbiAgfSBlbHNlIHtcbiAgICBsb2cuZGVidWcoYFNlbGVjdGVkIGNvbmZpZ3VyYXRpb246ICcke2NvbmZpZ01hcmtlcn0nYCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ01hcmtlcjtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG91dHB1dCBpbiBKU09OIGZvcm1hdCByZXRyaWV2ZWQgZnJvbVxuICogdGhlIGNvcnJlc3BvbmRpbmcgQXBwaXVtIFNldHRpbmdzIGJyb2FkY2FzdCBjYWxsc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmd9IGVudGl0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB3aGljaCBpc1xuICogZ29pbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcGFyc2VkIEpTT04gb2JqZWN0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG91dHB1dCBjYW5ub3QgYmUgcGFyc2VkXG4gKiBhcyBhIHZhbGlkIEpTT05cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uRGF0YSAob3V0cHV0LCBlbnRpdHlOYW1lKSB7XG4gIGlmICghL1xcYnJlc3VsdD0tMVxcYi8udGVzdChvdXRwdXQpIHx8ICEvXFxiZGF0YT1cIi8udGVzdChvdXRwdXQpKSB7XG4gICAgbG9nLmRlYnVnKG91dHB1dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgJHtlbnRpdHlOYW1lfSBmcm9tIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IC9cXGJkYXRhPShcIi4rKS8uZXhlYyhvdXRwdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKG91dHB1dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgJHtlbnRpdHlOYW1lfSBmcm9tIHRoZSBjb21tYW5kIG91dHB1dC4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IGpzb25TdHIgPSBfLnRyaW0obWF0Y2hbMV0pLnJlcGxhY2UoLyheXCIpfChcIiQpL2csICcnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1Zyhqc29uU3RyKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIHJlc3VsdGluZyBkYXRhIHN0cmluZy4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYWJicmV2aWF0aW9uc1xuICogdG8gQVZEIGFyZ3VtZW50cyBhcnJheVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgTGFuZ3VhZ2UgbmFtZSwgZm9yIGV4YW1wbGUgJ2ZyJ1xuICogQHBhcmFtIHs/c3RyaW5nfSBjb3VudHJ5IENvdW50cnkgbmFtZSwgZm9yIGV4YW1wbGUgJ0NBJ1xuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBnZW5lcmF0ZWQgYXJndW1lbnRzLiBUaGVcbiAqIHJlc3VsdGluZyBhcnJheSBtaWdodCBiZSBlbXB0eSBpZiBib3RoIGFyZ3VtZW50cyBhcmUgZW1wdHlcbiAqL1xuZnVuY3Rpb24gdG9BdmRMb2NhbGVBcmdzIChsYW5ndWFnZSwgY291bnRyeSkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGxhbmd1YWdlICYmIF8uaXNTdHJpbmcobGFuZ3VhZ2UpKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmxhbmd1YWdlPSR7bGFuZ3VhZ2UudG9Mb3dlckNhc2UoKX1gKTtcbiAgfVxuICBpZiAoY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmNvdW50cnk9JHtjb3VudHJ5LnRvVXBwZXJDYXNlKCl9YCk7XG4gIH1cbiAgbGV0IGxvY2FsZTtcbiAgaWYgKF8uaXNTdHJpbmcobGFuZ3VhZ2UpICYmIF8uaXNTdHJpbmcoY291bnRyeSkgJiYgbGFuZ3VhZ2UgJiYgY291bnRyeSkge1xuICAgIGxvY2FsZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCkgKyAnLScgKyBjb3VudHJ5LnRvVXBwZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAobGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSkpIHtcbiAgICBsb2NhbGUgPSBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKGNvdW50cnkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSkge1xuICAgIGxvY2FsZSA9IGNvdW50cnk7XG4gIH1cbiAgaWYgKGxvY2FsZSkge1xuICAgIHJlc3VsdC5wdXNoKCctcHJvcCcsIGBwZXJzaXN0LnN5cy5sb2NhbGU9JHtsb2NhbGV9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgQW5kcm9pZCBwcmVmZXJlbmNlcyByb290XG4gKlxuICogQHJldHVybnMgez9zdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gdGhlIGZvbGRlciBvciBgbnVsbGAgaWYgdGhlIGZvbGRlciBjYW5ub3QgYmUgZm91bmRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kcm9pZFByZWZzUm9vdCAoKSB7XG4gIGxldCBsb2NhdGlvbiA9IHByb2Nlc3MuZW52LkFORFJPSURfRU1VTEFUT1JfSE9NRTtcbiAgaWYgKGF3YWl0IGRpckV4aXN0cyhsb2NhdGlvbikpIHtcbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cblxuICBpZiAobG9jYXRpb24pIHtcbiAgICBsb2cud2FybihgVGhlIHZhbHVlIG9mIHRoZSBBTkRST0lEX0VNVUxBVE9SX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7bG9jYXRpb259JyBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCk7XG4gIH1cblxuICBjb25zdCBob21lID0gcHJvY2Vzcy5lbnYuSE9NRSB8fCBwcm9jZXNzLmVudi5VU0VSUFJPRklMRTtcbiAgaWYgKGhvbWUpIHtcbiAgICBsb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShob21lLCAnLmFuZHJvaWQnKTtcbiAgfVxuXG4gIGlmICghYXdhaXQgZGlyRXhpc3RzKGxvY2F0aW9uKSkge1xuICAgIGxvZy5kZWJ1ZyhgQW5kcm9pZCBjb25maWcgcm9vdCAnJHtsb2NhdGlvbn0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBsb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhdGggZXhpc3RzIG9uIHRoZSBmaWxlc3lzdGVtIGFuZCBpcyBhIGRpcmVjdG9yeVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbG9jYXRpb24gVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlyRXhpc3RzIChsb2NhdGlvbikge1xuICByZXR1cm4gbG9jYXRpb25cbiAgICAmJiBhd2FpdCBmcy5leGlzdHMobG9jYXRpb24pXG4gICAgJiYgKGF3YWl0IGZzLnN0YXQobG9jYXRpb24pKS5pc0RpcmVjdG9yeSgpO1xufVxuXG4vKipcbiAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuXG4gKiBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBwb3NzaWJsZSBpc3N1ZXMgd2l0aCBob3cgc3lzdGVtIGBzcGF3bmBcbiAqIGNhbGwgaGFuZGxlcyB0aGVtLlxuICogU2VlIGh0dHBzOi8vZGlzY3Vzcy5hcHBpdW0uaW8vdC9ob3ctdG8tbW9kaWZ5LXdkLXByb3h5LWFuZC11aWF1dG9tYXRvcjItc291cmNlLWNvZGUtdG8tc3VwcG9ydC11bmljb2RlLzMzNDY2XG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmcgTm9uLWVzY2FwZWQgYXJndW1lbnQgc3RyaW5nXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBhcmd1bWVudFxuICovXG5mdW5jdGlvbiBlc2NhcGVTaGVsbEFyZyAoYXJnKSB7XG4gIGFyZyA9IGAke2FyZ31gO1xuICBpZiAoc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgcmV0dXJuIC9bJnxeXFxzXS8udGVzdChhcmcpID8gYFwiJHthcmcucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImAgOiBhcmc7XG4gIH1cbiAgcmV0dXJuIGFyZy5yZXBsYWNlKC8mL2csICdcXFxcJicpO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbmFtZSBvZiBsYXVuY2hhYmxlIHBhY2thZ2UgYWN0aXZpdHlcbiAqIGZyb20gZHVtcHN5cyBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGR1bXBzeXMgdGhlIGFjdHVhbCBkdW1wc3lzIG91dHB1dFxuICogQHJldHVybnMge3N0cmluZ1tdfSBFaXRoZXIgdGhlIGZ1bGx5IHF1YWxpZmllZFxuICogYWN0aXZpdHkgbmFtZSBhcyBhIHNpbmdsZSBsaXN0IGl0ZW0gb3IgYW4gZW1wdHkgbGlzdCBpZiBub3RoaW5nIGNvdWxkIGJlIHBhcnNlZC5cbiAqIEluIEFuZHJvaWQgNiBhbmQgb2xkZXIgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGRldGVybWluZVxuICogdGhlIGNhdGVnb3J5IG5hbWUgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSwgc28gdGhpcyBBUEkganVzdFxuICogcmV0dXJucyBhbGwgYWN0aXZpdHkgbmFtZXMgYmVsb25naW5nIHRvICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTidcbiAqIHdpdGggdGhlIGV4cGVjdGF0aW9uIHRoYXQgdGhlIGFwcCBtYW5pZmVzdCBjb3VsZCBiZSBwYXJzZWQgbmV4dFxuICogaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGNhdGVnb3J5IG5hbWVzIGZvciB0aGVzZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyAoZHVtcHN5cykge1xuICBjb25zdCBtYWluQWN0aXZpdHlOYW1lUmUgPSBuZXcgUmVnRXhwKGBeXFxcXHMqJHtfLmVzY2FwZVJlZ0V4cChNQUlOX0FDVElPTil9OiRgKTtcbiAgY29uc3QgY2F0ZWdvcnlOYW1lUmUgPSAvXlxccypDYXRlZ29yeTpcXHMrXCIoW2EtekEtWjAtOS5fLy1dKylcIiQvO1xuICBjb25zdCBibG9ja3MgPSBbXTtcbiAgbGV0IGJsb2NrU3RhcnRJbmRlbnQ7XG4gIGxldCBibG9jayA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZHVtcHN5cy5zcGxpdCgnXFxuJykubWFwKF8udHJpbUVuZCkpIHtcbiAgICBjb25zdCBjdXJyZW50SW5kZW50ID0gbGluZS5sZW5ndGggLSBfLnRyaW1TdGFydChsaW5lKS5sZW5ndGg7XG4gICAgaWYgKG1haW5BY3Rpdml0eU5hbWVSZS50ZXN0KGxpbmUpKSB7XG4gICAgICBibG9ja1N0YXJ0SW5kZW50ID0gY3VycmVudEluZGVudDtcbiAgICAgIGlmICghXy5pc0VtcHR5KGJsb2NrKSkge1xuICAgICAgICBibG9ja3MucHVzaChibG9jayk7XG4gICAgICAgIGJsb2NrID0gW107XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKF8uaXNOaWwoYmxvY2tTdGFydEluZGVudCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50SW5kZW50ID4gYmxvY2tTdGFydEluZGVudCkge1xuICAgICAgYmxvY2sucHVzaChsaW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzRW1wdHkoYmxvY2spKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgYmxvY2sgPSBbXTtcbiAgICAgIH1cbiAgICAgIGJsb2NrU3RhcnRJbmRlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShibG9jaykpIHtcbiAgICBibG9ja3MucHVzaChibG9jayk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGJsb2Nrcykge1xuICAgIGxldCBoYXNDYXRlZ29yeSA9IGZhbHNlO1xuICAgIGxldCBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlbSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBjYXRlZ29yeU5hbWVSZS5leGVjKGxpbmUpO1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaGFzQ2F0ZWdvcnkgPSB0cnVlO1xuICAgICAgaXNMYXVuY2hlckNhdGVnb3J5ID0gbWF0Y2hbMV0gPT09IExBVU5DSEVSX0NBVEVHT1JZO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE9uIG9sZGVyIEFuZHJvaWQgdmVyc2lvbnMgdGhlIGNhdGVnb3J5IG5hbWVcbiAgICAvLyBtaWdodCBub3QgYmUgbGlzdGVkLCBzbyB3ZSBqdXN0IHRyeSB0byBmZXRjaFxuICAgIC8vIGFsbCBtYXRjaGVzIGluc3RlYWRcbiAgICBpZiAoaGFzQ2F0ZWdvcnkgJiYgIWlzTGF1bmNoZXJDYXRlZ29yeSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhY3Rpdml0eU5hbWVTdHIgb2YgaXRlbS5tYXAoXy50cmltKS5maWx0ZXIoQm9vbGVhbikpIHtcbiAgICAgIGNvbnN0IGZxQWN0aXZpdHlOYW1lID0gYWN0aXZpdHlOYW1lU3RyLnNwbGl0KC9cXHMrLylbMV07XG4gICAgICBpZiAoIW1hdGNoQ29tcG9uZW50TmFtZShmcUFjdGl2aXR5TmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xhdW5jaGVyQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmV0dXJuIFtmcUFjdGl2aXR5TmFtZV07XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChmcUFjdGl2aXR5TmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIGNvbXBvbmVudCBuYW1lXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzU3RyaW5nIFRoZSBzdHJpbmcgdG8gdmVyaWZ5XG4gKiBAcmV0dXJuIHs/QXJyYXk8TWF0Y2g+fSBUaGUgcmVzdWx0IG9mIFJlZ2V4cC5leGVjIG9wZXJhdGlvblxuICogb3IgX251bGxfIGlmIG5vIG1hdGNoZXMgYXJlIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIG1hdGNoQ29tcG9uZW50TmFtZSAoY2xhc3NTdHJpbmcpIHtcbiAgLy8gc29tZS5wYWNrYWdlL3NvbWUucGFja2FnZS5BY3Rpdml0eVxuICByZXR1cm4gL15bYS16MC05Li9fXSskL2kuZXhlYyhjbGFzc1N0cmluZyk7XG59XG5cbmV4cG9ydCB7XG4gIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgsIHVuemlwRmlsZSxcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldEphdmFGb3JPcywgaXNTaG93aW5nTG9ja3NjcmVlbiwgaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkLFxuICBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGlzU2NyZWVuT25GdWxseSwgYnVpbGRTdGFydENtZCwgZ2V0SmF2YUhvbWUsXG4gIGdldFNka1Rvb2xzVmVyc2lvbiwgZ2V0QXBrc2lnbmVyRm9yT3MsIGdldEJ1aWxkVG9vbHNEaXJzLFxuICBnZXRBcGthbmFseXplckZvck9zLCBnZXRPcGVuU3NsRm9yT3MsIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLCBBUEtTX0VYVEVOU0lPTixcbiAgQVBLX0lOU1RBTExfVElNRU9VVCwgQVBLU19JTlNUQUxMX1RJTUVPVVQsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS19FWFRFTlNJT04sXG4gIERFRkFVTFRfQURCX0VYRUNfVElNRU9VVCwgcGFyc2VNYW5pZmVzdCwgcGFyc2VBYXB0U3RyaW5ncywgcGFyc2VBYXB0MlN0cmluZ3MsXG4gIGZvcm1hdENvbmZpZ01hcmtlciwgcGFyc2VKc29uRGF0YSwgdW5zaWduQXBrLCB0b0F2ZExvY2FsZUFyZ3MsIHJlcXVpcmVTZGtSb290LFxuICBnZXRTZGtSb290RnJvbUVudiwgZ2V0QW5kcm9pZFByZWZzUm9vdCwgZGlyRXhpc3RzLCBlc2NhcGVTaGVsbEFyZyxcbiAgcGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcywgbWF0Y2hDb21wb25lbnROYW1l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
@@ -497,7 +497,22 @@ methods.setAirplaneMode = async function setAirplaneMode(on) {
497
497
  };
498
498
 
499
499
  methods.broadcastAirplaneMode = async function broadcastAirplaneMode(on) {
500
- await this.shell(['am', 'broadcast', '-a', 'android.intent.action.AIRPLANE_MODE', '--ez', 'state', on ? 'true' : 'false']);
500
+ const args = ['am', 'broadcast', '-a', 'android.intent.action.AIRPLANE_MODE', '--ez', 'state', on ? 'true' : 'false'];
501
+
502
+ try {
503
+ await this.shell(args);
504
+ } catch (e) {
505
+ if (_lodash.default.includes(e.stderr, 'SecurityException')) {
506
+ try {
507
+ await this.shell(args, {
508
+ privileged: true
509
+ });
510
+ return;
511
+ } catch (ign) {}
512
+ }
513
+
514
+ throw e;
515
+ }
501
516
  };
502
517
 
503
518
  methods.isWifiOn = async function isWifiOn() {
@@ -1143,4 +1158,4 @@ methods.addToDeviceIdleWhitelist = async function addToDeviceIdleWhitelist(...pa
1143
1158
 
1144
1159
  var _default = methods;
1145
1160
  exports.default = _default;
1146
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCIsIk5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IiLCJJR05PUkVEX1BFUk1fRVJST1JTIiwiTUFYX1BHUkVQX1BBVFRFUk5fTEVOIiwiSElEREVOX0FQSV9QT0xJQ1lfS0VZUyIsIlBJRF9DT0xVTU5fVElUTEUiLCJQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFIiwiUFNfVElUTEVfUEFUVEVSTiIsIlJlZ0V4cCIsIkFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTiIsIm1ldGhvZHMiLCJzaGVsbENodW5rcyIsImFyZ1RyYW5zZm9ybWVyIiwiYXJncyIsImNvbW1hbmRzIiwiY21kQ2h1bmsiLCJhcmciLCJuZXh0Q21kIiwiXyIsImlzQXJyYXkiLCJFcnJvciIsImxhc3QiLCJwdXNoIiwiam9pbiIsImxlbmd0aCIsImlzRW1wdHkiLCJsb2ciLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJsYXN0RXJyb3IiLCJjbWQiLCJzaGVsbCIsImUiLCJnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGgiLCJleGVjdXRhYmxlIiwicGF0aCIsImdldFNka0JpbmFyeVBhdGgiLCJhZGIiLCJpbml0QWFwdCIsImluaXRBYXB0MiIsImluaXRaaXBBbGlnbiIsImluaXRCdW5kbGV0b29sIiwiYmluYXJpZXMiLCJidW5kbGV0b29sIiwiZnMiLCJ3aGljaCIsImVyciIsImdldEFwaUxldmVsIiwiaXNJbnRlZ2VyIiwiX2FwaUxldmVsIiwic3RyT3V0cHV0IiwiZ2V0RGV2aWNlUHJvcGVydHkiLCJhcGlMZXZlbCIsInBhcnNlSW50IiwidHJpbSIsImNoYXJDb2RlUSIsImNoYXJDb2RlQXQiLCJhcGlMZXZlbERpZmYiLCJjb2RlbmFtZSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImdldFBsYXRmb3JtVmVyc2lvbiIsInRvTG93ZXJDYXNlIiwidG9VcHBlckNhc2UiLCJpc05hTiIsIm1lc3NhZ2UiLCJpbmZvIiwiaXNEZXZpY2VDb25uZWN0ZWQiLCJkZXZpY2VzIiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsIm1rZGlyIiwicmVtb3RlUGF0aCIsImlzVmFsaWRDbGFzcyIsImNsYXNzU3RyaW5nIiwibWF0Y2hDb21wb25lbnROYW1lIiwicmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSIsInBrZyIsIm9wdHMiLCJwcmVmZXJDbWQiLCJzdGRvdXQiLCJuYW1lcyIsInBhcnNlTGF1bmNoYWJsZUFjdGl2aXR5TmFtZXMiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ0bXBBcHAiLCJwdWxsQXBrIiwiYXBrQWN0aXZpdHkiLCJwYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QiLCJzdGFjayIsIndhcm4iLCJyaW1yYWYiLCJzdGRlcnIiLCJvdXRwdXRGb3JtYXQiLCJFWEVDX09VVFBVVF9GT1JNQVQiLCJGVUxMIiwibGluZSIsInNwbGl0IiwibWFwIiwiZm9yY2VTdG9wIiwia2lsbFBhY2thZ2UiLCJjbGVhciIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJhcGsiLCJ0YXJnZXRTZGsiLCJkdW1wc3lzT3V0cHV0IiwidGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHIiwidGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0IiwiZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMiLCJnZXREZW5pZWRQZXJtaXNzaW9ucyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiZ2V0U2V0dGluZyIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImdldElNRUxpc3RGcm9tT3V0cHV0IiwiZW5hYmxlZElNRXMiLCJlbmFibGVJTUUiLCJpbWVJZCIsImRpc2FibGVJTUUiLCJzZXRJTUUiLCJkZWZhdWx0SU1FIiwiZW5naW5lIiwia2V5ZXZlbnQiLCJrZXljb2RlIiwiY29kZSIsImlucHV0VGV4dCIsInRleHQiLCJvcmlnaW5hbFN0ciIsImVzY2FwZWRUZXh0IiwicmVwbGFjZSIsImV2ZXJ5IiwiYyIsImluY2x1ZGVzIiwicSIsImNsZWFyVGV4dEZpZWxkIiwiaSIsImxvY2siLCJpc1NjcmVlbkxvY2tlZCIsInRpbWVvdXRNcyIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiYmFjayIsImdvVG9Ib21lIiwiZ2V0QWRiUGF0aCIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U3VyZmFjZU9yaWVudGF0aW9uIiwic2VuZFRlbG5ldENvbW1hbmQiLCJjb21tYW5kIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwicG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImlzQWlycGxhbmVNb2RlT24iLCJzZXRBaXJwbGFuZU1vZGUiLCJvbiIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJsb2NhbFBhdGgiLCJwb3NpeCIsImRpcm5hbWUiLCJhZGJFeGVjIiwicHVsbCIsInRpbWVvdXQiLCJwcm9jZXNzRXhpc3RzIiwicHJvY2Vzc05hbWUiLCJnZXRQSURzQnlOYW1lIiwiZ2V0Rm9yd2FyZExpc3QiLCJjb25uZWN0aW9ucyIsIkVPTCIsImZvcndhcmRQb3J0Iiwic3lzdGVtUG9ydCIsImRldmljZVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImdldFJldmVyc2VMaXN0IiwicmV2ZXJzZVBvcnQiLCJyZW1vdmVQb3J0UmV2ZXJzZSIsImZvcndhcmRBYnN0cmFjdFBvcnQiLCJwaW5nIiwiaW5kZXhPZiIsInJlc3RhcnQiLCJzdG9wTG9nY2F0IiwicmVzdGFydEFkYiIsIndhaXRGb3JEZXZpY2UiLCJzdGFydExvZ2NhdCIsIl9sb2djYXRTdGFydHVwUGFyYW1zIiwibG9nY2F0IiwiTG9nY2F0IiwiZGVidWdUcmFjZSIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ2NhdExvZ3MiLCJnZXRMb2dzIiwic2V0TG9nY2F0TGlzdGVuZXIiLCJsaXN0ZW5lciIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJsaXN0UHJvY2Vzc1N0YXR1cyIsImlzQm9vbGVhbiIsIl9kb2VzUHNTdXBwb3J0QU9wdGlvbiIsImdldE5hbWVCeVBpZCIsInBpZCIsInRpdGxlTWF0Y2giLCJleGVjIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwicHJpdmlsZWdlZCIsImUxIiwiYnJvYWRjYXN0UHJvY2Vzc0VuZCIsImludGVudCIsImJyb2FkY2FzdCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsInNsZWVwIiwiZW5kQW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudFByb2MiLCJpc1J1bm5pbmciLCJzdG9wIiwiaW5zdHJ1bWVudCIsImFjdGl2aXR5IiwiaW5zdHJ1bWVudFdpdGgiLCJwa2dBY3Rpdml0eSIsImFuZHJvaWRDb3ZlcmFnZSIsImluc3RydW1lbnRDbGFzcyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJyZXNvbHZlIiwicmVqZWN0IiwiZGVmYXVsdEFyZ3MiLCJjb25jYXQiLCJTdWJQcm9jZXNzIiwid2FpdEZvckFjdGl2aXR5IiwicHJvcGVydHkiLCJ2YWwiLCJzZXREZXZpY2VQcm9wZXJ0eSIsInByb3AiLCJnZXREZXZpY2VTeXNMYW5ndWFnZSIsImdldERldmljZVN5c0NvdW50cnkiLCJnZXREZXZpY2VTeXNMb2NhbGUiLCJnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UiLCJnZXREZXZpY2VQcm9kdWN0Q291bnRyeSIsImdldERldmljZVByb2R1Y3RMb2NhbGUiLCJnZXRNb2RlbCIsImdldE1hbnVmYWN0dXJlciIsImdldFNjcmVlblNpemUiLCJzaXplIiwiZ2V0U2NyZWVuRGVuc2l0eSIsImRlbnNpdHkiLCJkZW5zaXR5TnVtYmVyIiwic2V0SHR0cFByb3h5IiwicHJveHlIb3N0IiwicHJveHlQb3J0IiwicHJveHkiLCJpc1VuZGVmaW5lZCIsImh0dHBQcm94eVNldHRpbnMiLCJzZXR0aW5nS2V5Iiwic2V0dGluZ1ZhbHVlIiwiZGVsZXRlSHR0cFByb3h5IiwibmFtZXNwYWNlIiwiYnVncmVwb3J0Iiwic2NyZWVucmVjb3JkIiwiZGVzdGluYXRpb24iLCJvcHRpb25zIiwidmlkZW9TaXplIiwiYml0UmF0ZSIsInRpbWVMaW1pdCIsImJ1Z1JlcG9ydCIsImZ1bGxDbWQiLCJxdW90ZSIsInJ1bkluSW1lQ29udGV4dCIsImltZSIsImZuIiwib3JpZ2luYWxJbWUiLCJkZWxheSIsImdldFRpbWVab25lIiwibGlzdEZlYXR1cmVzIiwiX21lbW9pemVkRmVhdHVyZXMiLCJtZW1vaXplIiwiY3VyRGV2aWNlSWQiLCJpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCIsInByb3RvIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJfaGVscE91dHB1dCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiYmluYXJ5IiwiZ2V0VmVyc2lvbiIsImNvbXBhcmVWZXJzaW9ucyIsInZlcnNpb24iLCJnZXREZXZpY2VJZGxlV2hpdGVsaXN0Iiwib3V0cHV0IiwiYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0IiwicGFja2FnZXMiLCJwbHVyYWxpemUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvYWRiLWNvbW1hbmRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldElNRUxpc3RGcm9tT3V0cHV0LCBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLFxuICBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzLCBtYXRjaENvbXBvbmVudE5hbWUsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHRlbXBEaXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IExvZ2NhdCBmcm9tICcuLi9sb2djYXQnO1xuaW1wb3J0IHsgc2xlZXAsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEggPSAxMDAwO1xuY29uc3QgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiA9IC9ub3QgYSBjaGFuZ2VhYmxlIHBlcm1pc3Npb24gdHlwZS9pO1xuY29uc3QgSUdOT1JFRF9QRVJNX0VSUk9SUyA9IFtcbiAgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUixcbiAgL1Vua25vd24gcGVybWlzc2lvbi9pLFxuXTtcbmNvbnN0IE1BWF9QR1JFUF9QQVRURVJOX0xFTiA9IDE1O1xuY29uc3QgSElEREVOX0FQSV9QT0xJQ1lfS0VZUyA9IFtcbiAgJ2hpZGRlbl9hcGlfcG9saWN5X3ByZV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3lfcF9hcHBzJyxcbiAgJ2hpZGRlbl9hcGlfcG9saWN5J1xuXTtcbmNvbnN0IFBJRF9DT0xVTU5fVElUTEUgPSAnUElEJztcbmNvbnN0IFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUgPSAnTkFNRSc7XG5jb25zdCBQU19USVRMRV9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtQSURfQ09MVU1OX1RJVExFfVxcXFxiLipcXFxcYiR7UFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRX1cXFxcYi4qKSRgLCAnbScpO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU3OTE0MjMvYWRiLXNoZWxsLWlucHV0LXRleHQtZG9lcy1ub3QtdGFrZS1hbXBlcnNhbmQtY2hhcmFjdGVyLzI1NzkxNDk4XG5jb25zdCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4gPSAvWygpPD58OyYqXFxcXH5eXCInXS9nO1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBjaHVua3MgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGV4ZWN1dGVzIHRoZW0gaW4gYGFkYiBzaGVsbGAuXG4gKiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYGFkYiBzaGVsbGAgc2VwYXJhdGVseSBmb3IgZWFjaCBhcmcsIGhvd2V2ZXJcbiAqIHRoZXJlIGlzIGEgbGltaXQgZm9yIGEgbWF4aW11bSBsZW5ndGggb2YgYSBzaW5nbGUgYWRiIGNvbW1hbmQuIHRoYXQgaXMgd2h5XG4gKiB3ZSBuZWVkIGFsbCB0aGlzIGNvbXBsaWNhdGVkIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFyZ1RyYW5zZm9ybWVyIEEgZnVuY3Rpb24sIHRoYXQgcmVjZWl2ZXMgc2luZ2xlIGFyZ3VtZW50XG4gKiBmcm9tIHRoZSBgYXJnc2AgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHNoZWxsIGNvbW1hbmQuIFRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGFuIGFycmF5LCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBwYXJ0IG9mIGEgc2luZ2xlIGNvbW1hbmQuXG4gKiBUaGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSBjb3VsZCBiZSAnOycuIElmIHRoaXMgaXMgbm90IGEgc2VtaWNvbG9uIHRoZW4gaXQgaXMgZ29pbmcgdG9cbiAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcnxzdHJpbmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcyB0byBjcmVhdGUgY2h1bmtzIGZvclxuICogQHRocm93cyB7RXJyb3J9IElmIGFueSBvZiB0aGUgY2h1bmtzIHJldHVybnMgbm9uLXplcm8gZXhpdCBjb2RlIGFmdGVyIGJlaW5nIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuc2hlbGxDaHVua3MgPSBhc3luYyBmdW5jdGlvbiBzaGVsbENodW5rcyAoYXJnVHJhbnNmb3JtZXIsIGFyZ3MpIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgbGV0IGNtZENodW5rID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBjb25zdCBuZXh0Q21kID0gYXJnVHJhbnNmb3JtZXIoYXJnKTtcbiAgICBpZiAoIV8uaXNBcnJheShuZXh0Q21kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0cmFuc2Zvcm1lciBtdXN0IHJlc3VsdCBpbiBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoXy5sYXN0KG5leHRDbWQpICE9PSAnOycpIHtcbiAgICAgIG5leHRDbWQucHVzaCgnOycpO1xuICAgIH1cbiAgICBpZiAobmV4dENtZC5qb2luKCcgJykubGVuZ3RoICsgY21kQ2h1bmsuam9pbignICcpLmxlbmd0aCA+PSBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCkge1xuICAgICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gICAgICBjbWRDaHVuayA9IFtdO1xuICAgIH1cbiAgICBjbWRDaHVuayA9IFsuLi5jbWRDaHVuaywgLi4ubmV4dENtZF07XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoY21kQ2h1bmspKSB7XG4gICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gIH1cbiAgbG9nLmRlYnVnKGBHb3QgdGhlIGZvbGxvd2luZyBjb21tYW5kIGNodW5rcyB0byBleGVjdXRlOiAke0pTT04uc3RyaW5naWZ5KGNvbW1hbmRzKX1gKTtcbiAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gIGZvciAoY29uc3QgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoY21kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdEVycm9yKSB7XG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byBhZGIgZXhlY3V0YWJsZSBhbWQgYXNzaWduIGl0XG4gKiB0byB0aGlzLmV4ZWN1dGFibGUucGF0aCBhbmQgdGhpcy5iaW5hcmllcy5hZGIgcHJvcGVydGllcy5cbiAqXG4gKiBAcmV0dXJuIHtBREJ9IEFEQiBpbnN0YW5jZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggPSBhc3luYyBmdW5jdGlvbiBnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggKCkge1xuICB0aGlzLmV4ZWN1dGFibGUucGF0aCA9IGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWRiJyk7XG4gIHJldHVybiB0aGlzLmFkYjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdCB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0ID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQnKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdDIgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQyIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQyID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQyICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0MicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byB6aXBhbGlnbiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuemlwYWxpZ24gcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0WmlwQWxpZ24gPSBhc3luYyBmdW5jdGlvbiBpbml0WmlwQWxpZ24gKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ3ppcGFsaWduJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGJ1bmRsZXRvb2wgYmluYXJ5IGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRCdW5kbGV0b29sID0gYXN5bmMgZnVuY3Rpb24gaW5pdEJ1bmRsZXRvb2wgKCkge1xuICB0cnkge1xuICAgIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCA9IGF3YWl0IGZzLndoaWNoKCdidW5kbGV0b29sLmphcicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1bmRsZXRvb2wuamFyIGJpbmFyeSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIFBBVEguICcgK1xuICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbCBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEFQSSBsZXZlbCBhcyBpbnRlZ2VyIG51bWJlciwgZm9yIGV4YW1wbGUgMjEgZm9yXG4gKiAgICAgICAgICAgICAgICAgIEFuZHJvaWQgTG9sbGlwb3AuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FjaGVkLCBzbyBhbGwgdGhlIGZ1cnRoZXJcbiAqIGNhbGxzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgZmlyc3Qgb25lLlxuICovXG5tZXRob2RzLmdldEFwaUxldmVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBpTGV2ZWwgKCkge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHRoaXMuX2FwaUxldmVsKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJPdXRwdXQgPSBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnNkaycpO1xuICAgICAgbGV0IGFwaUxldmVsID0gcGFyc2VJbnQoc3RyT3V0cHV0LnRyaW0oKSwgMTApO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBwcmV2aWV3L2JldGEgcGxhdGZvcm0gQVBJIGxldmVsXG4gICAgICBjb25zdCBjaGFyQ29kZVEgPSAncScuY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIDI4IGlzIHRoZSBmaXJzdCBBUEkgTGV2ZWwsIHdoZXJlIEFuZHJvaWQgU0RLIHN0YXJ0ZWQgcmV0dXJuaW5nIGxldHRlcnMgaW4gcmVzcG9uc2UgdG8gZ2V0UGxhdGZvcm1WZXJzaW9uXG4gICAgICBjb25zdCBhcGlMZXZlbERpZmYgPSBhcGlMZXZlbCAtIDI4O1xuICAgICAgY29uc3QgY29kZW5hbWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlUSArIGFwaUxldmVsRGlmZik7XG4gICAgICBpZiAoYXBpTGV2ZWxEaWZmID49IDAgJiYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkpLnRvTG93ZXJDYXNlKCkgPT09IGNvZGVuYW1lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVsZWFzZSB2ZXJzaW9uIGlzICR7Y29kZW5hbWUudG9VcHBlckNhc2UoKX0gYnV0IGZvdW5kIEFQSSBMZXZlbCAke2FwaUxldmVsfS4gU2V0dGluZyBBUEkgTGV2ZWwgdG8gJHthcGlMZXZlbCArIDF9YCk7XG4gICAgICAgIGFwaUxldmVsKys7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FwaUxldmVsID0gYXBpTGV2ZWw7XG4gICAgICBsb2cuZGVidWcoYERldmljZSBBUEkgbGV2ZWw6ICR7dGhpcy5fYXBpTGV2ZWx9YCk7XG4gICAgICBpZiAoaXNOYU4odGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFjdHVhbCBvdXRwdXQgJyR7c3RyT3V0cHV0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBBUEkgbGV2ZWwuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FwaUxldmVsO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBhcyBhIHN0cmluZywgZm9yIGV4YW1wbGUgJzUuMCcgZm9yXG4gKiBBbmRyb2lkIExvbGxpcG9wLlxuICovXG5tZXRob2RzLmdldFBsYXRmb3JtVmVyc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbiAoKSB7XG4gIGxvZy5pbmZvKCdHZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYSBkZXZpY2UgaXMgY29ubmVjdGVkLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBpcyB2aXNpYmxlIHRvIGFkYi5cbiAqL1xubWV0aG9kcy5pc0RldmljZUNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzRGV2aWNlQ29ubmVjdGVkICgpIHtcbiAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgcmV0dXJuIGRldmljZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY3JlYXRlIGEgbmV3IGZvbGRlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgbmV3IHBhdGggdG8gYmUgY3JlYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gbWtkaXIgY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMubWtkaXIgPSBhc3luYyBmdW5jdGlvbiBta2RpciAocmVtb3RlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYVxuICogdmFsaWQgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgLSBUaGUgYWN0dWFsIGNsYXNzIG5hbWUgdG8gYmUgdmVyaWZpZWQuXG4gKiBAcmV0dXJuIHs/QXJyYXkuPE1hdGNoPn0gVGhlIHJlc3VsdCBvZiBSZWdleHAuZXhlYyBvcGVyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmQuXG4gKi9cbm1ldGhvZHMuaXNWYWxpZENsYXNzID0gZnVuY3Rpb24gaXNWYWxpZENsYXNzIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiBtYXRjaENvbXBvbmVudE5hbWUoY2xhc3NTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXNvbHZlQWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBwcmVmZXJDbWQgW3RydWVdIFdoZXRoZXIgdG8gcHJlZmVyIGBjbWRgIHRvb2wgdXNhZ2UgZm9yXG4gKiBsYXVuY2hhYmxlIGFjdGl2aXR5IG5hbWUgZGV0ZWN0aW9uLiBJdCBtaWdodCBiZSB1c2VmdWwgdG8gZGlzYWJsZSBpdCBpZlxuICogYGNtZCBwYWNrYWdlIHJlc29sdmUtYWN0aXZpdHlgIHJldHVybnMgJ2FuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJlc29sdmVyQWN0aXZpdHknLFxuICogd2hpY2ggbWVhbnMgdGhlIGFwcCBoYXMgbm8gZGVmYXVsdCBoYW5kbGVyIHNldCBpbiBzeXN0ZW0gc2V0dGluZ3MuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3MTI4IGZvciBtb3JlIGRldGFpbHMuXG4gKiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIHRoZSB0YXJnZXQgQW5kcm9pZCB2ZXJzaW9uIGlzIGJlbG93IDI0IGFzIHRoZXJlXG4gKiB0aGUgY29ycmVzcG9uZGluZyBgY21kYCBzdWJjb21tYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBhbmQgZHVtcHN5cyB1c2FnZSBpcyB0aGUgb25seVxuICogcG9zc2libGUgd2F5IHRvIGRldGVjdCB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBuYW1lLlxuICovXG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgZm9yIHRoZVxuICogZ2l2ZW4gcGFja2FnZS4gSXQgaXMgZXhwZWN0ZWQgdGhlIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQgb25cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHRhcmdldCBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7UmVzb2x2ZUFjdGl2aXR5T3B0aW9ucz99IG9wdHNcbiAqIEByZXR1cm4ge3N0cmluZ30gRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHlcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVzb2x2aW5nIHRoZSBhY3Rpdml0eSBuYW1lXG4gKi9cbm1ldGhvZHMucmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkgKHBrZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcHJlZmVyQ21kID0gdHJ1ZSB9ID0gb3B0cztcbiAgaWYgKCFwcmVmZXJDbWQgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjQpIHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgbmFtZXMgPSBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzKHN0ZG91dCk7XG4gICAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBvZiAnJHtwa2d9Jy4gSXMgaXQgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2U/YCk7XG4gICAgfVxuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9XG5cbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRtcEFwcCA9IGF3YWl0IHRoaXMucHVsbEFwayhwa2csIHRtcFJvb3QpO1xuICAgICAgY29uc3Qge2Fwa0FjdGl2aXR5fSA9IGF3YWl0IHRoaXMucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0KHRtcEFwcCk7XG4gICAgICByZXR1cm4gYXBrQWN0aXZpdHk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBgICtcbiAgICAgICAgYFRoZSB2ZXJ5IGZpcnN0IG1hdGNoIG9mIHRoZSBkdW1wc3lzIG91dHB1dCBpcyBnb2luZyB0byBiZSB1c2VkLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2NtZCcsICdwYWNrYWdlJywgJ3Jlc29sdmUtYWN0aXZpdHknLCAnLS1icmllZicsIHBrZ10sIHtcbiAgICBvdXRwdXRGb3JtYXQ6IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULkZVTExcbiAgfSk7XG4gIGZvciAoY29uc3QgbGluZSBvZiAoc3Rkb3V0IHx8ICcnKS5zcGxpdCgnXFxuJykubWFwKF8udHJpbSkpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkQ2xhc3MobGluZSkpIHtcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnIgfHwgc3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBGb3JjZSBhcHBsaWNhdGlvbiB0byBzdG9wIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmZvcmNlU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIGZvcmNlU3RvcCAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnZm9yY2Utc3RvcCcsIHBrZ10pO1xufTtcblxuLypcbiAqIEtpbGwgYXBwbGljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmtpbGxQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24ga2lsbFBhY2thZ2UgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2tpbGwnLCBwa2ddKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIHVzZXIgZGF0YSBvZiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIGNsZWFyZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnY2xlYXInLCBwa2ddKTtcbn07XG5cbi8qKlxuICogR3JhbnQgYWxsIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBieSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgb24gQW5kcm9pZCA2LjArIGFuZCBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IHN1cHBvcnQgY29tcG9uZW50cy1iYXNlZCBwZXJtaXNzaW9ucyBzZXR0aW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgcGF0aCB0byB0aGUgYWN0dWFsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBncmFudGluZyBwZXJtaXNzaW9uc1xuICovXG5tZXRob2RzLmdyYW50QWxsUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudEFsbFBlcm1pc3Npb25zIChwa2csIGFwaykge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IHRhcmdldFNkayA9IDA7XG4gIGxldCBkdW1wc3lzT3V0cHV0ID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwaykge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiBhcGsgbm90IHByb3ZpZGVkLCBjb25zaWRlcmluZyBhcGsgYWxyZWFkeSBpbnN0YWxsZWQgb24gdGhlIGRldmljZVxuICAgICAgICogYW5kIGZldGNoaW5nIHRhcmdldFNkayB1c2luZyBwYWNrYWdlIG5hbWUuXG4gICAgICAgKi9cbiAgICAgIGR1bXBzeXNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Gcm9tTWFuaWZlc3QoYXBrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvL2F2b2lkaW5nIGxvZ2dpbmcgZXJyb3Igc3RhY2ssIGFzIGNhbGxpbmcgbGlicmFyeSBmdW5jdGlvbiB3b3VsZCBoYXZlIGxvZ2dlZFxuICAgIGxvZy53YXJuKGBSYW4gaW50byBwcm9ibGVtIGdldHRpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uOyBpZ25vcmluZy4uLmApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA+PSAyMyAmJiB0YXJnZXRTZGsgPj0gMjMpIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCA2LjAoQVBJIDIzKSBvciBoaWdoZXIsIGFuZCB5b3VyIGFwcCdzIHRhcmdldCBTREsgaXMgMjMgb3IgaGlnaGVyOlxuICAgICAqIFRoZSBhcHAgaGFzIHRvIGxpc3QgdGhlIHBlcm1pc3Npb25zIGluIHRoZSBtYW5pZmVzdC5cbiAgICAgKiByZWZlcjogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvcGVybWlzc2lvbnMvcmVxdWVzdGluZy5odG1sXG4gICAgICovXG4gICAgZHVtcHN5c091dHB1dCA9IGR1bXBzeXNPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IHJlcXVlc3RlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRSZXFQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnNUb0dyYW50ID0gXy5kaWZmZXJlbmNlKHJlcXVlc3RlZFBlcm1pc3Npb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnNUb0dyYW50KSkge1xuICAgICAgbG9nLmluZm8oYCR7cGtnfSBjb250YWlucyBubyBwZXJtaXNzaW9ucyBhdmFpbGFibGUgZm9yIGdyYW50aW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ3JhbnRQZXJtaXNzaW9ucyhwa2csIHBlcm1pc3Npb25zVG9HcmFudCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IG11bHRpcGxlIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBjYWxsIGlzIG1vcmUgcGVyZm9ybWFudCB0aGFuIGBncmFudFBlcm1pc3Npb25gIG9uZSwgc2luY2UgaXQgY29tYmluZXNcbiAqIG11bHRpcGxlIGBhZGIgc2hlbGxgIGNhbGxzIGludG8gYSBzaW5nbGUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbnMgKHBrZywgcGVybWlzc2lvbnMpIHtcbiAgLy8gQXMgaXQgY29uc3VtZXMgbW9yZSB0aW1lIGZvciBncmFudGluZyBlYWNoIHBlcm1pc3Npb24sXG4gIC8vIHRyeWluZyB0byBncmFudCBhbGwgcGVybWlzc2lvbiBieSBmb3JtaW5nIGVxdWl2YWxlbnQgY29tbWFuZC5cbiAgLy8gQWxzbywgaXQgaXMgbmVjZXNzYXJ5IHRvIHNwbGl0IGxvbmcgY29tbWFuZHMgaW50byBjaHVua3MsIHNpbmNlIHRoZSBtYXhpbXVtIGxlbmd0aCBvZlxuICAvLyBhZGIgc2hlbGwgYnVmZmVyIGlzIGxpbWl0ZWRcbiAgbG9nLmRlYnVnKGBHcmFudGluZyBwZXJtaXNzaW9ucyAke0pTT04uc3RyaW5naWZ5KHBlcm1pc3Npb25zKX0gdG8gJyR7cGtnfSdgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwZXJtKSA9PiBbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtXSwgcGVybWlzc2lvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFJR05PUkVEX1BFUk1fRVJST1JTLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgc2luZ2xlIHBlcm1pc3Npb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXZva2Ugc2luZ2xlIHBlcm1pc3Npb24gZnJvbSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSByZXZva2VkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5yZXZva2VQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gcmV2b2tlUGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ3Jldm9rZScsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0R3JhbnRlZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldERlbmllZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGVuaWVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZGVuaWVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIGZhbHNlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0UmVxUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXFQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyByZXF1ZXN0ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydyZXF1ZXN0ZWQnXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGxvY2F0aW9uIHByb3ZpZGVycyBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBhdmFpbGFibGUgbG9jYXRpb24gcHJvdmlkZXJzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TG9jYXRpb25Qcm92aWRlcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvblByb3ZpZGVycyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcpO1xuICByZXR1cm4gc3Rkb3V0LnRyaW0oKS5zcGxpdCgnLCcpXG4gICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBzdGF0ZSBvZiBHUFMgbG9jYXRpb24gcHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0byBlbmFibGUgKHRydWUpIG9yIGRpc2FibGUgKGZhbHNlKSB0aGUgR1BTIHByb3ZpZGVyLlxuICovXG5tZXRob2RzLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIChlbmFibGVkKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJywgYCR7ZW5hYmxlZCA/ICcrJyA6ICctJ31ncHNgKTtcbn07XG5cbi8qKlxuICogU2V0IGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhY2Nlc3MgdG8gbm9uLVNESyBBUElzLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIFRoZSBBUEkgZW5mb3JjZW1lbnQgcG9saWN5LlxuICogICAgIEZvciBBbmRyb2lkIFBcbiAqICAgICAwOiBEaXNhYmxlIG5vbi1TREsgQVBJIHVzYWdlIGRldGVjdGlvbi4gVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBsb2dnaW5nLCBhbmQgYWxzbyBicmVhayB0aGUgc3RyaWN0IG1vZGUgQVBJLFxuICogICAgICAgIGRldGVjdE5vblNka0FwaVVzYWdlKCkuIE5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBcIkp1c3Qgd2FyblwiIC0gcGVybWl0IGFjY2VzcyB0byBhbGwgbm9uLVNESyBBUElzLCBidXQga2VlcCB3YXJuaW5ncyBpbiB0aGUgbG9nLlxuICogICAgICAgIFRoZSBzdHJpY3QgbW9kZSBBUEkgd2lsbCBrZWVwIHdvcmtpbmcuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGFuZCBibGFjayBsaXN0ZWQgQVBJcy5cbiAqICAgICAzOiBEaXNhbGxvdyB1c2FnZSBvZiBibGFja2xpc3RlZCBBUElzLCBidXQgYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGxpc3RlZCBBUElzLlxuICpcbiAqICAgICBGb3IgQW5kcm9pZCBRXG4gKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9ub24tc2RrLXEjZW5hYmxlLW5vbi1zZGstYWNjZXNzXG4gKiAgICAgMDogRGlzYWJsZSBhbGwgZGV0ZWN0aW9uIG9mIG5vbi1TREsgaW50ZXJmYWNlcy4gVXNpbmcgdGhpcyBzZXR0aW5nIGRpc2FibGVzIGFsbCBsb2cgbWVzc2FnZXMgZm9yIG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlXG4gKiAgICAgICAgYW5kIHByZXZlbnRzIHlvdSBmcm9tIHRlc3RpbmcgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLiBUaGlzIHNldHRpbmcgaXMgbm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IEVuYWJsZSBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgaW50ZXJmYWNlcywgYnV0IHByaW50IGxvZyBtZXNzYWdlcyB3aXRoIHdhcm5pbmdzIGZvciBhbnkgbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2UuXG4gKiAgICAgICAgVXNpbmcgdGhpcyBzZXR0aW5nIGFsc28gYWxsb3dzIHlvdSB0byB0ZXN0IHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBub24tU0RLIGludGVyZmFjZXMgdGhhdCBiZWxvbmcgdG8gZWl0aGVyIHRoZSBibGFjayBsaXN0XG4gKiAgICAgICAgb3IgdG8gYSByZXN0cmljdGVkIGdyZXlsaXN0IGZvciB5b3VyIHRhcmdldCBBUEkgbGV2ZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SGlkZGVuQXBpUG9saWN5ICh2YWx1ZSwgaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBwdXQgZ2xvYmFsICR7a30gJHt2YWx1ZX1gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBzZXQgc2V0dGluZyBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9JyB0byAnJHt2YWx1ZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXQgYWNjZXNzIHRvIG5vbi1TREsgQVBJcyB0byBpdHMgZGVmYXVsdCBzZXR0aW5nLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgKGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCAke2t9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gZGVsZXRlIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RvcCB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIGNsZWFycyBpdHMgYXBwbGljYXRpb24gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKi9cbm1ldGhvZHMuc3RvcEFuZENsZWFyID0gYXN5bmMgZnVuY3Rpb24gc3RvcEFuZENsZWFyIChwa2cpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIGF3YWl0IHRoaXMuY2xlYXIocGtnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0b3AgYW5kIGNsZWFyICR7cGtnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5hdmFpbGFibGVJTUVzID0gYXN5bmMgZnVuY3Rpb24gYXZhaWxhYmxlSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCcsICctYSddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYXZhaWxhYmxlIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZW5hYmxlZCBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBlbmFibGVkIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmVuYWJsZWRJTUVzID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlZElNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGVuYWJsZWQgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmFibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5lbmFibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZW5hYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmRpc2FibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBkaXNhYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2Rpc2FibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5zZXRJTUUgPSBhc3luYyBmdW5jdGlvbiBzZXRJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnc2V0JywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kXG4gKi9cbm1ldGhvZHMuZGVmYXVsdElNRSA9IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJTUUgKCkge1xuICB0cnkge1xuICAgIGxldCBlbmdpbmUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdkZWZhdWx0X2lucHV0X21ldGhvZCcpO1xuICAgIGlmIChlbmdpbmUgPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbmdpbmUudHJpbSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRlZmF1bHQgSU1FLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGtleWNvZGUgLSBUaGUgYWN0dWFsIGtleSBjb2RlIHRvIGJlIHNlbnQuXG4gKi9cbm1ldGhvZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiBrZXlldmVudCAoa2V5Y29kZSkge1xuICAvLyBrZXljb2RlIG11c3QgYmUgYW4gaW50LlxuICBsZXQgY29kZSA9IHBhcnNlSW50KGtleWNvZGUsIDEwKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgY29kZV0pO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIHRleHQgb3IgYSBudW1iZXIgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIHRleHQgZ2V0cyBwcm9wZXJseSBlc2NhcGVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gQURCLlxuICogTm9vcCBpZiB0aGUgdGV4dCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHRleHQgLSBUaGUgYWN0dWFsIHRleHQgdG8gYmUgc2VudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nXG4gKi9cbm1ldGhvZHMuaW5wdXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gaW5wdXRUZXh0ICh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsU3RyID0gYCR7dGV4dH1gO1xuICBjb25zdCBlc2NhcGVkVGV4dCA9IG9yaWdpbmFsU3RyLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKS5yZXBsYWNlKC8gL2csICclcycpO1xuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAndGV4dCcsIG9yaWdpbmFsU3RyXTtcbiAgaWYgKGVzY2FwZWRUZXh0ICE9PSBvcmlnaW5hbFN0ciB8fCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4udGVzdChvcmlnaW5hbFN0cikpIHtcbiAgICBpZiAoXy5ldmVyeShbJ1wiJywgYCdgXSwgKGMpID0+IG9yaWdpbmFsU3RyLmluY2x1ZGVzKGMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBrbm93IGhvdyB0byBlc2NhcGUgYSBzdHJpbmcgdGhhdCBjb250YWlucyBib3RoIHR5cGVzIG9mIHF1b3RlcyAoXCIgYW5kICcpYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcSA9IG9yaWdpbmFsU3RyLmluY2x1ZGVzKCdcIicpID8gYCdgIDogJ1wiJztcbiAgICBhcmdzID0gW2BpbnB1dCB0ZXh0ICR7cX0ke2VzY2FwZWRUZXh0fSR7cX1gXTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgYWN0aXZlIHRleHQgZmllbGQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0IGJ5IHNlbmRpbmdcbiAqIHNwZWNpYWwga2V5ZXZlbnRzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggWzEwMF0gLSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdGhlIGZpZWxkIHRvIGJlIGNsZWFyZWQuXG4gKi9cbm1ldGhvZHMuY2xlYXJUZXh0RmllbGQgPSBhc3luYyBmdW5jdGlvbiBjbGVhclRleHRGaWVsZCAobGVuZ3RoID0gMTAwKSB7XG4gIC8vIGFzc3VtZXMgdGhhdCB0aGUgRWRpdFRleHQgZmllbGQgYWxyZWFkeSBoYXMgZm9jdXNcbiAgbG9nLmRlYnVnKGBDbGVhcmluZyB1cCB0byAke2xlbmd0aH0gY2hhcmFjdGVyc2ApO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICdrZXlldmVudCddO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgLy8gd2UgY2Fubm90IGtub3cgd2hlcmUgdGhlIGN1cnNvciBpcyBpbiB0aGUgdGV4dCBmaWVsZCwgc28gZGVsZXRlIGJvdGggYmVmb3JlXG4gICAgLy8gYW5kIGFmdGVyIHNvIHRoYXQgd2UgZ2V0IHJpZCBvZiBldmVyeXRoaW5nXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfREVMXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRk9SV0FSRF9ERUxcbiAgICBhcmdzLnB1c2goJzY3JywgJzExMicpO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gbG9jayBpdC5cbiAqL1xubWV0aG9kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCkpIHtcbiAgICBsb2cuZGVidWcoJ1NjcmVlbiBpcyBhbHJlYWR5IGxvY2tlZC4gRG9pbmcgbm90aGluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgS0VZQ09ERV9QT1dFUiBidXR0b24gdG8gbG9jayBzY3JlZW4nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgyNik7XG5cbiAgY29uc3QgdGltZW91dE1zID0gNTAwMDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMsXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkZXZpY2Ugc2NyZWVuIGlzIHN0aWxsIGxvY2tlZCBhZnRlciAke3RpbWVvdXRNc31tcyB0aW1lb3V0YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBCYWNrIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uIGJhY2sgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBCQUNLIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDQpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEhvbWUgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5nb1RvSG9tZSA9IGFzeW5jIGZ1bmN0aW9uIGdvVG9Ib21lICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgSE9NRSBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgzKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgYWN0dWFsIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiUGF0aCA9IGZ1bmN0aW9uIGdldEFkYlBhdGggKCkge1xuICByZXR1cm4gdGhpcy5leGVjdXRhYmxlLnBhdGg7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIGN1cnJlbnQgc2NyZWVuIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGVuY29kZWQgYXMgYW4gaW50ZWdlciBudW1iZXIuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuT3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5PcmllbnRhdGlvbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdpbnB1dCddKTtcbiAgcmV0dXJuIGdldFN1cmZhY2VPcmllbnRhdGlvbihzdGRvdXQpO1xufTtcblxuLyoqXG4gKiBTZW5kIGFuIGFyYml0cmFyeSBUZWxuZXQgY29tbWFuZCB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBiZSBzZW50LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFjdHVhbCBvdXRwdXQgb2YgdGhlIGdpdmVuIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuc2VuZFRlbG5ldENvbW1hbmQgPSBhc3luYyBmdW5jdGlvbiBzZW5kVGVsbmV0Q29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjRW11Q29uc29sZUNvbW1hbmQoY29tbWFuZCwge3BvcnQ6IGF3YWl0IHRoaXMuZ2V0RW11bGF0b3JQb3J0KCl9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgQWlycGxhbmUgbW9kZSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzQWlycGxhbmVNb2RlT24gPSBhc3luYyBmdW5jdGlvbiBpc0FpcnBsYW5lTW9kZU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nKTtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSB0aGUgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqL1xubWV0aG9kcy5zZXRBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBzZXRBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nLCBvbiA/IDEgOiAwKTtcbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzZXRBaXJwbGFuZU1vZGV9LCBvdGhlcndpc2VcbiAqIHRoZSBtb2RlIGNoYW5nZSBpcyBub3QgZ29pbmcgdG8gYmUgYXBwbGllZCBmb3IgdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBicm9hZGNhc3QgZW5hYmxlIGFuZCBmYWxzZSB0byBicm9hZGNhc3QgZGlzYWJsZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uQUlSUExBTkVfTU9ERScsXG4gICAgJy0tZXonLCAnc3RhdGUnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgXSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBXaUZpIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIFdpRmkgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpZmlfb24nKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIERhdGEgdHJhbnNmZXIgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0RhdGFPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzRGF0YU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ21vYmlsZV9kYXRhJyk7XG4gIHJldHVybiAocGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDApO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIFdpRmkgYW5kL29yIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gd2lmaSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIFdpRmkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRhdGEgLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBEYXRhIHRyYW5zZmVyLlxuICogQHBhcmFtIHtib29sZWFufSBpc0VtdWxhdG9yIFtmYWxzZV0gLSBTZXQgaXQgdG8gdHJ1ZSBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYW4gZW11bGF0b3IgcmF0aGVyIHRoYW4gYSByZWFsIGRldmljZS5cbiAqL1xubWV0aG9kcy5zZXRXaWZpQW5kRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlBbmREYXRhICh7d2lmaSwgZGF0YX0sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAodXRpbC5oYXNWYWx1ZSh3aWZpKSkge1xuICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHdpZmksIGlzRW11bGF0b3IpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGRhdGEpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXREYXRhU3RhdGUoZGF0YSwgaXNFbXVsYXRvcik7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIGFuaW1hdGlvbiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgYW5pbWF0aW9uIHNjYWxlIHNldHRpbmdzXG4gKiAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gJzAuMCcuXG4gKi9cbm1ldGhvZHMuaXNBbmltYXRpb25PbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQW5pbWF0aW9uT24gKCkge1xuICBsZXQgYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhbmltYXRvcl9kdXJhdGlvbl9zY2FsZScpO1xuICBsZXQgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZScpO1xuICBsZXQgd2luZG93X2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpbmRvd19hbmltYXRpb25fc2NhbGUnKTtcbiAgcmV0dXJuIF8uc29tZShbYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUsIHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlLCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlXSxcbiAgICAgICAgICAgICAgICAoc2V0dGluZykgPT4gc2V0dGluZyAhPT0gJzAuMCcpO1xufTtcblxuLyoqXG4gKiBGb3JjZWZ1bGx5IHJlY3Vyc2l2ZWx5IHJlbW92ZSBhIHBhdGggb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQmUgY2FyZWZ1bCB3aGlsZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gYmUgcmVtb3ZlZCByZWN1cnNpdmVseS5cbiAqL1xubWV0aG9kcy5yaW1yYWYgPSBhc3luYyBmdW5jdGlvbiByaW1yYWYgKHBhdGgpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1yZicsIHBhdGhdKTtcbn07XG5cbi8qKlxuICogU2VuZCBhIGZpbGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3MsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjXyBtZXRob2Qgb3B0aW9ucywgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKi9cbm1ldGhvZHMucHVzaCA9IGFzeW5jIGZ1bmN0aW9uIHB1c2ggKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgb3B0cykge1xuICBhd2FpdCB0aGlzLm1rZGlyKHBhdGgucG9zaXguZGlybmFtZShyZW1vdGVQYXRoKSk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3B1c2gnLCBsb2NhbFBhdGgsIHJlbW90ZVBhdGhdLCBvcHRzKTtcbn07XG5cbi8qKlxuICogUmVjZWl2ZSBhIGZpbGUgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgc291cmNlIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3MsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjXyBtZXRob2Qgb3B0aW9ucywgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKi9cbm1ldGhvZHMucHVsbCA9IGFzeW5jIGZ1bmN0aW9uIHB1bGwgKHJlbW90ZVBhdGgsIGxvY2FsUGF0aCwgb3B0cyA9IHt9KSB7XG4gIC8vIHB1bGwgZm9sZGVyIGNhbiB0YWtlIG1vcmUgdGltZSwgaW5jcmVhc2luZyB0aW1lIG91dCB0byA2MCBzZWNzXG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3B1bGwnLCByZW1vdGVQYXRoLCBsb2NhbFBhdGhdLCB7Li4ub3B0cywgdGltZW91dDogb3B0cy50aW1lb3V0ID8/IDYwMDAwfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIHByb2Nlc3Mgd2l0aCB0aGUgcGFydGljdWxhciBuYW1lIGlzIHJ1bm5pbmcgb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB0byBiZSBjaGVja2VkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpcyBydW5uaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5wcm9jZXNzRXhpc3RzID0gYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0V4aXN0cyAocHJvY2Vzc05hbWUpIHtcbiAgcmV0dXJuICFfLmlzRW1wdHkoYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKHByb2Nlc3NOYW1lKSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRGb3J3YXJkTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0Rm9yd2FyZCA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRGb3J3YXJkIChzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7c3lzdGVtUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgLS1yZW1vdmVgLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRSZXZlcnNlTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldFJldmVyc2VMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IHJldmVyc2UgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBPbmx5IGF2YWlsYWJsZSBmb3IgQVBJIDIxKy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqL1xubWV0aG9kcy5yZXZlcnNlUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIHJldmVyc2VQb3J0IChkZXZpY2VQb3J0LCBzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBkZXZpY2U6ICR7ZGV2aWNlUG9ydH0gdG8gc3lzdGVtOiAke3N5c3RlbVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgdGNwOiR7ZGV2aWNlUG9ydH1gLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRSZXZlcnNlID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydFJldmVyc2UgKGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyByZXZlcnNlIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke2RldmljZVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYC0tcmVtb3ZlYCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGRpZmZlcmVuY2VcbiAqIGJldHdlZW4ge0BsaW5rICNmb3J3YXJkUG9ydH0gaXMgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIHNldHVwIGZvciBhbiBhYnN0cmFjdFxuICogbG9jYWwgcG9ydC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkQWJzdHJhY3RQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZEFic3RyYWN0UG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGFic3RyYWN0IGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYGxvY2FsYWJzdHJhY3Q6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZSBwaW5nIHNoZWxsIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbW1hbmQgb3V0cHV0IGNvbnRhaW5zICdwaW5nJyBzdWJzdHJpbmcuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyAncGluZycgY29tbWFuZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgICBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5waW5nID0gYXN5bmMgZnVuY3Rpb24gcGluZyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZWNobycsICdwaW5nJ10pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ3BpbmcnKSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQURCIHBpbmcgZmFpbGVkLCByZXR1cm5lZCAke3N0ZG91dH1gKTtcbn07XG5cbi8qKlxuICogUmVzdGFydCB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgdXNpbmcgYWRiIGNvbW1hbmRzLlxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5yZXN0YXJ0ID0gYXN5bmMgZnVuY3Rpb24gcmVzdGFydCAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wTG9nY2F0KCk7XG4gICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGV2aWNlKDYwKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0TG9nY2F0KHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXN0YXJ0IGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvZ2NhdE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgVGhlIGxvZyBwcmludCBmb3JtYXQsIHdoZXJlIDxmb3JtYXQ+IGlzIG9uZSBvZjpcbiAqICAgYnJpZWYgcHJvY2VzcyB0YWcgdGhyZWFkIHJhdyB0aW1lIHRocmVhZHRpbWUgbG9uZ1xuICogYHRocmVhZHRpbWVgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJTcGVjcyBTZXJpZXMgb2YgPHRhZz5bOnByaW9yaXR5XVxuICogd2hlcmUgPHRhZz4gaXMgYSBsb2cgY29tcG9uZW50IHRhZyAob3IgKiBmb3IgYWxsKSBhbmQgcHJpb3JpdHkgaXM6XG4gKiAgViAgICBWZXJib3NlXG4gKiAgRCAgICBEZWJ1Z1xuICogIEkgICAgSW5mb1xuICogIFcgICAgV2FyblxuICogIEUgICAgRXJyb3JcbiAqICBGICAgIEZhdGFsXG4gKiAgUyAgICBTaWxlbnQgKHN1cHJlc3MgYWxsIG91dHB1dClcbiAqXG4gKiAnKicgbWVhbnMgJyo6ZCcgYW5kIDx0YWc+IGJ5IGl0c2VsZiBtZWFucyA8dGFnPjp2XG4gKlxuICogSWYgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUsIGZpbHRlcnNwZWMgaXMgc2V0IGZyb20gQU5EUk9JRF9MT0dfVEFHUy5cbiAqIElmIG5vIGZpbHRlcnNwZWMgaXMgZm91bmQsIGZpbHRlciBkZWZhdWx0cyB0byAnKjpJJ1xuICovXG5cbi8qKlxuICogU3RhcnQgdGhlIGxvZ2NhdCBwcm9jZXNzIHRvIGdhdGhlciBsb2dzLlxuICpcbiAqIEBwYXJhbSB7P0xvZ2NhdE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiByZXN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnN0YXJ0TG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRMb2djYXQgKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc3RhcnQgbG9nY2F0IGNhcHR1cmUgYnV0IGl0J3MgYWxyZWFkeSBzdGFydGVkIVwiKTtcbiAgfVxuXG4gIHRoaXMubG9nY2F0ID0gbmV3IExvZ2NhdCh7XG4gICAgYWRiOiB0aGlzLmV4ZWN1dGFibGUsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGRlYnVnVHJhY2U6IGZhbHNlLFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6ICEhdGhpcy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICB9KTtcbiAgYXdhaXQgdGhpcy5sb2djYXQuc3RhcnRDYXB0dXJlKG9wdHMpO1xuICB0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zID0gb3B0cztcbn07XG5cbi8qKlxuICogU3RvcCB0aGUgYWN0aXZlIGxvZ2NhdCBwcm9jZXNzIHdoaWNoIGdhdGhlcnMgbG9ncy5cbiAqIFRoZSBjYWxsIHdpbGwgYmUgaWdub3JlZCBpZiBubyBsb2djYXQgcHJvY2VzcyBpcyBydW5uaW5nLlxuICovXG5tZXRob2RzLnN0b3BMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdG9wTG9nY2F0ICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmxvZ2NhdC5zdG9wQ2FwdHVyZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMubG9nY2F0ID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgb3V0cHV0IGZyb20gdGhlIGN1cnJlbnRseSBydW5uaW5nIGxvZ2NhdCBwcm9jZXNzLlxuICogVGhlIGxvZ2NhdCBwcm9jZXNzIHNob3VsZCBiZSBleGVjdXRlZCBieSB7MmxpbmsgI3N0YXJ0TG9nY2F0fSBtZXRob2QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sbGVjdGVkIGxvZ2NhdCBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZ2V0TG9nY2F0TG9ncyA9IGZ1bmN0aW9uIGdldExvZ2NhdExvZ3MgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGdldCBsb2djYXQgbG9ncyBzaW5jZSBsb2djYXQgaGFzbid0IHN0YXJ0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHRoaXMubG9nY2F0LmdldExvZ3MoKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgb25lIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBsb2cgcmVjb3JkIG9iamVjdCB3aXRoIGB0aW1lc3RhbXBgLCBgbGV2ZWxgIGFuZCBgbWVzc2FnZWAgcHJvcGVydGllcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zZXRMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHNldExvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQub24oJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcHJldmlvdXNseSBzZXQgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBoYXMgYmVlbiBwcmV2aW91c2x5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBgc2V0TG9nY2F0TGlzdGVuZXJgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMucmVtb3ZlTG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0LnJlbW92ZUxpc3RlbmVyKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIEF0IHNvbWUgcG9pbnQgb2YgdGltZSBHb29nbGUgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgYHBzYCBiZWhhdmlvdXIsIHNvIGl0IG9ubHlcbiAqIGxpc3RzIHByb2Nlc3NlcyB0aGF0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzaGVsbCB1c2VyIHJhdGhlciB0byBhbGxcbiAqIHVzZXJzLiBJdCBpcyBuZWNlc3NhcnkgdG8gZXhlY3V0ZSBwcyB3aXRoIC1BIGNvbW1hbmQgbGluZSBhcmd1bWVudFxuICogdG8gbWltaWMgdGhlIHByZXZpb3VzIGJlaGF2aW91ci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgb3V0cHV0IG9mIGBwc2AgY29tbWFuZCB3aGVyZSBhbGwgcHJvY2Vzc2VzIGFyZSBpbmNsdWRlZFxuICovXG5tZXRob2RzLmxpc3RQcm9jZXNzU3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdFByb2Nlc3NTdGF0dXMgKCkge1xuICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uKSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IC9eLUFcXGIvbS50ZXN0KGF3YWl0IHRoaXMuc2hlbGwoWydwcycsICctLWhlbHAnXSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID8gWydwcycsICctQSddIDogWydwcyddKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBwcm9jZXNzIG5hbWUgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSB2YWxpZCBwcm9jZXNzIGlkZW50aWZpZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gUElEIGlzIGVpdGhlciBpbnZhbGlkIG9yIGlzIG5vdCBwcmVzZW50XG4gKiBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJvY2VzcyBuYW1lXG4gKi9cbm1ldGhvZHMuZ2V0TmFtZUJ5UGlkID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZUJ5UGlkIChwaWQpIHtcbiAgaWYgKGlzTmFOKHBpZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBQSUQgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIG51bWJlci4gJyR7cGlkfScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHBpZCA9IHBhcnNlSW50KHBpZCwgMTApO1xuXG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgLy8gaXQgbWlnaHQgbm90IGJlIHN0YWJsZSB0byB0YWtlIE5BTUUgYnkgaW5kZXgsIGJlY2F1c2UgZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBhY3R1YWwgU0RLIHRoZSBwcyBvdXRwdXQgbWlnaHQgbm90IGNvbnRhaW4gYW4gYWJicmV2aWF0aW9uIGZvciB0aGUgUyBmbGFnOlxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgICAgICAgTkFNRVxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgIFMgICAgTkFNRVxuICBjb25zdCBuYW1lT2Zmc2V0ID0gYWxsVGl0bGVzLmluZGV4T2YoUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSkgLSBhbGxUaXRsZXMubGVuZ3RoO1xuICBjb25zdCBwaWRSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYiR7cGlkfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwaWRSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkgPT09IHBpZCAmJiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdO1xuICAgIH1cbiAgfVxuICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFzc2VkIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBvbmVcbiAqL1xubWV0aG9kcy5nZXRQSURzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0J5TmFtZSAobmFtZSkge1xuICBsb2cuZGVidWcoYEdldHRpbmcgSURzIG9mIGFsbCAnJHtuYW1lfScgcHJvY2Vzc2VzYCk7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvY2VzcyBuYW1lOiAnJHtuYW1lfSdgKTtcbiAgfVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM1NjdcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgIGlmICghXy5pc0Jvb2xlYW4odGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkpIHtcbiAgICAgIC8vIHBncmVwIGlzIGluIHByaW9yaXR5LCBzaW5jZSBwaWRvZiBoYXMgYmVlbiByZXBvcnRlZCBvZiBoYXZpbmcgYnVncyBvbiBzb21lIHBsYXRmb3Jtc1xuICAgICAgY29uc3QgcGdyZXBPdXRwdXQgPSBfLnRyaW0oYXdhaXQgdGhpcy5zaGVsbChbJ3BncmVwIC0taGVscDsgZWNobyAkPyddKSk7XG4gICAgICB0aGlzLl9pc1BncmVwQXZhaWxhYmxlID0gcGFyc2VJbnQoXy5sYXN0KHBncmVwT3V0cHV0LnNwbGl0KC9cXHMrLykpLCAxMCkgPT09IDA7XG4gICAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoID0gL14tZlxcYi9tLnRlc3QocGdyZXBPdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSA9IHBhcnNlSW50KGF3YWl0IHRoaXMuc2hlbGwoWydwaWRvZiAtLWhlbHAgPiAvZGV2L251bGw7IGVjaG8gJD8nXSksIDEwKSA9PT0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgfHwgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSkge1xuICAgICAgY29uc3Qgc2hlbGxDb21tYW5kID0gdGhpcy5faXNQZ3JlcEF2YWlsYWJsZVxuICAgICAgICA/ICh0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoXG4gICAgICAgICAgPyBbJ3BncmVwJywgJy1mJywgXy5lc2NhcGVSZWdFeHAoYChbWzpibGFuazpdXXxeKSR7bmFtZX0oW1s6Ymxhbms6XV18JClgKV1cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM4NzJcbiAgICAgICAgICA6IFtgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgtTUFYX1BHUkVQX1BBVFRFUk5fTEVOKSl9JCBgICtcbiAgICAgICAgICAgICAgYHx8IHBncmVwIF4ke18uZXNjYXBlUmVnRXhwKG5hbWUuc2xpY2UoMCwgTUFYX1BHUkVQX1BBVFRFUk5fTEVOKSl9JGBdKVxuICAgICAgICA6IFsncGlkb2YnLCBuYW1lXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5zaGVsbChzaGVsbENvbW1hbmQpKVxuICAgICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgICAgLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTApKVxuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IF8uaXNJbnRlZ2VyKHgpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZXJyb3IgY29kZSAxIGlzIHJldHVybmVkIGlmIHRoZSB1dGlsaXR5IGRpZCBub3QgZmluZCBhbnkgcHJvY2Vzc2VzXG4gICAgICAgIC8vIHdpdGggdGhlIGdpdmVuIG5hbWVcbiAgICAgICAgaWYgKGUuY29kZSAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgcHJvY2VzcyBJRCBvZiAnJHtuYW1lfSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyIHx8IGUuc3Rkb3V0LCAnc3ludGF4IGVycm9yJykpIHtcbiAgICAgICAgICBsb2cud2FybihgR290IGFuIHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSB0aGUgc2hlbGwgaW50ZXJwcmV0ZXI6ICR7ZS5zdGRlcnIgfHwgZS5zdGRvdXR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9nLmRlYnVnKCdVc2luZyBwcy1iYXNlZCBQSUQgZGV0ZWN0aW9uJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSBwcyBvdXRwdXRgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICBjb25zdCBwaWRzID0gW107XG4gIGNvbnN0IHByb2Nlc3NOYW1lUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGJcXFxcZCtcXFxcYi4qXFxcXGIke18uZXNjYXBlUmVnRXhwKG5hbWUpfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwcm9jZXNzTmFtZVJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwaWRJbmRleCA+PSBhbGxUaXRsZXMubGVuZ3RoIHx8IGlzTmFOKGl0ZW1zW3BpZEluZGV4XSkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gJyR7bWF0Y2hlZExpbmVbMV0udHJpbSgpfSdgKTtcbiAgICB9XG4gICAgcGlkcy5wdXNoKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApKTtcbiAgfVxuICByZXR1cm4gcGlkcztcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3Nlc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzZXNCeU5hbWUgKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBhbGwgJHtuYW1lfSBwcm9jZXNzZXNgKTtcbiAgICBjb25zdCBwaWRzID0gYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKG5hbWUpO1xuICAgIGlmIChfLmlzRW1wdHkocGlkcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyAnJHtuYW1lfScgcHJvY2VzcyBoYXMgYmVlbiBmb3VuZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBCLmFsbChwaWRzLm1hcCgocCkgPT4gdGhpcy5raWxsUHJvY2Vzc0J5UElEKHApKSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8ga2lsbCAke25hbWV9IHByb2Nlc3Nlcy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEtpbGwgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGUgY3VycmVudCB1c2VyIGlzIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgdG8gcm9vdCBpZiBuZWNlc3NhcnkgaW4gb3JkZXJcbiAqIHRvIHByb3Blcmx5IGtpbGwgdGhlIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgdG8gYmUga2lsbGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm9jZXNzIGNhbm5vdCBiZSBraWxsZWQuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3NCeVBJRCA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzQnlQSUQgKHBpZCkge1xuICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBwcm9jZXNzICR7cGlkfWApO1xuICBjb25zdCBub1Byb2Nlc3NGbGFnID0gJ05vIHN1Y2ggcHJvY2Vzcyc7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gb3RoZXJ3aXNlXG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIV8uaW5jbHVkZXMoZS5zdGRlcnIsICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCcpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgQ2Fubm90IGtpbGwgUElEICR7cGlkfSBkdWUgdG8gaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLiBSZXRyeWluZyBhcyByb290YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSwge1xuICAgICAgICBwcml2aWxlZ2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlMSkge1xuICAgICAgaWYgKF8uaW5jbHVkZXMoZTEuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlMTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHByb2Nlc3Mga2lsbGluZyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGtpbGxlZCBwcm9jZXNzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZSBwcm9jZXNzIHdhcyBub3Qga2lsbGVkLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdFByb2Nlc3NFbmQgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RQcm9jZXNzRW5kIChpbnRlbnQsIHByb2Nlc3NOYW1lKSB7XG4gIC8vIHN0YXJ0IHRoZSBicm9hZGNhc3Qgd2l0aG91dCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2guXG4gIHRoaXMuYnJvYWRjYXN0KGludGVudCk7XG4gIC8vIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVuZFxuICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgdGltZW91dE1zID0gNDAwMDA7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChEYXRlLm5vdygpIC0gc3RhcnQpIDwgdGltZW91dE1zKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5wcm9jZXNzRXhpc3RzKHByb2Nlc3NOYW1lKSkge1xuICAgICAgICAvLyBjb29sIGRvd25cbiAgICAgICAgYXdhaXQgc2xlZXAoNDAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgUHJvY2VzcyBuZXZlciBkaWVkIHdpdGhpbiAke3RpbWVvdXRNc30gbXNgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGJyb2FkY2FzdCBwcm9jZXNzIGVuZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBhIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgaW50ZW50IG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3QgKGludGVudCkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGludGVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZW50ICR7aW50ZW50fWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgQnJvYWRjYXN0aW5nOiAke2ludGVudH1gKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2Jyb2FkY2FzdCcsICctYScsIGludGVudF0pO1xufTtcblxuLyoqXG4gKiBLaWxsIEFuZHJvaWQgaW5zdHJ1bWVudHMgaWYgdGhleSBhcmUgY3VycmVudGx5IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZW5kQW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gZW5kQW5kcm9pZENvdmVyYWdlICgpIHtcbiAgaWYgKHRoaXMuaW5zdHJ1bWVudFByb2MgJiYgdGhpcy5pbnN0cnVtZW50UHJvYy5pc1J1bm5pbmcpIHtcbiAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0b3AoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0cnVtZW50IHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudFdpdGggLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBpbnN0cnVtZW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aXZpdHkgd2l0aC5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5pbnN0cnVtZW50ID0gYXN5bmMgZnVuY3Rpb24gaW5zdHJ1bWVudCAocGtnLCBhY3Rpdml0eSwgaW5zdHJ1bWVudFdpdGgpIHtcbiAgaWYgKGFjdGl2aXR5WzBdICE9PSAnLicpIHtcbiAgICBwa2cgPSAnJztcbiAgfVxuICBsZXQgcGtnQWN0aXZpdHkgPSAocGtnICsgYWN0aXZpdHkpLnJlcGxhY2UoL1xcLisvZywgJy4nKTsgLy8gRml4IHBrZy4uYWN0aXZpdHkgZXJyb3JcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdpbnN0cnVtZW50JyxcbiAgICAnLWUnLCAnbWFpbl9hY3Rpdml0eScsXG4gICAgcGtnQWN0aXZpdHksXG4gICAgaW5zdHJ1bWVudFdpdGgsXG4gIF0pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ0V4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBleGNlcHRpb24gZHVyaW5nIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3IgJHtzdGRvdXQuc3BsaXQoJ1xcbicpWzBdfWApO1xuICB9XG59O1xuXG4vKipcbiAqIENvbGxlY3QgQW5kcm9pZCBjb3ZlcmFnZSBieSBpbnN0cnVtZW50aW5nIHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50Q2xhc3MgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRQa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICpcbiAqIEByZXR1cm4ge3Byb21pc2V9IFRoZSBwcm9taXNlIGlzIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBpZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHN0YXJ0c1xuICogICAgICAgICAgICAgICAgICAgd2l0aG91dCBlcnJvcnMuXG4gKi9cbm1ldGhvZHMuYW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gYW5kcm9pZENvdmVyYWdlIChpbnN0cnVtZW50Q2xhc3MsIHdhaXRQa2csIHdhaXRBY3Rpdml0eSkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGluc3RydW1lbnRDbGFzcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2xhc3MgJHtpbnN0cnVtZW50Q2xhc3N9YCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IG5ldyBCKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgYXJncyA9IHRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1xuICAgICAgLmNvbmNhdChbJ3NoZWxsJywgJ2FtJywgJ2luc3RydW1lbnQnLCAnLWUnLCAnY292ZXJhZ2UnLCAndHJ1ZScsICctdyddKVxuICAgICAgLmNvbmNhdChbaW5zdHJ1bWVudENsYXNzXSk7XG4gICAgbG9nLmRlYnVnKGBDb2xsZWN0aW5nIGNvdmVyYWdlIGRhdGEgd2l0aDogJHtbdGhpcy5leGVjdXRhYmxlLnBhdGhdLmNvbmNhdChhcmdzKS5qb2luKCcgJyl9YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGFtIGluc3RydW1lbnQgcnVucyBmb3IgdGhlIGxpZmUgb2YgdGhlIGFwcCBwcm9jZXNzLlxuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYyA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBhcmdzKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RhcnQoMCk7XG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnJ9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5KHdhaXRQa2csIHdhaXRBY3Rpdml0eSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQW5kcm9pZCBjb3ZlcmFnZSBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKSk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgZ2V0cHJvcF8gdG9vbC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9wZXJ0eSAocHJvcGVydHkpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydnZXRwcm9wJywgcHJvcGVydHldKTtcbiAgbGV0IHZhbCA9IHN0ZG91dC50cmltKCk7XG4gIGxvZy5kZWJ1ZyhgQ3VycmVudCBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcGVydHl9JzogJHt2YWx9YCk7XG4gIHJldHVybiB2YWw7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IHNldFByb3BPcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByaXZpbGVnZWQgLSBEbyB3ZSBydW4gc2V0UHJvcCBhcyBhIHByaXZpbGVnZWQgY29tbWFuZD8gRGVmYXVsdCB0cnVlLlxuICovXG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgc2V0cHJvcF8gdG9vbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgLSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlLlxuICogQHBhcmFtIHtzZXRQcm9wT3B0c30gb3B0c1xuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBfc2V0cHJvcF8gdXRpbGl0eSBmYWlscyB0byBjaGFuZ2UgcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuc2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBzZXREZXZpY2VQcm9wZXJ0eSAocHJvcCwgdmFsLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3ByaXZpbGVnZWQgPSB0cnVlfSA9IG9wdHM7XG4gIGxvZy5kZWJ1ZyhgU2V0dGluZyBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcH0nIHRvICcke3ZhbH0nYCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydzZXRwcm9wJywgcHJvcCwgdmFsXSwge1xuICAgIHByaXZpbGVnZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxhbmd1YWdlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0NvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmNvdW50cnknKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsYW5ndWFnZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0Q291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLnJlZ2lvbicpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TW9kZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRNb2RlbCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1vZGVsJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1hbnVmYWN0dXJlciBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNYW51ZmFjdHVyZXIgPSBhc3luYyBmdW5jdGlvbiBnZXRNYW51ZmFjdHVyZXIgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tYW51ZmFjdHVyZXInKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gRGV2aWNlIHNjcmVlbiBzaXplIGFzIHN0cmluZyBpbiBmb3JtYXQgJ1d4SCcgb3JcbiAqICAgICAgICAgICAgICAgICAgX251bGxfIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5tZXRob2RzLmdldFNjcmVlblNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5TaXplICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdzaXplJ10pO1xuICBsZXQgc2l6ZSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIHNpemU6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKHNpemUgJiYgc2l6ZS5sZW5ndGggPj0gMikge1xuICAgIHJldHVybiBzaXplWzFdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBkZW5zaXR5IGluIGRwaVxuICpcbiAqIEByZXR1cm4gez9udW1iZXJ9IERldmljZSBzY3JlZW4gZGVuc2l0eSBhcyBhIG51bWJlciBvciBfbnVsbF8gaWYgaXRcbiAqICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5EZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuRGVuc2l0eSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnZGVuc2l0eSddKTtcbiAgbGV0IGRlbnNpdHkgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBkZW5zaXR5OiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChkZW5zaXR5ICYmIGRlbnNpdHkubGVuZ3RoID49IDIpIHtcbiAgICBsZXQgZGVuc2l0eU51bWJlciA9IHBhcnNlSW50KGRlbnNpdHlbMV0udHJpbSgpLCAxMCk7XG4gICAgcmV0dXJuIGlzTmFOKGRlbnNpdHlOdW1iZXIpID8gbnVsbCA6IGRlbnNpdHlOdW1iZXI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFNldHVwIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYWQgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZnJhbWV3b3Jrcy9iYXNlLysvYW5kcm9pZC05LjAuMF9yMjEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBmb3IgZWFjaCBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm94eUhvc3QgLSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBwcm94eS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcHJveHlQb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHNldC5cbiAqL1xubWV0aG9kcy5zZXRIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzZXRIdHRwUHJveHkgKHByb3h5SG9zdCwgcHJveHlQb3J0KSB7XG4gIGxldCBwcm94eSA9IGAke3Byb3h5SG9zdH06JHtwcm94eVBvcnR9YDtcbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlIb3N0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X2hvc3Q6ICR7cHJveHl9YCk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlQb3J0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X3BvcnQgJHtwcm94eX1gKTtcbiAgfVxuXG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgWydodHRwX3Byb3h5JywgcHJveHldLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsIHByb3h5SG9zdF0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9wb3J0JywgcHJveHlQb3J0XVxuICBdO1xuICBmb3IgKGNvbnN0IFtzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWVdIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsIHNldHRpbmdLZXksIHNldHRpbmdWYWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVsZXRlIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYm9vdGluZyB0aGUgdGVzdCBkZXZpY2UgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHRoZSBjaGFuZ2UuXG4gKi9cbm1ldGhvZHMuZGVsZXRlSHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlSHR0cFByb3h5ICgpIHtcbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICAnaHR0cF9wcm94eScsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9wb3J0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3QnIC8vIGBnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdD1gIHdhcyBnZW5lcmF0ZWQgYnkgYHNldHRpbmdzIGdsb2JhbCBodHRvX3Byb3h5IHh4eHhgXG4gIF07XG4gIGZvciAoY29uc3Qgc2V0dGluZyBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2RlbGV0ZScsICdnbG9iYWwnLCBzZXR0aW5nXSk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIHByb3BlcnR5IHZhbHVlLlxuICogQHJldHVybiB7c3RyaW5nfSBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5zZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gc2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsIG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWVdKTtcbn07XG5cbi8qKlxuICogR2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHJldHVybiB7c3RyaW5nfSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5nZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZ2V0JywgbmFtZXNwYWNlLCBzZXR0aW5nXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBgYWRiIGJ1Z3JlcG9ydGAgY29tbWFuZCBvdXRwdXQuIFRoaXNcbiAqIG9wZXJhdGlvbiBtYXkgdGFrZSB1cCB0byBzZXZlcmFsIG1pbnV0ZXMuXG4gKlxuICogQHBhcmFtIHs/bnVtYmVyfSB0aW1lb3V0IFsxMjAwMDBdIC0gQ29tbWFuZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMge3N0cmluZ30gQ29tbWFuZCBzdGRvdXRcbiAqL1xubWV0aG9kcy5idWdyZXBvcnQgPSBhc3luYyBmdW5jdGlvbiBidWdyZXBvcnQgKHRpbWVvdXQgPSAxMjAwMDApIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2J1Z3JlcG9ydCddLCB7dGltZW91dH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JlZW5yZWNvcmRPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvU2l6ZSAtIFRoZSBmb3JtYXQgaXMgd2lkdGh4aGVpZ2h0LlxuICogICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGRpc3BsYXkgcmVzb2x1dGlvbiAoaWYgc3VwcG9ydGVkKSxcbiAqICAgICAgICAgICAgICAgICAgMTI4MHg3MjAgaWYgbm90LiBGb3IgYmVzdCByZXN1bHRzLFxuICogICAgICAgICAgICAgICAgICB1c2UgYSBzaXplIHN1cHBvcnRlZCBieSB5b3VyIGRldmljZSdzIEFkdmFuY2VkIFZpZGVvIENvZGluZyAoQVZDKSBlbmNvZGVyLlxuICogICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgXCIxMjgweDcyMFwiXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBidWdSZXBvcnQgLSBTZXQgaXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdmlkZW8gb3ZlcmxheSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgYSB0aW1lc3RhbXAsIHRoYXQgaXMgaGVscGZ1bCBpbiB2aWRlb3MgY2FwdHVyZWQgdG8gaWxsdXN0cmF0ZSBidWdzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCAoYW5kIG1heGltdW0pIHZhbHVlIGlzIDE4MCAoMyBtaW51dGVzKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IGJpdFJhdGUgLSBUaGUgdmlkZW8gYml0IHJhdGUgZm9yIHRoZSB2aWRlbywgaW4gbWVnYWJpdHMgcGVyIHNlY29uZC5cbiAqICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqICAgICAgICAgICAgICAgIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEluaXRpYXRlIHNjcmVlbnJlY29yZCB1dGlsaXR5IG9uIHRoZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb24gLSBGdWxsIHBhdGggdG8gdGhlIHdyaXRhYmxlIG1lZGlhIGZpbGUgZGVzdGluYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0gez9TY3JlZW5yZWNvcmRPcHRpb25zfSBvcHRpb25zIFt7fV1cbiAqIEByZXR1cm5zIHtTdWJQcm9jZXNzfSBzY3JlZW5yZWNvcmQgcHJvY2Vzcywgd2hpY2ggY2FuIGJlIHRoZW4gY29udHJvbGxlZCBieSB0aGUgY2xpZW50IGNvZGVcbiAqL1xubWV0aG9kcy5zY3JlZW5yZWNvcmQgPSBmdW5jdGlvbiBzY3JlZW5yZWNvcmQgKGRlc3RpbmF0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY21kID0gWydzY3JlZW5yZWNvcmQnXTtcbiAgY29uc3Qge1xuICAgIHZpZGVvU2l6ZSxcbiAgICBiaXRSYXRlLFxuICAgIHRpbWVMaW1pdCxcbiAgICBidWdSZXBvcnQsXG4gIH0gPSBvcHRpb25zO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh2aWRlb1NpemUpKSB7XG4gICAgY21kLnB1c2goJy0tc2l6ZScsIHZpZGVvU2l6ZSk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUodGltZUxpbWl0KSkge1xuICAgIGNtZC5wdXNoKCctLXRpbWUtbGltaXQnLCB0aW1lTGltaXQpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGJpdFJhdGUpKSB7XG4gICAgY21kLnB1c2goJy0tYml0LXJhdGUnLCBiaXRSYXRlKTtcbiAgfVxuICBpZiAoYnVnUmVwb3J0KSB7XG4gICAgY21kLnB1c2goJy0tYnVncmVwb3J0Jyk7XG4gIH1cbiAgY21kLnB1c2goZGVzdGluYXRpb24pO1xuXG4gIGNvbnN0IGZ1bGxDbWQgPSBbXG4gICAgLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgLi4uY21kXG4gIF07XG4gIGxvZy5kZWJ1ZyhgQnVpbGRpbmcgc2NyZWVucmVjb3JkIHByb2Nlc3Mgd2l0aCB0aGUgY29tbWFuZCBsaW5lOiBhZGIgJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGZ1bGxDbWQpO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgbWV0aG9kIGNvbnRleHRcbiAqIGFuZCB0aGVuIHJlc3RvcmVzIHRoZSBJTUUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZSAtIFZhbGlkIElNRSBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0IG9mIHRoZSBnaXZlbiBmdW5jdGlvblxuICovXG5tZXRob2RzLnJ1bkluSW1lQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHJ1bkluSW1lQ29udGV4dCAoaW1lLCBmbikge1xuICBjb25zdCBvcmlnaW5hbEltZSA9IGF3YWl0IHRoaXMuZGVmYXVsdElNRSgpO1xuICBpZiAob3JpZ2luYWxJbWUgPT09IGltZSkge1xuICAgIGxvZy5kZWJ1ZyhgVGhlIG9yaWdpbmFsIElNRSBpcyB0aGUgc2FtZSBhcyAnJHtpbWV9Jy4gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdGApO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZW5hYmxlSU1FKGltZSk7XG4gICAgYXdhaXQgdGhpcy5zZXRJTUUoaW1lKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTU5NDNcbiAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3JpZ2luYWxJbWUgIT09IGltZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRJTUUob3JpZ2luYWxJbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdHogZGF0YWJhc2UgdGltZSB6b25lIGZvcm1hdHRlZCB0aW1lem9uZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRaIGRhdGFiYXNlIFRpbWUgWm9uZXMgZm9ybWF0XG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmdldFRpbWVab25lID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGltZVpvbmUgKCkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgY3VycmVudCB0aW1lem9uZScpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy50aW1lem9uZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIHRpbWV6b25lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZlYXR1cmUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEFuIGV4YW1wbGUgYWRiIGNvbW1hbmQgb3V0cHV0OlxuICogYGBgXG4gKiBjbWRcbiAqIGxzX3YyXG4gKiBmaXhlZF9wdXNoX21rZGlyXG4gKiBzaGVsbF92MlxuICogYWJiXG4gKiBzdGF0X3YyXG4gKiBhcGV4XG4gKiBhYmJfZXhlY1xuICogcmVtb3VudF9zaGVsbFxuICogZml4ZWRfcHVzaF9zeW1saW5rX3RpbWVzdGFtcFxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3RcbiAqL1xubWV0aG9kcy5saXN0RmVhdHVyZXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0RmVhdHVyZXMgKCkge1xuICB0aGlzLl9tZW1vaXplZEZlYXR1cmVzID0gdGhpcy5fbWVtb2l6ZWRGZWF0dXJlc1xuICAgIHx8IF8ubWVtb2l6ZShhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmZWF0dXJlcyddKSwgKCkgPT4gdGhpcy5jdXJEZXZpY2VJZCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLl9tZW1vaXplZEZlYXR1cmVzKCkpXG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4geC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsICd1bmtub3duIGNvbW1hbmQnKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdGUgb2Ygc3RyZWFtZWQgaW5zdGFsbCBmZWF0dXJlLlxuICogVGhpcyBmZWF0dXJlIGFsbG93cyB0byBzcGVlZCB1cCBhcGsgaW5zdGFsbGF0aW9uXG4gKiBzaW5jZSBpdCBkb2VzIG5vdCByZXF1aXJlIHRoZSBvcmlnaW5hbCBhcGsgdG8gYmUgcHVzaGVkIHRvXG4gKiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgZmlyc3QsIHdoaWNoIGFsc28gc2F2ZXMgc3BhY2UuXG4gKiBBbHRob3VnaCwgaXQgaXMgcmVxdWlyZWQgdGhhdCBib3RoIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogYW5kIHRoZSBhZGIgc2VydmVyIGhhdmUgdGhlIG1lbnRpb25lZCBmdW5jdGlvbmFsaXR5LlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hb3NwLW1pcnJvci9wbGF0Zm9ybV9zeXN0ZW1fY29yZS9ibG9iL21hc3Rlci9hZGIvY2xpZW50L2FkYl9pbnN0YWxsLmNwcFxuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICBwcm90by5faGVscE91dHB1dCA9IHByb3RvLl9oZWxwT3V0cHV0IHx8IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2hlbHAnXSk7XG4gIHJldHVybiBwcm90by5faGVscE91dHB1dC5pbmNsdWRlcygnLS1zdHJlYW1pbmcnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnY21kJyk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGluY3JlbWVudGFsIGluc3RhbGwgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgQURCLlxuICogUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L2ZlYXR1cmVzI2luY3JlbWVudGFsXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIGl0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHtiaW5hcnl9ID0gYXdhaXQgdGhpcy5nZXRWZXJzaW9uKCk7XG4gIGlmICghYmluYXJ5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB1dGlsLmNvbXBhcmVWZXJzaW9ucyhiaW5hcnkudmVyc2lvbiwgJz49JywgJzMwLjAuMScpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdhYmJfZXhlYycpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZnJvbSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHdoaXRlbGlzdGVkIHBhY2thZ2VzLiBBbiBleGFtcGxlIG91dHB1dDpcbiAqIHN5c3RlbSxjb20uYW5kcm9pZC5zaGVsbCwyMDAwXG4gKiBzeXN0ZW0sY29tLmdvb2dsZS5hbmRyb2lkLmNlbGxicm9hZGNhc3RyZWNlaXZlciwxMDE0M1xuICogdXNlcixpby5hcHBpdW0uc2V0dGluZ3MsMTAxNTdcbiAqL1xubWV0aG9kcy5nZXREZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxvZy5pbmZvKCdMaXN0aW5nIHBhY2thZ2VzIGluIERvemUgd2hpdGVsaXN0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0J10pO1xuICByZXR1cm4gXy50cmltKG91dHB1dCkuc3BsaXQoL1xcbi8pXG4gICAgLm1hcCgobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gZXhpc3RpbmcgcGFja2FnZShzKSBpbnRvIHRoZSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBwYWNrYWdlcyBPbmUgb3IgbW9yZSBwYWNrYWdlcyB0byBhZGQuIElmIHRoZSBwYWNrYWdlXG4gKiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd2hpdGVsaXN0IHRoZW4gaXQgaXMgb25seSBnb2luZyB0byBiZSBhZGRlZCBvbmNlLlxuICogSWYgdGhlIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgaW5zdGFsbGVkL25vdCBrbm93biB0aGVuIGFuIGVycm9yXG4gKiB3aWxsIGJlIHRocm93bi5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNvbW1hbmQgdG8gYWRkIHBhY2thZ2UocykgaGFzIGJlZW4gZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgKC4uLnBhY2thZ2VzKSB7XG4gIGlmIChfLmlzRW1wdHkocGFja2FnZXMpIHx8IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nLmluZm8oYEFkZGluZyAke3V0aWwucGx1cmFsaXplKCdwYWNrYWdlJywgcGFja2FnZXMubGVuZ3RoKX0gJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlcyl9IHRvIERvemUgd2hpdGVsaXN0YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBrZykgPT4gWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0JywgYCske3BrZ31gXSwgcGFja2FnZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsSUFBaEM7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxtQ0FBbEM7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxDQUMxQkQseUJBRDBCLEVBRTFCLHFCQUYwQixDQUE1QjtBQUlBLE1BQU1FLHFCQUFxQixHQUFHLEVBQTlCO0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUcsQ0FDN0IsOEJBRDZCLEVBRTdCLDBCQUY2QixFQUc3QixtQkFINkIsQ0FBL0I7QUFLQSxNQUFNQyxnQkFBZ0IsR0FBRyxLQUF6QjtBQUNBLE1BQU1DLHlCQUF5QixHQUFHLE1BQWxDO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsSUFBSUMsTUFBSixDQUFZLFVBQVNILGdCQUFpQixXQUFVQyx5QkFBMEIsU0FBMUUsRUFBb0YsR0FBcEYsQ0FBekI7QUFFQSxNQUFNRyx3QkFBd0IsR0FBRyxtQkFBakM7QUFFQSxNQUFNQyxPQUFPLEdBQUcsRUFBaEI7O0FBZ0JBQSxPQUFPLENBQUNDLFdBQVIsR0FBc0IsZUFBZUEsV0FBZixDQUE0QkMsY0FBNUIsRUFBNENDLElBQTVDLEVBQWtEO0VBQ3RFLE1BQU1DLFFBQVEsR0FBRyxFQUFqQjtFQUNBLElBQUlDLFFBQVEsR0FBRyxFQUFmOztFQUNBLEtBQUssTUFBTUMsR0FBWCxJQUFrQkgsSUFBbEIsRUFBd0I7SUFDdEIsTUFBTUksT0FBTyxHQUFHTCxjQUFjLENBQUNJLEdBQUQsQ0FBOUI7O0lBQ0EsSUFBSSxDQUFDRSxlQUFBLENBQUVDLE9BQUYsQ0FBVUYsT0FBVixDQUFMLEVBQXlCO01BQ3ZCLE1BQU0sSUFBSUcsS0FBSixD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
1161
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCIsIk5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IiLCJJR05PUkVEX1BFUk1fRVJST1JTIiwiTUFYX1BHUkVQX1BBVFRFUk5fTEVOIiwiSElEREVOX0FQSV9QT0xJQ1lfS0VZUyIsIlBJRF9DT0xVTU5fVElUTEUiLCJQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFIiwiUFNfVElUTEVfUEFUVEVSTiIsIlJlZ0V4cCIsIkFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTiIsIm1ldGhvZHMiLCJzaGVsbENodW5rcyIsImFyZ1RyYW5zZm9ybWVyIiwiYXJncyIsImNvbW1hbmRzIiwiY21kQ2h1bmsiLCJhcmciLCJuZXh0Q21kIiwiXyIsImlzQXJyYXkiLCJFcnJvciIsImxhc3QiLCJwdXNoIiwiam9pbiIsImxlbmd0aCIsImlzRW1wdHkiLCJsb2ciLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJsYXN0RXJyb3IiLCJjbWQiLCJzaGVsbCIsImUiLCJnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGgiLCJleGVjdXRhYmxlIiwicGF0aCIsImdldFNka0JpbmFyeVBhdGgiLCJhZGIiLCJpbml0QWFwdCIsImluaXRBYXB0MiIsImluaXRaaXBBbGlnbiIsImluaXRCdW5kbGV0b29sIiwiYmluYXJpZXMiLCJidW5kbGV0b29sIiwiZnMiLCJ3aGljaCIsImVyciIsImdldEFwaUxldmVsIiwiaXNJbnRlZ2VyIiwiX2FwaUxldmVsIiwic3RyT3V0cHV0IiwiZ2V0RGV2aWNlUHJvcGVydHkiLCJhcGlMZXZlbCIsInBhcnNlSW50IiwidHJpbSIsImNoYXJDb2RlUSIsImNoYXJDb2RlQXQiLCJhcGlMZXZlbERpZmYiLCJjb2RlbmFtZSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImdldFBsYXRmb3JtVmVyc2lvbiIsInRvTG93ZXJDYXNlIiwidG9VcHBlckNhc2UiLCJpc05hTiIsIm1lc3NhZ2UiLCJpbmZvIiwiaXNEZXZpY2VDb25uZWN0ZWQiLCJkZXZpY2VzIiwiZ2V0Q29ubmVjdGVkRGV2aWNlcyIsIm1rZGlyIiwicmVtb3RlUGF0aCIsImlzVmFsaWRDbGFzcyIsImNsYXNzU3RyaW5nIiwibWF0Y2hDb21wb25lbnROYW1lIiwicmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSIsInBrZyIsIm9wdHMiLCJwcmVmZXJDbWQiLCJzdGRvdXQiLCJuYW1lcyIsInBhcnNlTGF1bmNoYWJsZUFjdGl2aXR5TmFtZXMiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ0bXBBcHAiLCJwdWxsQXBrIiwiYXBrQWN0aXZpdHkiLCJwYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QiLCJzdGFjayIsIndhcm4iLCJyaW1yYWYiLCJzdGRlcnIiLCJvdXRwdXRGb3JtYXQiLCJFWEVDX09VVFBVVF9GT1JNQVQiLCJGVUxMIiwibGluZSIsInNwbGl0IiwibWFwIiwiZm9yY2VTdG9wIiwia2lsbFBhY2thZ2UiLCJjbGVhciIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJhcGsiLCJ0YXJnZXRTZGsiLCJkdW1wc3lzT3V0cHV0IiwidGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHIiwidGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0IiwiZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMiLCJnZXREZW5pZWRQZXJtaXNzaW9ucyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiZ2V0U2V0dGluZyIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImdldElNRUxpc3RGcm9tT3V0cHV0IiwiZW5hYmxlZElNRXMiLCJlbmFibGVJTUUiLCJpbWVJZCIsImRpc2FibGVJTUUiLCJzZXRJTUUiLCJkZWZhdWx0SU1FIiwiZW5naW5lIiwia2V5ZXZlbnQiLCJrZXljb2RlIiwiY29kZSIsImlucHV0VGV4dCIsInRleHQiLCJvcmlnaW5hbFN0ciIsImVzY2FwZWRUZXh0IiwicmVwbGFjZSIsImV2ZXJ5IiwiYyIsImluY2x1ZGVzIiwicSIsImNsZWFyVGV4dEZpZWxkIiwiaSIsImxvY2siLCJpc1NjcmVlbkxvY2tlZCIsInRpbWVvdXRNcyIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiYmFjayIsImdvVG9Ib21lIiwiZ2V0QWRiUGF0aCIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U3VyZmFjZU9yaWVudGF0aW9uIiwic2VuZFRlbG5ldENvbW1hbmQiLCJjb21tYW5kIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwicG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImlzQWlycGxhbmVNb2RlT24iLCJzZXRBaXJwbGFuZU1vZGUiLCJvbiIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsInByaXZpbGVnZWQiLCJpZ24iLCJpc1dpZmlPbiIsImlzRGF0YU9uIiwic2V0V2lmaUFuZERhdGEiLCJ3aWZpIiwiZGF0YSIsImlzRW11bGF0b3IiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0FuaW1hdGlvbk9uIiwiYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUiLCJ0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSIsIndpbmRvd19hbmltYXRpb25fc2NhbGUiLCJzZXR0aW5nIiwibG9jYWxQYXRoIiwicG9zaXgiLCJkaXJuYW1lIiwiYWRiRXhlYyIsInB1bGwiLCJ0aW1lb3V0IiwicHJvY2Vzc0V4aXN0cyIsInByb2Nlc3NOYW1lIiwiZ2V0UElEc0J5TmFtZSIsImdldEZvcndhcmRMaXN0IiwiY29ubmVjdGlvbnMiLCJFT0wiLCJmb3J3YXJkUG9ydCIsInN5c3RlbVBvcnQiLCJkZXZpY2VQb3J0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJnZXRSZXZlcnNlTGlzdCIsInJldmVyc2VQb3J0IiwicmVtb3ZlUG9ydFJldmVyc2UiLCJmb3J3YXJkQWJzdHJhY3RQb3J0IiwicGluZyIsImluZGV4T2YiLCJyZXN0YXJ0Iiwic3RvcExvZ2NhdCIsInJlc3RhcnRBZGIiLCJ3YWl0Rm9yRGV2aWNlIiwic3RhcnRMb2djYXQiLCJfbG9nY2F0U3RhcnR1cFBhcmFtcyIsImxvZ2NhdCIsIkxvZ2NhdCIsImRlYnVnVHJhY2UiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0Iiwic3RhcnRDYXB0dXJlIiwic3RvcENhcHR1cmUiLCJnZXRMb2djYXRMb2dzIiwiZ2V0TG9ncyIsInNldExvZ2NhdExpc3RlbmVyIiwibGlzdGVuZXIiLCJyZW1vdmVMb2djYXRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwibGlzdFByb2Nlc3NTdGF0dXMiLCJpc0Jvb2xlYW4iLCJfZG9lc1BzU3VwcG9ydEFPcHRpb24iLCJnZXROYW1lQnlQaWQiLCJwaWQiLCJ0aXRsZU1hdGNoIiwiZXhlYyIsImFsbFRpdGxlcyIsInBpZEluZGV4IiwibmFtZU9mZnNldCIsInBpZFJlZ2V4IiwibWF0Y2hlZExpbmUiLCJpdGVtcyIsIm5hbWUiLCJfaXNQZ3JlcEF2YWlsYWJsZSIsInBncmVwT3V0cHV0IiwiX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2giLCJfaXNQaWRvZkF2YWlsYWJsZSIsInNoZWxsQ29tbWFuZCIsImVzY2FwZVJlZ0V4cCIsInNsaWNlIiwieCIsInBpZHMiLCJwcm9jZXNzTmFtZVJlZ2V4Iiwia2lsbFByb2Nlc3Nlc0J5TmFtZSIsIkIiLCJhbGwiLCJraWxsUHJvY2Vzc0J5UElEIiwibm9Qcm9jZXNzRmxhZyIsImUxIiwiYnJvYWRjYXN0UHJvY2Vzc0VuZCIsImludGVudCIsImJyb2FkY2FzdCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsInNsZWVwIiwiZW5kQW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudFByb2MiLCJpc1J1bm5pbmciLCJzdG9wIiwiaW5zdHJ1bWVudCIsImFjdGl2aXR5IiwiaW5zdHJ1bWVudFdpdGgiLCJwa2dBY3Rpdml0eSIsImFuZHJvaWRDb3ZlcmFnZSIsImluc3RydW1lbnRDbGFzcyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJyZXNvbHZlIiwicmVqZWN0IiwiZGVmYXVsdEFyZ3MiLCJjb25jYXQiLCJTdWJQcm9jZXNzIiwid2FpdEZvckFjdGl2aXR5IiwicHJvcGVydHkiLCJ2YWwiLCJzZXREZXZpY2VQcm9wZXJ0eSIsInByb3AiLCJnZXREZXZpY2VTeXNMYW5ndWFnZSIsImdldERldmljZVN5c0NvdW50cnkiLCJnZXREZXZpY2VTeXNMb2NhbGUiLCJnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UiLCJnZXREZXZpY2VQcm9kdWN0Q291bnRyeSIsImdldERldmljZVByb2R1Y3RMb2NhbGUiLCJnZXRNb2RlbCIsImdldE1hbnVmYWN0dXJlciIsImdldFNjcmVlblNpemUiLCJzaXplIiwiZ2V0U2NyZWVuRGVuc2l0eSIsImRlbnNpdHkiLCJkZW5zaXR5TnVtYmVyIiwic2V0SHR0cFByb3h5IiwicHJveHlIb3N0IiwicHJveHlQb3J0IiwicHJveHkiLCJpc1VuZGVmaW5lZCIsImh0dHBQcm94eVNldHRpbnMiLCJzZXR0aW5nS2V5Iiwic2V0dGluZ1ZhbHVlIiwiZGVsZXRlSHR0cFByb3h5IiwibmFtZXNwYWNlIiwiYnVncmVwb3J0Iiwic2NyZWVucmVjb3JkIiwiZGVzdGluYXRpb24iLCJvcHRpb25zIiwidmlkZW9TaXplIiwiYml0UmF0ZSIsInRpbWVMaW1pdCIsImJ1Z1JlcG9ydCIsImZ1bGxDbWQiLCJxdW90ZSIsInJ1bkluSW1lQ29udGV4dCIsImltZSIsImZuIiwib3JpZ2luYWxJbWUiLCJkZWxheSIsImdldFRpbWVab25lIiwibGlzdEZlYXR1cmVzIiwiX21lbW9pemVkRmVhdHVyZXMiLCJtZW1vaXplIiwiY3VyRGV2aWNlSWQiLCJpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCIsInByb3RvIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJfaGVscE91dHB1dCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiYmluYXJ5IiwiZ2V0VmVyc2lvbiIsImNvbXBhcmVWZXJzaW9ucyIsInZlcnNpb24iLCJnZXREZXZpY2VJZGxlV2hpdGVsaXN0Iiwib3V0cHV0IiwiYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0IiwicGFja2FnZXMiLCJwbHVyYWxpemUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvYWRiLWNvbW1hbmRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldElNRUxpc3RGcm9tT3V0cHV0LCBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLFxuICBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzLCBtYXRjaENvbXBvbmVudE5hbWUsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHRlbXBEaXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IExvZ2NhdCBmcm9tICcuLi9sb2djYXQnO1xuaW1wb3J0IHsgc2xlZXAsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEggPSAxMDAwO1xuY29uc3QgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiA9IC9ub3QgYSBjaGFuZ2VhYmxlIHBlcm1pc3Npb24gdHlwZS9pO1xuY29uc3QgSUdOT1JFRF9QRVJNX0VSUk9SUyA9IFtcbiAgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUixcbiAgL1Vua25vd24gcGVybWlzc2lvbi9pLFxuXTtcbmNvbnN0IE1BWF9QR1JFUF9QQVRURVJOX0xFTiA9IDE1O1xuY29uc3QgSElEREVOX0FQSV9QT0xJQ1lfS0VZUyA9IFtcbiAgJ2hpZGRlbl9hcGlfcG9saWN5X3ByZV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3lfcF9hcHBzJyxcbiAgJ2hpZGRlbl9hcGlfcG9saWN5J1xuXTtcbmNvbnN0IFBJRF9DT0xVTU5fVElUTEUgPSAnUElEJztcbmNvbnN0IFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUgPSAnTkFNRSc7XG5jb25zdCBQU19USVRMRV9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtQSURfQ09MVU1OX1RJVExFfVxcXFxiLipcXFxcYiR7UFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRX1cXFxcYi4qKSRgLCAnbScpO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU3OTE0MjMvYWRiLXNoZWxsLWlucHV0LXRleHQtZG9lcy1ub3QtdGFrZS1hbXBlcnNhbmQtY2hhcmFjdGVyLzI1NzkxNDk4XG5jb25zdCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4gPSAvWygpPD58OyYqXFxcXH5eXCInXS9nO1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBjaHVua3MgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGV4ZWN1dGVzIHRoZW0gaW4gYGFkYiBzaGVsbGAuXG4gKiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYGFkYiBzaGVsbGAgc2VwYXJhdGVseSBmb3IgZWFjaCBhcmcsIGhvd2V2ZXJcbiAqIHRoZXJlIGlzIGEgbGltaXQgZm9yIGEgbWF4aW11bSBsZW5ndGggb2YgYSBzaW5nbGUgYWRiIGNvbW1hbmQuIHRoYXQgaXMgd2h5XG4gKiB3ZSBuZWVkIGFsbCB0aGlzIGNvbXBsaWNhdGVkIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFyZ1RyYW5zZm9ybWVyIEEgZnVuY3Rpb24sIHRoYXQgcmVjZWl2ZXMgc2luZ2xlIGFyZ3VtZW50XG4gKiBmcm9tIHRoZSBgYXJnc2AgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHNoZWxsIGNvbW1hbmQuIFRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGFuIGFycmF5LCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBwYXJ0IG9mIGEgc2luZ2xlIGNvbW1hbmQuXG4gKiBUaGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSBjb3VsZCBiZSAnOycuIElmIHRoaXMgaXMgbm90IGEgc2VtaWNvbG9uIHRoZW4gaXQgaXMgZ29pbmcgdG9cbiAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcnxzdHJpbmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcyB0byBjcmVhdGUgY2h1bmtzIGZvclxuICogQHRocm93cyB7RXJyb3J9IElmIGFueSBvZiB0aGUgY2h1bmtzIHJldHVybnMgbm9uLXplcm8gZXhpdCBjb2RlIGFmdGVyIGJlaW5nIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuc2hlbGxDaHVua3MgPSBhc3luYyBmdW5jdGlvbiBzaGVsbENodW5rcyAoYXJnVHJhbnNmb3JtZXIsIGFyZ3MpIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgbGV0IGNtZENodW5rID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBjb25zdCBuZXh0Q21kID0gYXJnVHJhbnNmb3JtZXIoYXJnKTtcbiAgICBpZiAoIV8uaXNBcnJheShuZXh0Q21kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0cmFuc2Zvcm1lciBtdXN0IHJlc3VsdCBpbiBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoXy5sYXN0KG5leHRDbWQpICE9PSAnOycpIHtcbiAgICAgIG5leHRDbWQucHVzaCgnOycpO1xuICAgIH1cbiAgICBpZiAobmV4dENtZC5qb2luKCcgJykubGVuZ3RoICsgY21kQ2h1bmsuam9pbignICcpLmxlbmd0aCA+PSBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCkge1xuICAgICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gICAgICBjbWRDaHVuayA9IFtdO1xuICAgIH1cbiAgICBjbWRDaHVuayA9IFsuLi5jbWRDaHVuaywgLi4ubmV4dENtZF07XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoY21kQ2h1bmspKSB7XG4gICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gIH1cbiAgbG9nLmRlYnVnKGBHb3QgdGhlIGZvbGxvd2luZyBjb21tYW5kIGNodW5rcyB0byBleGVjdXRlOiAke0pTT04uc3RyaW5naWZ5KGNvbW1hbmRzKX1gKTtcbiAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gIGZvciAoY29uc3QgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoY21kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdEVycm9yKSB7XG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byBhZGIgZXhlY3V0YWJsZSBhbWQgYXNzaWduIGl0XG4gKiB0byB0aGlzLmV4ZWN1dGFibGUucGF0aCBhbmQgdGhpcy5iaW5hcmllcy5hZGIgcHJvcGVydGllcy5cbiAqXG4gKiBAcmV0dXJuIHtBREJ9IEFEQiBpbnN0YW5jZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggPSBhc3luYyBmdW5jdGlvbiBnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggKCkge1xuICB0aGlzLmV4ZWN1dGFibGUucGF0aCA9IGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWRiJyk7XG4gIHJldHVybiB0aGlzLmFkYjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdCB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0ID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQnKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdDIgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQyIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQyID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQyICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0MicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byB6aXBhbGlnbiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuemlwYWxpZ24gcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0WmlwQWxpZ24gPSBhc3luYyBmdW5jdGlvbiBpbml0WmlwQWxpZ24gKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ3ppcGFsaWduJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGJ1bmRsZXRvb2wgYmluYXJ5IGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRCdW5kbGV0b29sID0gYXN5bmMgZnVuY3Rpb24gaW5pdEJ1bmRsZXRvb2wgKCkge1xuICB0cnkge1xuICAgIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCA9IGF3YWl0IGZzLndoaWNoKCdidW5kbGV0b29sLmphcicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1bmRsZXRvb2wuamFyIGJpbmFyeSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIFBBVEguICcgK1xuICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbCBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEFQSSBsZXZlbCBhcyBpbnRlZ2VyIG51bWJlciwgZm9yIGV4YW1wbGUgMjEgZm9yXG4gKiAgICAgICAgICAgICAgICAgIEFuZHJvaWQgTG9sbGlwb3AuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FjaGVkLCBzbyBhbGwgdGhlIGZ1cnRoZXJcbiAqIGNhbGxzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgZmlyc3Qgb25lLlxuICovXG5tZXRob2RzLmdldEFwaUxldmVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBpTGV2ZWwgKCkge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHRoaXMuX2FwaUxldmVsKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJPdXRwdXQgPSBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnNkaycpO1xuICAgICAgbGV0IGFwaUxldmVsID0gcGFyc2VJbnQoc3RyT3V0cHV0LnRyaW0oKSwgMTApO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBwcmV2aWV3L2JldGEgcGxhdGZvcm0gQVBJIGxldmVsXG4gICAgICBjb25zdCBjaGFyQ29kZVEgPSAncScuY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIDI4IGlzIHRoZSBmaXJzdCBBUEkgTGV2ZWwsIHdoZXJlIEFuZHJvaWQgU0RLIHN0YXJ0ZWQgcmV0dXJuaW5nIGxldHRlcnMgaW4gcmVzcG9uc2UgdG8gZ2V0UGxhdGZvcm1WZXJzaW9uXG4gICAgICBjb25zdCBhcGlMZXZlbERpZmYgPSBhcGlMZXZlbCAtIDI4O1xuICAgICAgY29uc3QgY29kZW5hbWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlUSArIGFwaUxldmVsRGlmZik7XG4gICAgICBpZiAoYXBpTGV2ZWxEaWZmID49IDAgJiYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkpLnRvTG93ZXJDYXNlKCkgPT09IGNvZGVuYW1lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVsZWFzZSB2ZXJzaW9uIGlzICR7Y29kZW5hbWUudG9VcHBlckNhc2UoKX0gYnV0IGZvdW5kIEFQSSBMZXZlbCAke2FwaUxldmVsfS4gU2V0dGluZyBBUEkgTGV2ZWwgdG8gJHthcGlMZXZlbCArIDF9YCk7XG4gICAgICAgIGFwaUxldmVsKys7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FwaUxldmVsID0gYXBpTGV2ZWw7XG4gICAgICBsb2cuZGVidWcoYERldmljZSBBUEkgbGV2ZWw6ICR7dGhpcy5fYXBpTGV2ZWx9YCk7XG4gICAgICBpZiAoaXNOYU4odGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFjdHVhbCBvdXRwdXQgJyR7c3RyT3V0cHV0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBBUEkgbGV2ZWwuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FwaUxldmVsO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBhcyBhIHN0cmluZywgZm9yIGV4YW1wbGUgJzUuMCcgZm9yXG4gKiBBbmRyb2lkIExvbGxpcG9wLlxuICovXG5tZXRob2RzLmdldFBsYXRmb3JtVmVyc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbiAoKSB7XG4gIGxvZy5pbmZvKCdHZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYSBkZXZpY2UgaXMgY29ubmVjdGVkLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBpcyB2aXNpYmxlIHRvIGFkYi5cbiAqL1xubWV0aG9kcy5pc0RldmljZUNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzRGV2aWNlQ29ubmVjdGVkICgpIHtcbiAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgcmV0dXJuIGRldmljZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY3JlYXRlIGEgbmV3IGZvbGRlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgbmV3IHBhdGggdG8gYmUgY3JlYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gbWtkaXIgY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMubWtkaXIgPSBhc3luYyBmdW5jdGlvbiBta2RpciAocmVtb3RlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYVxuICogdmFsaWQgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgLSBUaGUgYWN0dWFsIGNsYXNzIG5hbWUgdG8gYmUgdmVyaWZpZWQuXG4gKiBAcmV0dXJuIHs/QXJyYXkuPE1hdGNoPn0gVGhlIHJlc3VsdCBvZiBSZWdleHAuZXhlYyBvcGVyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmQuXG4gKi9cbm1ldGhvZHMuaXNWYWxpZENsYXNzID0gZnVuY3Rpb24gaXNWYWxpZENsYXNzIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiBtYXRjaENvbXBvbmVudE5hbWUoY2xhc3NTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXNvbHZlQWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBwcmVmZXJDbWQgW3RydWVdIFdoZXRoZXIgdG8gcHJlZmVyIGBjbWRgIHRvb2wgdXNhZ2UgZm9yXG4gKiBsYXVuY2hhYmxlIGFjdGl2aXR5IG5hbWUgZGV0ZWN0aW9uLiBJdCBtaWdodCBiZSB1c2VmdWwgdG8gZGlzYWJsZSBpdCBpZlxuICogYGNtZCBwYWNrYWdlIHJlc29sdmUtYWN0aXZpdHlgIHJldHVybnMgJ2FuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJlc29sdmVyQWN0aXZpdHknLFxuICogd2hpY2ggbWVhbnMgdGhlIGFwcCBoYXMgbm8gZGVmYXVsdCBoYW5kbGVyIHNldCBpbiBzeXN0ZW0gc2V0dGluZ3MuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3MTI4IGZvciBtb3JlIGRldGFpbHMuXG4gKiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIHRoZSB0YXJnZXQgQW5kcm9pZCB2ZXJzaW9uIGlzIGJlbG93IDI0IGFzIHRoZXJlXG4gKiB0aGUgY29ycmVzcG9uZGluZyBgY21kYCBzdWJjb21tYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBhbmQgZHVtcHN5cyB1c2FnZSBpcyB0aGUgb25seVxuICogcG9zc2libGUgd2F5IHRvIGRldGVjdCB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBuYW1lLlxuICovXG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgZm9yIHRoZVxuICogZ2l2ZW4gcGFja2FnZS4gSXQgaXMgZXhwZWN0ZWQgdGhlIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQgb25cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHRhcmdldCBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7UmVzb2x2ZUFjdGl2aXR5T3B0aW9ucz99IG9wdHNcbiAqIEByZXR1cm4ge3N0cmluZ30gRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHlcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVzb2x2aW5nIHRoZSBhY3Rpdml0eSBuYW1lXG4gKi9cbm1ldGhvZHMucmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkgKHBrZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcHJlZmVyQ21kID0gdHJ1ZSB9ID0gb3B0cztcbiAgaWYgKCFwcmVmZXJDbWQgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjQpIHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgbmFtZXMgPSBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzKHN0ZG91dCk7XG4gICAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBvZiAnJHtwa2d9Jy4gSXMgaXQgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2U/YCk7XG4gICAgfVxuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9XG5cbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRtcEFwcCA9IGF3YWl0IHRoaXMucHVsbEFwayhwa2csIHRtcFJvb3QpO1xuICAgICAgY29uc3Qge2Fwa0FjdGl2aXR5fSA9IGF3YWl0IHRoaXMucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0KHRtcEFwcCk7XG4gICAgICByZXR1cm4gYXBrQWN0aXZpdHk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBgICtcbiAgICAgICAgYFRoZSB2ZXJ5IGZpcnN0IG1hdGNoIG9mIHRoZSBkdW1wc3lzIG91dHB1dCBpcyBnb2luZyB0byBiZSB1c2VkLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2NtZCcsICdwYWNrYWdlJywgJ3Jlc29sdmUtYWN0aXZpdHknLCAnLS1icmllZicsIHBrZ10sIHtcbiAgICBvdXRwdXRGb3JtYXQ6IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULkZVTExcbiAgfSk7XG4gIGZvciAoY29uc3QgbGluZSBvZiAoc3Rkb3V0IHx8ICcnKS5zcGxpdCgnXFxuJykubWFwKF8udHJpbSkpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkQ2xhc3MobGluZSkpIHtcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnIgfHwgc3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBGb3JjZSBhcHBsaWNhdGlvbiB0byBzdG9wIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmZvcmNlU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIGZvcmNlU3RvcCAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnZm9yY2Utc3RvcCcsIHBrZ10pO1xufTtcblxuLypcbiAqIEtpbGwgYXBwbGljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmtpbGxQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24ga2lsbFBhY2thZ2UgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2tpbGwnLCBwa2ddKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIHVzZXIgZGF0YSBvZiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIGNsZWFyZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnY2xlYXInLCBwa2ddKTtcbn07XG5cbi8qKlxuICogR3JhbnQgYWxsIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBieSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgb24gQW5kcm9pZCA2LjArIGFuZCBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IHN1cHBvcnQgY29tcG9uZW50cy1iYXNlZCBwZXJtaXNzaW9ucyBzZXR0aW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgcGF0aCB0byB0aGUgYWN0dWFsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBncmFudGluZyBwZXJtaXNzaW9uc1xuICovXG5tZXRob2RzLmdyYW50QWxsUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudEFsbFBlcm1pc3Npb25zIChwa2csIGFwaykge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IHRhcmdldFNkayA9IDA7XG4gIGxldCBkdW1wc3lzT3V0cHV0ID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwaykge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiBhcGsgbm90IHByb3ZpZGVkLCBjb25zaWRlcmluZyBhcGsgYWxyZWFkeSBpbnN0YWxsZWQgb24gdGhlIGRldmljZVxuICAgICAgICogYW5kIGZldGNoaW5nIHRhcmdldFNkayB1c2luZyBwYWNrYWdlIG5hbWUuXG4gICAgICAgKi9cbiAgICAgIGR1bXBzeXNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Gcm9tTWFuaWZlc3QoYXBrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvL2F2b2lkaW5nIGxvZ2dpbmcgZXJyb3Igc3RhY2ssIGFzIGNhbGxpbmcgbGlicmFyeSBmdW5jdGlvbiB3b3VsZCBoYXZlIGxvZ2dlZFxuICAgIGxvZy53YXJuKGBSYW4gaW50byBwcm9ibGVtIGdldHRpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uOyBpZ25vcmluZy4uLmApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA+PSAyMyAmJiB0YXJnZXRTZGsgPj0gMjMpIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCA2LjAoQVBJIDIzKSBvciBoaWdoZXIsIGFuZCB5b3VyIGFwcCdzIHRhcmdldCBTREsgaXMgMjMgb3IgaGlnaGVyOlxuICAgICAqIFRoZSBhcHAgaGFzIHRvIGxpc3QgdGhlIHBlcm1pc3Npb25zIGluIHRoZSBtYW5pZmVzdC5cbiAgICAgKiByZWZlcjogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvcGVybWlzc2lvbnMvcmVxdWVzdGluZy5odG1sXG4gICAgICovXG4gICAgZHVtcHN5c091dHB1dCA9IGR1bXBzeXNPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IHJlcXVlc3RlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRSZXFQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnNUb0dyYW50ID0gXy5kaWZmZXJlbmNlKHJlcXVlc3RlZFBlcm1pc3Npb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnNUb0dyYW50KSkge1xuICAgICAgbG9nLmluZm8oYCR7cGtnfSBjb250YWlucyBubyBwZXJtaXNzaW9ucyBhdmFpbGFibGUgZm9yIGdyYW50aW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ3JhbnRQZXJtaXNzaW9ucyhwa2csIHBlcm1pc3Npb25zVG9HcmFudCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IG11bHRpcGxlIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBjYWxsIGlzIG1vcmUgcGVyZm9ybWFudCB0aGFuIGBncmFudFBlcm1pc3Npb25gIG9uZSwgc2luY2UgaXQgY29tYmluZXNcbiAqIG11bHRpcGxlIGBhZGIgc2hlbGxgIGNhbGxzIGludG8gYSBzaW5nbGUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbnMgKHBrZywgcGVybWlzc2lvbnMpIHtcbiAgLy8gQXMgaXQgY29uc3VtZXMgbW9yZSB0aW1lIGZvciBncmFudGluZyBlYWNoIHBlcm1pc3Npb24sXG4gIC8vIHRyeWluZyB0byBncmFudCBhbGwgcGVybWlzc2lvbiBieSBmb3JtaW5nIGVxdWl2YWxlbnQgY29tbWFuZC5cbiAgLy8gQWxzbywgaXQgaXMgbmVjZXNzYXJ5IHRvIHNwbGl0IGxvbmcgY29tbWFuZHMgaW50byBjaHVua3MsIHNpbmNlIHRoZSBtYXhpbXVtIGxlbmd0aCBvZlxuICAvLyBhZGIgc2hlbGwgYnVmZmVyIGlzIGxpbWl0ZWRcbiAgbG9nLmRlYnVnKGBHcmFudGluZyBwZXJtaXNzaW9ucyAke0pTT04uc3RyaW5naWZ5KHBlcm1pc3Npb25zKX0gdG8gJyR7cGtnfSdgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwZXJtKSA9PiBbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtXSwgcGVybWlzc2lvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFJR05PUkVEX1BFUk1fRVJST1JTLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgc2luZ2xlIHBlcm1pc3Npb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXZva2Ugc2luZ2xlIHBlcm1pc3Npb24gZnJvbSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSByZXZva2VkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5yZXZva2VQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gcmV2b2tlUGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ3Jldm9rZScsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0R3JhbnRlZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldERlbmllZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGVuaWVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZGVuaWVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIGZhbHNlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0UmVxUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXFQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyByZXF1ZXN0ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydyZXF1ZXN0ZWQnXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGxvY2F0aW9uIHByb3ZpZGVycyBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBhdmFpbGFibGUgbG9jYXRpb24gcHJvdmlkZXJzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TG9jYXRpb25Qcm92aWRlcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvblByb3ZpZGVycyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcpO1xuICByZXR1cm4gc3Rkb3V0LnRyaW0oKS5zcGxpdCgnLCcpXG4gICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBzdGF0ZSBvZiBHUFMgbG9jYXRpb24gcHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0byBlbmFibGUgKHRydWUpIG9yIGRpc2FibGUgKGZhbHNlKSB0aGUgR1BTIHByb3ZpZGVyLlxuICovXG5tZXRob2RzLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIChlbmFibGVkKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJywgYCR7ZW5hYmxlZCA/ICcrJyA6ICctJ31ncHNgKTtcbn07XG5cbi8qKlxuICogU2V0IGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhY2Nlc3MgdG8gbm9uLVNESyBBUElzLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIFRoZSBBUEkgZW5mb3JjZW1lbnQgcG9saWN5LlxuICogICAgIEZvciBBbmRyb2lkIFBcbiAqICAgICAwOiBEaXNhYmxlIG5vbi1TREsgQVBJIHVzYWdlIGRldGVjdGlvbi4gVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBsb2dnaW5nLCBhbmQgYWxzbyBicmVhayB0aGUgc3RyaWN0IG1vZGUgQVBJLFxuICogICAgICAgIGRldGVjdE5vblNka0FwaVVzYWdlKCkuIE5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBcIkp1c3Qgd2FyblwiIC0gcGVybWl0IGFjY2VzcyB0byBhbGwgbm9uLVNESyBBUElzLCBidXQga2VlcCB3YXJuaW5ncyBpbiB0aGUgbG9nLlxuICogICAgICAgIFRoZSBzdHJpY3QgbW9kZSBBUEkgd2lsbCBrZWVwIHdvcmtpbmcuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGFuZCBibGFjayBsaXN0ZWQgQVBJcy5cbiAqICAgICAzOiBEaXNhbGxvdyB1c2FnZSBvZiBibGFja2xpc3RlZCBBUElzLCBidXQgYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGxpc3RlZCBBUElzLlxuICpcbiAqICAgICBGb3IgQW5kcm9pZCBRXG4gKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9ub24tc2RrLXEjZW5hYmxlLW5vbi1zZGstYWNjZXNzXG4gKiAgICAgMDogRGlzYWJsZSBhbGwgZGV0ZWN0aW9uIG9mIG5vbi1TREsgaW50ZXJmYWNlcy4gVXNpbmcgdGhpcyBzZXR0aW5nIGRpc2FibGVzIGFsbCBsb2cgbWVzc2FnZXMgZm9yIG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlXG4gKiAgICAgICAgYW5kIHByZXZlbnRzIHlvdSBmcm9tIHRlc3RpbmcgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLiBUaGlzIHNldHRpbmcgaXMgbm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IEVuYWJsZSBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgaW50ZXJmYWNlcywgYnV0IHByaW50IGxvZyBtZXNzYWdlcyB3aXRoIHdhcm5pbmdzIGZvciBhbnkgbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2UuXG4gKiAgICAgICAgVXNpbmcgdGhpcyBzZXR0aW5nIGFsc28gYWxsb3dzIHlvdSB0byB0ZXN0IHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBub24tU0RLIGludGVyZmFjZXMgdGhhdCBiZWxvbmcgdG8gZWl0aGVyIHRoZSBibGFjayBsaXN0XG4gKiAgICAgICAgb3IgdG8gYSByZXN0cmljdGVkIGdyZXlsaXN0IGZvciB5b3VyIHRhcmdldCBBUEkgbGV2ZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SGlkZGVuQXBpUG9saWN5ICh2YWx1ZSwgaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBwdXQgZ2xvYmFsICR7a30gJHt2YWx1ZX1gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBzZXQgc2V0dGluZyBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9JyB0byAnJHt2YWx1ZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXQgYWNjZXNzIHRvIG5vbi1TREsgQVBJcyB0byBpdHMgZGVmYXVsdCBzZXR0aW5nLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgKGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCAke2t9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gZGVsZXRlIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RvcCB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIGNsZWFycyBpdHMgYXBwbGljYXRpb24gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKi9cbm1ldGhvZHMuc3RvcEFuZENsZWFyID0gYXN5bmMgZnVuY3Rpb24gc3RvcEFuZENsZWFyIChwa2cpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIGF3YWl0IHRoaXMuY2xlYXIocGtnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0b3AgYW5kIGNsZWFyICR7cGtnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5hdmFpbGFibGVJTUVzID0gYXN5bmMgZnVuY3Rpb24gYXZhaWxhYmxlSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCcsICctYSddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYXZhaWxhYmxlIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZW5hYmxlZCBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBlbmFibGVkIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmVuYWJsZWRJTUVzID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlZElNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGVuYWJsZWQgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmFibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5lbmFibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZW5hYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmRpc2FibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBkaXNhYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2Rpc2FibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5zZXRJTUUgPSBhc3luYyBmdW5jdGlvbiBzZXRJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnc2V0JywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kXG4gKi9cbm1ldGhvZHMuZGVmYXVsdElNRSA9IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJTUUgKCkge1xuICB0cnkge1xuICAgIGxldCBlbmdpbmUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdkZWZhdWx0X2lucHV0X21ldGhvZCcpO1xuICAgIGlmIChlbmdpbmUgPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbmdpbmUudHJpbSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRlZmF1bHQgSU1FLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGtleWNvZGUgLSBUaGUgYWN0dWFsIGtleSBjb2RlIHRvIGJlIHNlbnQuXG4gKi9cbm1ldGhvZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiBrZXlldmVudCAoa2V5Y29kZSkge1xuICAvLyBrZXljb2RlIG11c3QgYmUgYW4gaW50LlxuICBsZXQgY29kZSA9IHBhcnNlSW50KGtleWNvZGUsIDEwKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgY29kZV0pO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIHRleHQgb3IgYSBudW1iZXIgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIHRleHQgZ2V0cyBwcm9wZXJseSBlc2NhcGVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gQURCLlxuICogTm9vcCBpZiB0aGUgdGV4dCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHRleHQgLSBUaGUgYWN0dWFsIHRleHQgdG8gYmUgc2VudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nXG4gKi9cbm1ldGhvZHMuaW5wdXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gaW5wdXRUZXh0ICh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsU3RyID0gYCR7dGV4dH1gO1xuICBjb25zdCBlc2NhcGVkVGV4dCA9IG9yaWdpbmFsU3RyLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKS5yZXBsYWNlKC8gL2csICclcycpO1xuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAndGV4dCcsIG9yaWdpbmFsU3RyXTtcbiAgaWYgKGVzY2FwZWRUZXh0ICE9PSBvcmlnaW5hbFN0ciB8fCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4udGVzdChvcmlnaW5hbFN0cikpIHtcbiAgICBpZiAoXy5ldmVyeShbJ1wiJywgYCdgXSwgKGMpID0+IG9yaWdpbmFsU3RyLmluY2x1ZGVzKGMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBrbm93IGhvdyB0byBlc2NhcGUgYSBzdHJpbmcgdGhhdCBjb250YWlucyBib3RoIHR5cGVzIG9mIHF1b3RlcyAoXCIgYW5kICcpYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcSA9IG9yaWdpbmFsU3RyLmluY2x1ZGVzKCdcIicpID8gYCdgIDogJ1wiJztcbiAgICBhcmdzID0gW2BpbnB1dCB0ZXh0ICR7cX0ke2VzY2FwZWRUZXh0fSR7cX1gXTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgYWN0aXZlIHRleHQgZmllbGQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0IGJ5IHNlbmRpbmdcbiAqIHNwZWNpYWwga2V5ZXZlbnRzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggWzEwMF0gLSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdGhlIGZpZWxkIHRvIGJlIGNsZWFyZWQuXG4gKi9cbm1ldGhvZHMuY2xlYXJUZXh0RmllbGQgPSBhc3luYyBmdW5jdGlvbiBjbGVhclRleHRGaWVsZCAobGVuZ3RoID0gMTAwKSB7XG4gIC8vIGFzc3VtZXMgdGhhdCB0aGUgRWRpdFRleHQgZmllbGQgYWxyZWFkeSBoYXMgZm9jdXNcbiAgbG9nLmRlYnVnKGBDbGVhcmluZyB1cCB0byAke2xlbmd0aH0gY2hhcmFjdGVyc2ApO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICdrZXlldmVudCddO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgLy8gd2UgY2Fubm90IGtub3cgd2hlcmUgdGhlIGN1cnNvciBpcyBpbiB0aGUgdGV4dCBmaWVsZCwgc28gZGVsZXRlIGJvdGggYmVmb3JlXG4gICAgLy8gYW5kIGFmdGVyIHNvIHRoYXQgd2UgZ2V0IHJpZCBvZiBldmVyeXRoaW5nXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfREVMXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRk9SV0FSRF9ERUxcbiAgICBhcmdzLnB1c2goJzY3JywgJzExMicpO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gbG9jayBpdC5cbiAqL1xubWV0aG9kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCkpIHtcbiAgICBsb2cuZGVidWcoJ1NjcmVlbiBpcyBhbHJlYWR5IGxvY2tlZC4gRG9pbmcgbm90aGluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgS0VZQ09ERV9QT1dFUiBidXR0b24gdG8gbG9jayBzY3JlZW4nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgyNik7XG5cbiAgY29uc3QgdGltZW91dE1zID0gNTAwMDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMsXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkZXZpY2Ugc2NyZWVuIGlzIHN0aWxsIGxvY2tlZCBhZnRlciAke3RpbWVvdXRNc31tcyB0aW1lb3V0YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBCYWNrIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uIGJhY2sgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBCQUNLIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDQpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEhvbWUgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5nb1RvSG9tZSA9IGFzeW5jIGZ1bmN0aW9uIGdvVG9Ib21lICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgSE9NRSBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgzKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgYWN0dWFsIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiUGF0aCA9IGZ1bmN0aW9uIGdldEFkYlBhdGggKCkge1xuICByZXR1cm4gdGhpcy5leGVjdXRhYmxlLnBhdGg7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIGN1cnJlbnQgc2NyZWVuIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGVuY29kZWQgYXMgYW4gaW50ZWdlciBudW1iZXIuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuT3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5PcmllbnRhdGlvbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdpbnB1dCddKTtcbiAgcmV0dXJuIGdldFN1cmZhY2VPcmllbnRhdGlvbihzdGRvdXQpO1xufTtcblxuLyoqXG4gKiBTZW5kIGFuIGFyYml0cmFyeSBUZWxuZXQgY29tbWFuZCB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBiZSBzZW50LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFjdHVhbCBvdXRwdXQgb2YgdGhlIGdpdmVuIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuc2VuZFRlbG5ldENvbW1hbmQgPSBhc3luYyBmdW5jdGlvbiBzZW5kVGVsbmV0Q29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjRW11Q29uc29sZUNvbW1hbmQoY29tbWFuZCwge3BvcnQ6IGF3YWl0IHRoaXMuZ2V0RW11bGF0b3JQb3J0KCl9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgQWlycGxhbmUgbW9kZSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzQWlycGxhbmVNb2RlT24gPSBhc3luYyBmdW5jdGlvbiBpc0FpcnBsYW5lTW9kZU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nKTtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSB0aGUgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqL1xubWV0aG9kcy5zZXRBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBzZXRBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nLCBvbiA/IDEgOiAwKTtcbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzZXRBaXJwbGFuZU1vZGV9LCBvdGhlcndpc2VcbiAqIHRoZSBtb2RlIGNoYW5nZSBpcyBub3QgZ29pbmcgdG8gYmUgYXBwbGllZCBmb3IgdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBicm9hZGNhc3QgZW5hYmxlIGFuZCBmYWxzZSB0byBicm9hZGNhc3QgZGlzYWJsZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5BSVJQTEFORV9NT0RFJyxcbiAgICAnLS1leicsICdzdGF0ZScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgXTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3NDIyXG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsICdTZWN1cml0eUV4Y2VwdGlvbicpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MsIHtwcml2aWxlZ2VkOiB0cnVlfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgV2lGaSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXaUZpIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNXaWZpT24gPSBhc3luYyBmdW5jdGlvbiBpc1dpZmlPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd3aWZpX29uJyk7XG4gIHJldHVybiAocGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDApO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBEYXRhIHRyYW5zZmVyIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNEYXRhT24gPSBhc3luYyBmdW5jdGlvbiBpc0RhdGFPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdtb2JpbGVfZGF0YScpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBXaUZpIGFuZC9vciBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHdpZmkgLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBXaUZpLlxuICogQHBhcmFtIHtib29sZWFufSBkYXRhIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgRGF0YSB0cmFuc2Zlci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbm1ldGhvZHMuc2V0V2lmaUFuZERhdGEgPSBhc3luYyBmdW5jdGlvbiBzZXRXaWZpQW5kRGF0YSAoe3dpZmksIGRhdGF9LCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUod2lmaSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldFdpZmlTdGF0ZSh3aWZpLCBpc0VtdWxhdG9yKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShkYXRhKSkge1xuICAgIGF3YWl0IHRoaXMuc2V0RGF0YVN0YXRlKGRhdGEsIGlzRW11bGF0b3IpO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBhbmltYXRpb24gb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIGFuaW1hdGlvbiBzY2FsZSBzZXR0aW5nc1xuICogICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvICcwLjAnLlxuICovXG5tZXRob2RzLmlzQW5pbWF0aW9uT24gPSBhc3luYyBmdW5jdGlvbiBpc0FuaW1hdGlvbk9uICgpIHtcbiAgbGV0IGFuaW1hdG9yX2R1cmF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUnKTtcbiAgbGV0IHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAndHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUnKTtcbiAgbGV0IHdpbmRvd19hbmltYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd3aW5kb3dfYW5pbWF0aW9uX3NjYWxlJyk7XG4gIHJldHVybiBfLnNvbWUoW2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlLCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSwgd2luZG93X2FuaW1hdGlvbl9zY2FsZV0sXG4gICAgICAgICAgICAgICAgKHNldHRpbmcpID0+IHNldHRpbmcgIT09ICcwLjAnKTtcbn07XG5cbi8qKlxuICogRm9yY2VmdWxseSByZWN1cnNpdmVseSByZW1vdmUgYSBwYXRoIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEJlIGNhcmVmdWwgd2hpbGUgY2FsbGluZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIGJlIHJlbW92ZWQgcmVjdXJzaXZlbHkuXG4gKi9cbm1ldGhvZHMucmltcmFmID0gYXN5bmMgZnVuY3Rpb24gcmltcmFmIChwYXRoKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydybScsICctcmYnLCBwYXRoXSk7XG59O1xuXG4vKipcbiAqIFNlbmQgYSBmaWxlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuIFNlZVxuICogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzLFxuICogICAgICAgICAgICAgICAgICAgICAgICBfZXhlY18gbWV0aG9kIG9wdGlvbnMsIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLlxuICovXG5tZXRob2RzLnB1c2ggPSBhc3luYyBmdW5jdGlvbiBwdXNoIChsb2NhbFBhdGgsIHJlbW90ZVBhdGgsIG9wdHMpIHtcbiAgYXdhaXQgdGhpcy5ta2RpcihwYXRoLnBvc2l4LmRpcm5hbWUocmVtb3RlUGF0aCkpO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydwdXNoJywgbG9jYWxQYXRoLCByZW1vdGVQYXRoXSwgb3B0cyk7XG59O1xuXG4vKipcbiAqIFJlY2VpdmUgYSBmaWxlIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHNvdXJjZSBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuIFNlZVxuICogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzLFxuICogICAgICAgICAgICAgICAgICAgICAgICBfZXhlY18gbWV0aG9kIG9wdGlvbnMsIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLlxuICovXG5tZXRob2RzLnB1bGwgPSBhc3luYyBmdW5jdGlvbiBwdWxsIChyZW1vdGVQYXRoLCBsb2NhbFBhdGgsIG9wdHMgPSB7fSkge1xuICAvLyBwdWxsIGZvbGRlciBjYW4gdGFrZSBtb3JlIHRpbWUsIGluY3JlYXNpbmcgdGltZSBvdXQgdG8gNjAgc2Vjc1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydwdWxsJywgcmVtb3RlUGF0aCwgbG9jYWxQYXRoXSwgey4uLm9wdHMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCA/PyA2MDAwMH0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9jZXNzIHdpdGggdGhlIHBhcnRpY3VsYXIgbmFtZSBpcyBydW5uaW5nIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb2Nlc3MgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIHByb2Nlc3MgaXMgcnVubmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMucHJvY2Vzc0V4aXN0cyA9IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFeGlzdHMgKHByb2Nlc3NOYW1lKSB7XG4gIHJldHVybiAhXy5pc0VtcHR5KGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShwcm9jZXNzTmFtZSkpO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0Rm9yd2FyZExpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydEZvcndhcmQgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0Rm9yd2FyZCAoc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke3N5c3RlbVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYC0tcmVtb3ZlYCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0UmV2ZXJzZUxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXZlcnNlTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCByZXZlcnNlIGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogT25seSBhdmFpbGFibGUgZm9yIEFQSSAyMSsuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKi9cbm1ldGhvZHMucmV2ZXJzZVBvcnQgPSBhc3luYyBmdW5jdGlvbiByZXZlcnNlUG9ydCAoZGV2aWNlUG9ydCwgc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgZGV2aWNlOiAke2RldmljZVBvcnR9IHRvIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYHRjcDoke2RldmljZVBvcnR9YCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0UmV2ZXJzZSA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRSZXZlcnNlIChkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgcmV2ZXJzZSBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtkZXZpY2VQb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGAtLXJlbW92ZWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBkaWZmZXJlbmNlXG4gKiBiZXR3ZWVuIHtAbGluayAjZm9yd2FyZFBvcnR9IGlzIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBzZXR1cCBmb3IgYW4gYWJzdHJhY3RcbiAqIGxvY2FsIHBvcnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZEFic3RyYWN0UG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRBYnN0cmFjdFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBhYnN0cmFjdCBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGUgcGluZyBzaGVsbCBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb21tYW5kIG91dHB1dCBjb250YWlucyAncGluZycgc3Vic3RyaW5nLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgJ3BpbmcnIGNvbW1hbmQgb24gdGhlXG4gKiAgICAgICAgICAgICAgICAgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMucGluZyA9IGFzeW5jIGZ1bmN0aW9uIHBpbmcgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2VjaG8nLCAncGluZyddKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdwaW5nJykgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEFEQiBwaW5nIGZhaWxlZCwgcmV0dXJuZWQgJHtzdGRvdXR9YCk7XG59O1xuXG4vKipcbiAqIFJlc3RhcnQgdGhlIGRldmljZSB1bmRlciB0ZXN0IHVzaW5nIGFkYiBjb21tYW5kcy5cbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMucmVzdGFydCA9IGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnQgKCkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc3RvcExvZ2NhdCgpO1xuICAgIGF3YWl0IHRoaXMucmVzdGFydEFkYigpO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZSg2MCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydExvZ2NhdCh0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVzdGFydCBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2djYXRPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybWF0IFRoZSBsb2cgcHJpbnQgZm9ybWF0LCB3aGVyZSA8Zm9ybWF0PiBpcyBvbmUgb2Y6XG4gKiAgIGJyaWVmIHByb2Nlc3MgdGFnIHRocmVhZCByYXcgdGltZSB0aHJlYWR0aW1lIGxvbmdcbiAqIGB0aHJlYWR0aW1lYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyU3BlY3MgU2VyaWVzIG9mIDx0YWc+Wzpwcmlvcml0eV1cbiAqIHdoZXJlIDx0YWc+IGlzIGEgbG9nIGNvbXBvbmVudCB0YWcgKG9yICogZm9yIGFsbCkgYW5kIHByaW9yaXR5IGlzOlxuICogIFYgICAgVmVyYm9zZVxuICogIEQgICAgRGVidWdcbiAqICBJICAgIEluZm9cbiAqICBXICAgIFdhcm5cbiAqICBFICAgIEVycm9yXG4gKiAgRiAgICBGYXRhbFxuICogIFMgICAgU2lsZW50IChzdXByZXNzIGFsbCBvdXRwdXQpXG4gKlxuICogJyonIG1lYW5zICcqOmQnIGFuZCA8dGFnPiBieSBpdHNlbGYgbWVhbnMgPHRhZz46dlxuICpcbiAqIElmIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lLCBmaWx0ZXJzcGVjIGlzIHNldCBmcm9tIEFORFJPSURfTE9HX1RBR1MuXG4gKiBJZiBubyBmaWx0ZXJzcGVjIGlzIGZvdW5kLCBmaWx0ZXIgZGVmYXVsdHMgdG8gJyo6SSdcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBsb2djYXQgcHJvY2VzcyB0byBnYXRoZXIgbG9ncy5cbiAqXG4gKiBAcGFyYW0gez9Mb2djYXRPcHRzfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgcmVzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5zdGFydExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TG9nY2F0IChvcHRzID0ge30pIHtcbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHN0YXJ0IGxvZ2NhdCBjYXB0dXJlIGJ1dCBpdCdzIGFscmVhZHkgc3RhcnRlZCFcIik7XG4gIH1cblxuICB0aGlzLmxvZ2NhdCA9IG5ldyBMb2djYXQoe1xuICAgIGFkYjogdGhpcy5leGVjdXRhYmxlLFxuICAgIGRlYnVnOiBmYWxzZSxcbiAgICBkZWJ1Z1RyYWNlOiBmYWxzZSxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0OiAhIXRoaXMuY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgfSk7XG4gIGF3YWl0IHRoaXMubG9nY2F0LnN0YXJ0Q2FwdHVyZShvcHRzKTtcbiAgdGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyA9IG9wdHM7XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIGFjdGl2ZSBsb2djYXQgcHJvY2VzcyB3aGljaCBnYXRoZXJzIGxvZ3MuXG4gKiBUaGUgY2FsbCB3aWxsIGJlIGlnbm9yZWQgaWYgbm8gbG9nY2F0IHByb2Nlc3MgaXMgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zdG9wTG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RvcExvZ2NhdCAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5sb2djYXQuc3RvcENhcHR1cmUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLmxvZ2NhdCA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIG91dHB1dCBmcm9tIHRoZSBjdXJyZW50bHkgcnVubmluZyBsb2djYXQgcHJvY2Vzcy5cbiAqIFRoZSBsb2djYXQgcHJvY2VzcyBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgezJsaW5rICNzdGFydExvZ2NhdH0gbWV0aG9kLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbGxlY3RlZCBsb2djYXQgb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLmdldExvZ2NhdExvZ3MgPSBmdW5jdGlvbiBnZXRMb2djYXRMb2dzICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBnZXQgbG9nY2F0IGxvZ3Mgc2luY2UgbG9nY2F0IGhhc24ndCBzdGFydGVkXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLmxvZ2NhdC5nZXRMb2dzKCk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVGhlIGFyZ3VtZW50IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbG9nIHJlY29yZCBvYmplY3Qgd2l0aCBgdGltZXN0YW1wYCwgYGxldmVsYCBhbmQgYG1lc3NhZ2VgIHByb3BlcnRpZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc2V0TG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiBzZXRMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0Lm9uKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggaGFzIGJlZW4gcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gYHNldExvZ2NhdExpc3RlbmVyYFxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnJlbW92ZUxvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5yZW1vdmVMaXN0ZW5lcignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBBdCBzb21lIHBvaW50IG9mIHRpbWUgR29vZ2xlIGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IGBwc2AgYmVoYXZpb3VyLCBzbyBpdCBvbmx5XG4gKiBsaXN0cyBwcm9jZXNzZXMgdGhhdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgc2hlbGwgdXNlciByYXRoZXIgdG8gYWxsXG4gKiB1c2Vycy4gSXQgaXMgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgcHMgd2l0aCAtQSBjb21tYW5kIGxpbmUgYXJndW1lbnRcbiAqIHRvIG1pbWljIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIG91dHB1dCBvZiBgcHNgIGNvbW1hbmQgd2hlcmUgYWxsIHByb2Nlc3NlcyBhcmUgaW5jbHVkZWRcbiAqL1xubWV0aG9kcy5saXN0UHJvY2Vzc1N0YXR1cyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9jZXNzU3RhdHVzICgpIHtcbiAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbikpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSAvXi1BXFxiL20udGVzdChhd2FpdCB0aGlzLnNoZWxsKFsncHMnLCAnLS1oZWxwJ10pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbCh0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA/IFsncHMnLCAnLUEnXSA6IFsncHMnXSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcHJvY2VzcyBuYW1lIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgdmFsaWQgcHJvY2VzcyBpZGVudGlmaWVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIFBJRCBpcyBlaXRoZXIgaW52YWxpZCBvciBpcyBub3QgcHJlc2VudFxuICogaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHByb2Nlc3MgbmFtZVxuICovXG5tZXRob2RzLmdldE5hbWVCeVBpZCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWVCeVBpZCAocGlkKSB7XG4gIGlmIChpc05hTihwaWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgUElEIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuICcke3BpZH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBwaWQgPSBwYXJzZUludChwaWQsIDEwKTtcblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIC8vIGl0IG1pZ2h0IG5vdCBiZSBzdGFibGUgdG8gdGFrZSBOQU1FIGJ5IGluZGV4LCBiZWNhdXNlIGRlcGVuZGluZyBvbiB0aGVcbiAgLy8gYWN0dWFsIFNESyB0aGUgcHMgb3V0cHV0IG1pZ2h0IG5vdCBjb250YWluIGFuIGFiYnJldmlhdGlvbiBmb3IgdGhlIFMgZmxhZzpcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICAgICAgIE5BTUVcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICBTICAgIE5BTUVcbiAgY29uc3QgbmFtZU9mZnNldCA9IGFsbFRpdGxlcy5pbmRleE9mKFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUpIC0gYWxsVGl0bGVzLmxlbmd0aDtcbiAgY29uc3QgcGlkUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke3BpZH1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcGlkUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApID09PSBwaWQgJiYgaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF0pIHtcbiAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XTtcbiAgICB9XG4gIH1cbiAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhc3NlZCBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgb25lXG4gKi9cbm1ldGhvZHMuZ2V0UElEc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBJRHNCeU5hbWUgKG5hbWUpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIElEcyBvZiBhbGwgJyR7bmFtZX0nIHByb2Nlc3Nlc2ApO1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb2Nlc3MgbmFtZTogJyR7bmFtZX0nYCk7XG4gIH1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzNTY3XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjMpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpKSB7XG4gICAgICAvLyBwZ3JlcCBpcyBpbiBwcmlvcml0eSwgc2luY2UgcGlkb2YgaGFzIGJlZW4gcmVwb3J0ZWQgb2YgaGF2aW5nIGJ1Z3Mgb24gc29tZSBwbGF0Zm9ybXNcbiAgICAgIGNvbnN0IHBncmVwT3V0cHV0ID0gXy50cmltKGF3YWl0IHRoaXMuc2hlbGwoWydwZ3JlcCAtLWhlbHA7IGVjaG8gJD8nXSkpO1xuICAgICAgdGhpcy5faXNQZ3JlcEF2YWlsYWJsZSA9IHBhcnNlSW50KF8ubGFzdChwZ3JlcE91dHB1dC5zcGxpdCgvXFxzKy8pKSwgMTApID09PSAwO1xuICAgICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCA9IC9eLWZcXGIvbS50ZXN0KHBncmVwT3V0cHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUgPSBwYXJzZUludChhd2FpdCB0aGlzLnNoZWxsKFsncGlkb2YgLS1oZWxwID4gL2Rldi9udWxsOyBlY2hvICQ/J10pLCAxMCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlIHx8IHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHNoZWxsQ29tbWFuZCA9IHRoaXMuX2lzUGdyZXBBdmFpbGFibGVcbiAgICAgICAgPyAodGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaFxuICAgICAgICAgID8gWydwZ3JlcCcsICctZicsIF8uZXNjYXBlUmVnRXhwKGAoW1s6Ymxhbms6XV18Xikke25hbWV9KFtbOmJsYW5rOl1dfCQpYCldXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzODcyXG4gICAgICAgICAgOiBbYHBncmVwIF4ke18uZXNjYXBlUmVnRXhwKG5hbWUuc2xpY2UoLU1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSQgYCArXG4gICAgICAgICAgICAgIGB8fCBwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKDAsIE1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSRgXSlcbiAgICAgICAgOiBbJ3BpZG9mJywgbmFtZV07XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGwoc2hlbGxDb21tYW5kKSlcbiAgICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAuZmlsdGVyKCh4KSA9PiBfLmlzSW50ZWdlcih4KSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGVycm9yIGNvZGUgMSBpcyByZXR1cm5lZCBpZiB0aGUgdXRpbGl0eSBkaWQgbm90IGZpbmQgYW55IHByb2Nlc3Nlc1xuICAgICAgICAvLyB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gICAgICAgIGlmIChlLmNvZGUgIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IHByb2Nlc3MgSUQgb2YgJyR7bmFtZX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciB8fCBlLnN0ZG91dCwgJ3N5bnRheCBlcnJvcicpKSB7XG4gICAgICAgICAgbG9nLndhcm4oYEdvdCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gdGhlIHNoZWxsIGludGVycHJldGVyOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvZy5kZWJ1ZygnVXNpbmcgcHMtYmFzZWQgUElEIGRldGVjdGlvbicpO1xuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gcHMgb3V0cHV0YCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgY29uc3QgcGlkcyA9IFtdO1xuICBjb25zdCBwcm9jZXNzTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiXFxcXGQrXFxcXGIuKlxcXFxiJHtfLmVzY2FwZVJlZ0V4cChuYW1lKX1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcHJvY2Vzc05hbWVSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGlkSW5kZXggPj0gYWxsVGl0bGVzLmxlbmd0aCB8fCBpc05hTihpdGVtc1twaWRJbmRleF0pKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tICcke21hdGNoZWRMaW5lWzFdLnRyaW0oKX0nYCk7XG4gICAgfVxuICAgIHBpZHMucHVzaChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSk7XG4gIH1cbiAgcmV0dXJuIHBpZHM7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzZXNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc2VzQnlOYW1lIChuYW1lKSB7XG4gIHRyeSB7XG4gICAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgYWxsICR7bmFtZX0gcHJvY2Vzc2VzYCk7XG4gICAgY29uc3QgcGlkcyA9IGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShuYW1lKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBpZHMpKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gJyR7bmFtZX0nIHByb2Nlc3MgaGFzIGJlZW4gZm91bmRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgQi5hbGwocGlkcy5tYXAoKHApID0+IHRoaXMua2lsbFByb2Nlc3NCeVBJRChwKSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGtpbGwgJHtuYW1lfSBwcm9jZXNzZXMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBLaWxsIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIGN1cnJlbnQgdXNlciBpcyBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIHJvb3QgaWYgbmVjZXNzYXJ5IGluIG9yZGVyXG4gKiB0byBwcm9wZXJseSBraWxsIHRoZSBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIElEIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGtpbGxlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvY2VzcyBjYW5ub3QgYmUga2lsbGVkLlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzQnlQSUQgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc0J5UElEIChwaWQpIHtcbiAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgcHJvY2VzcyAke3BpZH1gKTtcbiAgY29uc3Qgbm9Qcm9jZXNzRmxhZyA9ICdObyBzdWNoIHByb2Nlc3MnO1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwcm9jZXNzIGV4aXN0cyBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIG90aGVyd2lzZVxuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFfLmluY2x1ZGVzKGUuc3RkZXJyLCAnT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQnKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYENhbm5vdCBraWxsIFBJRCAke3BpZH0gZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucy4gUmV0cnlpbmcgYXMgcm9vdGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0sIHtcbiAgICAgICAgcHJpdmlsZWdlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGUxLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTE7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBwcm9jZXNzIGtpbGxpbmcgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBraWxsZWQgcHJvY2Vzcy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGUgcHJvY2VzcyB3YXMgbm90IGtpbGxlZC5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RQcm9jZXNzRW5kID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0UHJvY2Vzc0VuZCAoaW50ZW50LCBwcm9jZXNzTmFtZSkge1xuICAvLyBzdGFydCB0aGUgYnJvYWRjYXN0IHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gZmluaXNoLlxuICB0aGlzLmJyb2FkY2FzdChpbnRlbnQpO1xuICAvLyB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmRcbiAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHRpbWVvdXRNcyA9IDQwMDAwO1xuICB0cnkge1xuICAgIHdoaWxlICgoRGF0ZS5ub3coKSAtIHN0YXJ0KSA8IHRpbWVvdXRNcykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhwcm9jZXNzTmFtZSkpIHtcbiAgICAgICAgLy8gY29vbCBkb3duXG4gICAgICAgIGF3YWl0IHNsZWVwKDQwMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2Nlc3MgbmV2ZXIgZGllZCB3aXRoaW4gJHt0aW1lb3V0TXN9IG1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBicm9hZGNhc3QgcHJvY2VzcyBlbmQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBpbnRlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGludGVudCBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0IChpbnRlbnQpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnRlbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVudCAke2ludGVudH1gKTtcbiAgfVxuICBsb2cuZGVidWcoYEJyb2FkY2FzdGluZzogJHtpbnRlbnR9YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdicm9hZGNhc3QnLCAnLWEnLCBpbnRlbnRdKTtcbn07XG5cbi8qKlxuICogS2lsbCBBbmRyb2lkIGluc3RydW1lbnRzIGlmIHRoZXkgYXJlIGN1cnJlbnRseSBydW5uaW5nLlxuICovXG5tZXRob2RzLmVuZEFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGVuZEFuZHJvaWRDb3ZlcmFnZSAoKSB7XG4gIGlmICh0aGlzLmluc3RydW1lbnRQcm9jICYmIHRoaXMuaW5zdHJ1bWVudFByb2MuaXNSdW5uaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdG9wKCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdHJ1bWVudCB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRXaXRoIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gaW5zdHJ1bWVudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5IHdpdGguXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuaW5zdHJ1bWVudCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RydW1lbnQgKHBrZywgYWN0aXZpdHksIGluc3RydW1lbnRXaXRoKSB7XG4gIGlmIChhY3Rpdml0eVswXSAhPT0gJy4nKSB7XG4gICAgcGtnID0gJyc7XG4gIH1cbiAgbGV0IHBrZ0FjdGl2aXR5ID0gKHBrZyArIGFjdGl2aXR5KS5yZXBsYWNlKC9cXC4rL2csICcuJyk7IC8vIEZpeCBwa2cuLmFjdGl2aXR5IGVycm9yXG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnaW5zdHJ1bWVudCcsXG4gICAgJy1lJywgJ21haW5fYWN0aXZpdHknLFxuICAgIHBrZ0FjdGl2aXR5LFxuICAgIGluc3RydW1lbnRXaXRoLFxuICBdKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdFeGNlcHRpb24nKSAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZXhjZXB0aW9uIGR1cmluZyBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yICR7c3Rkb3V0LnNwbGl0KCdcXG4nKVswXX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDb2xsZWN0IEFuZHJvaWQgY292ZXJhZ2UgYnkgaW5zdHJ1bWVudGluZyB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudENsYXNzIC0gVGhlIG5hbWUgb2YgdGhlIGluc3RydW1lbnRhdGlvbiBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0UGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRBY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqXG4gKiBAcmV0dXJuIHtwcm9taXNlfSBUaGUgcHJvbWlzZSBpcyBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgaWYgdGhlIGluc3RydW1lbnRhdGlvbiBzdGFydHNcbiAqICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgZXJyb3JzLlxuICovXG5tZXRob2RzLmFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGFuZHJvaWRDb3ZlcmFnZSAoaW5zdHJ1bWVudENsYXNzLCB3YWl0UGtnLCB3YWl0QWN0aXZpdHkpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnN0cnVtZW50Q2xhc3MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNsYXNzICR7aW5zdHJ1bWVudENsYXNzfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCBuZXcgQihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IGFyZ3MgPSB0aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NcbiAgICAgIC5jb25jYXQoWydzaGVsbCcsICdhbScsICdpbnN0cnVtZW50JywgJy1lJywgJ2NvdmVyYWdlJywgJ3RydWUnLCAnLXcnXSlcbiAgICAgIC5jb25jYXQoW2luc3RydW1lbnRDbGFzc10pO1xuICAgIGxvZy5kZWJ1ZyhgQ29sbGVjdGluZyBjb3ZlcmFnZSBkYXRhIHdpdGg6ICR7W3RoaXMuZXhlY3V0YWJsZS5wYXRoXS5jb25jYXQoYXJncykuam9pbignICcpfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBhbSBpbnN0cnVtZW50IHJ1bnMgZm9yIHRoZSBsaWZlIG9mIHRoZSBhcHAgcHJvY2Vzcy5cbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2MgPSBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgYXJncyk7XG4gICAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0YXJ0KDApO1xuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3I6ICR7c3RkZXJyfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JBY3Rpdml0eSh3YWl0UGtnLCB3YWl0QWN0aXZpdHkpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFuZHJvaWQgY292ZXJhZ2UgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCkpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIGdldHByb3BfIHRvb2wuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICovXG5tZXRob2RzLmdldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvcGVydHkgKHByb3BlcnR5KSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZ2V0cHJvcCcsIHByb3BlcnR5XSk7XG4gIGxldCB2YWwgPSBzdGRvdXQudHJpbSgpO1xuICBsb2cuZGVidWcoYEN1cnJlbnQgZGV2aWNlIHByb3BlcnR5ICcke3Byb3BlcnR5fSc6ICR7dmFsfWApO1xuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBzZXRQcm9wT3B0c1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcml2aWxlZ2VkIC0gRG8gd2UgcnVuIHNldFByb3AgYXMgYSBwcml2aWxlZ2VkIGNvbW1hbmQ/IERlZmF1bHQgdHJ1ZS5cbiAqL1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIHNldHByb3BfIHRvb2wuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIC0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEBwYXJhbSB7c2V0UHJvcE9wdHN9IG9wdHNcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgX3NldHByb3BfIHV0aWxpdHkgZmFpbHMgdG8gY2hhbmdlIHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLnNldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGV2aWNlUHJvcGVydHkgKHByb3AsIHZhbCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwcml2aWxlZ2VkID0gdHJ1ZX0gPSBvcHRzO1xuICBsb2cuZGVidWcoYFNldHRpbmcgZGV2aWNlIHByb3BlcnR5ICcke3Byb3B9JyB0byAnJHt2YWx9J2ApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0cHJvcCcsIHByb3AsIHZhbF0sIHtcbiAgICBwcml2aWxlZ2VkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsYW5ndWFnZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzQ291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5jb3VudHJ5Jyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbGFuZ3VhZ2UgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0Q291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5yZWdpb24nKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1vZGVsIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1vZGVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0TW9kZWwgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tb2RlbCcpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtYW51ZmFjdHVyZXIgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TWFudWZhY3R1cmVyID0gYXN5bmMgZnVuY3Rpb24gZ2V0TWFudWZhY3R1cmVyICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubWFudWZhY3R1cmVyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZS5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERldmljZSBzY3JlZW4gc2l6ZSBhcyBzdHJpbmcgaW4gZm9ybWF0ICdXeEgnIG9yXG4gKiAgICAgICAgICAgICAgICAgIF9udWxsXyBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5TaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuU2l6ZSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnc2l6ZSddKTtcbiAgbGV0IHNpemUgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBzaXplOiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChzaXplICYmIHNpemUubGVuZ3RoID49IDIpIHtcbiAgICByZXR1cm4gc2l6ZVsxXS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gZGVuc2l0eSBpbiBkcGlcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBEZXZpY2Ugc2NyZWVuIGRlbnNpdHkgYXMgYSBudW1iZXIgb3IgX251bGxfIGlmIGl0XG4gKiAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuRGVuc2l0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbkRlbnNpdHkgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ2RlbnNpdHknXSk7XG4gIGxldCBkZW5zaXR5ID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgZGVuc2l0eTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoZGVuc2l0eSAmJiBkZW5zaXR5Lmxlbmd0aCA+PSAyKSB7XG4gICAgbGV0IGRlbnNpdHlOdW1iZXIgPSBwYXJzZUludChkZW5zaXR5WzFdLnRyaW0oKSwgMTApO1xuICAgIHJldHVybiBpc05hTihkZW5zaXR5TnVtYmVyKSA/IG51bGwgOiBkZW5zaXR5TnVtYmVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBTZXR1cCBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWFkIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL2FuZHJvaWQtOS4wLjBfcjIxL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgZm9yIGVhY2ggcHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJveHlIb3N0IC0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgcHJveHkuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHByb3h5UG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBiZSBzZXQuXG4gKi9cbm1ldGhvZHMuc2V0SHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SHR0cFByb3h5IChwcm94eUhvc3QsIHByb3h5UG9ydCkge1xuICBsZXQgcHJveHkgPSBgJHtwcm94eUhvc3R9OiR7cHJveHlQb3J0fWA7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5SG9zdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9ob3N0OiAke3Byb3h5fWApO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5UG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9wb3J0ICR7cHJveHl9YCk7XG4gIH1cblxuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgIFsnaHR0cF9wcm94eScsIHByb3h5XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLCBwcm94eUhvc3RdLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsIHByb3h5UG9ydF1cbiAgXTtcbiAgZm9yIChjb25zdCBbc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlXSBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCBzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIERlbGV0ZSBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWJvb3RpbmcgdGhlIHRlc3QgZGV2aWNlIGlzIG5lY2Vzc2FyeSB0byBhcHBseSB0aGUgY2hhbmdlLlxuICovXG5tZXRob2RzLmRlbGV0ZUh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUh0dHBQcm94eSAoKSB7XG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgJ2h0dHBfcHJveHknLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9ob3N0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0JyAvLyBgZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3Q9YCB3YXMgZ2VuZXJhdGVkIGJ5IGBzZXR0aW5ncyBnbG9iYWwgaHR0b19wcm94eSB4eHh4YFxuICBdO1xuICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdkZWxldGUnLCAnZ2xvYmFsJywgc2V0dGluZ10pO1xuICB9XG59O1xuXG4vKipcbiAqIFNldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgLSBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMuc2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIHNldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWUpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCBuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlXSk7XG59O1xuXG4vKipcbiAqIEdldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuZ2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIGdldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2dldCcsIG5hbWVzcGFjZSwgc2V0dGluZ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYGFkYiBidWdyZXBvcnRgIGNvbW1hbmQgb3V0cHV0LiBUaGlzXG4gKiBvcGVyYXRpb24gbWF5IHRha2UgdXAgdG8gc2V2ZXJhbCBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB7P251bWJlcn0gdGltZW91dCBbMTIwMDAwXSAtIENvbW1hbmQgdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbW1hbmQgc3Rkb3V0XG4gKi9cbm1ldGhvZHMuYnVncmVwb3J0ID0gYXN5bmMgZnVuY3Rpb24gYnVncmVwb3J0ICh0aW1lb3V0ID0gMTIwMDAwKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydidWdyZXBvcnQnXSwge3RpbWVvdXR9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2NyZWVucmVjb3JkT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2aWRlb1NpemUgLSBUaGUgZm9ybWF0IGlzIHdpZHRoeGhlaWdodC5cbiAqICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGRldmljZSdzIG5hdGl2ZSBkaXNwbGF5IHJlc29sdXRpb24gKGlmIHN1cHBvcnRlZCksXG4gKiAgICAgICAgICAgICAgICAgIDEyODB4NzIwIGlmIG5vdC4gRm9yIGJlc3QgcmVzdWx0cyxcbiAqICAgICAgICAgICAgICAgICAgdXNlIGEgc2l6ZSBzdXBwb3J0ZWQgYnkgeW91ciBkZXZpY2UncyBBZHZhbmNlZCBWaWRlbyBDb2RpbmcgKEFWQykgZW5jb2Rlci5cbiAqICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIFwiMTI4MHg3MjBcIlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYnVnUmVwb3J0IC0gU2V0IGl0IHRvIGB0cnVlYCBpbiBvcmRlciB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHZpZGVvIG92ZXJsYXksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIGEgdGltZXN0YW1wLCB0aGF0IGlzIGhlbHBmdWwgaW4gdmlkZW9zIGNhcHR1cmVkIHRvIGlsbHVzdHJhdGUgYnVncy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFQSSBsZXZlbCAyNyAoQW5kcm9pZCBQKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHRpbWVMaW1pdCAtIFRoZSBtYXhpbXVtIHJlY29yZGluZyB0aW1lLCBpbiBzZWNvbmRzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgKGFuZCBtYXhpbXVtKSB2YWx1ZSBpcyAxODAgKDMgbWludXRlcykuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIG1lZ2FiaXRzIHBlciBzZWNvbmQuXG4gKiAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LiBZb3UgY2FuIGluY3JlYXNlIHRoZSBiaXQgcmF0ZSB0byBpbXByb3ZlIHZpZGVvIHF1YWxpdHksXG4gKiAgICAgICAgICAgICAgICBidXQgZG9pbmcgc28gcmVzdWx0cyBpbiBsYXJnZXIgbW92aWUgZmlsZXMuXG4gKi9cblxuLyoqXG4gKiBJbml0aWF0ZSBzY3JlZW5yZWNvcmQgdXRpbGl0eSBvbiB0aGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uIC0gRnVsbCBwYXRoIHRvIHRoZSB3cml0YWJsZSBtZWRpYSBmaWxlIGRlc3RpbmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZGV2aWNlIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHs/U2NyZWVucmVjb3JkT3B0aW9uc30gb3B0aW9ucyBbe31dXG4gKiBAcmV0dXJucyB7U3ViUHJvY2Vzc30gc2NyZWVucmVjb3JkIHByb2Nlc3MsIHdoaWNoIGNhbiBiZSB0aGVuIGNvbnRyb2xsZWQgYnkgdGhlIGNsaWVudCBjb2RlXG4gKi9cbm1ldGhvZHMuc2NyZWVucmVjb3JkID0gZnVuY3Rpb24gc2NyZWVucmVjb3JkIChkZXN0aW5hdGlvbiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNtZCA9IFsnc2NyZWVucmVjb3JkJ107XG4gIGNvbnN0IHtcbiAgICB2aWRlb1NpemUsXG4gICAgYml0UmF0ZSxcbiAgICB0aW1lTGltaXQsXG4gICAgYnVnUmVwb3J0LFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHV0aWwuaGFzVmFsdWUodmlkZW9TaXplKSkge1xuICAgIGNtZC5wdXNoKCctLXNpemUnLCB2aWRlb1NpemUpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHRpbWVMaW1pdCkpIHtcbiAgICBjbWQucHVzaCgnLS10aW1lLWxpbWl0JywgdGltZUxpbWl0KTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShiaXRSYXRlKSkge1xuICAgIGNtZC5wdXNoKCctLWJpdC1yYXRlJywgYml0UmF0ZSk7XG4gIH1cbiAgaWYgKGJ1Z1JlcG9ydCkge1xuICAgIGNtZC5wdXNoKCctLWJ1Z3JlcG9ydCcpO1xuICB9XG4gIGNtZC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuICBjb25zdCBmdWxsQ21kID0gW1xuICAgIC4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnc2hlbGwnLFxuICAgIC4uLmNtZFxuICBdO1xuICBsb2cuZGVidWcoYEJ1aWxkaW5nIHNjcmVlbnJlY29yZCBwcm9jZXNzIHdpdGggdGhlIGNvbW1hbmQgbGluZTogYWRiICR7dXRpbC5xdW90ZShmdWxsQ21kKX1gKTtcbiAgcmV0dXJuIG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBmdWxsQ21kKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGlucHV0IG1ldGhvZCBjb250ZXh0XG4gKiBhbmQgdGhlbiByZXN0b3JlcyB0aGUgSU1FIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWUgLSBWYWxpZCBJTUUgaWRlbnRpZmllclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBGdW5jdGlvbiB0byBleGVjdXRlXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAqL1xubWV0aG9kcy5ydW5JbkltZUNvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBydW5JbkltZUNvbnRleHQgKGltZSwgZm4pIHtcbiAgY29uc3Qgb3JpZ2luYWxJbWUgPSBhd2FpdCB0aGlzLmRlZmF1bHRJTUUoKTtcbiAgaWYgKG9yaWdpbmFsSW1lID09PSBpbWUpIHtcbiAgICBsb2cuZGVidWcoYFRoZSBvcmlnaW5hbCBJTUUgaXMgdGhlIHNhbWUgYXMgJyR7aW1lfScuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRgKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLmVuYWJsZUlNRShpbWUpO1xuICAgIGF3YWl0IHRoaXMuc2V0SU1FKGltZSk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE1OTQzXG4gICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG9yaWdpbmFsSW1lICE9PSBpbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0SU1FKG9yaWdpbmFsSW1lKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHR6IGRhdGFiYXNlIHRpbWUgem9uZSBmb3JtYXR0ZWQgdGltZXpvbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUWiBkYXRhYmFzZSBUaW1lIFpvbmVzIGZvcm1hdFxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5nZXRUaW1lWm9uZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFRpbWVab25lICgpIHtcbiAgbG9nLmRlYnVnKCdHZXR0aW5nIGN1cnJlbnQgdGltZXpvbmUnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMudGltZXpvbmUnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyB0aW1lem9uZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmZWF0dXJlIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBBbiBleGFtcGxlIGFkYiBjb21tYW5kIG91dHB1dDpcbiAqIGBgYFxuICogY21kXG4gKiBsc192MlxuICogZml4ZWRfcHVzaF9ta2RpclxuICogc2hlbGxfdjJcbiAqIGFiYlxuICogc3RhdF92MlxuICogYXBleFxuICogYWJiX2V4ZWNcbiAqIHJlbW91bnRfc2hlbGxcbiAqIGZpeGVkX3B1c2hfc3ltbGlua190aW1lc3RhbXBcbiAqIGBgYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0XG4gKi9cbm1ldGhvZHMubGlzdEZlYXR1cmVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdEZlYXR1cmVzICgpIHtcbiAgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcyA9IHRoaXMuX21lbW9pemVkRmVhdHVyZXNcbiAgICB8fCBfLm1lbW9pemUoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZmVhdHVyZXMnXSksICgpID0+IHRoaXMuY3VyRGV2aWNlSWQpO1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcygpKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCAndW5rbm93biBjb21tYW5kJykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVja3MgdGhlIHN0YXRlIG9mIHN0cmVhbWVkIGluc3RhbGwgZmVhdHVyZS5cbiAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgdG8gc3BlZWQgdXAgYXBrIGluc3RhbGxhdGlvblxuICogc2luY2UgaXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgb3JpZ2luYWwgYXBrIHRvIGJlIHB1c2hlZCB0b1xuICogdGhlIGRldmljZSB1bmRlciB0ZXN0IGZpcnN0LCB3aGljaCBhbHNvIHNhdmVzIHNwYWNlLlxuICogQWx0aG91Z2gsIGl0IGlzIHJlcXVpcmVkIHRoYXQgYm90aCB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqIGFuZCB0aGUgYWRiIHNlcnZlciBoYXZlIHRoZSBtZW50aW9uZWQgZnVuY3Rpb25hbGl0eS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW9zcC1taXJyb3IvcGxhdGZvcm1fc3lzdGVtX2NvcmUvYmxvYi9tYXN0ZXIvYWRiL2NsaWVudC9hZGJfaW5zdGFsbC5jcHBcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgcHJvdG8uX2hlbHBPdXRwdXQgPSBwcm90by5faGVscE91dHB1dCB8fCBhd2FpdCB0aGlzLmFkYkV4ZWMoWydoZWxwJ10pO1xuICByZXR1cm4gcHJvdG8uX2hlbHBPdXRwdXQuaW5jbHVkZXMoJy0tc3RyZWFtaW5nJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2NtZCcpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBpbmNyZW1lbnRhbCBpbnN0YWxsIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IEFEQi5cbiAqIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9mZWF0dXJlcyNpbmNyZW1lbnRhbFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiBpdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCB7YmluYXJ5fSA9IGF3YWl0IHRoaXMuZ2V0VmVyc2lvbigpO1xuICBpZiAoIWJpbmFyeSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdXRpbC5jb21wYXJlVmVyc2lvbnMoYmluYXJ5LnZlcnNpb24sICc+PScsICczMC4wLjEnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnYWJiX2V4ZWMnKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGZyb20gRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiB3aGl0ZWxpc3RlZCBwYWNrYWdlcy4gQW4gZXhhbXBsZSBvdXRwdXQ6XG4gKiBzeXN0ZW0sY29tLmFuZHJvaWQuc2hlbGwsMjAwMFxuICogc3lzdGVtLGNvbS5nb29nbGUuYW5kcm9pZC5jZWxsYnJvYWRjYXN0cmVjZWl2ZXIsMTAxNDNcbiAqIHVzZXIsaW8uYXBwaXVtLnNldHRpbmdzLDEwMTU3XG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUlkbGVXaGl0ZWxpc3QgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsb2cuaW5mbygnTGlzdGluZyBwYWNrYWdlcyBpbiBEb3plIHdoaXRlbGlzdCcpO1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCddKTtcbiAgcmV0dXJuIF8udHJpbShvdXRwdXQpLnNwbGl0KC9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGV4aXN0aW5nIHBhY2thZ2UocykgaW50byB0aGUgRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gcGFja2FnZXMgT25lIG9yIG1vcmUgcGFja2FnZXMgdG8gYWRkLiBJZiB0aGUgcGFja2FnZVxuICogYWxyZWFkeSBleGlzdHMgaW4gdGhlIHdoaXRlbGlzdCB0aGVuIGl0IGlzIG9ubHkgZ29pbmcgdG8gYmUgYWRkZWQgb25jZS5cbiAqIElmIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgbm90IGluc3RhbGxlZC9ub3Qga25vd24gdGhlbiBhbiBlcnJvclxuICogd2lsbCBiZSB0aHJvd24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBjb21tYW5kIHRvIGFkZCBwYWNrYWdlKHMpIGhhcyBiZWVuIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ICguLi5wYWNrYWdlcykge1xuICBpZiAoXy5pc0VtcHR5KHBhY2thZ2VzKSB8fCBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBZGRpbmcgJHt1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhY2thZ2VzLmxlbmd0aCl9ICR7SlNPTi5zdHJpbmdpZnkocGFja2FnZXMpfSB0byBEb3plIHdoaXRlbGlzdGApO1xuICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwa2cpID0+IFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCcsIGArJHtwa2d9YF0sIHBhY2thZ2VzKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtZXRob2RzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLElBQWhDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsbUNBQWxDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsQ0FDMUJELHlCQUQwQixFQUUxQixxQkFGMEIsQ0FBNUI7QUFJQSxNQUFNRSxxQkFBcUIsR0FBRyxFQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQzdCLDhCQUQ2QixFQUU3QiwwQkFGNkIsRUFHN0IsbUJBSDZCLENBQS9CO0FBS0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxNQUFsQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLElBQUlDLE1BQUosQ0FBWSxVQUFTSCxnQkFBaUIsV0FBVUMseUJBQTBCLFNBQTFFLEVBQW9GLEdBQXBGLENBQXpCO0FBRUEsTUFBTUcsd0JBQXdCLEdBQUcsbUJBQWpDO0FBRUEsTUFBTUMsT0FBTyxHQUFH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
package/lib/helpers.js CHANGED
@@ -22,18 +22,18 @@ const LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';
22
22
  * @throws {Error} If the current module root folder cannot be determined
23
23
  */
24
24
  const getModuleRoot = _.memoize(function getModuleRoot () {
25
- const pathParts = path.resolve(__dirname).split(path.sep);
26
- for (let pathItemIdx = pathParts.length; pathItemIdx > 0; --pathItemIdx) {
27
- const currentDir = path.join(...(pathParts.slice(0, pathItemIdx)));
25
+ let currentDir = path.dirname(path.resolve(__filename));
26
+ let isAtFsRoot = false;
27
+ while (!isAtFsRoot) {
28
28
  const manifestPath = path.join(currentDir, 'package.json');
29
29
  try {
30
- if (!_fs.existsSync(manifestPath)) {
31
- continue;
32
- }
33
- if (JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
30
+ if (_fs.existsSync(manifestPath) &&
31
+ JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
34
32
  return currentDir;
35
33
  }
36
34
  } catch (ign) {}
35
+ currentDir = path.dirname(currentDir);
36
+ isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;
37
37
  }
38
38
  throw new Error('Cannot find the root folder of the appium-adb Node.js module');
39
39
  });
@@ -768,11 +768,23 @@ methods.setAirplaneMode = async function setAirplaneMode (on) {
768
768
  * @param {boolean} on - True to broadcast enable and false to broadcast disable.
769
769
  */
770
770
  methods.broadcastAirplaneMode = async function broadcastAirplaneMode (on) {
771
- await this.shell([
771
+ const args = [
772
772
  'am', 'broadcast',
773
773
  '-a', 'android.intent.action.AIRPLANE_MODE',
774
- '--ez', 'state', on ? 'true' : 'false'
775
- ]);
774
+ '--ez', 'state', on ? 'true' : 'false',
775
+ ];
776
+ try {
777
+ await this.shell(args);
778
+ } catch (e) {
779
+ // https://github.com/appium/appium/issues/17422
780
+ if (_.includes(e.stderr, 'SecurityException')) {
781
+ try {
782
+ await this.shell(args, {privileged: true});
783
+ return;
784
+ } catch (ign) {}
785
+ }
786
+ throw e;
787
+ }
776
788
  };
777
789
 
778
790
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-adb",
3
- "version": "9.10.4",
3
+ "version": "9.10.7",
4
4
  "description": "Android Debug Bridge interface",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {