appium-adb 8.12.2 → 8.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/helpers.js +4 -4
- package/build/lib/logcat.js +1 -1
- package/build/lib/tools/adb-commands.js +9 -5
- package/build/lib/tools/apk-utils.js +2 -2
- package/build/lib/tools/settings-client-commands.js +2 -2
- package/lib/helpers.js +9 -5
- package/lib/tools/adb-commands.js +8 -3
- package/lib/tools/apk-utils.js +2 -2
- package/lib/tools/settings-client-commands.js +2 -2
- package/package.json +1 -1
- package/lib/.DS_Store +0 -0
|
@@ -691,16 +691,20 @@ methods.getPIDsByName = async function getPIDsByName(name) {
|
|
|
691
691
|
}
|
|
692
692
|
|
|
693
693
|
if (this._isPgrepAvailable || this._isPidofAvailable) {
|
|
694
|
-
const shellCommand = this._isPgrepAvailable ? this._canPgrepUseFullCmdLineSearch ? ['pgrep', '-f', _lodash.default.escapeRegExp(`([[:blank:]]|^)${name}([[:blank:]]|$)`)] : [`pgrep ^${_lodash.default.escapeRegExp(name.slice(-MAX_PGREP_PATTERN_LEN))}$
|
|
694
|
+
const shellCommand = this._isPgrepAvailable ? this._canPgrepUseFullCmdLineSearch ? ['pgrep', '-f', _lodash.default.escapeRegExp(`([[:blank:]]|^)${name}([[:blank:]]|$)`)] : [`pgrep ^${_lodash.default.escapeRegExp(name.slice(-MAX_PGREP_PATTERN_LEN))}$ ` + `|| pgrep ^${_lodash.default.escapeRegExp(name.slice(0, MAX_PGREP_PATTERN_LEN))}$`] : ['pidof', name];
|
|
695
695
|
|
|
696
696
|
try {
|
|
697
697
|
return (await this.shell(shellCommand)).split(/\s+/).map(x => parseInt(x, 10)).filter(x => _lodash.default.isInteger(x));
|
|
698
698
|
} catch (e) {
|
|
699
|
-
if (e.code
|
|
700
|
-
|
|
699
|
+
if (e.code !== 1) {
|
|
700
|
+
throw new Error(`Could not extract process ID of '${name}': ${e.message}`);
|
|
701
701
|
}
|
|
702
702
|
|
|
703
|
-
|
|
703
|
+
if (_lodash.default.includes(e.stderr || e.stdout, 'syntax error')) {
|
|
704
|
+
_logger.default.warn(`Got an unexpected response from the shell interpreter: ${e.stderr || e.stdout}`);
|
|
705
|
+
} else {
|
|
706
|
+
return [];
|
|
707
|
+
}
|
|
704
708
|
}
|
|
705
709
|
}
|
|
706
710
|
}
|
|
@@ -1097,4 +1101,4 @@ var _default = methods;
|
|
|
1097
1101
|
exports.default = _default;require('source-map-support').install();
|
|
1098
1102
|
|
|
1099
1103
|
|
|
1100
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwibmFtZXMiOlsiTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgiLCJOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SIiwiSUdOT1JFRF9QRVJNX0VSUk9SUyIsIk1BWF9QR1JFUF9QQVRURVJOX0xFTiIsIkhJRERFTl9BUElfUE9MSUNZX0tFWVMiLCJQSURfQ09MVU1OX1RJVExFIiwiUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSIsIlBTX1RJVExFX1BBVFRFUk4iLCJSZWdFeHAiLCJtZXRob2RzIiwic2hlbGxDaHVua3MiLCJhcmdUcmFuc2Zvcm1lciIsImFyZ3MiLCJjb21tYW5kcyIsImNtZENodW5rIiwiYXJnIiwibmV4dENtZCIsIl8iLCJpc0FycmF5IiwiRXJyb3IiLCJsYXN0IiwicHVzaCIsImpvaW4iLCJsZW5ndGgiLCJpc0VtcHR5IiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGFzdEVycm9yIiwiY21kIiwic2hlbGwiLCJlIiwiZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoIiwiZXhlY3V0YWJsZSIsInBhdGgiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYWRiIiwiaW5pdEFhcHQiLCJpbml0QWFwdDIiLCJpbml0WmlwQWxpZ24iLCJpbml0QnVuZGxldG9vbCIsImJpbmFyaWVzIiwiYnVuZGxldG9vbCIsImZzIiwid2hpY2giLCJlcnIiLCJnZXRBcGlMZXZlbCIsImlzSW50ZWdlciIsIl9hcGlMZXZlbCIsInN0ck91dHB1dCIsImdldERldmljZVByb3BlcnR5IiwiYXBpTGV2ZWwiLCJwYXJzZUludCIsInRyaW0iLCJjaGFyQ29kZVEiLCJjaGFyQ29kZUF0IiwiYXBpTGV2ZWxEaWZmIiwiY29kZW5hbWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaXNOYU4iLCJtZXNzYWdlIiwiaW5mbyIsImlzRGV2aWNlQ29ubmVjdGVkIiwiZGV2aWNlcyIsImdldENvbm5lY3RlZERldmljZXMiLCJta2RpciIsInJlbW90ZVBhdGgiLCJpc1ZhbGlkQ2xhc3MiLCJjbGFzc1N0cmluZyIsImV4ZWMiLCJmb3JjZVN0b3AiLCJwa2ciLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0Iiwid2FybiIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsInN0ZGVyciIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0Iiwic3Rkb3V0IiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0IiwicmVwbGFjZSIsImNsZWFyVGV4dEZpZWxkIiwiaSIsImxvY2siLCJpc1NjcmVlbkxvY2tlZCIsInRpbWVvdXRNcyIsIndhaXRNcyIsImludGVydmFsTXMiLCJiYWNrIiwiZ29Ub0hvbWUiLCJnZXRBZGJQYXRoIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX0xPR19EVU1QU1lTIiwiZHVtcHN5c0ZpbGUiLCJyZXNvbHZlIiwiY3dkIiwid3JpdGVGaWxlIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaW5wdXRTaG93bk1hdGNoIiwiaW5wdXRWaWV3U2hvd25NYXRjaCIsImlzS2V5Ym9hcmRTaG93biIsImNhbkNsb3NlS2V5Ym9hcmQiLCJzZW5kVGVsbmV0Q29tbWFuZCIsImNvbW1hbmQiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJwb3J0IiwiZ2V0RW11bGF0b3JQb3J0IiwiaXNBaXJwbGFuZU1vZGVPbiIsInNldEFpcnBsYW5lTW9kZSIsIm9uIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNXaWZpT24iLCJpc0RhdGFPbiIsInNldFdpZmlBbmREYXRhIiwid2lmaSIsImRhdGEiLCJpc0VtdWxhdG9yIiwidXRpbCIsImhhc1ZhbHVlIiwic2V0V2lmaVN0YXRlIiwic2V0RGF0YVN0YXRlIiwiaXNBbmltYXRpb25PbiIsImFuaW1hdG9yX2R1cmF0aW9uX3NjYWxlIiwidHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUiLCJ3aW5kb3dfYW5pbWF0aW9uX3NjYWxlIiwic2V0dGluZyIsInJpbXJhZiIsImxvY2FsUGF0aCIsIm9wdHMiLCJwb3NpeCIsImRpcm5hbWUiLCJhZGJFeGVjIiwicHVsbCIsInRpbWVvdXQiLCJwcm9jZXNzRXhpc3RzIiwicHJvY2Vzc05hbWUiLCJnZXRQSURzQnlOYW1lIiwiZ2V0Rm9yd2FyZExpc3QiLCJjb25uZWN0aW9ucyIsIkVPTCIsImxpbmUiLCJmb3J3YXJkUG9ydCIsInN5c3RlbVBvcnQiLCJkZXZpY2VQb3J0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJnZXRSZXZlcnNlTGlzdCIsInJldmVyc2VQb3J0IiwicmVtb3ZlUG9ydFJldmVyc2UiLCJmb3J3YXJkQWJzdHJhY3RQb3J0IiwicGluZyIsImluZGV4T2YiLCJyZXN0YXJ0Iiwic3RvcExvZ2NhdCIsInJlc3RhcnRBZGIiLCJ3YWl0Rm9yRGV2aWNlIiwic3RhcnRMb2djYXQiLCJfbG9nY2F0U3RhcnR1cFBhcmFtcyIsImxvZ2NhdCIsIkxvZ2NhdCIsImRlYnVnVHJhY2UiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0Iiwic3RhcnRDYXB0dXJlIiwic3RvcENhcHR1cmUiLCJnZXRMb2djYXRMb2dzIiwiZ2V0TG9ncyIsInNldExvZ2NhdExpc3RlbmVyIiwibGlzdGVuZXIiLCJyZW1vdmVMb2djYXRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwibGlzdFByb2Nlc3NTdGF0dXMiLCJpc0Jvb2xlYW4iLCJfZG9lc1BzU3VwcG9ydEFPcHRpb24iLCJzdGFjayIsImdldE5hbWVCeVBpZCIsInBpZCIsInRpdGxlTWF0Y2giLCJhbGxUaXRsZXMiLCJwaWRJbmRleCIsIm5hbWVPZmZzZXQiLCJwaWRSZWdleCIsIm1hdGNoZWRMaW5lIiwiaXRlbXMiLCJuYW1lIiwiX2lzUGdyZXBBdmFpbGFibGUiLCJwZ3JlcE91dHB1dCIsIl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoIiwiX2lzUGlkb2ZBdmFpbGFibGUiLCJzaGVsbENvbW1hbmQiLCJlc2NhcGVSZWdFeHAiLCJzbGljZSIsIngiLCJwaWRzIiwicHJvY2Vzc05hbWVSZWdleCIsImtpbGxQcm9jZXNzZXNCeU5hbWUiLCJCIiwiYWxsIiwia2lsbFByb2Nlc3NCeVBJRCIsIm5vUHJvY2Vzc0ZsYWciLCJpbmNsdWRlcyIsInByaXZpbGVnZWQiLCJlMSIsImJyb2FkY2FzdFByb2Nlc3NFbmQiLCJpbnRlbnQiLCJicm9hZGNhc3QiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlamVjdCIsImRlZmF1bHRBcmdzIiwiY29uY2F0IiwiU3ViUHJvY2VzcyIsIndhaXRGb3JBY3Rpdml0eSIsInByb3BlcnR5IiwidmFsIiwic2V0RGV2aWNlUHJvcGVydHkiLCJwcm9wIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VTeXNDb3VudHJ5IiwiZ2V0RGV2aWNlU3lzTG9jYWxlIiwiZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlIiwiZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0TG9jYWxlIiwiZ2V0TW9kZWwiLCJnZXRNYW51ZmFjdHVyZXIiLCJnZXRTY3JlZW5TaXplIiwic2l6ZSIsImdldFNjcmVlbkRlbnNpdHkiLCJkZW5zaXR5IiwiZGVuc2l0eU51bWJlciIsInNldEh0dHBQcm94eSIsInByb3h5SG9zdCIsInByb3h5UG9ydCIsInByb3h5IiwiaXNVbmRlZmluZWQiLCJodHRwUHJveHlTZXR0aW5zIiwic2V0dGluZ0tleSIsInNldHRpbmdWYWx1ZSIsImRlbGV0ZUh0dHBQcm94eSIsIm5hbWVzcGFjZSIsImJ1Z3JlcG9ydCIsInNjcmVlbnJlY29yZCIsImRlc3RpbmF0aW9uIiwib3B0aW9ucyIsInZpZGVvU2l6ZSIsImJpdFJhdGUiLCJ0aW1lTGltaXQiLCJidWdSZXBvcnQiLCJmdWxsQ21kIiwicXVvdGUiLCJydW5JbkltZUNvbnRleHQiLCJpbWUiLCJmbiIsIm9yaWdpbmFsSW1lIiwiZ2V0VGltZVpvbmUiLCJsaXN0RmVhdHVyZXMiLCJfbWVtb2l6ZWRGZWF0dXJlcyIsIm1lbW9pemUiLCJjdXJEZXZpY2VJZCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwicHJvdG8iLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9oZWxwT3V0cHV0IiwiaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQiLCJiaW5hcnkiLCJnZXRWZXJzaW9uIiwiY29tcGFyZVZlcnNpb25zIiwidmVyc2lvbiIsImdldERldmljZUlkbGVXaGl0ZWxpc3QiLCJvdXRwdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJwYWNrYWdlcyIsInBsdXJhbGl6ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSx1QkFBdUIsR0FBRyxJQUFoQztBQUNBLE1BQU1DLHlCQUF5QixHQUFHLG1DQUFsQztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLENBQzFCRCx5QkFEMEIsRUFFMUIscUJBRjBCLENBQTVCO0FBSUEsTUFBTUUscUJBQXFCLEdBQUcsRUFBOUI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxDQUM3Qiw4QkFENkIsRUFFN0IsMEJBRjZCLEVBRzdCLG1CQUg2QixDQUEvQjtBQUtBLE1BQU1DLGdCQUFnQixHQUFHLEtBQXpCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsTUFBbEM7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyxNQUFKLENBQVksVUFBU0gsZ0JBQWlCLFdBQVVDLHlCQUEwQixTQUExRSxFQUFvRixHQUFwRixDQUF6QjtBQUdBLE1BQU1HLE9BQU8sR0FBRyxFQUFoQjs7QUFnQkFBLE9BQU8sQ0FBQ0MsV0FBUixHQUFzQixlQUFlQSxXQUFmLENBQTRCQyxjQUE1QixFQUE0Q0MsSUFBNUMsRUFBa0Q7QUFDdEUsUUFBTUMsUUFBUSxHQUFHLEVBQWpCO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLEVBQWY7O0FBQ0EsT0FBSyxNQUFNQyxHQUFYLElBQWtCSCxJQUFsQixFQUF3QjtBQUN0QixVQUFNSSxPQUFPLEdBQUdMLGNBQWMsQ0FBQ0ksR0FBRCxDQUE5Qjs7QUFDQSxRQUFJLENBQUNFLGdC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WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBnZXRJTUVMaXN0RnJvbU91dHB1dCwgaXNTaG93aW5nTG9ja3NjcmVlbiwgaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkLFxuICBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGlzU2NyZWVuT25GdWxseSwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG5cblxuY29uc3QgbWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgY2h1bmtzIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCBleGVjdXRlcyB0aGVtIGluIGBhZGIgc2hlbGxgLlxuICogVGhpcyBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBhZGIgc2hlbGxgIHNlcGFyYXRlbHkgZm9yIGVhY2ggYXJnLCBob3dldmVyXG4gKiB0aGVyZSBpcyBhIGxpbWl0IGZvciBhIG1heGltdW0gbGVuZ3RoIG9mIGEgc2luZ2xlIGFkYiBjb21tYW5kLiB0aGF0IGlzIHdoeVxuICogd2UgbmVlZCBhbGwgdGhpcyBjb21wbGljYXRlZCBsb2dpYy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcmdUcmFuc2Zvcm1lciBBIGZ1bmN0aW9uLCB0aGF0IHJlY2VpdmVzIHNpbmdsZSBhcmd1bWVudFxuICogZnJvbSB0aGUgYGFyZ3NgIGFycmF5IGFuZCB0cmFuc2Zvcm1zIGl0IGludG8gYSBzaGVsbCBjb21tYW5kLiBUaGUgcmVzdWx0XG4gKiBvZiB0aGUgZnVuY3Rpb24gbXVzdCBiZSBhbiBhcnJheSwgd2hlcmUgZWFjaCBpdGVtIGlzIGEgcGFydCBvZiBhIHNpbmdsZSBjb21tYW5kLlxuICogVGhlIGxhc3QgaXRlbSBvZiB0aGUgYXJyYXkgY291bGQgYmUgJzsnLiBJZiB0aGlzIGlzIG5vdCBhIHNlbWljb2xvbiB0aGVuIGl0IGlzIGdvaW5nIHRvXG4gKiBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICogQHBhcmFtIHtBcnJheTxudW1iZXJ8c3RyaW5nPn0gYXJncyBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMgdG8gY3JlYXRlIGNodW5rcyBmb3JcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhbnkgb2YgdGhlIGNodW5rcyByZXR1cm5zIG5vbi16ZXJvIGV4aXQgY29kZSBhZnRlciBiZWluZyBleGVjdXRlZFxuICovXG5tZXRob2RzLnNoZWxsQ2h1bmtzID0gYXN5bmMgZnVuY3Rpb24gc2hlbGxDaHVua3MgKGFyZ1RyYW5zZm9ybWVyLCBhcmdzKSB7XG4gIGNvbnN0IGNvbW1hbmRzID0gW107XG4gIGxldCBjbWRDaHVuayA9IFtdO1xuICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgY29uc3QgbmV4dENtZCA9IGFyZ1RyYW5zZm9ybWVyKGFyZyk7XG4gICAgaWYgKCFfLmlzQXJyYXkobmV4dENtZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgdHJhbnNmb3JtZXIgbXVzdCByZXN1bHQgaW4gYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKF8ubGFzdChuZXh0Q21kKSAhPT0gJzsnKSB7XG4gICAgICBuZXh0Q21kLnB1c2goJzsnKTtcbiAgICB9XG4gICAgaWYgKG5leHRDbWQuam9pbignICcpLmxlbmd0aCArIGNtZENodW5rLmpvaW4oJyAnKS5sZW5ndGggPj0gTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goY21kQ2h1bmspO1xuICAgICAgY21kQ2h1bmsgPSBbXTtcbiAgICB9XG4gICAgY21kQ2h1bmsgPSBbLi4uY21kQ2h1bmssIC4uLm5leHRDbWRdO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGNtZENodW5rKSkge1xuICAgIGNvbW1hbmRzLnB1c2goY21kQ2h1bmspO1xuICB9XG4gIGxvZy5kZWJ1ZyhgR290IHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjaHVua3MgdG8gZXhlY3V0ZTogJHtKU09OLnN0cmluZ2lmeShjb21tYW5kcyl9YCk7XG4gIGxldCBsYXN0RXJyb3IgPSBudWxsO1xuICBmb3IgKGNvbnN0IGNtZCBvZiBjb21tYW5kcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKGNtZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbGFzdEVycm9yID0gZTtcbiAgICB9XG4gIH1cbiAgaWYgKGxhc3RFcnJvcikge1xuICAgIHRocm93IGxhc3RFcnJvcjtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUgYW1kIGFzc2lnbiBpdFxuICogdG8gdGhpcy5leGVjdXRhYmxlLnBhdGggYW5kIHRoaXMuYmluYXJpZXMuYWRiIHByb3BlcnRpZXMuXG4gKlxuICogQHJldHVybiB7QURCfSBBREIgaW5zdGFuY2UuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoID0gYXN5bmMgZnVuY3Rpb24gZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoICgpIHtcbiAgdGhpcy5leGVjdXRhYmxlLnBhdGggPSBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FkYicpO1xuICByZXR1cm4gdGhpcy5hZGI7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGFhcHQgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRBYXB0ICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0Jyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGFhcHQyIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0MiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0MiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRBYXB0MiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdDInKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gemlwYWxpZ24gdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLnppcGFsaWduIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdFppcEFsaWduID0gYXN5bmMgZnVuY3Rpb24gaW5pdFppcEFsaWduICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCd6aXBhbGlnbicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBidW5kbGV0b29sIGJpbmFyeSBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRCdW5kbGV0b29sICgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wgPSBhd2FpdCBmcy53aGljaCgnYnVuZGxldG9vbC5qYXInKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidW5kbGV0b29sLmphciBiaW5hcnkgaXMgZXhwZWN0ZWQgdG8gYmUgcHJlc2VudCBpbiBQQVRILiAnICtcbiAgICAgICdWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2J1bmRsZXRvb2wgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgQVBJIGxldmVsIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBBUEkgbGV2ZWwgYXMgaW50ZWdlciBudW1iZXIsIGZvciBleGFtcGxlIDIxIGZvclxuICogICAgICAgICAgICAgICAgICBBbmRyb2lkIExvbGxpcG9wLiBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIGNhY2hlZCwgc28gYWxsIHRoZSBmdXJ0aGVyXG4gKiBjYWxscyByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGZpcnN0IG9uZS5cbiAqL1xubWV0aG9kcy5nZXRBcGlMZXZlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFwaUxldmVsICgpIHtcbiAgaWYgKCFfLmlzSW50ZWdlcih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyT3V0cHV0ID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5zZGsnKTtcbiAgICAgIGxldCBhcGlMZXZlbCA9IHBhcnNlSW50KHN0ck91dHB1dC50cmltKCksIDEwKTtcblxuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgcHJldmlldy9iZXRhIHBsYXRmb3JtIEFQSSBsZXZlbFxuICAgICAgY29uc3QgY2hhckNvZGVRID0gJ3EnLmNoYXJDb2RlQXQoMCk7XG4gICAgICAvLyAyOCBpcyB0aGUgZmlyc3QgQVBJIExldmVsLCB3aGVyZSBBbmRyb2lkIFNESyBzdGFydGVkIHJldHVybmluZyBsZXR0ZXJzIGluIHJlc3BvbnNlIHRvIGdldFBsYXRmb3JtVmVyc2lvblxuICAgICAgY29uc3QgYXBpTGV2ZWxEaWZmID0gYXBpTGV2ZWwgLSAyODtcbiAgICAgIGNvbnN0IGNvZGVuYW1lID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZVEgKyBhcGlMZXZlbERpZmYpO1xuICAgICAgaWYgKGFwaUxldmVsRGlmZiA+PSAwICYmIChhd2FpdCB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpKS50b0xvd2VyQ2FzZSgpID09PSBjb2RlbmFtZSkge1xuICAgICAgICBsb2cuZGVidWcoYFJlbGVhc2UgdmVyc2lvbiBpcyAke2NvZGVuYW1lLnRvVXBwZXJDYXNlKCl9IGJ1dCBmb3VuZCBBUEkgTGV2ZWwgJHthcGlMZXZlbH0uIFNldHRpbmcgQVBJIExldmVsIHRvICR7YXBpTGV2ZWwgKyAxfWApO1xuICAgICAgICBhcGlMZXZlbCsrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hcGlMZXZlbCA9IGFwaUxldmVsO1xuICAgICAgbG9nLmRlYnVnKGBEZXZpY2UgQVBJIGxldmVsOiAke3RoaXMuX2FwaUxldmVsfWApO1xuICAgICAgaWYgKGlzTmFOKHRoaXMuX2FwaUxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhY3R1YWwgb3V0cHV0ICcke3N0ck91dHB1dH0nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlcmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZXZpY2UgQVBJIGxldmVsLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzLl9hcGlMZXZlbDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBsYXRmb3JtIHZlcnNpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBsYXRmb3JtIHZlcnNpb24gYXMgYSBzdHJpbmcsIGZvciBleGFtcGxlICc1LjAnIGZvclxuICogQW5kcm9pZCBMb2xsaXBvcC5cbiAqL1xubWV0aG9kcy5nZXRQbGF0Zm9ybVZlcnNpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24gKCkge1xuICBsb2cuaW5mbygnR2V0dGluZyBkZXZpY2UgcGxhdGZvcm0gdmVyc2lvbicpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZXZpY2UgcGxhdGZvcm0gdmVyc2lvbi4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIGEgZGV2aWNlIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBkZXZpY2UgaXMgdmlzaWJsZSB0byBhZGIuXG4gKi9cbm1ldGhvZHMuaXNEZXZpY2VDb25uZWN0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0RldmljZUNvbm5lY3RlZCAoKSB7XG4gIGxldCBkZXZpY2VzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VzKCk7XG4gIHJldHVybiBkZXZpY2VzLmxlbmd0aCA+IDA7XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNyZWF0ZSBhIG5ldyBmb2xkZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIG5ldyBwYXRoIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IG1rZGlyIGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLm1rZGlyID0gYXN5bmMgZnVuY3Rpb24gbWtkaXIgKHJlbW90ZVBhdGgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydta2RpcicsICctcCcsIHJlbW90ZVBhdGhdKTtcbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIGFcbiAqIHZhbGlkIGNsYXNzIG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzU3RyaW5nIC0gVGhlIGFjdHVhbCBjbGFzcyBuYW1lIHRvIGJlIHZlcmlmaWVkLlxuICogQHJldHVybiB7P0FycmF5LjxNYXRjaD59IFRoZSByZXN1bHQgb2YgUmVnZXhwLmV4ZWMgb3BlcmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgX251bGxfIGlmIG5vIG1hdGNoZXMgYXJlIGZvdW5kLlxuICovXG5tZXRob2RzLmlzVmFsaWRDbGFzcyA9IGZ1bmN0aW9uIGlzVmFsaWRDbGFzcyAoY2xhc3NTdHJpbmcpIHtcbiAgLy8gc29tZS5wYWNrYWdlL3NvbWUucGFja2FnZS5BY3Rpdml0eVxuICByZXR1cm4gbmV3IFJlZ0V4cCgvXlthLXpBLVowLTkuL19dKyQvKS5leGVjKGNsYXNzU3RyaW5nKTtcbn07XG5cbi8qKlxuICogRm9yY2UgYXBwbGljYXRpb24gdG8gc3RvcCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5mb3JjZVN0b3AgPSBhc3luYyBmdW5jdGlvbiBmb3JjZVN0b3AgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2ZvcmNlLXN0b3AnLCBwa2ddKTtcbn07XG5cbi8qXG4gKiBLaWxsIGFwcGxpY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5raWxsUGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQYWNrYWdlIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdraWxsJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSB1c2VyIGRhdGEgb2YgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBjbGVhcmVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gY2xlYXIgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2NsZWFyJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIEdyYW50IGFsbCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIG9uIEFuZHJvaWQgNi4wKyBhbmQgZm9yIGFwcGxpY2F0aW9uc1xuICogdGhhdCBzdXBwb3J0IGNvbXBvbmVudHMtYmFzZWQgcGVybWlzc2lvbnMgc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIHBhdGggdG8gdGhlIGFjdHVhbCBhcGsgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ3JhbnRpbmcgcGVybWlzc2lvbnNcbiAqL1xubWV0aG9kcy5ncmFudEFsbFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRBbGxQZXJtaXNzaW9ucyAocGtnLCBhcGspIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG4gIGxldCB0YXJnZXRTZGsgPSAwO1xuICBsZXQgZHVtcHN5c091dHB1dCA9IG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKCFhcGspIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgYXBrIG5vdCBwcm92aWRlZCwgY29uc2lkZXJpbmcgYXBrIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2VcbiAgICAgICAqIGFuZCBmZXRjaGluZyB0YXJnZXRTZGsgdXNpbmcgcGFja2FnZSBuYW1lLlxuICAgICAgICovXG4gICAgICBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0KGFwayk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy9hdm9pZGluZyBsb2dnaW5nIGVycm9yIHN0YWNrLCBhcyBjYWxsaW5nIGxpYnJhcnkgZnVuY3Rpb24gd291bGQgaGF2ZSBsb2dnZWRcbiAgICBsb2cud2FybihgUmFuIGludG8gcHJvYmxlbSBnZXR0aW5nIHRhcmdldCBTREsgdmVyc2lvbjsgaWdub3JpbmcuLi5gKTtcbiAgfVxuICBpZiAoYXBpTGV2ZWwgPj0gMjMgJiYgdGFyZ2V0U2RrID49IDIzKSB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQgNi4wKEFQSSAyMykgb3IgaGlnaGVyLCBhbmQgeW91ciBhcHAncyB0YXJnZXQgU0RLIGlzIDIzIG9yIGhpZ2hlcjpcbiAgICAgKiBUaGUgYXBwIGhhcyB0byBsaXN0IHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgbWFuaWZlc3QuXG4gICAgICogcmVmZXI6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3RyYWluaW5nL3Blcm1pc3Npb25zL3JlcXVlc3RpbmcuaHRtbFxuICAgICAqL1xuICAgIGR1bXBzeXNPdXRwdXQgPSBkdW1wc3lzT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UmVxUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBncmFudGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zVG9HcmFudCA9IF8uZGlmZmVyZW5jZShyZXF1ZXN0ZWRQZXJtaXNzaW9ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zVG9HcmFudCkpIHtcbiAgICAgIGxvZy5pbmZvKGAke3BrZ30gY29udGFpbnMgbm8gcGVybWlzc2lvbnMgYXZhaWxhYmxlIGZvciBncmFudGluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmdyYW50UGVybWlzc2lvbnMocGtnLCBwZXJtaXNzaW9uc1RvR3JhbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBtdWx0aXBsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgY2FsbCBpcyBtb3JlIHBlcmZvcm1hbnQgdGhhbiBgZ3JhbnRQZXJtaXNzaW9uYCBvbmUsIHNpbmNlIGl0IGNvbWJpbmVzXG4gKiBtdWx0aXBsZSBgYWRiIHNoZWxsYCBjYWxscyBpbnRvIGEgc2luZ2xlIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9ucyAtIFRoZSBsaXN0IG9mIHBlcm1pc3Npb25zIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb25zIChwa2csIHBlcm1pc3Npb25zKSB7XG4gIC8vIEFzIGl0IGNvbnN1bWVzIG1vcmUgdGltZSBmb3IgZ3JhbnRpbmcgZWFjaCBwZXJtaXNzaW9uLFxuICAvLyB0cnlpbmcgdG8gZ3JhbnQgYWxsIHBlcm1pc3Npb24gYnkgZm9ybWluZyBlcXVpdmFsZW50IGNvbW1hbmQuXG4gIC8vIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSB0byBzcGxpdCBsb25nIGNvbW1hbmRzIGludG8gY2h1bmtzLCBzaW5jZSB0aGUgbWF4aW11bSBsZW5ndGggb2ZcbiAgLy8gYWRiIHNoZWxsIGJ1ZmZlciBpcyBsaW1pdGVkXG4gIGxvZy5kZWJ1ZyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9ucyl9IHRvICcke3BrZ30nYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGVybSkgPT4gWydwbScsICdncmFudCcsIHBrZywgcGVybV0sIHBlcm1pc3Npb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghSUdOT1JFRF9QRVJNX0VSUk9SUy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IHNpbmdsZSBwZXJtaXNzaW9uIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdncmFudCcsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV2b2tlIHNpbmdsZSBwZXJtaXNzaW9uIGZyb20gdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgcmV2b2tlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMucmV2b2tlUGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIHJldm9rZVBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdyZXZva2UnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldEdyYW50ZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBncmFudGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXREZW5pZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldERlbmllZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGRlbmllZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldFJlcVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmVxUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgcmVxdWVzdGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsncmVxdWVzdGVkJ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBsb2NhdGlvbiBwcm92aWRlcnMgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2F0aW9uIHByb3ZpZGVycyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldExvY2F0aW9uUHJvdmlkZXJzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb25Qcm92aWRlcnMgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnKTtcbiAgcmV0dXJuIHN0ZG91dC50cmltKCkuc3BsaXQoJywnKVxuICAgIC5tYXAoKHApID0+IHAudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIFRvZ2dsZSB0aGUgc3RhdGUgb2YgR1BTIGxvY2F0aW9uIHByb3ZpZGVyLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdG8gZW5hYmxlICh0cnVlKSBvciBkaXNhYmxlIChmYWxzZSkgdGhlIEdQUyBwcm92aWRlci5cbiAqL1xubWV0aG9kcy50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciAoZW5hYmxlZCkge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcsIGAke2VuYWJsZWQgPyAnKycgOiAnLSd9Z3BzYCk7XG59O1xuXG4vKipcbiAqIFNldCBoaWRkZW4gYXBpIHBvbGljeSB0byBtYW5hZ2UgYWNjZXNzIHRvIG5vbi1TREsgQVBJcy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWUgLSBUaGUgQVBJIGVuZm9yY2VtZW50IHBvbGljeS5cbiAqICAgICBGb3IgQW5kcm9pZCBQXG4gKiAgICAgMDogRGlzYWJsZSBub24tU0RLIEFQSSB1c2FnZSBkZXRlY3Rpb24uIFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgbG9nZ2luZywgYW5kIGFsc28gYnJlYWsgdGhlIHN0cmljdCBtb2RlIEFQSSxcbiAqICAgICAgICBkZXRlY3ROb25TZGtBcGlVc2FnZSgpLiBOb3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogXCJKdXN0IHdhcm5cIiAtIHBlcm1pdCBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgQVBJcywgYnV0IGtlZXAgd2FybmluZ3MgaW4gdGhlIGxvZy5cbiAqICAgICAgICBUaGUgc3RyaWN0IG1vZGUgQVBJIHdpbGwga2VlcCB3b3JraW5nLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBhbmQgYmxhY2sgbGlzdGVkIEFQSXMuXG4gKiAgICAgMzogRGlzYWxsb3cgdXNhZ2Ugb2YgYmxhY2tsaXN0ZWQgQVBJcywgYnV0IGFsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBsaXN0ZWQgQVBJcy5cbiAqXG4gKiAgICAgRm9yIEFuZHJvaWQgUVxuICogICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvbm9uLXNkay1xI2VuYWJsZS1ub24tc2RrLWFjY2Vzc1xuICogICAgIDA6IERpc2FibGUgYWxsIGRldGVjdGlvbiBvZiBub24tU0RLIGludGVyZmFjZXMuIFVzaW5nIHRoaXMgc2V0dGluZyBkaXNhYmxlcyBhbGwgbG9nIG1lc3NhZ2VzIGZvciBub24tU0RLIGludGVyZmFjZSB1c2FnZVxuICogICAgICAgIGFuZCBwcmV2ZW50cyB5b3UgZnJvbSB0ZXN0aW5nIHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS4gVGhpcyBzZXR0aW5nIGlzIG5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBFbmFibGUgYWNjZXNzIHRvIGFsbCBub24tU0RLIGludGVyZmFjZXMsIGJ1dCBwcmludCBsb2cgbWVzc2FnZXMgd2l0aCB3YXJuaW5ncyBmb3IgYW55IG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlLlxuICogICAgICAgIFVzaW5nIHRoaXMgc2V0dGluZyBhbHNvIGFsbG93cyB5b3UgdG8gdGVzdCB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2Ygbm9uLVNESyBpbnRlcmZhY2VzIHRoYXQgYmVsb25nIHRvIGVpdGhlciB0aGUgYmxhY2sgbGlzdFxuICogICAgICAgIG9yIHRvIGEgcmVzdHJpY3RlZCBncmV5bGlzdCBmb3IgeW91ciB0YXJnZXQgQVBJIGxldmVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldEhpZGRlbkFwaVBvbGljeSAodmFsdWUsIGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgcHV0IGdsb2JhbCAke2t9ICR7dmFsdWV9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gc2V0IHNldHRpbmcga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScgdG8gJyR7dmFsdWV9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlc2V0IGFjY2VzcyB0byBub24tU0RLIEFQSXMgdG8gaXRzIGRlZmF1bHQgc2V0dGluZy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IChpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwgJHtrfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIGRlbGV0ZSBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIHBhcnRpY3VsYXIgcGFja2FnZSBpZiBpdCBpcyBydW5uaW5nIGFuZCBjbGVhcnMgaXRzIGFwcGxpY2F0aW9uIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICovXG5tZXRob2RzLnN0b3BBbmRDbGVhciA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BBbmRDbGVhciAocGtnKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5mb3JjZVN0b3AocGtnKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFyKHBrZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzdG9wIGFuZCBjbGVhciAke3BrZ30uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuYXZhaWxhYmxlSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGF2YWlsYWJsZUlNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnLCAnLWEnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGF2YWlsYWJsZSBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGVuYWJsZWQgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZW5hYmxlZCBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5lbmFibGVkSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZWRJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0J10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBlbmFibGVkIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5hYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZW5hYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2VuYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIERpc2FibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5kaXNhYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdkaXNhYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuc2V0SU1FID0gYXN5bmMgZnVuY3Rpb24gc2V0SU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ3NldCcsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZFxuICovXG5tZXRob2RzLmRlZmF1bHRJTUUgPSBhc3luYyBmdW5jdGlvbiBkZWZhdWx0SU1FICgpIHtcbiAgdHJ5IHtcbiAgICBsZXQgZW5naW5lID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnZGVmYXVsdF9pbnB1dF9tZXRob2QnKTtcbiAgICBpZiAoZW5naW5lID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZW5naW5lLnRyaW0oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZWZhdWx0IElNRS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBrZXljb2RlIC0gVGhlIGFjdHVhbCBrZXkgY29kZSB0byBiZSBzZW50LlxuICovXG5tZXRob2RzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUpIHtcbiAgLy8ga2V5Y29kZSBtdXN0IGJlIGFuIGludC5cbiAgbGV0IGNvZGUgPSBwYXJzZUludChrZXljb2RlLCAxMCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIGNvZGVdKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciB0ZXh0IHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBhY3R1YWwgdGV4dCB0byBiZSBzZW50LlxuICovXG5tZXRob2RzLmlucHV0VGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGlucHV0VGV4dCAodGV4dCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuICAvLyBuZWVkIHRvIGVzY2FwZSB3aGl0ZXNwYWNlIGFuZCAoICkgPCA+IHwgOyAmICogXFwgfiBcIiAnXG4gIHRleHQgPSB0ZXh0XG4gICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJylcbiAgICAgICAgICAucmVwbGFjZSgvXFwoL2csICdcXCgnKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXCkvZywgJ1xcKScpXG4gICAgICAgICAgLnJlcGxhY2UoLzwvZywgJ1xcPCcpXG4gICAgICAgICAgLnJlcGxhY2UoLz4vZywgJ1xcPicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcfC9nLCAnXFx8JylcbiAgICAgICAgICAucmVwbGFjZSgvOy9nLCAnXFw7JylcbiAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnXFwmJylcbiAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICdcXConKVxuICAgICAgICAgIC5yZXBsYWNlKC9+L2csICdcXH4nKVxuICAgICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnXFxcIicpXG4gICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXCdcIilcbiAgICAgICAgICAucmVwbGFjZSgvIC9nLCAnJXMnKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdXNlbGVzcy1lc2NhcGUgKi9cbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCB0ZXh0XSk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSBhY3RpdmUgdGV4dCBmaWVsZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgYnkgc2VuZGluZ1xuICogc3BlY2lhbCBrZXlldmVudHMgdG8gaXQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBbMTAwXSAtIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgZmllbGQgdG8gYmUgY2xlYXJlZC5cbiAqL1xubWV0aG9kcy5jbGVhclRleHRGaWVsZCA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyVGV4dEZpZWxkIChsZW5ndGggPSAxMDApIHtcbiAgLy8gYXNzdW1lcyB0aGF0IHRoZSBFZGl0VGV4dCBmaWVsZCBhbHJlYWR5IGhhcyBmb2N1c1xuICBsb2cuZGVidWcoYENsZWFyaW5nIHVwIHRvICR7bGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGFyZ3MgPSBbJ2lucHV0JywgJ2tleWV2ZW50J107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAvLyB3ZSBjYW5ub3Qga25vdyB3aGVyZSB0aGUgY3Vyc29yIGlzIGluIHRoZSB0ZXh0IGZpZWxkLCBzbyBkZWxldGUgYm90aCBiZWZvcmVcbiAgICAvLyBhbmQgYWZ0ZXIgc28gdGhhdCB3ZSBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmdcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9ERUxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9GT1JXQVJEX0RFTFxuICAgIGFyZ3MucHVzaCgnNjcnLCAnMTEyJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBsb2NrIGl0LlxuICovXG5tZXRob2RzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIGxvZy5kZWJ1ZygnU2NyZWVuIGlzIGFscmVhZHkgbG9ja2VkLiBEb2luZyBub3RoaW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBLRVlDT0RFX1BPV0VSIGJ1dHRvbiB0byBsb2NrIHNjcmVlbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDI2KTtcblxuICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwO1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRldmljZSBzY3JlZW4gaXMgc3RpbGwgbG9ja2VkIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXRgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEJhY2sgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEJBQ0sgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoNCk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogSG9tZSBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmdvVG9Ib21lID0gYXN5bmMgZnVuY3Rpb24gZ29Ub0hvbWUgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBIT01FIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBhY3R1YWwgcGF0aCB0byBhZGIgZXhlY3V0YWJsZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJQYXRoID0gZnVuY3Rpb24gZ2V0QWRiUGF0aCAoKSB7XG4gIHJldHVybiB0aGlzLmV4ZWN1dGFibGUucGF0aDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgY3VycmVudCBzY3JlZW4gb3JpZW50YXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgb3JpZW50YXRpb24gZW5jb2RlZCBhcyBhbiBpbnRlZ2VyIG51bWJlci5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5PcmllbnRhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbk9yaWVudGF0aW9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2lucHV0J10pO1xuICByZXR1cm4gZ2V0U3VyZmFjZU9yaWVudGF0aW9uKHN0ZG91dCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBzY3JlZW4gbG9jayBzdGF0ZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGxvY2tlZC5cbiAqL1xubWV0aG9kcy5pc1NjcmVlbkxvY2tlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzU2NyZWVuTG9ja2VkICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3dpbmRvdyddKTtcbiAgaWYgKHByb2Nlc3MuZW52LkFQUElVTV9MT0dfRFVNUFNZUykge1xuICAgIC8vIG9wdGlvbmFsIGRlYnVnZ2luZ1xuICAgIC8vIGlmIHRoZSBtZXRob2QgaXMgbm90IHdvcmtpbmcsIHR1cm4gaXQgb24gYW5kIHNlbmQgdXMgdGhlIG91dHB1dFxuICAgIGxldCBkdW1wc3lzRmlsZSA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnZHVtcHN5cy5sb2cnKTtcbiAgICBsb2cuZGVidWcoYFdyaXRpbmcgZHVtcHN5cyBvdXRwdXQgdG8gJHtkdW1wc3lzRmlsZX1gKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZHVtcHN5c0ZpbGUsIHN0ZG91dCk7XG4gIH1cbiAgcmV0dXJuIChpc1Nob3dpbmdMb2Nrc2NyZWVuKHN0ZG91dCkgfHwgaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkKHN0ZG91dCkgfHxcbiAgICAgICAgICAhaXNTY3JlZW5PbkZ1bGx5KHN0ZG91dCkpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBLZXlib2FyZFN0YXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzS2V5Ym9hcmRTaG93biAtIFdoZXRoZXIgc29mdCBrZXlib2FyZCBpcyBjdXJyZW50bHkgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2FuQ2xvc2VLZXlib2FyZCAtIFdoZXRoZXIgdGhlIGtleWJvYXJkIGNhbiBiZSBjbG9zZWQuXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgc3RhdGUgb2YgdGhlIHNvZnR3YXJlIGtleWJvYXJkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtLZXlib2FyZFN0YXRlfSBUaGUga2V5Ym9hcmQgc3RhdGUuXG4gKi9cbm1ldGhvZHMuaXNTb2Z0S2V5Ym9hcmRQcmVzZW50ID0gYXN5bmMgZnVuY3Rpb24gaXNTb2Z0S2V5Ym9hcmRQcmVzZW50ICgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdpbnB1dF9tZXRob2QnXSk7XG4gICAgY29uc3QgaW5wdXRTaG93bk1hdGNoID0gL21JbnB1dFNob3duPShcXHcrKS8uZXhlYyhzdGRvdXQpO1xuICAgIGNvbnN0IGlucHV0Vmlld1Nob3duTWF0Y2ggPSAvbUlzSW5wdXRWaWV3U2hvd249KFxcdyspLy5leGVjKHN0ZG91dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzS2V5Ym9hcmRTaG93bjogISEoaW5wdXRTaG93bk1hdGNoICYmIGlucHV0U2hvd25NYXRjaFsxXSA9PT0gJ3RydWUnKSxcbiAgICAgIGNhbkNsb3NlS2V5Ym9hcmQ6ICEhKGlucHV0Vmlld1Nob3duTWF0Y2ggJiYgaW5wdXRWaWV3U2hvd25NYXRjaFsxXSA9PT0gJ3RydWUnKSxcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaW5kaW5nIHNvZnRrZXlib2FyZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgYW4gYXJiaXRyYXJ5IFRlbG5ldCBjb21tYW5kIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGJlIHNlbnQuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWN0dWFsIG91dHB1dCBvZiB0aGUgZ2l2ZW4gY29tbWFuZC5cbiAqL1xubWV0aG9kcy5zZW5kVGVsbmV0Q29tbWFuZCA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRUZWxuZXRDb21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWNFbXVDb25zb2xlQ29tbWFuZChjb21tYW5kLCB7cG9ydDogYXdhaXQgdGhpcy5nZXRFbXVsYXRvclBvcnQoKX0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBBaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNBaXJwbGFuZU1vZGVPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQWlycGxhbmVNb2RlT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicpO1xuICByZXR1cm4gcGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDA7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gZW5hYmxlIHRoZSBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIGFuZCBmYWxzZSB0byBkaXNhYmxlIGl0LlxuICovXG5tZXRob2RzLnNldEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicsIG9uID8gMSA6IDApO1xufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgI3NldEFpcnBsYW5lTW9kZX0sIG90aGVyd2lzZVxuICogdGhlIG1vZGUgY2hhbmdlIGlzIG5vdCBnb2luZyB0byBiZSBhcHBsaWVkIGZvciB0aGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGJyb2FkY2FzdCBlbmFibGUgYW5kIGZhbHNlIHRvIGJyb2FkY2FzdCBkaXNhYmxlLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5BSVJQTEFORV9NT0RFJyxcbiAgICAnLS1leicsICdzdGF0ZScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICBdKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV2lGaSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2lmaV9vbicpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRGF0YSB0cmFuc2ZlciBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzRGF0YU9uID0gYXN5bmMgZnVuY3Rpb24gaXNEYXRhT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnbW9iaWxlX2RhdGEnKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgV2lGaSBhbmQvb3IgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSB3aWZpIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgV2lGaS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0YSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIERhdGEgdHJhbnNmZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5tZXRob2RzLnNldFdpZmlBbmREYXRhID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaUFuZERhdGEgKHt3aWZpLCBkYXRhfSwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHdpZmkpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUod2lmaSwgaXNFbXVsYXRvcik7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGF0YSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldERhdGFTdGF0ZShkYXRhLCBpc0VtdWxhdG9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgYW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBvZiBhbmltYXRpb24gc2NhbGUgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byAnMC4wJy5cbiAqL1xubWV0aG9kcy5pc0FuaW1hdGlvbk9uID0gYXN5bmMgZnVuY3Rpb24gaXNBbmltYXRpb25PbiAoKSB7XG4gIGxldCBhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlJyk7XG4gIGxldCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3RyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlJyk7XG4gIGxldCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2luZG93X2FuaW1hdGlvbl9zY2FsZScpO1xuICByZXR1cm4gXy5zb21lKFthbmltYXRvcl9kdXJhdGlvbl9zY2FsZSwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUsIHdpbmRvd19hbmltYXRpb25fc2NhbGVdLFxuICAgICAgICAgICAgICAgIChzZXR0aW5nKSA9PiBzZXR0aW5nICE9PSAnMC4wJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlZnVsbHkgcmVjdXJzaXZlbHkgcmVtb3ZlIGEgcGF0aCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBCZSBjYXJlZnVsIHdoaWxlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBiZSByZW1vdmVkIHJlY3Vyc2l2ZWx5LlxuICovXG5tZXRob2RzLnJpbXJhZiA9IGFzeW5jIGZ1bmN0aW9uIHJpbXJhZiAocGF0aCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgcGF0aF0pO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgZmlsZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdXNoID0gYXN5bmMgZnVuY3Rpb24gcHVzaCAobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRzKSB7XG4gIGF3YWl0IHRoaXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVzaCcsIGxvY2FsUGF0aCwgcmVtb3RlUGF0aF0sIG9wdHMpO1xufTtcblxuLyoqXG4gKiBSZWNlaXZlIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBzb3VyY2UgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbm1ldGhvZHMucHVsbCA9IGFzeW5jIGZ1bmN0aW9uIHB1bGwgKHJlbW90ZVBhdGgsIGxvY2FsUGF0aCkge1xuICAvLyBwdWxsIGZvbGRlciBjYW4gdGFrZSBtb3JlIHRpbWUsIGluY3JlYXNpbmcgdGltZSBvdXQgdG8gNjAgc2Vjc1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydwdWxsJywgcmVtb3RlUGF0aCwgbG9jYWxQYXRoXSwge3RpbWVvdXQ6IDYwMDAwfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIHByb2Nlc3Mgd2l0aCB0aGUgcGFydGljdWxhciBuYW1lIGlzIHJ1bm5pbmcgb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB0byBiZSBjaGVja2VkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpcyBydW5uaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5wcm9jZXNzRXhpc3RzID0gYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0V4aXN0cyAocHJvY2Vzc05hbWUpIHtcbiAgcmV0dXJuICFfLmlzRW1wdHkoYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKHByb2Nlc3NOYW1lKSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRGb3J3YXJkTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0Rm9yd2FyZCA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRGb3J3YXJkIChzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7c3lzdGVtUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgLS1yZW1vdmVgLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRSZXZlcnNlTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldFJldmVyc2VMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IHJldmVyc2UgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBPbmx5IGF2YWlsYWJsZSBmb3IgQVBJIDIxKy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqL1xubWV0aG9kcy5yZXZlcnNlUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIHJldmVyc2VQb3J0IChkZXZpY2VQb3J0LCBzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBkZXZpY2U6ICR7ZGV2aWNlUG9ydH0gdG8gc3lzdGVtOiAke3N5c3RlbVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgdGNwOiR7ZGV2aWNlUG9ydH1gLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRSZXZlcnNlID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydFJldmVyc2UgKGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyByZXZlcnNlIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke2RldmljZVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYC0tcmVtb3ZlYCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGRpZmZlcmVuY2VcbiAqIGJldHdlZW4ge0BsaW5rICNmb3J3YXJkUG9ydH0gaXMgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIHNldHVwIGZvciBhbiBhYnN0cmFjdFxuICogbG9jYWwgcG9ydC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkQWJzdHJhY3RQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZEFic3RyYWN0UG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGFic3RyYWN0IGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYGxvY2FsYWJzdHJhY3Q6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZSBwaW5nIHNoZWxsIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbW1hbmQgb3V0cHV0IGNvbnRhaW5zICdwaW5nJyBzdWJzdHJpbmcuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyAncGluZycgY29tbWFuZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgICBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5waW5nID0gYXN5bmMgZnVuY3Rpb24gcGluZyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZWNobycsICdwaW5nJ10pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ3BpbmcnKSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQURCIHBpbmcgZmFpbGVkLCByZXR1cm5lZCAke3N0ZG91dH1gKTtcbn07XG5cbi8qKlxuICogUmVzdGFydCB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgdXNpbmcgYWRiIGNvbW1hbmRzLlxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5yZXN0YXJ0ID0gYXN5bmMgZnVuY3Rpb24gcmVzdGFydCAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wTG9nY2F0KCk7XG4gICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGV2aWNlKDYwKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0TG9nY2F0KHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXN0YXJ0IGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvZ2NhdE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgVGhlIGxvZyBwcmludCBmb3JtYXQsIHdoZXJlIDxmb3JtYXQ+IGlzIG9uZSBvZjpcbiAqICAgYnJpZWYgcHJvY2VzcyB0YWcgdGhyZWFkIHJhdyB0aW1lIHRocmVhZHRpbWUgbG9uZ1xuICogYHRocmVhZHRpbWVgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJTcGVjcyBTZXJpZXMgb2YgPHRhZz5bOnByaW9yaXR5XVxuICogd2hlcmUgPHRhZz4gaXMgYSBsb2cgY29tcG9uZW50IHRhZyAob3IgKiBmb3IgYWxsKSBhbmQgcHJpb3JpdHkgaXM6XG4gKiAgViAgICBWZXJib3NlXG4gKiAgRCAgICBEZWJ1Z1xuICogIEkgICAgSW5mb1xuICogIFcgICAgV2FyblxuICogIEUgICAgRXJyb3JcbiAqICBGICAgIEZhdGFsXG4gKiAgUyAgICBTaWxlbnQgKHN1cHJlc3MgYWxsIG91dHB1dClcbiAqXG4gKiAnKicgbWVhbnMgJyo6ZCcgYW5kIDx0YWc+IGJ5IGl0c2VsZiBtZWFucyA8dGFnPjp2XG4gKlxuICogSWYgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUsIGZpbHRlcnNwZWMgaXMgc2V0IGZyb20gQU5EUk9JRF9MT0dfVEFHUy5cbiAqIElmIG5vIGZpbHRlcnNwZWMgaXMgZm91bmQsIGZpbHRlciBkZWZhdWx0cyB0byAnKjpJJ1xuICovXG5cbi8qKlxuICogU3RhcnQgdGhlIGxvZ2NhdCBwcm9jZXNzIHRvIGdhdGhlciBsb2dzLlxuICpcbiAqIEBwYXJhbSB7P0xvZ2NhdE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiByZXN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnN0YXJ0TG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRMb2djYXQgKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc3RhcnQgbG9nY2F0IGNhcHR1cmUgYnV0IGl0J3MgYWxyZWFkeSBzdGFydGVkIVwiKTtcbiAgfVxuXG4gIHRoaXMubG9nY2F0ID0gbmV3IExvZ2NhdCh7XG4gICAgYWRiOiB0aGlzLmV4ZWN1dGFibGUsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGRlYnVnVHJhY2U6IGZhbHNlLFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6ICEhdGhpcy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICB9KTtcbiAgYXdhaXQgdGhpcy5sb2djYXQuc3RhcnRDYXB0dXJlKG9wdHMpO1xuICB0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zID0gb3B0cztcbn07XG5cbi8qKlxuICogU3RvcCB0aGUgYWN0aXZlIGxvZ2NhdCBwcm9jZXNzIHdoaWNoIGdhdGhlcnMgbG9ncy5cbiAqIFRoZSBjYWxsIHdpbGwgYmUgaWdub3JlZCBpZiBubyBsb2djYXQgcHJvY2VzcyBpcyBydW5uaW5nLlxuICovXG5tZXRob2RzLnN0b3BMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdG9wTG9nY2F0ICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmxvZ2NhdC5zdG9wQ2FwdHVyZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMubG9nY2F0ID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgb3V0cHV0IGZyb20gdGhlIGN1cnJlbnRseSBydW5uaW5nIGxvZ2NhdCBwcm9jZXNzLlxuICogVGhlIGxvZ2NhdCBwcm9jZXNzIHNob3VsZCBiZSBleGVjdXRlZCBieSB7MmxpbmsgI3N0YXJ0TG9nY2F0fSBtZXRob2QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sbGVjdGVkIGxvZ2NhdCBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZ2V0TG9nY2F0TG9ncyA9IGZ1bmN0aW9uIGdldExvZ2NhdExvZ3MgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGdldCBsb2djYXQgbG9ncyBzaW5jZSBsb2djYXQgaGFzbid0IHN0YXJ0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHRoaXMubG9nY2F0LmdldExvZ3MoKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgb25lIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBsb2cgcmVjb3JkIG9iamVjdCB3aXRoIGB0aW1lc3RhbXBgLCBgbGV2ZWxgIGFuZCBgbWVzc2FnZWAgcHJvcGVydGllcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zZXRMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHNldExvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQub24oJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcHJldmlvdXNseSBzZXQgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBoYXMgYmVlbiBwcmV2aW91c2x5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBgc2V0TG9nY2F0TGlzdGVuZXJgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMucmVtb3ZlTG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0LnJlbW92ZUxpc3RlbmVyKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIEF0IHNvbWUgcG9pbnQgb2YgdGltZSBHb29nbGUgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgYHBzYCBiZWhhdmlvdXIsIHNvIGl0IG9ubHlcbiAqIGxpc3RzIHByb2Nlc3NlcyB0aGF0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzaGVsbCB1c2VyIHJhdGhlciB0byBhbGxcbiAqIHVzZXJzLiBJdCBpcyBuZWNlc3NhcnkgdG8gZXhlY3V0ZSBwcyB3aXRoIC1BIGNvbW1hbmQgbGluZSBhcmd1bWVudFxuICogdG8gbWltaWMgdGhlIHByZXZpb3VzIGJlaGF2aW91ci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgb3V0cHV0IG9mIGBwc2AgY29tbWFuZCB3aGVyZSBhbGwgcHJvY2Vzc2VzIGFyZSBpbmNsdWRlZFxuICovXG5tZXRob2RzLmxpc3RQcm9jZXNzU3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdFByb2Nlc3NTdGF0dXMgKCkge1xuICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uKSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IC9eLUFcXGIvbS50ZXN0KGF3YWl0IHRoaXMuc2hlbGwoWydwcycsICctLWhlbHAnXSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID8gWydwcycsICctQSddIDogWydwcyddKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBwcm9jZXNzIG5hbWUgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSB2YWxpZCBwcm9jZXNzIGlkZW50aWZpZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gUElEIGlzIGVpdGhlciBpbnZhbGlkIG9yIGlzIG5vdCBwcmVzZW50XG4gKiBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJvY2VzcyBuYW1lXG4gKi9cbm1ldGhvZHMuZ2V0TmFtZUJ5UGlkID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZUJ5UGlkIChwaWQpIHtcbiAgaWYgKGlzTmFOKHBpZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBQSUQgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIG51bWJlci4gJyR7cGlkfScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHBpZCA9IHBhcnNlSW50KHBpZCwgMTApO1xuXG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgLy8gaXQgbWlnaHQgbm90IGJlIHN0YWJsZSB0byB0YWtlIE5BTUUgYnkgaW5kZXgsIGJlY2F1c2UgZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBhY3R1YWwgU0RLIHRoZSBwcyBvdXRwdXQgbWlnaHQgbm90IGNvbnRhaW4gYW4gYWJicmV2aWF0aW9uIGZvciB0aGUgUyBmbGFnOlxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgICAgICAgTkFNRVxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgIFMgICAgTkFNRVxuICBjb25zdCBuYW1lT2Zmc2V0ID0gYWxsVGl0bGVzLmluZGV4T2YoUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSkgLSBhbGxUaXRsZXMubGVuZ3RoO1xuICBjb25zdCBwaWRSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYiR7cGlkfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwaWRSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkgPT09IHBpZCAmJiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdO1xuICAgIH1cbiAgfVxuICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFzc2VkIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBvbmVcbiAqL1xubWV0aG9kcy5nZXRQSURzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0J5TmFtZSAobmFtZSkge1xuICBsb2cuZGVidWcoYEdldHRpbmcgSURzIG9mIGFsbCAnJHtuYW1lfScgcHJvY2Vzc2VzYCk7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvY2VzcyBuYW1lOiAnJHtuYW1lfSdgKTtcbiAgfVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM1NjdcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgIGlmICghXy5pc0Jvb2xlYW4odGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkpIHtcbiAgICAgIC8vIHBncmVwIGlzIGluIHByaW9yaXR5LCBzaW5jZSBwaWRvZiBoYXMgYmVlbiByZXBvcnRlZCBvZiBoYXZpbmcgYnVncyBvbiBzb21lIHBsYXRmb3Jtc1xuICAgICAgY29uc3QgcGdyZXBPdXRwdXQgPSBfLnRyaW0oYXdhaXQgdGhpcy5zaGVsbChbJ3BncmVwIC0taGVscDsgZWNobyAkPyddKSk7XG4gICAgICB0aGlzLl9pc1BncmVwQXZhaWxhYmxlID0gcGFyc2VJbnQoXy5sYXN0KHBncmVwT3V0cHV0LnNwbGl0KC9cXHMrLykpLCAxMCkgPT09IDA7XG4gICAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoID0gL14tZlxcYi9tLnRlc3QocGdyZXBPdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSA9IHBhcnNlSW50KGF3YWl0IHRoaXMuc2hlbGwoWydwaWRvZiAtLWhlbHAgPiAvZGV2L251bGw7IGVjaG8gJD8nXSksIDEwKSA9PT0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgfHwgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSkge1xuICAgICAgY29uc3Qgc2hlbGxDb21tYW5kID0gdGhpcy5faXNQZ3JlcEF2YWlsYWJsZVxuICAgICAgICA/ICh0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoXG4gICAgICAgICAgPyBbJ3BncmVwJywgJy1mJywgXy5lc2NhcGVSZWdFeHAoYChbWzpibGFuazpdXXxeKSR7bmFtZX0oW1s6Ymxhbms6XV18JClgKV1cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM4NzJcbiAgICAgICAgICA6IFtgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgtTUFYX1BHUkVQX1BBVFRFUk5fTEVOKSl9JCB8fCBwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKDAsIE1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSRgXSlcbiAgICAgICAgOiBbJ3BpZG9mJywgbmFtZV07XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGwoc2hlbGxDb21tYW5kKSlcbiAgICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAuZmlsdGVyKCh4KSA9PiBfLmlzSW50ZWdlcih4KSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGVycm9yIGNvZGUgMSBpcyByZXR1cm5lZCBpZiB0aGUgdXRpbGl0eSBkaWQgbm90IGZpbmQgYW55IHByb2Nlc3Nlc1xuICAgICAgICAvLyB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gICAgICAgIGlmIChlLmNvZGUgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBwcm9jZXNzIElEIG9mICcke25hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9nLmRlYnVnKCdVc2luZyBwcy1iYXNlZCBQSUQgZGV0ZWN0aW9uJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSBwcyBvdXRwdXRgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICBjb25zdCBwaWRzID0gW107XG4gIGNvbnN0IHByb2Nlc3NOYW1lUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGJcXFxcZCtcXFxcYi4qXFxcXGIke18uZXNjYXBlUmVnRXhwKG5hbWUpfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwcm9jZXNzTmFtZVJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwaWRJbmRleCA+PSBhbGxUaXRsZXMubGVuZ3RoIHx8IGlzTmFOKGl0ZW1zW3BpZEluZGV4XSkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gJyR7bWF0Y2hlZExpbmVbMV0udHJpbSgpfSdgKTtcbiAgICB9XG4gICAgcGlkcy5wdXNoKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApKTtcbiAgfVxuICByZXR1cm4gcGlkcztcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3Nlc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzZXNCeU5hbWUgKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBhbGwgJHtuYW1lfSBwcm9jZXNzZXNgKTtcbiAgICBjb25zdCBwaWRzID0gYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKG5hbWUpO1xuICAgIGlmIChfLmlzRW1wdHkocGlkcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyAnJHtuYW1lfScgcHJvY2VzcyBoYXMgYmVlbiBmb3VuZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBCLmFsbChwaWRzLm1hcCgocCkgPT4gdGhpcy5raWxsUHJvY2Vzc0J5UElEKHApKSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8ga2lsbCAke25hbWV9IHByb2Nlc3Nlcy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEtpbGwgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGUgY3VycmVudCB1c2VyIGlzIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgdG8gcm9vdCBpZiBuZWNlc3NhcnkgaW4gb3JkZXJcbiAqIHRvIHByb3Blcmx5IGtpbGwgdGhlIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgdG8gYmUga2lsbGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm9jZXNzIGNhbm5vdCBiZSBraWxsZWQuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3NCeVBJRCA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzQnlQSUQgKHBpZCkge1xuICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBwcm9jZXNzICR7cGlkfWApO1xuICBjb25zdCBub1Byb2Nlc3NGbGFnID0gJ05vIHN1Y2ggcHJvY2Vzcyc7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gb3RoZXJ3aXNlXG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIV8uaW5jbHVkZXMoZS5zdGRlcnIsICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCcpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgQ2Fubm90IGtpbGwgUElEICR7cGlkfSBkdWUgdG8gaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLiBSZXRyeWluZyBhcyByb290YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSwge1xuICAgICAgICBwcml2aWxlZ2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlMSkge1xuICAgICAgaWYgKF8uaW5jbHVkZXMoZTEuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlMTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHByb2Nlc3Mga2lsbGluZyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGtpbGxlZCBwcm9jZXNzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZSBwcm9jZXNzIHdhcyBub3Qga2lsbGVkLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdFByb2Nlc3NFbmQgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RQcm9jZXNzRW5kIChpbnRlbnQsIHByb2Nlc3NOYW1lKSB7XG4gIC8vIHN0YXJ0IHRoZSBicm9hZGNhc3Qgd2l0aG91dCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2guXG4gIHRoaXMuYnJvYWRjYXN0KGludGVudCk7XG4gIC8vIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVuZFxuICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgdGltZW91dE1zID0gNDAwMDA7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChEYXRlLm5vdygpIC0gc3RhcnQpIDwgdGltZW91dE1zKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5wcm9jZXNzRXhpc3RzKHByb2Nlc3NOYW1lKSkge1xuICAgICAgICAvLyBjb29sIGRvd25cbiAgICAgICAgYXdhaXQgc2xlZXAoNDAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgUHJvY2VzcyBuZXZlciBkaWVkIHdpdGhpbiAke3RpbWVvdXRNc30gbXNgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGJyb2FkY2FzdCBwcm9jZXNzIGVuZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBhIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgaW50ZW50IG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3QgKGludGVudCkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGludGVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZW50ICR7aW50ZW50fWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgQnJvYWRjYXN0aW5nOiAke2ludGVudH1gKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2Jyb2FkY2FzdCcsICctYScsIGludGVudF0pO1xufTtcblxuLyoqXG4gKiBLaWxsIEFuZHJvaWQgaW5zdHJ1bWVudHMgaWYgdGhleSBhcmUgY3VycmVudGx5IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZW5kQW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gZW5kQW5kcm9pZENvdmVyYWdlICgpIHtcbiAgaWYgKHRoaXMuaW5zdHJ1bWVudFByb2MgJiYgdGhpcy5pbnN0cnVtZW50UHJvYy5pc1J1bm5pbmcpIHtcbiAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0b3AoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0cnVtZW50IHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudFdpdGggLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBpbnN0cnVtZW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aXZpdHkgd2l0aC5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5pbnN0cnVtZW50ID0gYXN5bmMgZnVuY3Rpb24gaW5zdHJ1bWVudCAocGtnLCBhY3Rpdml0eSwgaW5zdHJ1bWVudFdpdGgpIHtcbiAgaWYgKGFjdGl2aXR5WzBdICE9PSAnLicpIHtcbiAgICBwa2cgPSAnJztcbiAgfVxuICBsZXQgcGtnQWN0aXZpdHkgPSAocGtnICsgYWN0aXZpdHkpLnJlcGxhY2UoL1xcLisvZywgJy4nKTsgLy8gRml4IHBrZy4uYWN0aXZpdHkgZXJyb3JcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdpbnN0cnVtZW50JyxcbiAgICAnLWUnLCAnbWFpbl9hY3Rpdml0eScsXG4gICAgcGtnQWN0aXZpdHksXG4gICAgaW5zdHJ1bWVudFdpdGgsXG4gIF0pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ0V4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBleGNlcHRpb24gZHVyaW5nIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3IgJHtzdGRvdXQuc3BsaXQoJ1xcbicpWzBdfWApO1xuICB9XG59O1xuXG4vKipcbiAqIENvbGxlY3QgQW5kcm9pZCBjb3ZlcmFnZSBieSBpbnN0cnVtZW50aW5nIHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50Q2xhc3MgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRQa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICpcbiAqIEByZXR1cm4ge3Byb21pc2V9IFRoZSBwcm9taXNlIGlzIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBpZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHN0YXJ0c1xuICogICAgICAgICAgICAgICAgICAgd2l0aG91dCBlcnJvcnMuXG4gKi9cbm1ldGhvZHMuYW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gYW5kcm9pZENvdmVyYWdlIChpbnN0cnVtZW50Q2xhc3MsIHdhaXRQa2csIHdhaXRBY3Rpdml0eSkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGluc3RydW1lbnRDbGFzcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2xhc3MgJHtpbnN0cnVtZW50Q2xhc3N9YCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IG5ldyBCKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgYXJncyA9IHRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1xuICAgICAgLmNvbmNhdChbJ3NoZWxsJywgJ2FtJywgJ2luc3RydW1lbnQnLCAnLWUnLCAnY292ZXJhZ2UnLCAndHJ1ZScsICctdyddKVxuICAgICAgLmNvbmNhdChbaW5zdHJ1bWVudENsYXNzXSk7XG4gICAgbG9nLmRlYnVnKGBDb2xsZWN0aW5nIGNvdmVyYWdlIGRhdGEgd2l0aDogJHtbdGhpcy5leGVjdXRhYmxlLnBhdGhdLmNvbmNhdChhcmdzKS5qb2luKCcgJyl9YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGFtIGluc3RydW1lbnQgcnVucyBmb3IgdGhlIGxpZmUgb2YgdGhlIGFwcCBwcm9jZXNzLlxuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYyA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBhcmdzKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RhcnQoMCk7XG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnJ9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5KHdhaXRQa2csIHdhaXRBY3Rpdml0eSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQW5kcm9pZCBjb3ZlcmFnZSBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKSk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgZ2V0cHJvcF8gdG9vbC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9wZXJ0eSAocHJvcGVydHkpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydnZXRwcm9wJywgcHJvcGVydHldKTtcbiAgbGV0IHZhbCA9IHN0ZG91dC50cmltKCk7XG4gIGxvZy5kZWJ1ZyhgQ3VycmVudCBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcGVydHl9JzogJHt2YWx9YCk7XG4gIHJldHVybiB2YWw7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IHNldFByb3BPcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByaXZpbGVnZWQgLSBEbyB3ZSBydW4gc2V0UHJvcCBhcyBhIHByaXZpbGVnZWQgY29tbWFuZD8gRGVmYXVsdCB0cnVlLlxuICovXG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgc2V0cHJvcF8gdG9vbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgLSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlLlxuICogQHBhcmFtIHtzZXRQcm9wT3B0c30gb3B0c1xuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBfc2V0cHJvcF8gdXRpbGl0eSBmYWlscyB0byBjaGFuZ2UgcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuc2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBzZXREZXZpY2VQcm9wZXJ0eSAocHJvcCwgdmFsLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3ByaXZpbGVnZWQgPSB0cnVlfSA9IG9wdHM7XG4gIGxvZy5kZWJ1ZyhgU2V0dGluZyBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcH0nIHRvICcke3ZhbH0nYCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydzZXRwcm9wJywgcHJvcCwgdmFsXSwge1xuICAgIHByaXZpbGVnZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxhbmd1YWdlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0NvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmNvdW50cnknKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsYW5ndWFnZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0Q291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLnJlZ2lvbicpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TW9kZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRNb2RlbCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1vZGVsJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1hbnVmYWN0dXJlciBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNYW51ZmFjdHVyZXIgPSBhc3luYyBmdW5jdGlvbiBnZXRNYW51ZmFjdHVyZXIgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tYW51ZmFjdHVyZXInKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gRGV2aWNlIHNjcmVlbiBzaXplIGFzIHN0cmluZyBpbiBmb3JtYXQgJ1d4SCcgb3JcbiAqICAgICAgICAgICAgICAgICAgX251bGxfIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5tZXRob2RzLmdldFNjcmVlblNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5TaXplICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdzaXplJ10pO1xuICBsZXQgc2l6ZSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIHNpemU6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKHNpemUgJiYgc2l6ZS5sZW5ndGggPj0gMikge1xuICAgIHJldHVybiBzaXplWzFdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBkZW5zaXR5IGluIGRwaVxuICpcbiAqIEByZXR1cm4gez9udW1iZXJ9IERldmljZSBzY3JlZW4gZGVuc2l0eSBhcyBhIG51bWJlciBvciBfbnVsbF8gaWYgaXRcbiAqICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5EZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuRGVuc2l0eSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnZGVuc2l0eSddKTtcbiAgbGV0IGRlbnNpdHkgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBkZW5zaXR5OiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChkZW5zaXR5ICYmIGRlbnNpdHkubGVuZ3RoID49IDIpIHtcbiAgICBsZXQgZGVuc2l0eU51bWJlciA9IHBhcnNlSW50KGRlbnNpdHlbMV0udHJpbSgpLCAxMCk7XG4gICAgcmV0dXJuIGlzTmFOKGRlbnNpdHlOdW1iZXIpID8gbnVsbCA6IGRlbnNpdHlOdW1iZXI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFNldHVwIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYWQgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZnJhbWV3b3Jrcy9iYXNlLysvYW5kcm9pZC05LjAuMF9yMjEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBmb3IgZWFjaCBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm94eUhvc3QgLSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBwcm94eS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcHJveHlQb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHNldC5cbiAqL1xubWV0aG9kcy5zZXRIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzZXRIdHRwUHJveHkgKHByb3h5SG9zdCwgcHJveHlQb3J0KSB7XG4gIGxldCBwcm94eSA9IGAke3Byb3h5SG9zdH06JHtwcm94eVBvcnR9YDtcbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlIb3N0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X2hvc3Q6ICR7cHJveHl9YCk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlQb3J0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X3BvcnQgJHtwcm94eX1gKTtcbiAgfVxuXG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgWydodHRwX3Byb3h5JywgcHJveHldLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsIHByb3h5SG9zdF0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9wb3J0JywgcHJveHlQb3J0XVxuICBdO1xuICBmb3IgKGNvbnN0IFtzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWVdIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsIHNldHRpbmdLZXksIHNldHRpbmdWYWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVsZXRlIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYm9vdGluZyB0aGUgdGVzdCBkZXZpY2UgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHRoZSBjaGFuZ2UuXG4gKi9cbm1ldGhvZHMuZGVsZXRlSHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlSHR0cFByb3h5ICgpIHtcbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICAnaHR0cF9wcm94eScsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9wb3J0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3QnIC8vIGBnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdD1gIHdhcyBnZW5lcmF0ZWQgYnkgYHNldHRpbmdzIGdsb2JhbCBodHRvX3Byb3h5IHh4eHhgXG4gIF07XG4gIGZvciAoY29uc3Qgc2V0dGluZyBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2RlbGV0ZScsICdnbG9iYWwnLCBzZXR0aW5nXSk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIHByb3BlcnR5IHZhbHVlLlxuICogQHJldHVybiB7c3RyaW5nfSBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5zZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gc2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsIG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWVdKTtcbn07XG5cbi8qKlxuICogR2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHJldHVybiB7c3RyaW5nfSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5nZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZ2V0JywgbmFtZXNwYWNlLCBzZXR0aW5nXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBgYWRiIGJ1Z3JlcG9ydGAgY29tbWFuZCBvdXRwdXQuIFRoaXNcbiAqIG9wZXJhdGlvbiBtYXkgdGFrZSB1cCB0byBzZXZlcmFsIG1pbnV0ZXMuXG4gKlxuICogQHBhcmFtIHs/bnVtYmVyfSB0aW1lb3V0IFsxMjAwMDBdIC0gQ29tbWFuZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMge3N0cmluZ30gQ29tbWFuZCBzdGRvdXRcbiAqL1xubWV0aG9kcy5idWdyZXBvcnQgPSBhc3luYyBmdW5jdGlvbiBidWdyZXBvcnQgKHRpbWVvdXQgPSAxMjAwMDApIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2J1Z3JlcG9ydCddLCB7dGltZW91dH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JlZW5yZWNvcmRPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvU2l6ZSAtIFRoZSBmb3JtYXQgaXMgd2lkdGh4aGVpZ2h0LlxuICogICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGRpc3BsYXkgcmVzb2x1dGlvbiAoaWYgc3VwcG9ydGVkKSxcbiAqICAgICAgICAgICAgICAgICAgMTI4MHg3MjAgaWYgbm90LiBGb3IgYmVzdCByZXN1bHRzLFxuICogICAgICAgICAgICAgICAgICB1c2UgYSBzaXplIHN1cHBvcnRlZCBieSB5b3VyIGRldmljZSdzIEFkdmFuY2VkIFZpZGVvIENvZGluZyAoQVZDKSBlbmNvZGVyLlxuICogICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgXCIxMjgweDcyMFwiXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBidWdSZXBvcnQgLSBTZXQgaXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdmlkZW8gb3ZlcmxheSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgYSB0aW1lc3RhbXAsIHRoYXQgaXMgaGVscGZ1bCBpbiB2aWRlb3MgY2FwdHVyZWQgdG8gaWxsdXN0cmF0ZSBidWdzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCAoYW5kIG1heGltdW0pIHZhbHVlIGlzIDE4MCAoMyBtaW51dGVzKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IGJpdFJhdGUgLSBUaGUgdmlkZW8gYml0IHJhdGUgZm9yIHRoZSB2aWRlbywgaW4gbWVnYWJpdHMgcGVyIHNlY29uZC5cbiAqICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqICAgICAgICAgICAgICAgIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEluaXRpYXRlIHNjcmVlbnJlY29yZCB1dGlsaXR5IG9uIHRoZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb24gLSBGdWxsIHBhdGggdG8gdGhlIHdyaXRhYmxlIG1lZGlhIGZpbGUgZGVzdGluYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0gez9TY3JlZW5yZWNvcmRPcHRpb25zfSBvcHRpb25zIFt7fV1cbiAqIEByZXR1cm5zIHtTdWJQcm9jZXNzfSBzY3JlZW5yZWNvcmQgcHJvY2Vzcywgd2hpY2ggY2FuIGJlIHRoZW4gY29udHJvbGxlZCBieSB0aGUgY2xpZW50IGNvZGVcbiAqL1xubWV0aG9kcy5zY3JlZW5yZWNvcmQgPSBmdW5jdGlvbiBzY3JlZW5yZWNvcmQgKGRlc3RpbmF0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY21kID0gWydzY3JlZW5yZWNvcmQnXTtcbiAgY29uc3Qge1xuICAgIHZpZGVvU2l6ZSxcbiAgICBiaXRSYXRlLFxuICAgIHRpbWVMaW1pdCxcbiAgICBidWdSZXBvcnQsXG4gIH0gPSBvcHRpb25zO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh2aWRlb1NpemUpKSB7XG4gICAgY21kLnB1c2goJy0tc2l6ZScsIHZpZGVvU2l6ZSk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUodGltZUxpbWl0KSkge1xuICAgIGNtZC5wdXNoKCctLXRpbWUtbGltaXQnLCB0aW1lTGltaXQpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGJpdFJhdGUpKSB7XG4gICAgY21kLnB1c2goJy0tYml0LXJhdGUnLCBiaXRSYXRlKTtcbiAgfVxuICBpZiAoYnVnUmVwb3J0KSB7XG4gICAgY21kLnB1c2goJy0tYnVncmVwb3J0Jyk7XG4gIH1cbiAgY21kLnB1c2goZGVzdGluYXRpb24pO1xuXG4gIGNvbnN0IGZ1bGxDbWQgPSBbXG4gICAgLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgLi4uY21kXG4gIF07XG4gIGxvZy5kZWJ1ZyhgQnVpbGRpbmcgc2NyZWVucmVjb3JkIHByb2Nlc3Mgd2l0aCB0aGUgY29tbWFuZCBsaW5lOiBhZGIgJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGZ1bGxDbWQpO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgbWV0aG9kIGNvbnRleHRcbiAqIGFuZCB0aGVuIHJlc3RvcmVzIHRoZSBJTUUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZSAtIFZhbGlkIElNRSBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0IG9mIHRoZSBnaXZlbiBmdW5jdGlvblxuICovXG5tZXRob2RzLnJ1bkluSW1lQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHJ1bkluSW1lQ29udGV4dCAoaW1lLCBmbikge1xuICBjb25zdCBvcmlnaW5hbEltZSA9IGF3YWl0IHRoaXMuZGVmYXVsdElNRSgpO1xuICBpZiAob3JpZ2luYWxJbWUgPT09IGltZSkge1xuICAgIGxvZy5kZWJ1ZyhgVGhlIG9yaWdpbmFsIElNRSBpcyB0aGUgc2FtZSBhcyAnJHtpbWV9Jy4gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdGApO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZW5hYmxlSU1FKGltZSk7XG4gICAgYXdhaXQgdGhpcy5zZXRJTUUoaW1lKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvcmlnaW5hbEltZSAhPT0gaW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldElNRShvcmlnaW5hbEltZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldCB0eiBkYXRhYmFzZSB0aW1lIHpvbmUgZm9ybWF0dGVkIHRpbWV6b25lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVFogZGF0YWJhc2UgVGltZSBab25lcyBmb3JtYXRcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuZ2V0VGltZVpvbmUgPSBhc3luYyBmdW5jdGlvbiBnZXRUaW1lWm9uZSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjdXJyZW50IHRpbWV6b25lJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLnRpbWV6b25lJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgdGltZXpvbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQW4gZXhhbXBsZSBhZGIgY29tbWFuZCBvdXRwdXQ6XG4gKiBgYGBcbiAqIGNtZFxuICogbHNfdjJcbiAqIGZpeGVkX3B1c2hfbWtkaXJcbiAqIHNoZWxsX3YyXG4gKiBhYmJcbiAqIHN0YXRfdjJcbiAqIGFwZXhcbiAqIGFiYl9leGVjXG4gKiByZW1vdW50X3NoZWxsXG4gKiBmaXhlZF9wdXNoX3N5bWxpbmtfdGltZXN0YW1wXG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdFxuICovXG5tZXRob2RzLmxpc3RGZWF0dXJlcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RGZWF0dXJlcyAoKSB7XG4gIHRoaXMuX21lbW9pemVkRmVhdHVyZXMgPSB0aGlzLl9tZW1vaXplZEZlYXR1cmVzXG4gICAgfHwgXy5tZW1vaXplKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZlYXR1cmVzJ10pLCAoKSA9PiB0aGlzLmN1ckRldmljZUlkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuX21lbW9pemVkRmVhdHVyZXMoKSlcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ3Vua25vd24gY29tbWFuZCcpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0ZSBvZiBzdHJlYW1lZCBpbnN0YWxsIGZlYXR1cmUuXG4gKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHRvIHNwZWVkIHVwIGFwayBpbnN0YWxsYXRpb25cbiAqIHNpbmNlIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG9yaWdpbmFsIGFwayB0byBiZSBwdXNoZWQgdG9cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBmaXJzdCwgd2hpY2ggYWxzbyBzYXZlcyBzcGFjZS5cbiAqIEFsdGhvdWdoLCBpdCBpcyByZXF1aXJlZCB0aGF0IGJvdGggdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBhbmQgdGhlIGFkYiBzZXJ2ZXIgaGF2ZSB0aGUgbWVudGlvbmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fvc3AtbWlycm9yL3BsYXRmb3JtX3N5c3RlbV9jb3JlL2Jsb2IvbWFzdGVyL2FkYi9jbGllbnQvYWRiX2luc3RhbGwuY3BwXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gIHByb3RvLl9oZWxwT3V0cHV0ID0gcHJvdG8uX2hlbHBPdXRwdXQgfHwgYXdhaXQgdGhpcy5hZGJFeGVjKFsnaGVscCddKTtcbiAgcmV0dXJuIHByb3RvLl9oZWxwT3V0cHV0LmluY2x1ZGVzKCctLXN0cmVhbWluZycpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdjbWQnKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgaW5jcmVtZW50YWwgaW5zdGFsbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBBREIuXG4gKiBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gaXQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3Qge2JpbmFyeX0gPSBhd2FpdCB0aGlzLmdldFZlcnNpb24oKTtcbiAgaWYgKCFiaW5hcnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHV0aWwuY29tcGFyZVZlcnNpb25zKGJpbmFyeS52ZXJzaW9uLCAnPj0nLCAnMzAuMC4xJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2FiYl9leGVjJyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBwYWNrYWdlcyBmcm9tIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2Ygd2hpdGVsaXN0ZWQgcGFja2FnZXMuIEFuIGV4YW1wbGUgb3V0cHV0OlxuICogc3lzdGVtLGNvbS5hbmRyb2lkLnNoZWxsLDIwMDBcbiAqIHN5c3RlbSxjb20uZ29vZ2xlLmFuZHJvaWQuY2VsbGJyb2FkY2FzdHJlY2VpdmVyLDEwMTQzXG4gKiB1c2VyLGlvLmFwcGl1bS5zZXR0aW5ncywxMDE1N1xuICovXG5tZXRob2RzLmdldERldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJZGxlV2hpdGVsaXN0ICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbG9nLmluZm8oJ0xpc3RpbmcgcGFja2FnZXMgaW4gRG96ZSB3aGl0ZWxpc3QnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnXSk7XG4gIHJldHVybiBfLnRyaW0ob3V0cHV0KS5zcGxpdCgvXFxuLylcbiAgICAubWFwKChsaW5lKSA9PiBfLnRyaW0obGluZSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogQWRkcyBhbiBleGlzdGluZyBwYWNrYWdlKHMpIGludG8gdGhlIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHBhY2thZ2VzIE9uZSBvciBtb3JlIHBhY2thZ2VzIHRvIGFkZC4gSWYgdGhlIHBhY2thZ2VcbiAqIGFscmVhZHkgZXhpc3RzIGluIHRoZSB3aGl0ZWxpc3QgdGhlbiBpdCBpcyBvbmx5IGdvaW5nIHRvIGJlIGFkZGVkIG9uY2UuXG4gKiBJZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBpbnN0YWxsZWQvbm90IGtub3duIHRoZW4gYW4gZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29tbWFuZCB0byBhZGQgcGFja2FnZShzKSBoYXMgYmVlbiBleGVjdXRlZFxuICovXG5tZXRob2RzLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCAoLi4ucGFja2FnZXMpIHtcbiAgaWYgKF8uaXNFbXB0eShwYWNrYWdlcykgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuaW5mbyhgQWRkaW5nICR7dXRpbC5wbHVyYWxpemUoJ3BhY2thZ2UnLCBwYWNrYWdlcy5sZW5ndGgpfSAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzKX0gdG8gRG96ZSB3aGl0ZWxpc3RgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGtnKSA9PiBbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnLCBgKyR7cGtnfWBdLCBwYWNrYWdlcyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWV0aG9kcztcbiJdLCJmaWxlIjoibGliL3Rvb2xzL2FkYi1jb21tYW5kcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
1104
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwibmFtZXMiOlsiTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgiLCJOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SIiwiSUdOT1JFRF9QRVJNX0VSUk9SUyIsIk1BWF9QR1JFUF9QQVRURVJOX0xFTiIsIkhJRERFTl9BUElfUE9MSUNZX0tFWVMiLCJQSURfQ09MVU1OX1RJVExFIiwiUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSIsIlBTX1RJVExFX1BBVFRFUk4iLCJSZWdFeHAiLCJtZXRob2RzIiwic2hlbGxDaHVua3MiLCJhcmdUcmFuc2Zvcm1lciIsImFyZ3MiLCJjb21tYW5kcyIsImNtZENodW5rIiwiYXJnIiwibmV4dENtZCIsIl8iLCJpc0FycmF5IiwiRXJyb3IiLCJsYXN0IiwicHVzaCIsImpvaW4iLCJsZW5ndGgiLCJpc0VtcHR5IiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGFzdEVycm9yIiwiY21kIiwic2hlbGwiLCJlIiwiZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoIiwiZXhlY3V0YWJsZSIsInBhdGgiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYWRiIiwiaW5pdEFhcHQiLCJpbml0QWFwdDIiLCJpbml0WmlwQWxpZ24iLCJpbml0QnVuZGxldG9vbCIsImJpbmFyaWVzIiwiYnVuZGxldG9vbCIsImZzIiwid2hpY2giLCJlcnIiLCJnZXRBcGlMZXZlbCIsImlzSW50ZWdlciIsIl9hcGlMZXZlbCIsInN0ck91dHB1dCIsImdldERldmljZVByb3BlcnR5IiwiYXBpTGV2ZWwiLCJwYXJzZUludCIsInRyaW0iLCJjaGFyQ29kZVEiLCJjaGFyQ29kZUF0IiwiYXBpTGV2ZWxEaWZmIiwiY29kZW5hbWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaXNOYU4iLCJtZXNzYWdlIiwiaW5mbyIsImlzRGV2aWNlQ29ubmVjdGVkIiwiZGV2aWNlcyIsImdldENvbm5lY3RlZERldmljZXMiLCJta2RpciIsInJlbW90ZVBhdGgiLCJpc1ZhbGlkQ2xhc3MiLCJjbGFzc1N0cmluZyIsImV4ZWMiLCJmb3JjZVN0b3AiLCJwa2ciLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0Iiwid2FybiIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsInN0ZGVyciIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0Iiwic3Rkb3V0IiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0IiwicmVwbGFjZSIsImNsZWFyVGV4dEZpZWxkIiwiaSIsImxvY2siLCJpc1NjcmVlbkxvY2tlZCIsInRpbWVvdXRNcyIsIndhaXRNcyIsImludGVydmFsTXMiLCJiYWNrIiwiZ29Ub0hvbWUiLCJnZXRBZGJQYXRoIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX0xPR19EVU1QU1lTIiwiZHVtcHN5c0ZpbGUiLCJyZXNvbHZlIiwiY3dkIiwid3JpdGVGaWxlIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaW5wdXRTaG93bk1hdGNoIiwiaW5wdXRWaWV3U2hvd25NYXRjaCIsImlzS2V5Ym9hcmRTaG93biIsImNhbkNsb3NlS2V5Ym9hcmQiLCJzZW5kVGVsbmV0Q29tbWFuZCIsImNvbW1hbmQiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJwb3J0IiwiZ2V0RW11bGF0b3JQb3J0IiwiaXNBaXJwbGFuZU1vZGVPbiIsInNldEFpcnBsYW5lTW9kZSIsIm9uIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNXaWZpT24iLCJpc0RhdGFPbiIsInNldFdpZmlBbmREYXRhIiwid2lmaSIsImRhdGEiLCJpc0VtdWxhdG9yIiwidXRpbCIsImhhc1ZhbHVlIiwic2V0V2lmaVN0YXRlIiwic2V0RGF0YVN0YXRlIiwiaXNBbmltYXRpb25PbiIsImFuaW1hdG9yX2R1cmF0aW9uX3NjYWxlIiwidHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUiLCJ3aW5kb3dfYW5pbWF0aW9uX3NjYWxlIiwic2V0dGluZyIsInJpbXJhZiIsImxvY2FsUGF0aCIsIm9wdHMiLCJwb3NpeCIsImRpcm5hbWUiLCJhZGJFeGVjIiwicHVsbCIsInRpbWVvdXQiLCJwcm9jZXNzRXhpc3RzIiwicHJvY2Vzc05hbWUiLCJnZXRQSURzQnlOYW1lIiwiZ2V0Rm9yd2FyZExpc3QiLCJjb25uZWN0aW9ucyIsIkVPTCIsImxpbmUiLCJmb3J3YXJkUG9ydCIsInN5c3RlbVBvcnQiLCJkZXZpY2VQb3J0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJnZXRSZXZlcnNlTGlzdCIsInJldmVyc2VQb3J0IiwicmVtb3ZlUG9ydFJldmVyc2UiLCJmb3J3YXJkQWJzdHJhY3RQb3J0IiwicGluZyIsImluZGV4T2YiLCJyZXN0YXJ0Iiwic3RvcExvZ2NhdCIsInJlc3RhcnRBZGIiLCJ3YWl0Rm9yRGV2aWNlIiwic3RhcnRMb2djYXQiLCJfbG9nY2F0U3RhcnR1cFBhcmFtcyIsImxvZ2NhdCIsIkxvZ2NhdCIsImRlYnVnVHJhY2UiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0Iiwic3RhcnRDYXB0dXJlIiwic3RvcENhcHR1cmUiLCJnZXRMb2djYXRMb2dzIiwiZ2V0TG9ncyIsInNldExvZ2NhdExpc3RlbmVyIiwibGlzdGVuZXIiLCJyZW1vdmVMb2djYXRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwibGlzdFByb2Nlc3NTdGF0dXMiLCJpc0Jvb2xlYW4iLCJfZG9lc1BzU3VwcG9ydEFPcHRpb24iLCJzdGFjayIsImdldE5hbWVCeVBpZCIsInBpZCIsInRpdGxlTWF0Y2giLCJhbGxUaXRsZXMiLCJwaWRJbmRleCIsIm5hbWVPZmZzZXQiLCJwaWRSZWdleCIsIm1hdGNoZWRMaW5lIiwiaXRlbXMiLCJuYW1lIiwiX2lzUGdyZXBBdmFpbGFibGUiLCJwZ3JlcE91dHB1dCIsIl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoIiwiX2lzUGlkb2ZBdmFpbGFibGUiLCJzaGVsbENvbW1hbmQiLCJlc2NhcGVSZWdFeHAiLCJzbGljZSIsIngiLCJpbmNsdWRlcyIsInBpZHMiLCJwcm9jZXNzTmFtZVJlZ2V4Iiwia2lsbFByb2Nlc3Nlc0J5TmFtZSIsIkIiLCJhbGwiLCJraWxsUHJvY2Vzc0J5UElEIiwibm9Qcm9jZXNzRmxhZyIsInByaXZpbGVnZWQiLCJlMSIsImJyb2FkY2FzdFByb2Nlc3NFbmQiLCJpbnRlbnQiLCJicm9hZGNhc3QiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlamVjdCIsImRlZmF1bHRBcmdzIiwiY29uY2F0IiwiU3ViUHJvY2VzcyIsIndhaXRGb3JBY3Rpdml0eSIsInByb3BlcnR5IiwidmFsIiwic2V0RGV2aWNlUHJvcGVydHkiLCJwcm9wIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VTeXNDb3VudHJ5IiwiZ2V0RGV2aWNlU3lzTG9jYWxlIiwiZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlIiwiZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0TG9jYWxlIiwiZ2V0TW9kZWwiLCJnZXRNYW51ZmFjdHVyZXIiLCJnZXRTY3JlZW5TaXplIiwic2l6ZSIsImdldFNjcmVlbkRlbnNpdHkiLCJkZW5zaXR5IiwiZGVuc2l0eU51bWJlciIsInNldEh0dHBQcm94eSIsInByb3h5SG9zdCIsInByb3h5UG9ydCIsInByb3h5IiwiaXNVbmRlZmluZWQiLCJodHRwUHJveHlTZXR0aW5zIiwic2V0dGluZ0tleSIsInNldHRpbmdWYWx1ZSIsImRlbGV0ZUh0dHBQcm94eSIsIm5hbWVzcGFjZSIsImJ1Z3JlcG9ydCIsInNjcmVlbnJlY29yZCIsImRlc3RpbmF0aW9uIiwib3B0aW9ucyIsInZpZGVvU2l6ZSIsImJpdFJhdGUiLCJ0aW1lTGltaXQiLCJidWdSZXBvcnQiLCJmdWxsQ21kIiwicXVvdGUiLCJydW5JbkltZUNvbnRleHQiLCJpbWUiLCJmbiIsIm9yaWdpbmFsSW1lIiwiZ2V0VGltZVpvbmUiLCJsaXN0RmVhdHVyZXMiLCJfbWVtb2l6ZWRGZWF0dXJlcyIsIm1lbW9pemUiLCJjdXJEZXZpY2VJZCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwicHJvdG8iLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9oZWxwT3V0cHV0IiwiaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQiLCJiaW5hcnkiLCJnZXRWZXJzaW9uIiwiY29tcGFyZVZlcnNpb25zIiwidmVyc2lvbiIsImdldERldmljZUlkbGVXaGl0ZWxpc3QiLCJvdXRwdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJwYWNrYWdlcyIsInBsdXJhbGl6ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSx1QkFBdUIsR0FBRyxJQUFoQztBQUNBLE1BQU1DLHlCQUF5QixHQUFHLG1DQUFsQztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLENBQzFCRCx5QkFEMEIsRUFFMUIscUJBRjBCLENBQTVCO0FBSUEsTUFBTUUscUJBQXFCLEdBQUcsRUFBOUI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxDQUM3Qiw4QkFENkIsRUFFN0IsMEJBRjZCLEVBRzdCLG1CQUg2QixDQUEvQjtBQUtBLE1BQU1DLGdCQUFnQixHQUFHLEtBQXpCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsTUFBbEM7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyxNQUFKLENBQVksVUFBU0gsZ0JBQWlCLFdBQVVDLHlCQUEwQixTQUExRSxFQUFvRixHQUFwRixDQUF6QjtBQUdBLE1BQU1HLE9BQU8sR0FBRyxFQUFoQjs7QUFnQkFBLE9BQU8sQ0FBQ0MsV0FBUixHQUFzQixlQUFlQSxXQUFmLENBQTRCQyxjQUE1QixFQUE0Q0MsSUFBNUMsRUFBa0Q7QUFDdEUsUUFBTUMsUUFBUSxHQUFHLEVBQWpCO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLEVBQWY7O0FBQ0EsT0FBSyxNQUFNQyxHQUFYLElBQWtCSCxJQUFsQixFQUF3QjtBQUN0QixVQUFNSSxPQUFPLEdBQUdMLGNBQWMsQ0FBQ0ksR0FBRCxDQUE5Qjs7QUFDQSxRQUFJLENBQUNFLGdC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LENBQUNDLFNBQUwsQ0FBZXVULFFBQWYsQ0FBeUIsb0JBQTFGOztBQUNBLFFBQU0sS0FBS3pVLFdBQUwsQ0FBa0JrRSxHQUFELElBQVMsQ0FBQyxTQUFELEVBQVksWUFBWixFQUEwQixXQUExQixFQUF3QyxJQUFHQSxHQUFJLEVBQS9DLENBQTFCLEVBQTZFdVEsUUFBN0UsQ0FBTjtBQUNBLFNBQU8sSUFBUDtBQUNELENBVEQ7O2VBV2UxVSxPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGlzU2hvd2luZ0xvY2tzY3JlZW4sIGlzQ3VycmVudEZvY3VzT25LZXlndWFyZCxcbiAgZ2V0U3VyZmFjZU9yaWVudGF0aW9uLCBpc1NjcmVlbk9uRnVsbHksIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IExvZ2NhdCBmcm9tICcuLi9sb2djYXQnO1xuaW1wb3J0IHsgc2xlZXAsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEggPSAxMDAwO1xuY29uc3QgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiA9IC9ub3QgYSBjaGFuZ2VhYmxlIHBlcm1pc3Npb24gdHlwZS9pO1xuY29uc3QgSUdOT1JFRF9QRVJNX0VSUk9SUyA9IFtcbiAgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUixcbiAgL1Vua25vd24gcGVybWlzc2lvbi9pLFxuXTtcbmNvbnN0IE1BWF9QR1JFUF9QQVRURVJOX0xFTiA9IDE1O1xuY29uc3QgSElEREVOX0FQSV9QT0xJQ1lfS0VZUyA9IFtcbiAgJ2hpZGRlbl9hcGlfcG9saWN5X3ByZV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3lfcF9hcHBzJyxcbiAgJ2hpZGRlbl9hcGlfcG9saWN5J1xuXTtcbmNvbnN0IFBJRF9DT0xVTU5fVElUTEUgPSAnUElEJztcbmNvbnN0IFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUgPSAnTkFNRSc7XG5jb25zdCBQU19USVRMRV9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtQSURfQ09MVU1OX1RJVExFfVxcXFxiLipcXFxcYiR7UFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRX1cXFxcYi4qKSRgLCAnbScpO1xuXG5cbmNvbnN0IG1ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGNodW5rcyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZXMgdGhlbSBpbiBgYWRiIHNoZWxsYC5cbiAqIFRoaXMgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgYWRiIHNoZWxsYCBzZXBhcmF0ZWx5IGZvciBlYWNoIGFyZywgaG93ZXZlclxuICogdGhlcmUgaXMgYSBsaW1pdCBmb3IgYSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNpbmdsZSBhZGIgY29tbWFuZC4gdGhhdCBpcyB3aHlcbiAqIHdlIG5lZWQgYWxsIHRoaXMgY29tcGxpY2F0ZWQgbG9naWMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXJnVHJhbnNmb3JtZXIgQSBmdW5jdGlvbiwgdGhhdCByZWNlaXZlcyBzaW5nbGUgYXJndW1lbnRcbiAqIGZyb20gdGhlIGBhcmdzYCBhcnJheSBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgc2hlbGwgY29tbWFuZC4gVGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgYW4gYXJyYXksIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHBhcnQgb2YgYSBzaW5nbGUgY29tbWFuZC5cbiAqIFRoZSBsYXN0IGl0ZW0gb2YgdGhlIGFycmF5IGNvdWxkIGJlICc7Jy4gSWYgdGhpcyBpcyBub3QgYSBzZW1pY29sb24gdGhlbiBpdCBpcyBnb2luZyB0b1xuICogYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyfHN0cmluZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgdmFsdWVzIHRvIGNyZWF0ZSBjaHVua3MgZm9yXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW55IG9mIHRoZSBjaHVua3MgcmV0dXJucyBub24temVybyBleGl0IGNvZGUgYWZ0ZXIgYmVpbmcgZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5zaGVsbENodW5rcyA9IGFzeW5jIGZ1bmN0aW9uIHNoZWxsQ2h1bmtzIChhcmdUcmFuc2Zvcm1lciwgYXJncykge1xuICBjb25zdCBjb21tYW5kcyA9IFtdO1xuICBsZXQgY21kQ2h1bmsgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGNvbnN0IG5leHRDbWQgPSBhcmdUcmFuc2Zvcm1lcihhcmcpO1xuICAgIGlmICghXy5pc0FycmF5KG5leHRDbWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRyYW5zZm9ybWVyIG11c3QgcmVzdWx0IGluIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChfLmxhc3QobmV4dENtZCkgIT09ICc7Jykge1xuICAgICAgbmV4dENtZC5wdXNoKCc7Jyk7XG4gICAgfVxuICAgIGlmIChuZXh0Q21kLmpvaW4oJyAnKS5sZW5ndGggKyBjbWRDaHVuay5qb2luKCcgJykubGVuZ3RoID49IE1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgICAgIGNtZENodW5rID0gW107XG4gICAgfVxuICAgIGNtZENodW5rID0gWy4uLmNtZENodW5rLCAuLi5uZXh0Q21kXTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShjbWRDaHVuaykpIHtcbiAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgfVxuICBsb2cuZGVidWcoYEdvdCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY2h1bmtzIHRvIGV4ZWN1dGU6ICR7SlNPTi5zdHJpbmdpZnkoY29tbWFuZHMpfWApO1xuICBsZXQgbGFzdEVycm9yID0gbnVsbDtcbiAgZm9yIChjb25zdCBjbWQgb2YgY29tbWFuZHMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChjbWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgfVxuICB9XG4gIGlmIChsYXN0RXJyb3IpIHtcbiAgICB0aHJvdyBsYXN0RXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGFkYiBleGVjdXRhYmxlIGFtZCBhc3NpZ24gaXRcbiAqIHRvIHRoaXMuZXhlY3V0YWJsZS5wYXRoIGFuZCB0aGlzLmJpbmFyaWVzLmFkYiBwcm9wZXJ0aWVzLlxuICpcbiAqIEByZXR1cm4ge0FEQn0gQURCIGluc3RhbmNlLlxuICovXG5tZXRob2RzLmdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCAoKSB7XG4gIHRoaXMuZXhlY3V0YWJsZS5wYXRoID0gYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhZGInKTtcbiAgcmV0dXJuIHRoaXMuYWRiO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0IHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0IHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdCAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdCcpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0MiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdDIgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdDIgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdDIgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIHppcGFsaWduIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy56aXBhbGlnbiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRaaXBBbGlnbiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRaaXBBbGlnbiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnemlwYWxpZ24nKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYnVuZGxldG9vbCBiaW5hcnkgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5idW5kbGV0b29sIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEJ1bmRsZXRvb2wgPSBhc3luYyBmdW5jdGlvbiBpbml0QnVuZGxldG9vbCAoKSB7XG4gIHRyeSB7XG4gICAgdGhpcy5iaW5hcmllcy5idW5kbGV0b29sID0gYXdhaXQgZnMud2hpY2goJ2J1bmRsZXRvb2wuamFyJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVuZGxldG9vbC5qYXIgYmluYXJ5IGlzIGV4cGVjdGVkIHRvIGJlIHByZXNlbnQgaW4gUEFUSC4gJyArXG4gICAgICAnVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9idW5kbGV0b29sIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIEFQSSBsZXZlbCBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgQVBJIGxldmVsIGFzIGludGVnZXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAyMSBmb3JcbiAqICAgICAgICAgICAgICAgICAgQW5kcm9pZCBMb2xsaXBvcC4gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBjYWNoZWQsIHNvIGFsbCB0aGUgZnVydGhlclxuICogY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBmaXJzdCBvbmUuXG4gKi9cbm1ldGhvZHMuZ2V0QXBpTGV2ZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRBcGlMZXZlbCAoKSB7XG4gIGlmICghXy5pc0ludGVnZXIodGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ck91dHB1dCA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24uc2RrJyk7XG4gICAgICBsZXQgYXBpTGV2ZWwgPSBwYXJzZUludChzdHJPdXRwdXQudHJpbSgpLCAxMCk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHByZXZpZXcvYmV0YSBwbGF0Zm9ybSBBUEkgbGV2ZWxcbiAgICAgIGNvbnN0IGNoYXJDb2RlUSA9ICdxJy5jaGFyQ29kZUF0KDApO1xuICAgICAgLy8gMjggaXMgdGhlIGZpcnN0IEFQSSBMZXZlbCwgd2hlcmUgQW5kcm9pZCBTREsgc3RhcnRlZCByZXR1cm5pbmcgbGV0dGVycyBpbiByZXNwb25zZSB0byBnZXRQbGF0Zm9ybVZlcnNpb25cbiAgICAgIGNvbnN0IGFwaUxldmVsRGlmZiA9IGFwaUxldmVsIC0gMjg7XG4gICAgICBjb25zdCBjb2RlbmFtZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGVRICsgYXBpTGV2ZWxEaWZmKTtcbiAgICAgIGlmIChhcGlMZXZlbERpZmYgPj0gMCAmJiAoYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKSkudG9Mb3dlckNhc2UoKSA9PT0gY29kZW5hbWUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBSZWxlYXNlIHZlcnNpb24gaXMgJHtjb2RlbmFtZS50b1VwcGVyQ2FzZSgpfSBidXQgZm91bmQgQVBJIExldmVsICR7YXBpTGV2ZWx9LiBTZXR0aW5nIEFQSSBMZXZlbCB0byAke2FwaUxldmVsICsgMX1gKTtcbiAgICAgICAgYXBpTGV2ZWwrKztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYXBpTGV2ZWwgPSBhcGlMZXZlbDtcbiAgICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIEFQSSBsZXZlbDogJHt0aGlzLl9hcGlMZXZlbH1gKTtcbiAgICAgIGlmIChpc05hTih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWN0dWFsIG91dHB1dCAnJHtzdHJPdXRwdXR9JyBjYW5ub3QgYmUgY29udmVydGVkIHRvIGFuIGludGVnZXJgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIEFQSSBsZXZlbC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fYXBpTGV2ZWw7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGFzIGEgc3RyaW5nLCBmb3IgZXhhbXBsZSAnNS4wJyBmb3JcbiAqIEFuZHJvaWQgTG9sbGlwb3AuXG4gKi9cbm1ldGhvZHMuZ2V0UGxhdGZvcm1WZXJzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1WZXJzaW9uICgpIHtcbiAgbG9nLmluZm8oJ0dldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhIGRldmljZSBpcyBjb25uZWN0ZWQuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZGV2aWNlIGlzIHZpc2libGUgdG8gYWRiLlxuICovXG5tZXRob2RzLmlzRGV2aWNlQ29ubmVjdGVkID0gYXN5bmMgZnVuY3Rpb24gaXNEZXZpY2VDb25uZWN0ZWQgKCkge1xuICBsZXQgZGV2aWNlcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlcygpO1xuICByZXR1cm4gZGV2aWNlcy5sZW5ndGggPiAwO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjcmVhdGUgYSBuZXcgZm9sZGVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBuZXcgcGF0aCB0byBiZSBjcmVhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBta2RpciBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5ta2RpciA9IGFzeW5jIGZ1bmN0aW9uIG1rZGlyIChyZW1vdGVQYXRoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhXG4gKiB2YWxpZCBjbGFzcyBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1N0cmluZyAtIFRoZSBhY3R1YWwgY2xhc3MgbmFtZSB0byBiZSB2ZXJpZmllZC5cbiAqIEByZXR1cm4gez9BcnJheS48TWF0Y2g+fSBUaGUgcmVzdWx0IG9mIFJlZ2V4cC5leGVjIG9wZXJhdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIF9udWxsXyBpZiBubyBtYXRjaGVzIGFyZSBmb3VuZC5cbiAqL1xubWV0aG9kcy5pc1ZhbGlkQ2xhc3MgPSBmdW5jdGlvbiBpc1ZhbGlkQ2xhc3MgKGNsYXNzU3RyaW5nKSB7XG4gIC8vIHNvbWUucGFja2FnZS9zb21lLnBhY2thZ2UuQWN0aXZpdHlcbiAgcmV0dXJuIG5ldyBSZWdFeHAoL15bYS16QS1aMC05Li9fXSskLykuZXhlYyhjbGFzc1N0cmluZyk7XG59O1xuXG4vKipcbiAqIEZvcmNlIGFwcGxpY2F0aW9uIHRvIHN0b3Agb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuZm9yY2VTdG9wID0gYXN5bmMgZnVuY3Rpb24gZm9yY2VTdG9wIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdmb3JjZS1zdG9wJywgcGtnXSk7XG59O1xuXG4vKlxuICogS2lsbCBhcHBsaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMua2lsbFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBraWxsUGFja2FnZSAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAna2lsbCcsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgdXNlciBkYXRhIG9mIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgY2xlYXJlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdjbGVhcicsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBHcmFudCBhbGwgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCBvbiBBbmRyb2lkIDYuMCsgYW5kIGZvciBhcHBsaWNhdGlvbnNcbiAqIHRoYXQgc3VwcG9ydCBjb21wb25lbnRzLWJhc2VkIHBlcm1pc3Npb25zIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwayAtIFRoZSBwYXRoIHRvIHRoZSBhY3R1YWwgYXBrIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdyYW50aW5nIHBlcm1pc3Npb25zXG4gKi9cbm1ldGhvZHMuZ3JhbnRBbGxQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50QWxsUGVybWlzc2lvbnMgKHBrZywgYXBrKSB7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpO1xuICBsZXQgdGFyZ2V0U2RrID0gMDtcbiAgbGV0IGR1bXBzeXNPdXRwdXQgPSBudWxsO1xuICB0cnkge1xuICAgIGlmICghYXBrKSB7XG4gICAgICAvKipcbiAgICAgICAqIElmIGFwayBub3QgcHJvdmlkZWQsIGNvbnNpZGVyaW5nIGFwayBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlXG4gICAgICAgKiBhbmQgZmV0Y2hpbmcgdGFyZ2V0U2RrIHVzaW5nIHBhY2thZ2UgbmFtZS5cbiAgICAgICAqL1xuICAgICAgZHVtcHN5c091dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdChhcGspO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vYXZvaWRpbmcgbG9nZ2luZyBlcnJvciBzdGFjaywgYXMgY2FsbGluZyBsaWJyYXJ5IGZ1bmN0aW9uIHdvdWxkIGhhdmUgbG9nZ2VkXG4gICAgbG9nLndhcm4oYFJhbiBpbnRvIHByb2JsZW0gZ2V0dGluZyB0YXJnZXQgU0RLIHZlcnNpb247IGlnbm9yaW5nLi4uYCk7XG4gIH1cbiAgaWYgKGFwaUxldmVsID49IDIzICYmIHRhcmdldFNkayA+PSAyMykge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBkZXZpY2UgaXMgcnVubmluZyBBbmRyb2lkIDYuMChBUEkgMjMpIG9yIGhpZ2hlciwgYW5kIHlvdXIgYXBwJ3MgdGFyZ2V0IFNESyBpcyAyMyBvciBoaWdoZXI6XG4gICAgICogVGhlIGFwcCBoYXMgdG8gbGlzdCB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIG1hbmlmZXN0LlxuICAgICAqIHJlZmVyOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS90cmFpbmluZy9wZXJtaXNzaW9ucy9yZXF1ZXN0aW5nLmh0bWxcbiAgICAgKi9cbiAgICBkdW1wc3lzT3V0cHV0ID0gZHVtcHN5c091dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgcmVxdWVzdGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFJlcVBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRHcmFudGVkUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBwZXJtaXNzaW9uc1RvR3JhbnQgPSBfLmRpZmZlcmVuY2UocmVxdWVzdGVkUGVybWlzc2lvbnMsIGdyYW50ZWRQZXJtaXNzaW9ucyk7XG4gICAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9uc1RvR3JhbnQpKSB7XG4gICAgICBsb2cuaW5mbyhgJHtwa2d9IGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIGF2YWlsYWJsZSBmb3IgZ3JhbnRpbmdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5ncmFudFBlcm1pc3Npb25zKHBrZywgcGVybWlzc2lvbnNUb0dyYW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgbXVsdGlwbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIGNhbGwgaXMgbW9yZSBwZXJmb3JtYW50IHRoYW4gYGdyYW50UGVybWlzc2lvbmAgb25lLCBzaW5jZSBpdCBjb21iaW5lc1xuICogbXVsdGlwbGUgYGFkYiBzaGVsbGAgY2FsbHMgaW50byBhIHNpbmdsZSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcGVybWlzc2lvbnMgLSBUaGUgbGlzdCBvZiBwZXJtaXNzaW9ucyB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9ucyAocGtnLCBwZXJtaXNzaW9ucykge1xuICAvLyBBcyBpdCBjb25zdW1lcyBtb3JlIHRpbWUgZm9yIGdyYW50aW5nIGVhY2ggcGVybWlzc2lvbixcbiAgLy8gdHJ5aW5nIHRvIGdyYW50IGFsbCBwZXJtaXNzaW9uIGJ5IGZvcm1pbmcgZXF1aXZhbGVudCBjb21tYW5kLlxuICAvLyBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgdG8gc3BsaXQgbG9uZyBjb21tYW5kcyBpbnRvIGNodW5rcywgc2luY2UgdGhlIG1heGltdW0gbGVuZ3RoIG9mXG4gIC8vIGFkYiBzaGVsbCBidWZmZXIgaXMgbGltaXRlZFxuICBsb2cuZGVidWcoYEdyYW50aW5nIHBlcm1pc3Npb25zICR7SlNPTi5zdHJpbmdpZnkocGVybWlzc2lvbnMpfSB0byAnJHtwa2d9J2ApO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBlcm0pID0+IFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1dLCBwZXJtaXNzaW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIUlHTk9SRURfUEVSTV9FUlJPUlMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBzaW5nbGUgcGVybWlzc2lvbiBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldm9rZSBzaW5nbGUgcGVybWlzc2lvbiBmcm9tIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIHJldm9rZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLnJldm9rZVBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiByZXZva2VQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAncmV2b2tlJywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5nZXRHcmFudGVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRHcmFudGVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZ3JhbnRlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGVuaWVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXREZW5pZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBkZW5pZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRSZXFQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldFJlcVBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHJlcXVlc3RlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ3JlcXVlc3RlZCddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgbG9jYXRpb24gcHJvdmlkZXJzIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsb2NhdGlvbiBwcm92aWRlcnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRMb2NhdGlvblByb3ZpZGVycyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uUHJvdmlkZXJzICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJyk7XG4gIHJldHVybiBzdGRvdXQudHJpbSgpLnNwbGl0KCcsJylcbiAgICAubWFwKChwKSA9PiBwLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgdGhlIHN0YXRlIG9mIEdQUyBsb2NhdGlvbiBwcm92aWRlci5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRvIGVuYWJsZSAodHJ1ZSkgb3IgZGlzYWJsZSAoZmFsc2UpIHRoZSBHUFMgcHJvdmlkZXIuXG4gKi9cbm1ldGhvZHMudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgKGVuYWJsZWQpIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnLCBgJHtlbmFibGVkID8gJysnIDogJy0nfWdwc2ApO1xufTtcblxuLyoqXG4gKiBTZXQgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFjY2VzcyB0byBub24tU0RLIEFQSXMuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlIC0gVGhlIEFQSSBlbmZvcmNlbWVudCBwb2xpY3kuXG4gKiAgICAgRm9yIEFuZHJvaWQgUFxuICogICAgIDA6IERpc2FibGUgbm9uLVNESyBBUEkgdXNhZ2UgZGV0ZWN0aW9uLiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIGxvZ2dpbmcsIGFuZCBhbHNvIGJyZWFrIHRoZSBzdHJpY3QgbW9kZSBBUEksXG4gKiAgICAgICAgZGV0ZWN0Tm9uU2RrQXBpVXNhZ2UoKS4gTm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IFwiSnVzdCB3YXJuXCIgLSBwZXJtaXQgYWNjZXNzIHRvIGFsbCBub24tU0RLIEFQSXMsIGJ1dCBrZWVwIHdhcm5pbmdzIGluIHRoZSBsb2cuXG4gKiAgICAgICAgVGhlIHN0cmljdCBtb2RlIEFQSSB3aWxsIGtlZXAgd29ya2luZy5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgYW5kIGJsYWNrIGxpc3RlZCBBUElzLlxuICogICAgIDM6IERpc2FsbG93IHVzYWdlIG9mIGJsYWNrbGlzdGVkIEFQSXMsIGJ1dCBhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgbGlzdGVkIEFQSXMuXG4gKlxuICogICAgIEZvciBBbmRyb2lkIFFcbiAqICAgICBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L25vbi1zZGstcSNlbmFibGUtbm9uLXNkay1hY2Nlc3NcbiAqICAgICAwOiBEaXNhYmxlIGFsbCBkZXRlY3Rpb24gb2Ygbm9uLVNESyBpbnRlcmZhY2VzLiBVc2luZyB0aGlzIHNldHRpbmcgZGlzYWJsZXMgYWxsIGxvZyBtZXNzYWdlcyBmb3Igbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2VcbiAqICAgICAgICBhbmQgcHJldmVudHMgeW91IGZyb20gdGVzdGluZyB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuIFRoaXMgc2V0dGluZyBpcyBub3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogRW5hYmxlIGFjY2VzcyB0byBhbGwgbm9uLVNESyBpbnRlcmZhY2VzLCBidXQgcHJpbnQgbG9nIG1lc3NhZ2VzIHdpdGggd2FybmluZ3MgZm9yIGFueSBub24tU0RLIGludGVyZmFjZSB1c2FnZS5cbiAqICAgICAgICBVc2luZyB0aGlzIHNldHRpbmcgYWxzbyBhbGxvd3MgeW91IHRvIHRlc3QgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIG5vbi1TREsgaW50ZXJmYWNlcyB0aGF0IGJlbG9uZyB0byBlaXRoZXIgdGhlIGJsYWNrIGxpc3RcbiAqICAgICAgICBvciB0byBhIHJlc3RyaWN0ZWQgZ3JleWxpc3QgZm9yIHlvdXIgdGFyZ2V0IEFQSSBsZXZlbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXRIaWRkZW5BcGlQb2xpY3kgKHZhbHVlLCBpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIHB1dCBnbG9iYWwgJHtrfSAke3ZhbHVlfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIHNldCBzZXR0aW5nIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nIHRvICcke3ZhbHVlfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXNldCBhY2Nlc3MgdG8gbm9uLVNESyBBUElzIHRvIGl0cyBkZWZhdWx0IHNldHRpbmcuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSAoaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsICR7a31gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBkZWxldGUga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UgaWYgaXQgaXMgcnVubmluZyBhbmQgY2xlYXJzIGl0cyBhcHBsaWNhdGlvbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqL1xubWV0aG9kcy5zdG9wQW5kQ2xlYXIgPSBhc3luYyBmdW5jdGlvbiBzdG9wQW5kQ2xlYXIgKHBrZykge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZm9yY2VTdG9wKHBrZyk7XG4gICAgYXdhaXQgdGhpcy5jbGVhcihwa2cpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcCBhbmQgY2xlYXIgJHtwa2d9LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmF2YWlsYWJsZUlNRXMgPSBhc3luYyBmdW5jdGlvbiBhdmFpbGFibGVJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0JywgJy1hJ10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBhdmFpbGFibGUgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBlbmFibGVkIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGVuYWJsZWQgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZW5hYmxlZElNRXMgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVkSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZW5hYmxlZCBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmVuYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdlbmFibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBEaXNhYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZGlzYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZGlzYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLnNldElNRSA9IGFzeW5jIGZ1bmN0aW9uIHNldElNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdzZXQnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2RcbiAqL1xubWV0aG9kcy5kZWZhdWx0SU1FID0gYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElNRSAoKSB7XG4gIHRyeSB7XG4gICAgbGV0IGVuZ2luZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2RlZmF1bHRfaW5wdXRfbWV0aG9kJyk7XG4gICAgaWYgKGVuZ2luZSA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVuZ2luZS50cmltKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGVmYXVsdCBJTUUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0ga2V5Y29kZSAtIFRoZSBhY3R1YWwga2V5IGNvZGUgdG8gYmUgc2VudC5cbiAqL1xubWV0aG9kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIGtleWV2ZW50IChrZXljb2RlKSB7XG4gIC8vIGtleWNvZGUgbXVzdCBiZSBhbiBpbnQuXG4gIGxldCBjb2RlID0gcGFyc2VJbnQoa2V5Y29kZSwgMTApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBjb2RlXSk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIgdGV4dCB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgYWN0dWFsIHRleHQgdG8gYmUgc2VudC5cbiAqL1xubWV0aG9kcy5pbnB1dFRleHQgPSBhc3luYyBmdW5jdGlvbiBpbnB1dFRleHQgKHRleHQpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdXNlbGVzcy1lc2NhcGUgKi9cbiAgLy8gbmVlZCB0byBlc2NhcGUgd2hpdGVzcGFjZSBhbmQgKCApIDwgPiB8IDsgJiAqIFxcIH4gXCIgJ1xuICB0ZXh0ID0gdGV4dFxuICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKC9nLCAnXFwoJylcbiAgICAgICAgICAucmVwbGFjZSgvXFwpL2csICdcXCknKVxuICAgICAgICAgIC5yZXBsYWNlKC88L2csICdcXDwnKVxuICAgICAgICAgIC5yZXBsYWNlKC8+L2csICdcXD4nKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHwvZywgJ1xcfCcpXG4gICAgICAgICAgLnJlcGxhY2UoLzsvZywgJ1xcOycpXG4gICAgICAgICAgLnJlcGxhY2UoLyYvZywgJ1xcJicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKi9nLCAnXFwqJylcbiAgICAgICAgICAucmVwbGFjZSgvfi9nLCAnXFx+JylcbiAgICAgICAgICAucmVwbGFjZSgvXCIvZywgJ1xcXCInKVxuICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFwnXCIpXG4gICAgICAgICAgLnJlcGxhY2UoLyAvZywgJyVzJyk7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbnB1dCcsICd0ZXh0JywgdGV4dF0pO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgYWN0aXZlIHRleHQgZmllbGQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0IGJ5IHNlbmRpbmdcbiAqIHNwZWNpYWwga2V5ZXZlbnRzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggWzEwMF0gLSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdGhlIGZpZWxkIHRvIGJlIGNsZWFyZWQuXG4gKi9cbm1ldGhvZHMuY2xlYXJUZXh0RmllbGQgPSBhc3luYyBmdW5jdGlvbiBjbGVhclRleHRGaWVsZCAobGVuZ3RoID0gMTAwKSB7XG4gIC8vIGFzc3VtZXMgdGhhdCB0aGUgRWRpdFRleHQgZmllbGQgYWxyZWFkeSBoYXMgZm9jdXNcbiAgbG9nLmRlYnVnKGBDbGVhcmluZyB1cCB0byAke2xlbmd0aH0gY2hhcmFjdGVyc2ApO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICdrZXlldmVudCddO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgLy8gd2UgY2Fubm90IGtub3cgd2hlcmUgdGhlIGN1cnNvciBpcyBpbiB0aGUgdGV4dCBmaWVsZCwgc28gZGVsZXRlIGJvdGggYmVmb3JlXG4gICAgLy8gYW5kIGFmdGVyIHNvIHRoYXQgd2UgZ2V0IHJpZCBvZiBldmVyeXRoaW5nXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfREVMXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRk9SV0FSRF9ERUxcbiAgICBhcmdzLnB1c2goJzY3JywgJzExMicpO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gbG9jayBpdC5cbiAqL1xubWV0aG9kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCkpIHtcbiAgICBsb2cuZGVidWcoJ1NjcmVlbiBpcyBhbHJlYWR5IGxvY2tlZC4gRG9pbmcgbm90aGluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgS0VZQ09ERV9QT1dFUiBidXR0b24gdG8gbG9jayBzY3JlZW4nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgyNik7XG5cbiAgY29uc3QgdGltZW91dE1zID0gNTAwMDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMsXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkZXZpY2Ugc2NyZWVuIGlzIHN0aWxsIGxvY2tlZCBhZnRlciAke3RpbWVvdXRNc31tcyB0aW1lb3V0YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBCYWNrIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uIGJhY2sgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBCQUNLIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDQpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEhvbWUgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5nb1RvSG9tZSA9IGFzeW5jIGZ1bmN0aW9uIGdvVG9Ib21lICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgSE9NRSBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgzKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgYWN0dWFsIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiUGF0aCA9IGZ1bmN0aW9uIGdldEFkYlBhdGggKCkge1xuICByZXR1cm4gdGhpcy5leGVjdXRhYmxlLnBhdGg7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIGN1cnJlbnQgc2NyZWVuIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGVuY29kZWQgYXMgYW4gaW50ZWdlciBudW1iZXIuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuT3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5PcmllbnRhdGlvbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdpbnB1dCddKTtcbiAgcmV0dXJuIGdldFN1cmZhY2VPcmllbnRhdGlvbihzdGRvdXQpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgc2NyZWVuIGxvY2sgc3RhdGUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGRldmljZSBpcyBsb2NrZWQuXG4gKi9cbm1ldGhvZHMuaXNTY3JlZW5Mb2NrZWQgPSBhc3luYyBmdW5jdGlvbiBpc1NjcmVlbkxvY2tlZCAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICd3aW5kb3cnXSk7XG4gIGlmIChwcm9jZXNzLmVudi5BUFBJVU1fTE9HX0RVTVBTWVMpIHtcbiAgICAvLyBvcHRpb25hbCBkZWJ1Z2dpbmdcbiAgICAvLyBpZiB0aGUgbWV0aG9kIGlzIG5vdCB3b3JraW5nLCB0dXJuIGl0IG9uIGFuZCBzZW5kIHVzIHRoZSBvdXRwdXRcbiAgICBsZXQgZHVtcHN5c0ZpbGUgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2R1bXBzeXMubG9nJyk7XG4gICAgbG9nLmRlYnVnKGBXcml0aW5nIGR1bXBzeXMgb3V0cHV0IHRvICR7ZHVtcHN5c0ZpbGV9YCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGR1bXBzeXNGaWxlLCBzdGRvdXQpO1xuICB9XG4gIHJldHVybiAoaXNTaG93aW5nTG9ja3NjcmVlbihzdGRvdXQpIHx8IGlzQ3VycmVudEZvY3VzT25LZXlndWFyZChzdGRvdXQpIHx8XG4gICAgICAgICAgIWlzU2NyZWVuT25GdWxseShzdGRvdXQpKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gS2V5Ym9hcmRTdGF0ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0tleWJvYXJkU2hvd24gLSBXaGV0aGVyIHNvZnQga2V5Ym9hcmQgaXMgY3VycmVudGx5IHZpc2libGUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNhbkNsb3NlS2V5Ym9hcmQgLSBXaGV0aGVyIHRoZSBrZXlib2FyZCBjYW4gYmUgY2xvc2VkLlxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHN0YXRlIG9mIHRoZSBzb2Z0d2FyZSBrZXlib2FyZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7S2V5Ym9hcmRTdGF0ZX0gVGhlIGtleWJvYXJkIHN0YXRlLlxuICovXG5tZXRob2RzLmlzU29mdEtleWJvYXJkUHJlc2VudCA9IGFzeW5jIGZ1bmN0aW9uIGlzU29mdEtleWJvYXJkUHJlc2VudCAoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnaW5wdXRfbWV0aG9kJ10pO1xuICAgIGNvbnN0IGlucHV0U2hvd25NYXRjaCA9IC9tSW5wdXRTaG93bj0oXFx3KykvLmV4ZWMoc3Rkb3V0KTtcbiAgICBjb25zdCBpbnB1dFZpZXdTaG93bk1hdGNoID0gL21Jc0lucHV0Vmlld1Nob3duPShcXHcrKS8uZXhlYyhzdGRvdXQpO1xuICAgIHJldHVybiB7XG4gICAgICBpc0tleWJvYXJkU2hvd246ICEhKGlucHV0U2hvd25NYXRjaCAmJiBpbnB1dFNob3duTWF0Y2hbMV0gPT09ICd0cnVlJyksXG4gICAgICBjYW5DbG9zZUtleWJvYXJkOiAhIShpbnB1dFZpZXdTaG93bk1hdGNoICYmIGlucHV0Vmlld1Nob3duTWF0Y2hbMV0gPT09ICd0cnVlJyksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZmluZGluZyBzb2Z0a2V5Ym9hcmQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIGFuIGFyYml0cmFyeSBUZWxuZXQgY29tbWFuZCB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBiZSBzZW50LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFjdHVhbCBvdXRwdXQgb2YgdGhlIGdpdmVuIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuc2VuZFRlbG5ldENvbW1hbmQgPSBhc3luYyBmdW5jdGlvbiBzZW5kVGVsbmV0Q29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjRW11Q29uc29sZUNvbW1hbmQoY29tbWFuZCwge3BvcnQ6IGF3YWl0IHRoaXMuZ2V0RW11bGF0b3JQb3J0KCl9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgQWlycGxhbmUgbW9kZSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzQWlycGxhbmVNb2RlT24gPSBhc3luYyBmdW5jdGlvbiBpc0FpcnBsYW5lTW9kZU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nKTtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSB0aGUgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqL1xubWV0aG9kcy5zZXRBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBzZXRBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nLCBvbiA/IDEgOiAwKTtcbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzZXRBaXJwbGFuZU1vZGV9LCBvdGhlcndpc2VcbiAqIHRoZSBtb2RlIGNoYW5nZSBpcyBub3QgZ29pbmcgdG8gYmUgYXBwbGllZCBmb3IgdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBicm9hZGNhc3QgZW5hYmxlIGFuZCBmYWxzZSB0byBicm9hZGNhc3QgZGlzYWJsZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uQUlSUExBTkVfTU9ERScsXG4gICAgJy0tZXonLCAnc3RhdGUnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgXSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBXaUZpIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIFdpRmkgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpZmlfb24nKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIERhdGEgdHJhbnNmZXIgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0RhdGFPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzRGF0YU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ21vYmlsZV9kYXRhJyk7XG4gIHJldHVybiAocGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDApO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIFdpRmkgYW5kL29yIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gd2lmaSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIFdpRmkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRhdGEgLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBEYXRhIHRyYW5zZmVyLlxuICogQHBhcmFtIHtib29sZWFufSBpc0VtdWxhdG9yIFtmYWxzZV0gLSBTZXQgaXQgdG8gdHJ1ZSBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYW4gZW11bGF0b3IgcmF0aGVyIHRoYW4gYSByZWFsIGRldmljZS5cbiAqL1xubWV0aG9kcy5zZXRXaWZpQW5kRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlBbmREYXRhICh7d2lmaSwgZGF0YX0sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAodXRpbC5oYXNWYWx1ZSh3aWZpKSkge1xuICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHdpZmksIGlzRW11bGF0b3IpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGRhdGEpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXREYXRhU3RhdGUoZGF0YSwgaXNFbXVsYXRvcik7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIGFuaW1hdGlvbiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgYW5pbWF0aW9uIHNjYWxlIHNldHRpbmdzXG4gKiAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gJzAuMCcuXG4gKi9cbm1ldGhvZHMuaXNBbmltYXRpb25PbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQW5pbWF0aW9uT24gKCkge1xuICBsZXQgYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhbmltYXRvcl9kdXJhdGlvbl9zY2FsZScpO1xuICBsZXQgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZScpO1xuICBsZXQgd2luZG93X2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpbmRvd19hbmltYXRpb25fc2NhbGUnKTtcbiAgcmV0dXJuIF8uc29tZShbYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUsIHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlLCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlXSxcbiAgICAgICAgICAgICAgICAoc2V0dGluZykgPT4gc2V0dGluZyAhPT0gJzAuMCcpO1xufTtcblxuLyoqXG4gKiBGb3JjZWZ1bGx5IHJlY3Vyc2l2ZWx5IHJlbW92ZSBhIHBhdGggb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQmUgY2FyZWZ1bCB3aGlsZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gYmUgcmVtb3ZlZCByZWN1cnNpdmVseS5cbiAqL1xubWV0aG9kcy5yaW1yYWYgPSBhc3luYyBmdW5jdGlvbiByaW1yYWYgKHBhdGgpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1yZicsIHBhdGhdKTtcbn07XG5cbi8qKlxuICogU2VuZCBhIGZpbGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3MsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjXyBtZXRob2Qgb3B0aW9ucywgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKi9cbm1ldGhvZHMucHVzaCA9IGFzeW5jIGZ1bmN0aW9uIHB1c2ggKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgb3B0cykge1xuICBhd2FpdCB0aGlzLm1rZGlyKHBhdGgucG9zaXguZGlybmFtZShyZW1vdGVQYXRoKSk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3B1c2gnLCBsb2NhbFBhdGgsIHJlbW90ZVBhdGhdLCBvcHRzKTtcbn07XG5cbi8qKlxuICogUmVjZWl2ZSBhIGZpbGUgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgc291cmNlIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5tZXRob2RzLnB1bGwgPSBhc3luYyBmdW5jdGlvbiBwdWxsIChyZW1vdGVQYXRoLCBsb2NhbFBhdGgpIHtcbiAgLy8gcHVsbCBmb2xkZXIgY2FuIHRha2UgbW9yZSB0aW1lLCBpbmNyZWFzaW5nIHRpbWUgb3V0IHRvIDYwIHNlY3NcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVsbCcsIHJlbW90ZVBhdGgsIGxvY2FsUGF0aF0sIHt0aW1lb3V0OiA2MDAwMH0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9jZXNzIHdpdGggdGhlIHBhcnRpY3VsYXIgbmFtZSBpcyBydW5uaW5nIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb2Nlc3MgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIHByb2Nlc3MgaXMgcnVubmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMucHJvY2Vzc0V4aXN0cyA9IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFeGlzdHMgKHByb2Nlc3NOYW1lKSB7XG4gIHJldHVybiAhXy5pc0VtcHR5KGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShwcm9jZXNzTmFtZSkpO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0Rm9yd2FyZExpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydEZvcndhcmQgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0Rm9yd2FyZCAoc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke3N5c3RlbVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYC0tcmVtb3ZlYCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0UmV2ZXJzZUxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXZlcnNlTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCByZXZlcnNlIGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogT25seSBhdmFpbGFibGUgZm9yIEFQSSAyMSsuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKi9cbm1ldGhvZHMucmV2ZXJzZVBvcnQgPSBhc3luYyBmdW5jdGlvbiByZXZlcnNlUG9ydCAoZGV2aWNlUG9ydCwgc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgZGV2aWNlOiAke2RldmljZVBvcnR9IHRvIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYHRjcDoke2RldmljZVBvcnR9YCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0UmV2ZXJzZSA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRSZXZlcnNlIChkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgcmV2ZXJzZSBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtkZXZpY2VQb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGAtLXJlbW92ZWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBkaWZmZXJlbmNlXG4gKiBiZXR3ZWVuIHtAbGluayAjZm9yd2FyZFBvcnR9IGlzIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBzZXR1cCBmb3IgYW4gYWJzdHJhY3RcbiAqIGxvY2FsIHBvcnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZEFic3RyYWN0UG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRBYnN0cmFjdFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBhYnN0cmFjdCBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGUgcGluZyBzaGVsbCBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb21tYW5kIG91dHB1dCBjb250YWlucyAncGluZycgc3Vic3RyaW5nLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgJ3BpbmcnIGNvbW1hbmQgb24gdGhlXG4gKiAgICAgICAgICAgICAgICAgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMucGluZyA9IGFzeW5jIGZ1bmN0aW9uIHBpbmcgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2VjaG8nLCAncGluZyddKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdwaW5nJykgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEFEQiBwaW5nIGZhaWxlZCwgcmV0dXJuZWQgJHtzdGRvdXR9YCk7XG59O1xuXG4vKipcbiAqIFJlc3RhcnQgdGhlIGRldmljZSB1bmRlciB0ZXN0IHVzaW5nIGFkYiBjb21tYW5kcy5cbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMucmVzdGFydCA9IGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnQgKCkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc3RvcExvZ2NhdCgpO1xuICAgIGF3YWl0IHRoaXMucmVzdGFydEFkYigpO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZSg2MCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydExvZ2NhdCh0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVzdGFydCBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2djYXRPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybWF0IFRoZSBsb2cgcHJpbnQgZm9ybWF0LCB3aGVyZSA8Zm9ybWF0PiBpcyBvbmUgb2Y6XG4gKiAgIGJyaWVmIHByb2Nlc3MgdGFnIHRocmVhZCByYXcgdGltZSB0aHJlYWR0aW1lIGxvbmdcbiAqIGB0aHJlYWR0aW1lYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyU3BlY3MgU2VyaWVzIG9mIDx0YWc+Wzpwcmlvcml0eV1cbiAqIHdoZXJlIDx0YWc+IGlzIGEgbG9nIGNvbXBvbmVudCB0YWcgKG9yICogZm9yIGFsbCkgYW5kIHByaW9yaXR5IGlzOlxuICogIFYgICAgVmVyYm9zZVxuICogIEQgICAgRGVidWdcbiAqICBJICAgIEluZm9cbiAqICBXICAgIFdhcm5cbiAqICBFICAgIEVycm9yXG4gKiAgRiAgICBGYXRhbFxuICogIFMgICAgU2lsZW50IChzdXByZXNzIGFsbCBvdXRwdXQpXG4gKlxuICogJyonIG1lYW5zICcqOmQnIGFuZCA8dGFnPiBieSBpdHNlbGYgbWVhbnMgPHRhZz46dlxuICpcbiAqIElmIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lLCBmaWx0ZXJzcGVjIGlzIHNldCBmcm9tIEFORFJPSURfTE9HX1RBR1MuXG4gKiBJZiBubyBmaWx0ZXJzcGVjIGlzIGZvdW5kLCBmaWx0ZXIgZGVmYXVsdHMgdG8gJyo6SSdcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBsb2djYXQgcHJvY2VzcyB0byBnYXRoZXIgbG9ncy5cbiAqXG4gKiBAcGFyYW0gez9Mb2djYXRPcHRzfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgcmVzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5zdGFydExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TG9nY2F0IChvcHRzID0ge30pIHtcbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHN0YXJ0IGxvZ2NhdCBjYXB0dXJlIGJ1dCBpdCdzIGFscmVhZHkgc3RhcnRlZCFcIik7XG4gIH1cblxuICB0aGlzLmxvZ2NhdCA9IG5ldyBMb2djYXQoe1xuICAgIGFkYjogdGhpcy5leGVjdXRhYmxlLFxuICAgIGRlYnVnOiBmYWxzZSxcbiAgICBkZWJ1Z1RyYWNlOiBmYWxzZSxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0OiAhIXRoaXMuY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgfSk7XG4gIGF3YWl0IHRoaXMubG9nY2F0LnN0YXJ0Q2FwdHVyZShvcHRzKTtcbiAgdGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyA9IG9wdHM7XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIGFjdGl2ZSBsb2djYXQgcHJvY2VzcyB3aGljaCBnYXRoZXJzIGxvZ3MuXG4gKiBUaGUgY2FsbCB3aWxsIGJlIGlnbm9yZWQgaWYgbm8gbG9nY2F0IHByb2Nlc3MgaXMgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zdG9wTG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RvcExvZ2NhdCAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5sb2djYXQuc3RvcENhcHR1cmUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLmxvZ2NhdCA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIG91dHB1dCBmcm9tIHRoZSBjdXJyZW50bHkgcnVubmluZyBsb2djYXQgcHJvY2Vzcy5cbiAqIFRoZSBsb2djYXQgcHJvY2VzcyBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgezJsaW5rICNzdGFydExvZ2NhdH0gbWV0aG9kLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbGxlY3RlZCBsb2djYXQgb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLmdldExvZ2NhdExvZ3MgPSBmdW5jdGlvbiBnZXRMb2djYXRMb2dzICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBnZXQgbG9nY2F0IGxvZ3Mgc2luY2UgbG9nY2F0IGhhc24ndCBzdGFydGVkXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLmxvZ2NhdC5nZXRMb2dzKCk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVGhlIGFyZ3VtZW50IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbG9nIHJlY29yZCBvYmplY3Qgd2l0aCBgdGltZXN0YW1wYCwgYGxldmVsYCBhbmQgYG1lc3NhZ2VgIHByb3BlcnRpZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc2V0TG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiBzZXRMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0Lm9uKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggaGFzIGJlZW4gcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gYHNldExvZ2NhdExpc3RlbmVyYFxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnJlbW92ZUxvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5yZW1vdmVMaXN0ZW5lcignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBBdCBzb21lIHBvaW50IG9mIHRpbWUgR29vZ2xlIGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IGBwc2AgYmVoYXZpb3VyLCBzbyBpdCBvbmx5XG4gKiBsaXN0cyBwcm9jZXNzZXMgdGhhdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgc2hlbGwgdXNlciByYXRoZXIgdG8gYWxsXG4gKiB1c2Vycy4gSXQgaXMgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgcHMgd2l0aCAtQSBjb21tYW5kIGxpbmUgYXJndW1lbnRcbiAqIHRvIG1pbWljIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIG91dHB1dCBvZiBgcHNgIGNvbW1hbmQgd2hlcmUgYWxsIHByb2Nlc3NlcyBhcmUgaW5jbHVkZWRcbiAqL1xubWV0aG9kcy5saXN0UHJvY2Vzc1N0YXR1cyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9jZXNzU3RhdHVzICgpIHtcbiAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbikpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSAvXi1BXFxiL20udGVzdChhd2FpdCB0aGlzLnNoZWxsKFsncHMnLCAnLS1oZWxwJ10pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbCh0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA/IFsncHMnLCAnLUEnXSA6IFsncHMnXSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcHJvY2VzcyBuYW1lIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgdmFsaWQgcHJvY2VzcyBpZGVudGlmaWVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIFBJRCBpcyBlaXRoZXIgaW52YWxpZCBvciBpcyBub3QgcHJlc2VudFxuICogaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHByb2Nlc3MgbmFtZVxuICovXG5tZXRob2RzLmdldE5hbWVCeVBpZCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWVCeVBpZCAocGlkKSB7XG4gIGlmIChpc05hTihwaWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgUElEIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuICcke3BpZH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBwaWQgPSBwYXJzZUludChwaWQsIDEwKTtcblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIC8vIGl0IG1pZ2h0IG5vdCBiZSBzdGFibGUgdG8gdGFrZSBOQU1FIGJ5IGluZGV4LCBiZWNhdXNlIGRlcGVuZGluZyBvbiB0aGVcbiAgLy8gYWN0dWFsIFNESyB0aGUgcHMgb3V0cHV0IG1pZ2h0IG5vdCBjb250YWluIGFuIGFiYnJldmlhdGlvbiBmb3IgdGhlIFMgZmxhZzpcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICAgICAgIE5BTUVcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICBTICAgIE5BTUVcbiAgY29uc3QgbmFtZU9mZnNldCA9IGFsbFRpdGxlcy5pbmRleE9mKFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUpIC0gYWxsVGl0bGVzLmxlbmd0aDtcbiAgY29uc3QgcGlkUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke3BpZH1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcGlkUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApID09PSBwaWQgJiYgaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF0pIHtcbiAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XTtcbiAgICB9XG4gIH1cbiAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhc3NlZCBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgb25lXG4gKi9cbm1ldGhvZHMuZ2V0UElEc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBJRHNCeU5hbWUgKG5hbWUpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIElEcyBvZiBhbGwgJyR7bmFtZX0nIHByb2Nlc3Nlc2ApO1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb2Nlc3MgbmFtZTogJyR7bmFtZX0nYCk7XG4gIH1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzNTY3XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjMpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpKSB7XG4gICAgICAvLyBwZ3JlcCBpcyBpbiBwcmlvcml0eSwgc2luY2UgcGlkb2YgaGFzIGJlZW4gcmVwb3J0ZWQgb2YgaGF2aW5nIGJ1Z3Mgb24gc29tZSBwbGF0Zm9ybXNcbiAgICAgIGNvbnN0IHBncmVwT3V0cHV0ID0gXy50cmltKGF3YWl0IHRoaXMuc2hlbGwoWydwZ3JlcCAtLWhlbHA7IGVjaG8gJD8nXSkpO1xuICAgICAgdGhpcy5faXNQZ3JlcEF2YWlsYWJsZSA9IHBhcnNlSW50KF8ubGFzdChwZ3JlcE91dHB1dC5zcGxpdCgvXFxzKy8pKSwgMTApID09PSAwO1xuICAgICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCA9IC9eLWZcXGIvbS50ZXN0KHBncmVwT3V0cHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUgPSBwYXJzZUludChhd2FpdCB0aGlzLnNoZWxsKFsncGlkb2YgLS1oZWxwID4gL2Rldi9udWxsOyBlY2hvICQ/J10pLCAxMCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlIHx8IHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHNoZWxsQ29tbWFuZCA9IHRoaXMuX2lzUGdyZXBBdmFpbGFibGVcbiAgICAgICAgPyAodGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaFxuICAgICAgICAgID8gWydwZ3JlcCcsICctZicsIF8uZXNjYXBlUmVnRXhwKGAoW1s6Ymxhbms6XV18Xikke25hbWV9KFtbOmJsYW5rOl1dfCQpYCldXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzODcyXG4gICAgICAgICAgOiBbYHBncmVwIF4ke18uZXNjYXBlUmVnRXhwKG5hbWUuc2xpY2UoLU1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSQgYCArXG4gICAgICAgICAgICAgIGB8fCBwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKDAsIE1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSRgXSlcbiAgICAgICAgOiBbJ3BpZG9mJywgbmFtZV07XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGwoc2hlbGxDb21tYW5kKSlcbiAgICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAuZmlsdGVyKCh4KSA9PiBfLmlzSW50ZWdlcih4KSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGVycm9yIGNvZGUgMSBpcyByZXR1cm5lZCBpZiB0aGUgdXRpbGl0eSBkaWQgbm90IGZpbmQgYW55IHByb2Nlc3Nlc1xuICAgICAgICAvLyB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gICAgICAgIGlmIChlLmNvZGUgIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IHByb2Nlc3MgSUQgb2YgJyR7bmFtZX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciB8fCBlLnN0ZG91dCwgJ3N5bnRheCBlcnJvcicpKSB7XG4gICAgICAgICAgbG9nLndhcm4oYEdvdCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gdGhlIHNoZWxsIGludGVycHJldGVyOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvZy5kZWJ1ZygnVXNpbmcgcHMtYmFzZWQgUElEIGRldGVjdGlvbicpO1xuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gcHMgb3V0cHV0YCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgY29uc3QgcGlkcyA9IFtdO1xuICBjb25zdCBwcm9jZXNzTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiXFxcXGQrXFxcXGIuKlxcXFxiJHtfLmVzY2FwZVJlZ0V4cChuYW1lKX1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcHJvY2Vzc05hbWVSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGlkSW5kZXggPj0gYWxsVGl0bGVzLmxlbmd0aCB8fCBpc05hTihpdGVtc1twaWRJbmRleF0pKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tICcke21hdGNoZWRMaW5lWzFdLnRyaW0oKX0nYCk7XG4gICAgfVxuICAgIHBpZHMucHVzaChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSk7XG4gIH1cbiAgcmV0dXJuIHBpZHM7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzZXNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc2VzQnlOYW1lIChuYW1lKSB7XG4gIHRyeSB7XG4gICAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgYWxsICR7bmFtZX0gcHJvY2Vzc2VzYCk7XG4gICAgY29uc3QgcGlkcyA9IGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShuYW1lKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBpZHMpKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gJyR7bmFtZX0nIHByb2Nlc3MgaGFzIGJlZW4gZm91bmRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgQi5hbGwocGlkcy5tYXAoKHApID0+IHRoaXMua2lsbFByb2Nlc3NCeVBJRChwKSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGtpbGwgJHtuYW1lfSBwcm9jZXNzZXMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBLaWxsIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIGN1cnJlbnQgdXNlciBpcyBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIHJvb3QgaWYgbmVjZXNzYXJ5IGluIG9yZGVyXG4gKiB0byBwcm9wZXJseSBraWxsIHRoZSBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIElEIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGtpbGxlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvY2VzcyBjYW5ub3QgYmUga2lsbGVkLlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzQnlQSUQgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc0J5UElEIChwaWQpIHtcbiAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgcHJvY2VzcyAke3BpZH1gKTtcbiAgY29uc3Qgbm9Qcm9jZXNzRmxhZyA9ICdObyBzdWNoIHByb2Nlc3MnO1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwcm9jZXNzIGV4aXN0cyBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIG90aGVyd2lzZVxuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFfLmluY2x1ZGVzKGUuc3RkZXJyLCAnT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQnKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYENhbm5vdCBraWxsIFBJRCAke3BpZH0gZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucy4gUmV0cnlpbmcgYXMgcm9vdGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0sIHtcbiAgICAgICAgcHJpdmlsZWdlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGUxLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTE7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBwcm9jZXNzIGtpbGxpbmcgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBraWxsZWQgcHJvY2Vzcy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGUgcHJvY2VzcyB3YXMgbm90IGtpbGxlZC5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RQcm9jZXNzRW5kID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0UHJvY2Vzc0VuZCAoaW50ZW50LCBwcm9jZXNzTmFtZSkge1xuICAvLyBzdGFydCB0aGUgYnJvYWRjYXN0IHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gZmluaXNoLlxuICB0aGlzLmJyb2FkY2FzdChpbnRlbnQpO1xuICAvLyB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmRcbiAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHRpbWVvdXRNcyA9IDQwMDAwO1xuICB0cnkge1xuICAgIHdoaWxlICgoRGF0ZS5ub3coKSAtIHN0YXJ0KSA8IHRpbWVvdXRNcykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhwcm9jZXNzTmFtZSkpIHtcbiAgICAgICAgLy8gY29vbCBkb3duXG4gICAgICAgIGF3YWl0IHNsZWVwKDQwMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2Nlc3MgbmV2ZXIgZGllZCB3aXRoaW4gJHt0aW1lb3V0TXN9IG1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBicm9hZGNhc3QgcHJvY2VzcyBlbmQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBpbnRlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGludGVudCBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0IChpbnRlbnQpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnRlbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVudCAke2ludGVudH1gKTtcbiAgfVxuICBsb2cuZGVidWcoYEJyb2FkY2FzdGluZzogJHtpbnRlbnR9YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdicm9hZGNhc3QnLCAnLWEnLCBpbnRlbnRdKTtcbn07XG5cbi8qKlxuICogS2lsbCBBbmRyb2lkIGluc3RydW1lbnRzIGlmIHRoZXkgYXJlIGN1cnJlbnRseSBydW5uaW5nLlxuICovXG5tZXRob2RzLmVuZEFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGVuZEFuZHJvaWRDb3ZlcmFnZSAoKSB7XG4gIGlmICh0aGlzLmluc3RydW1lbnRQcm9jICYmIHRoaXMuaW5zdHJ1bWVudFByb2MuaXNSdW5uaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdG9wKCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdHJ1bWVudCB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRXaXRoIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gaW5zdHJ1bWVudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5IHdpdGguXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuaW5zdHJ1bWVudCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RydW1lbnQgKHBrZywgYWN0aXZpdHksIGluc3RydW1lbnRXaXRoKSB7XG4gIGlmIChhY3Rpdml0eVswXSAhPT0gJy4nKSB7XG4gICAgcGtnID0gJyc7XG4gIH1cbiAgbGV0IHBrZ0FjdGl2aXR5ID0gKHBrZyArIGFjdGl2aXR5KS5yZXBsYWNlKC9cXC4rL2csICcuJyk7IC8vIEZpeCBwa2cuLmFjdGl2aXR5IGVycm9yXG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnaW5zdHJ1bWVudCcsXG4gICAgJy1lJywgJ21haW5fYWN0aXZpdHknLFxuICAgIHBrZ0FjdGl2aXR5LFxuICAgIGluc3RydW1lbnRXaXRoLFxuICBdKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdFeGNlcHRpb24nKSAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZXhjZXB0aW9uIGR1cmluZyBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yICR7c3Rkb3V0LnNwbGl0KCdcXG4nKVswXX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDb2xsZWN0IEFuZHJvaWQgY292ZXJhZ2UgYnkgaW5zdHJ1bWVudGluZyB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudENsYXNzIC0gVGhlIG5hbWUgb2YgdGhlIGluc3RydW1lbnRhdGlvbiBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0UGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRBY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqXG4gKiBAcmV0dXJuIHtwcm9taXNlfSBUaGUgcHJvbWlzZSBpcyBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgaWYgdGhlIGluc3RydW1lbnRhdGlvbiBzdGFydHNcbiAqICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgZXJyb3JzLlxuICovXG5tZXRob2RzLmFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGFuZHJvaWRDb3ZlcmFnZSAoaW5zdHJ1bWVudENsYXNzLCB3YWl0UGtnLCB3YWl0QWN0aXZpdHkpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnN0cnVtZW50Q2xhc3MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNsYXNzICR7aW5zdHJ1bWVudENsYXNzfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCBuZXcgQihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IGFyZ3MgPSB0aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NcbiAgICAgIC5jb25jYXQoWydzaGVsbCcsICdhbScsICdpbnN0cnVtZW50JywgJy1lJywgJ2NvdmVyYWdlJywgJ3RydWUnLCAnLXcnXSlcbiAgICAgIC5jb25jYXQoW2luc3RydW1lbnRDbGFzc10pO1xuICAgIGxvZy5kZWJ1ZyhgQ29sbGVjdGluZyBjb3ZlcmFnZSBkYXRhIHdpdGg6ICR7W3RoaXMuZXhlY3V0YWJsZS5wYXRoXS5jb25jYXQoYXJncykuam9pbignICcpfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBhbSBpbnN0cnVtZW50IHJ1bnMgZm9yIHRoZSBsaWZlIG9mIHRoZSBhcHAgcHJvY2Vzcy5cbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2MgPSBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgYXJncyk7XG4gICAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0YXJ0KDApO1xuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3I6ICR7c3RkZXJyfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JBY3Rpdml0eSh3YWl0UGtnLCB3YWl0QWN0aXZpdHkpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFuZHJvaWQgY292ZXJhZ2UgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCkpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIGdldHByb3BfIHRvb2wuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICovXG5tZXRob2RzLmdldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvcGVydHkgKHByb3BlcnR5KSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZ2V0cHJvcCcsIHByb3BlcnR5XSk7XG4gIGxldCB2YWwgPSBzdGRvdXQudHJpbSgpO1xuICBsb2cuZGVidWcoYEN1cnJlbnQgZGV2aWNlIHByb3BlcnR5ICcke3Byb3BlcnR5fSc6ICR7dmFsfWApO1xuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBzZXRQcm9wT3B0c1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcml2aWxlZ2VkIC0gRG8gd2UgcnVuIHNldFByb3AgYXMgYSBwcml2aWxlZ2VkIGNvbW1hbmQ/IERlZmF1bHQgdHJ1ZS5cbiAqL1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIHNldHByb3BfIHRvb2wuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIC0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEBwYXJhbSB7c2V0UHJvcE9wdHN9IG9wdHNcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgX3NldHByb3BfIHV0aWxpdHkgZmFpbHMgdG8gY2hhbmdlIHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLnNldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGV2aWNlUHJvcGVydHkgKHByb3AsIHZhbCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwcml2aWxlZ2VkID0gdHJ1ZX0gPSBvcHRzO1xuICBsb2cuZGVidWcoYFNldHRpbmcgZGV2aWNlIHByb3BlcnR5ICcke3Byb3B9JyB0byAnJHt2YWx9J2ApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0cHJvcCcsIHByb3AsIHZhbF0sIHtcbiAgICBwcml2aWxlZ2VkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsYW5ndWFnZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzQ291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5jb3VudHJ5Jyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbGFuZ3VhZ2UgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0Q291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5yZWdpb24nKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1vZGVsIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1vZGVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0TW9kZWwgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tb2RlbCcpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtYW51ZmFjdHVyZXIgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TWFudWZhY3R1cmVyID0gYXN5bmMgZnVuY3Rpb24gZ2V0TWFudWZhY3R1cmVyICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubWFudWZhY3R1cmVyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZS5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERldmljZSBzY3JlZW4gc2l6ZSBhcyBzdHJpbmcgaW4gZm9ybWF0ICdXeEgnIG9yXG4gKiAgICAgICAgICAgICAgICAgIF9udWxsXyBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5TaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuU2l6ZSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnc2l6ZSddKTtcbiAgbGV0IHNpemUgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBzaXplOiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChzaXplICYmIHNpemUubGVuZ3RoID49IDIpIHtcbiAgICByZXR1cm4gc2l6ZVsxXS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gZGVuc2l0eSBpbiBkcGlcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBEZXZpY2Ugc2NyZWVuIGRlbnNpdHkgYXMgYSBudW1iZXIgb3IgX251bGxfIGlmIGl0XG4gKiAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuRGVuc2l0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbkRlbnNpdHkgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ2RlbnNpdHknXSk7XG4gIGxldCBkZW5zaXR5ID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgZGVuc2l0eTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoZGVuc2l0eSAmJiBkZW5zaXR5Lmxlbmd0aCA+PSAyKSB7XG4gICAgbGV0IGRlbnNpdHlOdW1iZXIgPSBwYXJzZUludChkZW5zaXR5WzFdLnRyaW0oKSwgMTApO1xuICAgIHJldHVybiBpc05hTihkZW5zaXR5TnVtYmVyKSA/IG51bGwgOiBkZW5zaXR5TnVtYmVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBTZXR1cCBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWFkIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL2FuZHJvaWQtOS4wLjBfcjIxL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgZm9yIGVhY2ggcHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJveHlIb3N0IC0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgcHJveHkuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHByb3h5UG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBiZSBzZXQuXG4gKi9cbm1ldGhvZHMuc2V0SHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SHR0cFByb3h5IChwcm94eUhvc3QsIHByb3h5UG9ydCkge1xuICBsZXQgcHJveHkgPSBgJHtwcm94eUhvc3R9OiR7cHJveHlQb3J0fWA7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5SG9zdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9ob3N0OiAke3Byb3h5fWApO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5UG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9wb3J0ICR7cHJveHl9YCk7XG4gIH1cblxuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgIFsnaHR0cF9wcm94eScsIHByb3h5XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLCBwcm94eUhvc3RdLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsIHByb3h5UG9ydF1cbiAgXTtcbiAgZm9yIChjb25zdCBbc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlXSBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCBzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIERlbGV0ZSBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWJvb3RpbmcgdGhlIHRlc3QgZGV2aWNlIGlzIG5lY2Vzc2FyeSB0byBhcHBseSB0aGUgY2hhbmdlLlxuICovXG5tZXRob2RzLmRlbGV0ZUh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUh0dHBQcm94eSAoKSB7XG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgJ2h0dHBfcHJveHknLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9ob3N0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0JyAvLyBgZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3Q9YCB3YXMgZ2VuZXJhdGVkIGJ5IGBzZXR0aW5ncyBnbG9iYWwgaHR0b19wcm94eSB4eHh4YFxuICBdO1xuICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdkZWxldGUnLCAnZ2xvYmFsJywgc2V0dGluZ10pO1xuICB9XG59O1xuXG4vKipcbiAqIFNldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgLSBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMuc2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIHNldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWUpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCBuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlXSk7XG59O1xuXG4vKipcbiAqIEdldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuZ2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIGdldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2dldCcsIG5hbWVzcGFjZSwgc2V0dGluZ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYGFkYiBidWdyZXBvcnRgIGNvbW1hbmQgb3V0cHV0LiBUaGlzXG4gKiBvcGVyYXRpb24gbWF5IHRha2UgdXAgdG8gc2V2ZXJhbCBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB7P251bWJlcn0gdGltZW91dCBbMTIwMDAwXSAtIENvbW1hbmQgdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbW1hbmQgc3Rkb3V0XG4gKi9cbm1ldGhvZHMuYnVncmVwb3J0ID0gYXN5bmMgZnVuY3Rpb24gYnVncmVwb3J0ICh0aW1lb3V0ID0gMTIwMDAwKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydidWdyZXBvcnQnXSwge3RpbWVvdXR9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2NyZWVucmVjb3JkT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2aWRlb1NpemUgLSBUaGUgZm9ybWF0IGlzIHdpZHRoeGhlaWdodC5cbiAqICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGRldmljZSdzIG5hdGl2ZSBkaXNwbGF5IHJlc29sdXRpb24gKGlmIHN1cHBvcnRlZCksXG4gKiAgICAgICAgICAgICAgICAgIDEyODB4NzIwIGlmIG5vdC4gRm9yIGJlc3QgcmVzdWx0cyxcbiAqICAgICAgICAgICAgICAgICAgdXNlIGEgc2l6ZSBzdXBwb3J0ZWQgYnkgeW91ciBkZXZpY2UncyBBZHZhbmNlZCBWaWRlbyBDb2RpbmcgKEFWQykgZW5jb2Rlci5cbiAqICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIFwiMTI4MHg3MjBcIlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYnVnUmVwb3J0IC0gU2V0IGl0IHRvIGB0cnVlYCBpbiBvcmRlciB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHZpZGVvIG92ZXJsYXksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIGEgdGltZXN0YW1wLCB0aGF0IGlzIGhlbHBmdWwgaW4gdmlkZW9zIGNhcHR1cmVkIHRvIGlsbHVzdHJhdGUgYnVncy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFQSSBsZXZlbCAyNyAoQW5kcm9pZCBQKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHRpbWVMaW1pdCAtIFRoZSBtYXhpbXVtIHJlY29yZGluZyB0aW1lLCBpbiBzZWNvbmRzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgKGFuZCBtYXhpbXVtKSB2YWx1ZSBpcyAxODAgKDMgbWludXRlcykuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIG1lZ2FiaXRzIHBlciBzZWNvbmQuXG4gKiAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LiBZb3UgY2FuIGluY3JlYXNlIHRoZSBiaXQgcmF0ZSB0byBpbXByb3ZlIHZpZGVvIHF1YWxpdHksXG4gKiAgICAgICAgICAgICAgICBidXQgZG9pbmcgc28gcmVzdWx0cyBpbiBsYXJnZXIgbW92aWUgZmlsZXMuXG4gKi9cblxuLyoqXG4gKiBJbml0aWF0ZSBzY3JlZW5yZWNvcmQgdXRpbGl0eSBvbiB0aGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uIC0gRnVsbCBwYXRoIHRvIHRoZSB3cml0YWJsZSBtZWRpYSBmaWxlIGRlc3RpbmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZGV2aWNlIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHs/U2NyZWVucmVjb3JkT3B0aW9uc30gb3B0aW9ucyBbe31dXG4gKiBAcmV0dXJucyB7U3ViUHJvY2Vzc30gc2NyZWVucmVjb3JkIHByb2Nlc3MsIHdoaWNoIGNhbiBiZSB0aGVuIGNvbnRyb2xsZWQgYnkgdGhlIGNsaWVudCBjb2RlXG4gKi9cbm1ldGhvZHMuc2NyZWVucmVjb3JkID0gZnVuY3Rpb24gc2NyZWVucmVjb3JkIChkZXN0aW5hdGlvbiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNtZCA9IFsnc2NyZWVucmVjb3JkJ107XG4gIGNvbnN0IHtcbiAgICB2aWRlb1NpemUsXG4gICAgYml0UmF0ZSxcbiAgICB0aW1lTGltaXQsXG4gICAgYnVnUmVwb3J0LFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHV0aWwuaGFzVmFsdWUodmlkZW9TaXplKSkge1xuICAgIGNtZC5wdXNoKCctLXNpemUnLCB2aWRlb1NpemUpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHRpbWVMaW1pdCkpIHtcbiAgICBjbWQucHVzaCgnLS10aW1lLWxpbWl0JywgdGltZUxpbWl0KTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShiaXRSYXRlKSkge1xuICAgIGNtZC5wdXNoKCctLWJpdC1yYXRlJywgYml0UmF0ZSk7XG4gIH1cbiAgaWYgKGJ1Z1JlcG9ydCkge1xuICAgIGNtZC5wdXNoKCctLWJ1Z3JlcG9ydCcpO1xuICB9XG4gIGNtZC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuICBjb25zdCBmdWxsQ21kID0gW1xuICAgIC4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnc2hlbGwnLFxuICAgIC4uLmNtZFxuICBdO1xuICBsb2cuZGVidWcoYEJ1aWxkaW5nIHNjcmVlbnJlY29yZCBwcm9jZXNzIHdpdGggdGhlIGNvbW1hbmQgbGluZTogYWRiICR7dXRpbC5xdW90ZShmdWxsQ21kKX1gKTtcbiAgcmV0dXJuIG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBmdWxsQ21kKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGlucHV0IG1ldGhvZCBjb250ZXh0XG4gKiBhbmQgdGhlbiByZXN0b3JlcyB0aGUgSU1FIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWUgLSBWYWxpZCBJTUUgaWRlbnRpZmllclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBGdW5jdGlvbiB0byBleGVjdXRlXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAqL1xubWV0aG9kcy5ydW5JbkltZUNvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBydW5JbkltZUNvbnRleHQgKGltZSwgZm4pIHtcbiAgY29uc3Qgb3JpZ2luYWxJbWUgPSBhd2FpdCB0aGlzLmRlZmF1bHRJTUUoKTtcbiAgaWYgKG9yaWdpbmFsSW1lID09PSBpbWUpIHtcbiAgICBsb2cuZGVidWcoYFRoZSBvcmlnaW5hbCBJTUUgaXMgdGhlIHNhbWUgYXMgJyR7aW1lfScuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRgKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLmVuYWJsZUlNRShpbWUpO1xuICAgIGF3YWl0IHRoaXMuc2V0SU1FKGltZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3JpZ2luYWxJbWUgIT09IGltZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRJTUUob3JpZ2luYWxJbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdHogZGF0YWJhc2UgdGltZSB6b25lIGZvcm1hdHRlZCB0aW1lem9uZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRaIGRhdGFiYXNlIFRpbWUgWm9uZXMgZm9ybWF0XG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmdldFRpbWVab25lID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGltZVpvbmUgKCkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgY3VycmVudCB0aW1lem9uZScpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy50aW1lem9uZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIHRpbWV6b25lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZlYXR1cmUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEFuIGV4YW1wbGUgYWRiIGNvbW1hbmQgb3V0cHV0OlxuICogYGBgXG4gKiBjbWRcbiAqIGxzX3YyXG4gKiBmaXhlZF9wdXNoX21rZGlyXG4gKiBzaGVsbF92MlxuICogYWJiXG4gKiBzdGF0X3YyXG4gKiBhcGV4XG4gKiBhYmJfZXhlY1xuICogcmVtb3VudF9zaGVsbFxuICogZml4ZWRfcHVzaF9zeW1saW5rX3RpbWVzdGFtcFxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3RcbiAqL1xubWV0aG9kcy5saXN0RmVhdHVyZXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0RmVhdHVyZXMgKCkge1xuICB0aGlzLl9tZW1vaXplZEZlYXR1cmVzID0gdGhpcy5fbWVtb2l6ZWRGZWF0dXJlc1xuICAgIHx8IF8ubWVtb2l6ZShhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmZWF0dXJlcyddKSwgKCkgPT4gdGhpcy5jdXJEZXZpY2VJZCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLl9tZW1vaXplZEZlYXR1cmVzKCkpXG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4geC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsICd1bmtub3duIGNvbW1hbmQnKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdGUgb2Ygc3RyZWFtZWQgaW5zdGFsbCBmZWF0dXJlLlxuICogVGhpcyBmZWF0dXJlIGFsbG93cyB0byBzcGVlZCB1cCBhcGsgaW5zdGFsbGF0aW9uXG4gKiBzaW5jZSBpdCBkb2VzIG5vdCByZXF1aXJlIHRoZSBvcmlnaW5hbCBhcGsgdG8gYmUgcHVzaGVkIHRvXG4gKiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgZmlyc3QsIHdoaWNoIGFsc28gc2F2ZXMgc3BhY2UuXG4gKiBBbHRob3VnaCwgaXQgaXMgcmVxdWlyZWQgdGhhdCBib3RoIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogYW5kIHRoZSBhZGIgc2VydmVyIGhhdmUgdGhlIG1lbnRpb25lZCBmdW5jdGlvbmFsaXR5LlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hb3NwLW1pcnJvci9wbGF0Zm9ybV9zeXN0ZW1fY29yZS9ibG9iL21hc3Rlci9hZGIvY2xpZW50L2FkYl9pbnN0YWxsLmNwcFxuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICBwcm90by5faGVscE91dHB1dCA9IHByb3RvLl9oZWxwT3V0cHV0IHx8IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2hlbHAnXSk7XG4gIHJldHVybiBwcm90by5faGVscE91dHB1dC5pbmNsdWRlcygnLS1zdHJlYW1pbmcnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnY21kJyk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGluY3JlbWVudGFsIGluc3RhbGwgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgQURCLlxuICogUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L2ZlYXR1cmVzI2luY3JlbWVudGFsXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIGl0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHtiaW5hcnl9ID0gYXdhaXQgdGhpcy5nZXRWZXJzaW9uKCk7XG4gIGlmICghYmluYXJ5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB1dGlsLmNvbXBhcmVWZXJzaW9ucyhiaW5hcnkudmVyc2lvbiwgJz49JywgJzMwLjAuMScpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdhYmJfZXhlYycpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZnJvbSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHdoaXRlbGlzdGVkIHBhY2thZ2VzLiBBbiBleGFtcGxlIG91dHB1dDpcbiAqIHN5c3RlbSxjb20uYW5kcm9pZC5zaGVsbCwyMDAwXG4gKiBzeXN0ZW0sY29tLmdvb2dsZS5hbmRyb2lkLmNlbGxicm9hZGNhc3RyZWNlaXZlciwxMDE0M1xuICogdXNlcixpby5hcHBpdW0uc2V0dGluZ3MsMTAxNTdcbiAqL1xubWV0aG9kcy5nZXREZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxvZy5pbmZvKCdMaXN0aW5nIHBhY2thZ2VzIGluIERvemUgd2hpdGVsaXN0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0J10pO1xuICByZXR1cm4gXy50cmltKG91dHB1dCkuc3BsaXQoL1xcbi8pXG4gICAgLm1hcCgobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gZXhpc3RpbmcgcGFja2FnZShzKSBpbnRvIHRoZSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBwYWNrYWdlcyBPbmUgb3IgbW9yZSBwYWNrYWdlcyB0byBhZGQuIElmIHRoZSBwYWNrYWdlXG4gKiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd2hpdGVsaXN0IHRoZW4gaXQgaXMgb25seSBnb2luZyB0byBiZSBhZGRlZCBvbmNlLlxuICogSWYgdGhlIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgaW5zdGFsbGVkL25vdCBrbm93biB0aGVuIGFuIGVycm9yXG4gKiB3aWxsIGJlIHRocm93bi5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNvbW1hbmQgdG8gYWRkIHBhY2thZ2UocykgaGFzIGJlZW4gZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgKC4uLnBhY2thZ2VzKSB7XG4gIGlmIChfLmlzRW1wdHkocGFja2FnZXMpIHx8IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nLmluZm8oYEFkZGluZyAke3V0aWwucGx1cmFsaXplKCdwYWNrYWdlJywgcGFja2FnZXMubGVuZ3RoKX0gJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlcyl9IHRvIERvemUgd2hpdGVsaXN0YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBrZykgPT4gWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0JywgYCske3BrZ31gXSwgcGFja2FnZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hZGItY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|